純JavaScript實(shí)現(xiàn)驚艷的液態(tài)玻璃效果的示例
前言
今天給大家分享一個超酷的視覺效果——??液態(tài)玻璃??。這個效果看起來就像一塊可以隨意拖動、邊緣會自然流動的玻璃面板。最棒的是,我們完全用原生JavaScript實(shí)現(xiàn),不需要任何第三方庫!
效果預(yù)覽

技術(shù)原理
這個效果主要基于以下幾個核心技術(shù):
- ??SVG位移映射??:使用
feDisplacementMap濾鏡實(shí)現(xiàn)變形效果 - ??符號距離函數(shù)(SDF)??:計算邊緣的平滑過渡
- ??Canvas實(shí)時渲染??:動態(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)建了一個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的每個像素,計算它們應(yī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;
}
這個SDF函數(shù)計算點(diǎn)到圓角矩形邊緣的距離,是實(shí)現(xiàn)邊緣流動效果的關(guān)鍵。
完整實(shí)現(xiàn)步驟
- ??創(chuàng)建容器元素??:一個固定定位的div作為玻璃面板
- ??設(shè)置SVG濾鏡??:包含位移映射和圖像處理
- ??初始化Canvas??:用于實(shí)時生成位移貼圖
- ??實(shí)現(xiàn)拖拽功能??:讓用戶可以拖動玻璃面板
- ??響應(yīng)鼠標(biāo)移動??:根據(jù)鼠標(biāo)位置更新變形效果
實(shí)際應(yīng)用場景
這種效果可以用于:
- 特色按鈕或卡片
- 網(wǎng)站裝飾元素
- 數(shù)據(jù)可視化中的焦點(diǎn)提示
- 交互式教程中的高亮區(qū)域
性能優(yōu)化建議
- 對于移動端,可以降低canvas的分辨率
- 使用requestAnimationFrame進(jìn)行節(jié)流
- 對于靜態(tài)效果,可以預(yù)生成位移貼圖
結(jié)語
這個液態(tài)玻璃效果展示了現(xiàn)代瀏覽器強(qiáng)大的圖形能力,純前端實(shí)現(xiàn)這樣的效果在幾年前還是難以想象的。希望這個教程能給你帶來啟發(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)文章
微信小程序自定義彈窗實(shí)現(xiàn)詳解(可通用)
這篇文章主要介紹了微信小程序自定義彈窗實(shí)現(xiàn)詳解(可通用),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07
移動端網(wǎng)頁開發(fā)調(diào)試神器Eruda的介紹與使用技巧
在日常的移動端開發(fā)時,一般都是試用chrome瀏覽器的移動端模式進(jìn)行開發(fā)和調(diào)試,只有在chrome調(diào)試完成,而最近發(fā)現(xiàn)了一個新的調(diào)試方法,所以這篇文章主要給大家介紹了關(guān)于移動端網(wǎng)頁開發(fā)調(diào)試神器Eruda的基本資料,以及其使用的一些技巧,需要的朋友可以參考下。2017-10-10

