基于CSS mask-image 實現(xiàn)炫酷圖片過渡效果之星球大戰(zhàn)

在給公司開發(fā)官網(wǎng)的過程中丰涉,會有涉及到一些圖片的鼠標(biāo)懸停效果拓巧,鼠標(biāo)懸停后會改變原圖,單純的漸隱漸現(xiàn)一死,放大縮小肛度,左右平移已經(jīng)滿足不了產(chǎn)品經(jīng)理期望了,總覺得不夠驚艷投慈,創(chuàng)意不夠贤斜。其實作為一個開發(fā)者,也不會滿足這普通日常的動畫交互效果逛裤,在尋找新的 idea 時發(fā)現(xiàn)基于 CSS mask-image 可以實現(xiàn)很多不錯的效果瘩绒,本文將基于此屬性實現(xiàn)四種圖片過渡動畫效果。

前置知識點 mask-image

mask-image CSS 屬性用于設(shè)置元素上遮罩層的圖像带族。默認(rèn)值是 none锁荔,也就是無遮罩圖片。因此蝙砌,和 border 屬性中的 border-style 屬性類似阳堕,是一個想要有效果就必須設(shè)定的屬性值跋理。注意由于此屬性目前還不是完全支持,部分瀏覽器還需要增加-webkit-前綴使用恬总。

mask-image遮罩所支持的圖片類型非常的廣泛前普,可以是 url()靜態(tài)圖片資源,格式包括 JPG壹堰,PNG 以及 SVG 等都是支持的拭卿;也可以是動態(tài)生成的圖片,例如使用各種 CSS3 漸變繪制的圖片贱纠。語法上支持 CSS3 各類漸變峻厚,以及 url()功能符,image()功能符谆焊,甚至 element()功能符惠桃。同時還支持多背景,因此理論上辖试,使用 mask-image 我們可以遮罩出任意我們想要的圖形辜王,非常強(qiáng)大。

語法如下:

/* <mask-source> value */
mask-image: url(masks.svg#mask1);

/* <image> values */
mask-image: linear-gradient(rgba(0, 0, 0, 1.0), transparent);
mask-image: image(url(mask.png), skyblue);

/* Multiple values */
mask-image: image(url(mask.png), skyblue), linear-gradient(rgba(0, 0, 0, 1.0), transparent);

示例演示罐孝,一個漸變色背景的純文本元素增加 mask-image 屬性后是什么效果呢呐馆。


image.png
.mask {
  -webkit-mask-size: contain;
 -webkit-mask-image: url(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/161ced10bf344eb085c34cefd8958dd1~tplv-k3u1fbpfcp-watermark.image?);
}

兩張圖片以漸變的方式合并成為一張圖片。

bbad6292-8fea-4bb2-9425-e1e66a5ca0f0.png
.scene-2 {
  background-image: url(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fd9e83460a5645ccb78dc1c8efb86871~tplv-k3u1fbpfcp-watermark.image?);
  -webkit-mask-image: linear-gradient(to right, transparent 8%, #fff 30%);
}

如上圖 1 所示肾档,使用 mask-image 屬性設(shè)置了一個 png 格式的客服圖標(biāo)摹恰,整個元素將只顯示 png 圖像的內(nèi)容區(qū)域,其他區(qū)域都消失不見了怒见。如圖 2 所示俗慈,使用 mask-image 屬性設(shè)置漸變顏色,使兩種圖片以漸變疊加的方式融合在了一起遣耍。

想必大家可以看出 mask-image 的主要功能了吧闺阱,CSS mask 屬性在使用的時候就是 mask: xxx,現(xiàn)在隨著這個屬性的規(guī)范化舵变,mask 屬性實際上已經(jīng)成為了諸多 mask-\*的縮寫酣溃,除了 mask-image 還有以下屬性,用法和 CSS background 用法是相仿的纪隙,具體屬性值可以看 mask 遮罩層詳解赊豌。

mask-mode

mask-repeat

mask-position

mask-clip

mask-origin

mask-size

mask-type

mask-composite

介紹完主要的前置知識點,接下來就進(jìn)入到具體的動畫效果和實現(xiàn)過程绵咱。

效果一

1658033110338.gif

兩張圖片切換的過渡效果碘饼,動畫開始前中間定位了一個透明的圖標(biāo),動畫開始后圖標(biāo)不斷放大,直到圖標(biāo)放大到全屏此時已過渡到第二張圖片艾恼,整個過程相當(dāng)炫酷住涉。基于上面的前置知識點钠绍,很快可想到對應(yīng)的實現(xiàn)方式舆声,這里需要額外用到其他的幾個屬性,用法和 background 類似:

  • mask-size: 如動畫所示柳爽,中間的 png 圖標(biāo)從小放大媳握,則需要這個屬性控制圖標(biāo)的大小變化
  • mask-position: 圖標(biāo)一直是保持在水平垂直居中的位置放大,則需要這個屬性圖像的起始位置
  • mask-repeat:和 background 類似泻拦,不設(shè)置 no-repeat 圖標(biāo)會重復(fù)整個界面

動畫效果示意圖如下:


GIF25.gif

核心代碼如下:

.scene-2 {
  background-image: url(https://assets.codepen.io/77020/sw-shape-zoom-scene-2.jpg);
  -webkit-mask-image: url(https://assets.codepen.io/77020/sw-jedi-crest.svg);
  -webkit-mask-size: 10%;
  -webkit-mask-position: center;
  -webkit-mask-repeat: no-repeat;
}

.scenes:is(:hover, :focus) .scene-2 {
  animation: scene-transition 4s cubic-bezier(1, 0, 1, 1) forwards;
}

@keyframes scene-transition {
  100% {
![2e03c419-766b-407a-aff8-36d8610e75a0.png](https://upload-images.jianshu.io/upload_images/10832850-711d80b4e10a24b1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    -webkit-mask-size: 1800%;
  }
}

這時整體動畫效果基本完成了毙芜,但是還有細(xì)節(jié)繼續(xù)優(yōu)化忽媒,動畫開始前圖標(biāo)內(nèi)的圖片已經(jīng)看到争拐,這樣對比整個界面不夠鮮明美觀,所以需要默認(rèn)設(shè)置第二張圖片的亮度晦雨,當(dāng)動畫進(jìn)行到一定的階段再徹底顯示出來架曹。


2e03c419-766b-407a-aff8-36d8610e75a0.png

代碼如下:

.scene-2 {
  filter: brightness(0%);
}

@keyframes scene-transition {
  25% {
    filter: brightness(100%);
  }
  100% {
    filter: brightness(100%);
  }
}

代碼在線預(yù)覽:
https://code.juejin.cn/pen/7121173655316332580

效果二

1658033153487.gif

如效果圖所示,這里用到了錐形漸變 conic-gradient闹瞧,通過一個完整的錐形漸變過渡圖片绑雄。和上面的示例二類似,只不過把 linear-gradient 線性漸變改變?yōu)?conic-gradient 錐形漸變奥邮,通過控制錐形漸變的角度完成圖片的過渡效果万牺,動畫效果示例圖如下:

GIF24.gif

核心代碼如下:

@property --angle {
  syntax: '<angle>';
  inherits: true;
  initial-value: -10deg;
}

.scene-2 {
  background-image: url(https://assets.codepen.io/77020/sw-clock-wipe-scene-2.jpg);
  z-index: -1;
  -webkit-mask-image:
    conic-gradient(
      #fff 0deg,
      #fff calc(var(--angle) - 10deg),
      transparent calc(var(--angle) + 10deg),
      transparent 360deg
    ),
    conic-gradient(
      transparent 340deg,
      #fff 360deg
    );
}
.scenes:is(:hover, :focus) .scene-2 {
  z-index: 1;
  animation: scene-transition 2s linear forwards;
}

@keyframes scene-transition {
  to { --angle: 370deg; }
}

代碼在線預(yù)覽:
https://code.juejin.cn/pen/7121174793981788196

效果三

1658033154244.gif

此效果由效果二的錐形漸變改變?yōu)?radial-gradient 徑向漸變,控制漸變的范圍從完全不見到覆蓋整個元素洽腺。動畫效果示例圖如下:


GIF23.gif

核心代碼如下:

@property --radius {
  syntax: '<percentage>';
  inherits: true;
  initial-value: -5%;
}

@keyframes scene-transition {
  to { --radius: 105%; }
}

.scene-2 {
  background-image: url(https://assets.codepen.io/77020/sw-iris-wipe-scene-2.jpg);
  -webkit-mask-image: radial-gradient(
    circle,
    #fff calc(var(--radius) - 5%),
    transparent calc(var(--radius) + 5%)
  );
}

.scenes:is(:hover, :focus) .scene-2 {
  animation: scene-transition 2s linear forwards;
}

代碼在線預(yù)覽:
https://code.juejin.cn/pen/7121179125821210654

效果四

1658033155226.gif

此效果和示例二中的效果一樣脚粟,使用 linear-gradient 線性漸變過渡圖片,這里將 mask-size 設(shè)置寬度的兩倍蘸朋,前面一半設(shè)置為透明色核无,則看到的還是第一張圖片。觸發(fā)動畫的時候改變 mask-positionleft 變更為 right藕坯,動畫效果示例圖如下:

GIF22.gif

核心代碼如下:

.scene-2 {
  background-image: url(https://assets.codepen.io/77020/sw-horizontal-wipe-scene-2.jpg);
  -webkit-mask-image: linear-gradient(
    to right,
    transparent 47.5%,
    #fff 52.5%
  );
  -webkit-mask-size: 210%;
  -webkit-mask-position: left;
}

.scenes:is(:hover, :focus) .scene-2 {
  -webkit-mask-position: right;
  transition: -webkit-mask-position 2s linear;
}

代碼在線預(yù)覽:
https://code.juejin.cn/pen/7121181551152332814

最后

本文基于 CSS mask-image 實現(xiàn)了四種圖片過渡效果团南,相信這幾種效果能夠讓你的老板眼前一亮,讓你的項目炫酷起來吧炼彪⊥赂看到最后如果覺得有用,記得點個贊收藏起來辐马,說不定哪天就用上啦拷橘。

專注前端開發(fā),分享前端相關(guān)技術(shù)干貨,公眾號:南城大前端(ID: nanchengfe)

參考

mask-image:
https://developer.mozilla.org/zh-CN/docs/Web/CSS/mask-image

codepen:https://codepen.io/lonekorean/details/eYVrWoq

mask 遮罩層詳解:https://blog.csdn.net/qq_32682137/article/details/83751176

CSS的mask-image屬性詳解
https://www.php.cn/css-tutorial-389418.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末膜楷,一起剝皮案震驚了整個濱河市旭咽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赌厅,老刑警劉巖穷绵,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異特愿,居然都是意外死亡仲墨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門揍障,熙熙樓的掌柜王于貴愁眉苦臉地迎上來目养,“玉大人,你說我怎么就攤上這事毒嫡“┮希” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵兜畸,是天一觀的道長努释。 經(jīng)常有香客問我,道長咬摇,這世上最難降的妖魔是什么伐蒂? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮肛鹏,結(jié)果婚禮上逸邦,老公的妹妹穿的比我還像新娘。我一直安慰自己在扰,他們只是感情好缕减,可當(dāng)我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著健田,像睡著了一般烛卧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妓局,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天腾窝,我揣著相機(jī)與錄音赁炎,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛婆誓,可吹牛的內(nèi)容都是我干的刑顺。 我是一名探鬼主播隶校,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼夺姑,長吁一口氣:“原來是場噩夢啊……” “哼蜈漓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宫盔,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤融虽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后灼芭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體有额,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年彼绷,在試婚紗的時候發(fā)現(xiàn)自己被綠了巍佑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡寄悯,死狀恐怖萤衰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情猜旬,我是刑警寧澤脆栋,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站昔馋,受9級特大地震影響筹吐,放射性物質(zhì)發(fā)生泄漏糖耸。R本人自食惡果不足惜秘遏,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘉竟。 院中可真熱鬧邦危,春花似錦、人聲如沸舍扰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽边苹。三九已至陵且,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間个束,已是汗流浹背慕购。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留茬底,地道東北人沪悲。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像阱表,于是被迫代替她去往敵國和親殿如。 傳聞我的和親對象是個殘疾皇子贡珊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容