iOS26 Liquid Effect Implementation Specification for Web Design web interfaces with the following mandatory characteristics: 1. **Dynamic environmental Refraction**: Simulate real-world glass light-bending through real-time environmental sampling, creating prism-like chromatic dispersion when interacting with UI elements 2. **Physics-Driven Animation**: Implement isotropic expansion animations on button presses with chromatic aberration, maintaining solid glass texture during idle states 3. **Context-Aware Responsiveness**: Adjust dispersion intensity (0.1-0.9) based on interaction velocity - rapid gestures (>120px/s) trigger LCD-like spectral artifacts, slow movements produce subtle rainbow fringing 4. **Tactile Sync Feedback**: Coordinate with Haptic Feedback API for visual-to-tactile latency <50ms during deformations 5. **Cross-Device Consistency**: Maintain sub-pixel refraction accuracy across devices using WebGPU/Metal 5 rendering管线, preserving glass thickness variations without blur artifacts Technical Blueprint for Liquid Glass Web Adaptation Must include: - **SDF-Based Edge Preservation**: Use signed distance fields to maintain sharp UI edges while simulating liquid surface tension - **Real-Time Photon Mapping**: Trace virtual light rays through UI hierarchy with machine learning-accelerated scattering algorithms - **Adaptive Opacity Modulation**: Non-linear opacity changes (0.4-0.8) correlating with interaction intensity - **Environmental Light Sync**: Read device ambient light sensors to adjust material transparency gradients - **Performance Optimization**: Implement level-of-detail rendering (LOD) for 30fps frame rate on mobile devices while maintaining 4x AA on desktop Liquid Effect Validation Checklist for Web Ensure compliance with: ① **Physical Material Simulation**: Elastic collisions and surface tension effects in button press animations ② **Speed-Dependent Phenomena**: Chromatic aberration scaling with gesture velocity (0.2-0.8 coefficient range) ③ **Environmental Interaction**: Real-time adjustment of refractive angles based on ambient lighting conditions ④ **Edge Case Handling**: Prevent color overflow during background-color transitions and maintain rendering coherence across screen resolutions ⑤ **Hardware-Agnostic Design**: Parameter auto-adaptation (environmental light sensitivity 0.6-1.2, max deformation 15%) for iOS/Android/Mac devices Cross-Platform Liquid Glass Parameter Set Define technical specifications: - **Optical Parameters**: - Dispersion intensity (0.1-0.9) - Maximum refraction angle (45°-85°) - Surface tension coefficient (0.8-1.4) - **Performance Metrics**: - Touch response latency (30-80ms) - Frame rate prioritization (mobile:30fps/desktop:60fps) - Anti-aliasing level (2x-4x) - **Material Rules**: - Non-linear opacity gradient mapping - Real-time shadow casting between UI elements - Haptic vibration frequency (1-3级) synchronization - Follow Up Deployment
Browse files- index.html +71 -9
index.html
CHANGED
|
@@ -40,12 +40,19 @@
|
|
| 40 |
background: linear-gradient(135deg, #0A84FF, #BF5AF2, #30D158, #FFD60A);
|
| 41 |
background-size: 400% 400%;
|
| 42 |
animation: liquid-move 15s ease infinite;
|
|
|
|
| 43 |
}
|
| 44 |
|
| 45 |
.icon-liquid {
|
| 46 |
animation: liquid-pulse 3s ease-in-out infinite;
|
| 47 |
-
transition: all 0.3s
|
| 48 |
-
box-shadow:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 49 |
}
|
| 50 |
|
| 51 |
.icon-liquid:hover {
|
|
@@ -115,19 +122,33 @@
|
|
| 115 |
|
| 116 |
@keyframes droplet-fall {
|
| 117 |
0% {
|
| 118 |
-
transform:
|
|
|
|
|
|
|
| 119 |
opacity: 0;
|
|
|
|
| 120 |
}
|
| 121 |
20% {
|
| 122 |
-
transform:
|
|
|
|
|
|
|
| 123 |
opacity: 1;
|
| 124 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 125 |
80% {
|
| 126 |
-
transform:
|
|
|
|
|
|
|
| 127 |
opacity: 0.8;
|
| 128 |
}
|
| 129 |
100% {
|
| 130 |
-
transform:
|
|
|
|
|
|
|
| 131 |
opacity: 0;
|
| 132 |
}
|
| 133 |
}
|
|
@@ -138,6 +159,17 @@
|
|
| 138 |
-webkit-backdrop-filter: blur(5px);
|
| 139 |
}
|
| 140 |
</style>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 141 |
</head>
|
| 142 |
<body class="bg-ios-dark text-white flex justify-center items-center min-h-screen overflow-hidden">
|
| 143 |
<!-- iPhone Frame -->
|
|
@@ -288,25 +320,55 @@
|
|
| 288 |
</div>
|
| 289 |
|
| 290 |
<script>
|
|
|
|
|
|
|
|
|
|
| 291 |
function createLiquidWave(event) {
|
| 292 |
const icon = event.currentTarget.querySelector('.icon-liquid');
|
| 293 |
const rect = icon.getBoundingClientRect();
|
| 294 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 295 |
const droplet = document.createElement('div');
|
| 296 |
droplet.classList.add('droplet');
|
| 297 |
droplet.style.left = `${rect.left + rect.width/2 - 20}px`;
|
| 298 |
droplet.style.top = `${rect.top}px`;
|
|
|
|
| 299 |
|
| 300 |
document.body.appendChild(droplet);
|
| 301 |
|
| 302 |
-
//
|
| 303 |
setTimeout(() => {
|
| 304 |
-
droplet.style.animation =
|
| 305 |
}, 10);
|
| 306 |
|
| 307 |
-
// Remove after animation completes
|
| 308 |
setTimeout(() => {
|
| 309 |
droplet.remove();
|
|
|
|
| 310 |
}, 800);
|
| 311 |
}
|
| 312 |
|
|
|
|
| 40 |
background: linear-gradient(135deg, #0A84FF, #BF5AF2, #30D158, #FFD60A);
|
| 41 |
background-size: 400% 400%;
|
| 42 |
animation: liquid-move 15s ease infinite;
|
| 43 |
+
filter: url('#liquid-turbulence');
|
| 44 |
}
|
| 45 |
|
| 46 |
.icon-liquid {
|
| 47 |
animation: liquid-pulse 3s ease-in-out infinite;
|
| 48 |
+
transition: all 0.3s cubic-bezier(0.17, 0.67, 0.83, 0.67);
|
| 49 |
+
box-shadow:
|
| 50 |
+
0 0 20px rgba(191, 90, 242, 0.3),
|
| 51 |
+
0 0 40px rgba(255, 255, 255, 0.1);
|
| 52 |
+
backdrop-filter: blur(2px);
|
| 53 |
+
-webkit-backdrop-filter: blur(2px);
|
| 54 |
+
border: 1px solid rgba(255, 255, 255, 0.15);
|
| 55 |
+
will-change: transform, filter, box-shadow;
|
| 56 |
}
|
| 57 |
|
| 58 |
.icon-liquid:hover {
|
|
|
|
| 122 |
|
| 123 |
@keyframes droplet-fall {
|
| 124 |
0% {
|
| 125 |
+
transform:
|
| 126 |
+
translateY(calc(-20px * var(--velocity, 1)))
|
| 127 |
+
scale(calc(0.5 * var(--velocity, 1)));
|
| 128 |
opacity: 0;
|
| 129 |
+
filter: blur(calc(1px * var(--velocity, 1)));
|
| 130 |
}
|
| 131 |
20% {
|
| 132 |
+
transform:
|
| 133 |
+
translateY(calc(-30px * var(--velocity, 1)))
|
| 134 |
+
scale(var(--velocity, 1));
|
| 135 |
opacity: 1;
|
| 136 |
}
|
| 137 |
+
50% {
|
| 138 |
+
filter:
|
| 139 |
+
blur(calc(2px * var(--velocity, 1)))
|
| 140 |
+
drop-shadow(0 0 5px rgba(255,255,255,0.5));
|
| 141 |
+
}
|
| 142 |
80% {
|
| 143 |
+
transform:
|
| 144 |
+
translateY(0)
|
| 145 |
+
scale(calc(0.8 + 0.2 * var(--velocity, 1)));
|
| 146 |
opacity: 0.8;
|
| 147 |
}
|
| 148 |
100% {
|
| 149 |
+
transform:
|
| 150 |
+
translateY(calc(10px * var(--velocity, 1)))
|
| 151 |
+
scale(0);
|
| 152 |
opacity: 0;
|
| 153 |
}
|
| 154 |
}
|
|
|
|
| 159 |
-webkit-backdrop-filter: blur(5px);
|
| 160 |
}
|
| 161 |
</style>
|
| 162 |
+
<svg width="0" height="0" style="position:absolute">
|
| 163 |
+
<filter id="liquid-turbulence" x="0" y="0" width="100%" height="100%">
|
| 164 |
+
<feTurbulence type="fractalNoise" baseFrequency="0.01 0.01" numOctaves="2" result="turbulence"/>
|
| 165 |
+
<feDisplacementMap in2="turbulence" in="SourceGraphic" scale="5" xChannelSelector="R" yChannelSelector="B"/>
|
| 166 |
+
<feComponentTransfer>
|
| 167 |
+
<feFuncR type="linear" slope="1.2" intercept="-0.1"/>
|
| 168 |
+
<feFuncG type="linear" slope="1.0" intercept="0"/>
|
| 169 |
+
<feFuncB type="linear" slope="0.8" intercept="0.1"/>
|
| 170 |
+
</feComponentTransfer>
|
| 171 |
+
</filter>
|
| 172 |
+
</svg>
|
| 173 |
</head>
|
| 174 |
<body class="bg-ios-dark text-white flex justify-center items-center min-h-screen overflow-hidden">
|
| 175 |
<!-- iPhone Frame -->
|
|
|
|
| 320 |
</div>
|
| 321 |
|
| 322 |
<script>
|
| 323 |
+
let lastTouchTime = 0;
|
| 324 |
+
let lastTouchY = 0;
|
| 325 |
+
|
| 326 |
function createLiquidWave(event) {
|
| 327 |
const icon = event.currentTarget.querySelector('.icon-liquid');
|
| 328 |
const rect = icon.getBoundingClientRect();
|
| 329 |
|
| 330 |
+
// Calculate interaction velocity
|
| 331 |
+
const now = Date.now();
|
| 332 |
+
let velocity = 0;
|
| 333 |
+
if (event.type === 'touchmove') {
|
| 334 |
+
const touchY = event.touches[0].clientY;
|
| 335 |
+
velocity = Math.abs(touchY - lastTouchY) / (now - lastTouchTime) * 1000;
|
| 336 |
+
lastTouchY = touchY;
|
| 337 |
+
}
|
| 338 |
+
lastTouchTime = now;
|
| 339 |
+
|
| 340 |
+
// Adjust effects based on velocity
|
| 341 |
+
const aberrationIntensity = Math.min(0.8, Math.max(0.2, velocity / 200));
|
| 342 |
+
const scaleFactor = 1 + (velocity > 120 ? 0.15 : 0.05);
|
| 343 |
+
|
| 344 |
+
// Create chromatic aberration effect
|
| 345 |
+
icon.style.filter = `
|
| 346 |
+
drop-shadow(${aberrationIntensity}px 0 1px rgba(255,0,0,0.7))
|
| 347 |
+
drop-shadow(${-aberrationIntensity}px 0 1px rgba(0,0,255,0.7))
|
| 348 |
+
`;
|
| 349 |
+
|
| 350 |
+
// Trigger haptic feedback if available
|
| 351 |
+
if ('vibrate' in navigator) {
|
| 352 |
+
navigator.vibrate(velocity > 120 ? 30 : 10);
|
| 353 |
+
}
|
| 354 |
+
|
| 355 |
+
// Create droplet with physics
|
| 356 |
const droplet = document.createElement('div');
|
| 357 |
droplet.classList.add('droplet');
|
| 358 |
droplet.style.left = `${rect.left + rect.width/2 - 20}px`;
|
| 359 |
droplet.style.top = `${rect.top}px`;
|
| 360 |
+
droplet.style.setProperty('--velocity', Math.min(1, velocity/200));
|
| 361 |
|
| 362 |
document.body.appendChild(droplet);
|
| 363 |
|
| 364 |
+
// Animate with physics
|
| 365 |
setTimeout(() => {
|
| 366 |
+
droplet.style.animation = `droplet-fall ${0.8 - Math.min(0.3, velocity/1000)}s ease-out forwards`;
|
| 367 |
}, 10);
|
| 368 |
|
|
|
|
| 369 |
setTimeout(() => {
|
| 370 |
droplet.remove();
|
| 371 |
+
icon.style.filter = '';
|
| 372 |
}, 800);
|
| 373 |
}
|
| 374 |
|