純JavaScript實現(xiàn)驚艷的液態(tài)玻璃效果的示例
前言
今天給大家分享一個超酷的視覺效果——??液態(tài)玻璃??。這個效果看起來就像一塊可以隨意拖動、邊緣會自然流動的玻璃面板。最棒的是,我們完全用原生JavaScript實現(xiàn),不需要任何第三方庫!
效果預覽
技術原理
這個效果主要基于以下幾個核心技術:
- ??SVG位移映射??:使用
feDisplacementMap
濾鏡實現(xiàn)變形效果 - ??符號距離函數(shù)(SDF)??:計算邊緣的平滑過渡
- ??Canvas實時渲染??:動態(tài)生成位移貼圖
- ??CSS視覺效果??:結合
backdrop-filter
增強質感
核心代碼解析
1. 初始化SVG濾鏡
// 創(chuàng)建SVG濾鏡 const filter = document.createElementNS('http://www.w3.org/2000/svg', 'filter'); this.feDisplacementMap = document.createElementNS('http://www.w3.org/2000/svg', 'feDisplacementMap'); this.feDisplacementMap.setAttribute('in', 'SourceGraphic'); this.feDisplacementMap.setAttribute('in2', `${this.id}_map`); this.feDisplacementMap.setAttribute('xChannelSelector', 'R'); this.feDisplacementMap.setAttribute('yChannelSelector', 'G');
這段代碼創(chuàng)建了一個SVG位移濾鏡,它會根據(jù)我們提供的位移貼圖來扭曲元素的外觀。
2. 位移貼圖生成
// 在updateShader方法中計算每個像素的位移 for (let i = 0; i < data.length; i += 4) { const x = (i / 4) % w; const y = Math.floor(i / 4 / w); const pos = this.fragment({ x: x / w, y: y / h }, mouseProxy); const dx = pos.x * w - x; const dy = pos.y * h - y; maxScale = Math.max(maxScale, Math.abs(dx), Math.abs(dy)); rawValues.push(dx, dy); }
這段代碼遍歷canvas的每個像素,計算它們應該移動的位置,生成位移貼圖。
3. 邊緣平滑處理
function roundedRectSDF(x, y, width, height, radius) { const qx = Math.abs(x) - width + radius; const qy = Math.abs(y) - height + radius; return Math.min(Math.max(qx, qy), 0) + length(Math.max(qx, 0), Math.max(qy, 0)) - radius; }
這個SDF函數(shù)計算點到圓角矩形邊緣的距離,是實現(xiàn)邊緣流動效果的關鍵。
完整實現(xiàn)步驟
- ??創(chuàng)建容器元素??:一個固定定位的div作為玻璃面板
- ??設置SVG濾鏡??:包含位移映射和圖像處理
- ??初始化Canvas??:用于實時生成位移貼圖
- ??實現(xiàn)拖拽功能??:讓用戶可以拖動玻璃面板
- ??響應鼠標移動??:根據(jù)鼠標位置更新變形效果
實際應用場景
這種效果可以用于:
- 特色按鈕或卡片
- 網(wǎng)站裝飾元素
- 數(shù)據(jù)可視化中的焦點提示
- 交互式教程中的高亮區(qū)域
性能優(yōu)化建議
- 對于移動端,可以降低canvas的分辨率
- 使用requestAnimationFrame進行節(jié)流
- 對于靜態(tài)效果,可以預生成位移貼圖
結語
這個液態(tài)玻璃效果展示了現(xiàn)代瀏覽器強大的圖形能力,純前端實現(xiàn)這樣的效果在幾年前還是難以想象的。希望這個教程能給你帶來啟發(fā),歡迎在評論區(qū)分享你的創(chuàng)意實現(xiàn)!
到此這篇關于純JavaScript實現(xiàn)驚艷的液態(tài)玻璃效果的示例的文章就介紹到這了,更多相關JavaScript液態(tài)玻璃內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
ymPrompt的doHandler方法來實現(xiàn)獲取子窗口返回值的方法
今天在寫頁面時用到了ymPrompt的win方法來彈出一個窗口。由于要用到獲取子窗口返回來的值判斷是否刷新父窗口,在ymPrompt的組件Demo中一直沒有找到合適的方法實現(xiàn)2010-06-06javascript動態(tài)添加、修改、刪除對象的屬性與方法詳解
本篇文章主要是對javascript動態(tài)添加、修改、刪除對象的屬性與方法進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01