純JavaScript實(shí)現(xiàn)驚艷的液態(tài)玻璃效果的示例
前言
今天給大家分享一個(gè)超酷的視覺效果——??液態(tài)玻璃??。這個(gè)效果看起來就像一塊可以隨意拖動(dòng)、邊緣會自然流動(dòng)的玻璃面板。最棒的是,我們完全用原生JavaScript實(shí)現(xiàn),不需要任何第三方庫!
效果預(yù)覽
技術(shù)原理
這個(gè)效果主要基于以下幾個(gè)核心技術(shù):
- ??SVG位移映射??:使用
feDisplacementMap
濾鏡實(shí)現(xiàn)變形效果 - ??符號距離函數(shù)(SDF)??:計(jì)算邊緣的平滑過渡
- ??Canvas實(shí)時(shí)渲染??:動(dòng)態(tài)生成位移貼圖
- ??CSS視覺效果??:結(jié)合
backdrop-filter
增強(qiáng)質(zhì)感
核心代碼解析
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)建了一個(gè)SVG位移濾鏡,它會根據(jù)我們提供的位移貼圖來扭曲元素的外觀。
2. 位移貼圖生成
// 在updateShader方法中計(jì)算每個(gè)像素的位移 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的每個(gè)像素,計(jì)算它們應(yīng)該移動(dòng)的位置,生成位移貼圖。
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; }
這個(gè)SDF函數(shù)計(jì)算點(diǎn)到圓角矩形邊緣的距離,是實(shí)現(xiàn)邊緣流動(dòng)效果的關(guān)鍵。
完整實(shí)現(xiàn)步驟
- ??創(chuàng)建容器元素??:一個(gè)固定定位的div作為玻璃面板
- ??設(shè)置SVG濾鏡??:包含位移映射和圖像處理
- ??初始化Canvas??:用于實(shí)時(shí)生成位移貼圖
- ??實(shí)現(xiàn)拖拽功能??:讓用戶可以拖動(dòng)玻璃面板
- ??響應(yīng)鼠標(biāo)移動(dòng)??:根據(jù)鼠標(biāo)位置更新變形效果
實(shí)際應(yīng)用場景
這種效果可以用于:
- 特色按鈕或卡片
- 網(wǎng)站裝飾元素
- 數(shù)據(jù)可視化中的焦點(diǎn)提示
- 交互式教程中的高亮區(qū)域
性能優(yōu)化建議
- 對于移動(dòng)端,可以降低canvas的分辨率
- 使用requestAnimationFrame進(jìn)行節(jié)流
- 對于靜態(tài)效果,可以預(yù)生成位移貼圖
結(jié)語
這個(gè)液態(tài)玻璃效果展示了現(xiàn)代瀏覽器強(qiáng)大的圖形能力,純前端實(shí)現(xiàn)這樣的效果在幾年前還是難以想象的。希望這個(gè)教程能給你帶來啟發(fā),歡迎在評論區(qū)分享你的創(chuàng)意實(shí)現(xiàn)!
到此這篇關(guān)于純JavaScript實(shí)現(xiàn)驚艷的液態(tài)玻璃效果的示例的文章就介紹到這了,更多相關(guān)JavaScript液態(tài)玻璃內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript中日期轉(zhuǎn)換成時(shí)間戳的小例子
javascript中日期轉(zhuǎn)換成時(shí)間戳的小例子,需要的朋友可以參考一下2013-03-03ymPrompt的doHandler方法來實(shí)現(xiàn)獲取子窗口返回值的方法
今天在寫頁面時(shí)用到了ymPrompt的win方法來彈出一個(gè)窗口。由于要用到獲取子窗口返回來的值判斷是否刷新父窗口,在ymPrompt的組件Demo中一直沒有找到合適的方法實(shí)現(xiàn)2010-06-06javascript動(dòng)態(tài)添加、修改、刪除對象的屬性與方法詳解
本篇文章主要是對javascript動(dòng)態(tài)添加、修改、刪除對象的屬性與方法進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01基于JavaScript實(shí)現(xiàn)的折半查找算法示例
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)的折半查找算法,結(jié)合實(shí)例形式分析了折半查找的原理、操作步驟及javascript實(shí)現(xiàn)折半查找的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2017-04-04