JS利用?clip-path?實(shí)現(xiàn)動(dòng)態(tài)區(qū)域裁剪功能
背景
今天逛 CodePen,看到了這樣一個(gè)非常有意思的效果:
CodePen Demo -- Material Design Menu By Bennett Feely
這個(gè)效果還是有一些值得探討學(xué)習(xí)的點(diǎn),下面我們一起來(lái)看看。
如何實(shí)現(xiàn)這樣一個(gè)類似的效果?
首先,想一想,如果讓你去實(shí)現(xiàn)上面的效果,你會(huì)怎么做呢?
這里我簡(jiǎn)單羅列一些可能的辦法:
- 陰影 box-shadow
- 漸變 radial-gradient
- 縮放 transform: scale()
快速的一個(gè)一個(gè)過(guò)一下。
使用 box-shadow 實(shí)現(xiàn)
如果使用 box-shadow
,代碼大致如下:
<div class="g-container"> <div class="g-item"></div> </div>
.g-container { position: relative; width: 400px; height: 300px; overflow: hidden; } .g-item { position: absolute; width: 48px; height: 48px; border-radius: 50%; background: #fff; top: 20px; left: 20px; box-shadow: 0 0 0 0 #fff; transition: box-shadow .3s linear; &:hover { box-shadow: 0 0 0 420px #fff; } }
核心就在于:
- 外層一個(gè)設(shè)置了
overflow: hideen
的遮罩 - 內(nèi)層元素 hover 的時(shí)候,實(shí)現(xiàn)一個(gè)
box-shadow: 0 0 0 0 #fff
到box-shadow: 0 0 0 420px #fff
的變化
效果如下:
整體的動(dòng)畫(huà)是模擬出來(lái)了,但是它最致命的問(wèn)題有兩個(gè):
- 當(dāng)我們的鼠標(biāo)離開(kāi)圓形的時(shí)候,整個(gè)動(dòng)畫(huà)就開(kāi)始反向進(jìn)行了,白色區(qū)域開(kāi)始消失,如果我們要進(jìn)行按鈕操作,是無(wú)法完成的
- 隱藏在動(dòng)畫(huà)展開(kāi)后的矩形內(nèi)的元素,不容易放置
所以,box-shadow
看著雖好,但是只能放棄。上述 Demo 的代碼 -- CodePen Demo -- box-shadow zoom in animation
使用漸變 radial-gradient 實(shí)現(xiàn)
下面我們使用徑向漸變 radial-gradient
加上 CSS @property,也可以還原上述效果:
<div class="g-container"></div>
@property --size { syntax: '<length>'; inherits: false; initial-value: 24px; } .g-container { position: relative; width: 400px; height: 300px; overflow: hidden; background: radial-gradient(circle at 44px 44px, #fff 0, #fff var(--size), transparent var(--size), transparent 0); transition: --size .3s linear; &:hover { --size: 450px; } }
我們通過(guò)控制徑向漸變的動(dòng)畫(huà)效果,在 hover 的時(shí)候,讓原本只是一個(gè)小圓背景,變成一個(gè)大圓背景,效果如下:
emmm,效果確實(shí)是還原了,問(wèn)題也很致命:
- 由于是背景的變化,所以鼠標(biāo)不需要 hover 到小圓上,只需要進(jìn)入 div 的范圍,動(dòng)畫(huà)就會(huì)開(kāi)始,這顯然是不對(duì)的
- 和第一種
box-shadow
的方法類似,隱藏在白色之下的導(dǎo)航元素的 DOM 不好放置
上述 Demo 的代碼 -- CodePen Demo -- radial-gradient zoom in animation
emmm,還有一種方法,通過(guò)縮放 transform: scale()
,也會(huì)存一定問(wèn)題,這里不繼續(xù)展開(kāi)。
所以到這里,想實(shí)現(xiàn)上述的效果,核心在于:
- 鼠標(biāo)要 hover 到圓上,才能開(kāi)始動(dòng)畫(huà),并且,鼠標(biāo)可以在展開(kāi)后的范圍內(nèi)自由移動(dòng),且不會(huì)收回動(dòng)畫(huà)效果
- 動(dòng)畫(huà)展開(kāi)后,里面的 DOM 的放置,不能太麻煩,能不借助 Javascript 去控制里面內(nèi)容的顯示隱藏最好
利用 clip-path 實(shí)現(xiàn)動(dòng)態(tài)區(qū)域裁剪
所以,這里,我們其實(shí)是需要一個(gè)動(dòng)態(tài)的區(qū)域裁剪。
在我的這篇文章中 -- 如何不使用 overflow: hidden 實(shí)現(xiàn) overflow: hidden?,介紹了 CSS 中幾種裁剪元素的方式,而其中,最適合利用在這個(gè)效果的,就是 -- clip-path。
利用 clip-path
,可以非常好的實(shí)現(xiàn),動(dòng)態(tài)裁剪的功能,并且,代碼也非常簡(jiǎn)單:
<div class="g-container"></div>
.g-container { position: relative; width: 400px; height: 300px; overflow: hidden; transition: clip-path .3s linear; clip-path: circle(20px at 44px 44px); background: #fff; &:hover { clip-path: circle(460px at 44px 44px); } }
我們只需要利用 clip-path
,在最開(kāi)始的時(shí)候,將一個(gè)矩形 div,利用 clip-path: circle(20px at 44px 44px)
裁剪成一個(gè)圓,當(dāng) hover 的時(shí)候,擴(kuò)大裁剪圓的半徑到整個(gè)矩形范圍即可。
效果如下:
這樣,我們就能完美的實(shí)現(xiàn)題圖的效果,并且,內(nèi)置的 DOM 元素,直接寫(xiě)進(jìn)這個(gè) div 內(nèi)部即可。
<div class="g-container"> <ul> <li>11111</li> <li>22222</li> <li>33333</li> <li>44444</li> </ul> </div>
效果如下:
CodePen Demo -- clip-path zoom in animation
很有意思的一個(gè)技巧,利用 clip-path 實(shí)現(xiàn)動(dòng)態(tài)區(qū)域裁剪,希望大家能夠掌握。
到此這篇關(guān)于JS利用?clip-path?實(shí)現(xiàn)動(dòng)態(tài)區(qū)域裁剪功能的文章就介紹到這了,更多相關(guān)clip-path區(qū)域裁剪內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序?qū)崿F(xiàn)運(yùn)動(dòng)步數(shù)排行功能(可刪除)
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)運(yùn)動(dòng)步數(shù)排行功能(可刪除),實(shí)現(xiàn)代碼也很簡(jiǎn)單,需要的朋友可以參考下2018-07-07JavaScript數(shù)組操作之旋轉(zhuǎn)二維數(shù)組
這篇文章主要介紹了JavaScript數(shù)組操作之旋轉(zhuǎn)二維數(shù)組,主要從兩個(gè)方面展開(kāi)文章介紹,一是通過(guò)對(duì)數(shù)組的操作熟練度;二是(鏡像反轉(zhuǎn))比實(shí)現(xiàn)一更優(yōu),減少了空間復(fù)雜度,內(nèi)容介紹具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04js實(shí)現(xiàn)圖片無(wú)縫循環(huán)輪播
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)圖片無(wú)縫循環(huán)輪播,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10JS獲取鼠標(biāo)坐標(biāo)的實(shí)例方法
這篇文章介紹了JS獲取鼠標(biāo)坐標(biāo)的實(shí)例方法,有需要的朋友可以參考一下2013-07-07XMLHTTP 亂碼的解決方法(UTF8,GB2312 編碼 解碼)
XMLHTTP 亂碼的解決方法(UTF8,GB2312 編碼 解碼)(附帶解決DHTMLX不能用中文的問(wèn)題)2011-01-01JavaScript中cookie工具函數(shù)封裝的示例代碼
這篇文章給大家主要介紹了JavaScript中cookie工具函數(shù)的封裝,文中給出了詳細(xì)的實(shí)現(xiàn)步驟和示例代碼,相信會(huì)對(duì)大家的理解很有幫助,有需要的朋友們下面來(lái)一起看看吧。2016-10-10javascript實(shí)現(xiàn)鼠標(biāo)移到Image上方時(shí)顯示文字效果的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)鼠標(biāo)移到Image上方時(shí)顯示文字效果的方法,涉及javascript鼠標(biāo)事件及圖文屬性動(dòng)態(tài)設(shè)置的相關(guān)技巧,可用于為圖片增加文字提示效果,需要的朋友可以參考下2015-08-08微信小程序 scroll-view實(shí)現(xiàn)錨點(diǎn)滑動(dòng)的示例
本篇文章主要介紹了微信小程序 scroll-view實(shí)現(xiàn)錨點(diǎn)滑動(dòng)的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12