久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

CSS高階技巧:實現圖片漸隱消的多種方法

CSS高階技巧:實現圖片漸隱消的多種方法

將專注于實現復雜布局,兼容設備差異,制作酷炫動畫,制作復雜交互,提升可訪問性及構建奇思妙想效果等方面的內容。

在兼顧基礎概述的同時,注重對技巧的挖掘,結合實際進行運用,歡迎大家關注。

正文從這里開始。

在過往,我們想要實現一個圖片的漸隱消失。最常見的莫過于整體透明度的變化,像是這樣:

<div class="img"></div>
登錄后復制

登錄后復制

div {     width: 300px;     height: 300px;     background: url(image.jpg);     transition: .4s; } .img:hover {     opacity: 0; }
登錄后復制

CSS高階技巧:實現圖片漸隱消的多種方法

但是,CSS 的功能如此強大的今天。我們可以利用 CSS 實現的漸隱效果已經不再是如此的簡單。【推薦學習:css視頻教程】

想想看,下面這樣一個效果,是 CSS 能夠實現的么?

CSS高階技巧:實現圖片漸隱消的多種方法

答案是肯定的!本文就將一步一步,從零開始,僅僅使用一個標簽,實現上述的圖片漸隱效果。

這里,有兩個核心的點:

  • 如何將一張圖片切割的這么細,切割成這么多塊?

  • 基于上述 (1)的基礎上,又該如何分別控制這些小塊的獨立隱藏和展示呢?

莫慌,讓我們一步一步來解決他們。

強大的 Mask

首先,我們需要用到 Mask。

在 CSS 中,mask 屬性允許使用者通過遮罩或者裁切特定區域的圖片的方式來隱藏一個元素的部分或者全部可見區域。

語法

最基本,使用 mask 的方式是借助圖片,類似這樣:

div {     width: 300px;     height: 300px;     background: url(image.jpg);     transition: .4s; } .img:hover {     opacity: 0; }
登錄后復制

當然,使用圖片的方式后文會再講。借助圖片的方式其實比較繁瑣,因為我們首先還得準備相應的圖片素材,除了圖片,mask 還可以接受一個類似 background 的參數,也就是漸變。

類似如下使用方法:

{     mask: linear-gradient(#000, transparent)                      /* 使用漸變來做遮罩 */ }
登錄后復制

那該具體怎么使用呢?一個非常簡單的例子,上述我們創造了一個從黑色到透明漸變色,我們將它運用到實際中,代碼類似這樣:

下面這樣一張圖片,疊加上一個從透明到黑色的漸變,

{     background: url(image.png) ;     mask: linear-gradient(90deg, transparent, #fff); }
登錄后復制

CSS高階技巧:實現圖片漸隱消的多種方法

應用了 mask 之后,就會變成這樣:

CSS高階技巧:實現圖片漸隱消的多種方法

這個 DEMO,可以先簡單了解到 mask 的基本用法。

這里得到了使用 mask 最重要結論:圖片與 mask 生成的漸變的 transparent 的重疊部分,將會變得透明。

值得注意的是,上面的漸變使用的是 linear-gradient(90deg, transparent, #fff),這里的 #fff 純色部分其實換成任意顏色都可以,不影響效果。

CodePen Demo — 使用 MASK 的基本使用

使用 mask 實現 hover 隱藏圖片

了解了 mask 的簡單用法后,我們來看這樣一個非常簡單的例子,我們改造下上述的第一個 DEMO。

<div class="img"></div>
登錄后復制

登錄后復制

div {     width: 300px;     height: 300px;     background: url(image.jpg); } .img:hover {     mask: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0)); }
登錄后復制

是的,利用 Mask,我們同樣也可以得到近似的消失效果:

CSS高階技巧:實現圖片漸隱消的多種方法

如果對于 Mask 你還不了解,你需要首先看看這篇:奇妙的 CSS MASK

當然,對于現在這個效果,有個很大的缺陷,那就是缺少了動畫。圖片是瞬間消失的。所以,我們還需要給上述的借助 mask 實現的圖片消失效果添加上動畫。

而這,就需要用上 CSS @property 了。

強大的 CSS @property

CSS @property,大家應該不那么陌生了。

@property CSS at-rule 是 CSS Houdini API 的一部分, 它允許開發者顯式地定義他們的 CSS 自定義屬性,允許進行屬性類型檢查、設定默認值以及定義該自定義屬性是否可以被繼承。

如果你對 CSS @property 還有所疑惑,建議你先快速讀一讀這篇文章 — CSS @property,讓不可能變可能

回到我們的正題,如果我們想給上述使用 Mask 的代碼,添加上動畫,我們期望代碼大概是這樣:

div {     width: 300px;     height: 300px;     background: url(image.jpg);     mask: linear-gradient(rgba(0, 0, 0, 1), rgba(0, 0, 0, 1)); } .img:hover {     mask: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0)); }
登錄后復制

這里,mask 的是從 mask: linear-gradient(rgba(0, 0, 0, 1), rgba(0, 0, 0, 1))mask: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0)) 變化的。

但是實際上,這樣并不會產生任何的動畫效果。

原因在于,我們 Mask 屬性本身是不支持過渡動畫的!

但是,利用上 CSS @property,整個效果就不一樣了。借助,CSS @property,我們改造一下代碼:

@property --m-0 {    syntax: "<number>";    initial-value: 1;    inherits: false; } div {     width: 300px;     height: 300px;     background: url(image.jpg);     mask: linear-gradient(90deg, rgba(0, 0, 0, var(--m-0)), rgba(0, 0, 0, var(--m-0)));     transition: --m-0 0.5s; } div:hover {     --m-0: 0; }
登錄后復制

我們利用 CSS @property 定義了一個名為 --m-0 的變量,然后,我們將整個動畫過渡效果賦予了這個變量,而不是整個 mask。

利用這個小技巧,我們就可以成功的實現基于 mask 屬性的動畫效果:

CSS高階技巧:實現圖片漸隱消的多種方法

借助多重 mask 分割圖片

到了這一步,后面的步驟其實就很明朗了。

由于 mask 擁有和 background 一樣的特性。因此,mask 是可以有多重 mask 的。也就是說,我們可以設置多個不同的 mask 效果給同一個元素。

什么意思呢?上面的效果只有一重 mask,我們稍微添加一些 mask 代碼,讓它變成 2 重 mask:

@property --m-0 {    syntax: "<number>";    initial-value: 1;    inherits: false; } @property --m-1 {    syntax: "<number>";    initial-value: 1;    inherits: false; } div {     mask:          linear-gradient(90deg, rgba(0, 0, 0, var(--m-0)), rgba(0, 0, 0, var(--m-0))),         linear-gradient(90deg, rgba(0, 0, 0, var(--m-1)), rgba(0, 0, 0, var(--m-1)));     mask-size: 50% 100%;     mask-position: left, right;     mask-repeat: no-repeat;     transition:          --m-0 0.3s,         --m-1 0.25s 0.15s; } div:hover {     --m-0: 0;     --m-1: 0; }
登錄后復制

這樣,我們的步驟大概是:

  • 首先將 mask 一分為二,左右兩邊各一個

  • 然后,設置了兩個基于 CSS @property 的變量,--m-0--m-0

  • 然后,給它們設置了不同的過渡時間和過渡延遲時間

  • 在 hover 的一瞬間,再將這兩個變量的值,都置為 0,也就是實現 linear-gradient(90deg, rgba(0, 0, 0, 1), rgba(0, 0, 0, 1))linear-gradient(90deg, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0)) 的變化,用于隱藏對應 mask 塊

  • 由于設置了不同的過渡時間和延遲時間,整體上看上去,整個動畫就分成了兩部分

看看效果:

CSS高階技巧:實現圖片漸隱消的多種方法

繼續切割為 4 重 mask

好,既然 2 重 mask 效果沒問題,那么我們可以再進一步,將整個效果切割為 4 個 mask。代碼還是如法炮制,這里我再貼上核心代碼:

@property --m-0 {    syntax: "<number>";    initial-value: 1;    inherits: false; } @property --m-1 {    syntax: "<number>";    initial-value: 1;    inherits: false; } @property --m-2 {    syntax: "<number>";    initial-value: 1;    inherits: false; } @property --m-3 {    syntax: "<number>";    initial-value: 1;    inherits: false; } div {     mask:          linear-gradient(90deg, rgba(0, 0, 0, var(--m-0)), rgba(0, 0, 0, var(--m-0))),         linear-gradient(90deg, rgba(0, 0, 0, var(--m-1)), rgba(0, 0, 0, var(--m-1))),         linear-gradient(90deg, rgba(0, 0, 0, var(--m-2)), rgba(0, 0, 0, var(--m-2))),         linear-gradient(90deg, rgba(0, 0, 0, var(--m-3)), rgba(0, 0, 0, var(--m-3)));     mask-size: 50% 50%;     mask-repeat: no-repeat;     mask-position: left top, right top, left bottom, bottom right;     transition:          --m-0 0.3s,         --m-1 0.15s 0.1s,         --m-2 0.25s 0.21s,         --m-3 0.19s 0.15s; } div:hover {     --m-0: 0;     --m-1: 0;     --m-2: 0;     --m-3: 0; }
登錄后復制

這樣,我們就可以得到 4 塊分割圖片的 mask 消失效果:

CSS高階技巧:實現圖片漸隱消的多種方法

好,再依次類推,我們就可以得到分割為 9 塊的,分割為 16 塊的。由于代碼太多,就簡單看看效果:

CSS高階技巧:實現圖片漸隱消的多種方法

CodePen Demo — 基于 @property 和 mask 的圖片漸隱消失術

基于 SCSS 簡化代碼

那么,如果我們要分割為 100 塊呢?或者 400 塊呢?還要手寫這些代碼嗎?

當然不需要,由于上面的代碼的規律非常的明顯,我們可以借助預處理器很好的封裝整個效果。從而快速的實現切割成任意規則塊數的效果。

完整的代碼如下:

$count: 400; $sqrt: 20; $per: 100% / $sqrt; $width: 300px; $perWid: 15;  @for $i from 1 to ($count + 1) {     @property --m-#{$i} {        syntax: "<number>";        initial-value: 1;        inherits: false;     } } @function bgSet($n) {     $bg : radial-gradient(rgba(0, 0, 0, var(--m-1)), rgba(0, 0, 0, var(--m-1)));          @for $i from 2 through $n {                  $bg: $bg, radial-gradient(rgba(0, 0, 0, var(--m-#{$i})), rgba(0, 0, 0, var(--m-#{$i})));     }          @return $bg; } @function positionSet($n) {     $bgPosition: ();      @for $i from 0 through ($n) {            @for $j from 0 through ($n - 1) {               $bgPosition: $bgPosition, #{$i * $perWid}px #{$j * $perWid}px;         }     }          @return $bgPosition; } @function transitionSet($n) {     $transition: --m-1 0.1s 0.1s;      @for $i from 1 through $n {            $transition: $transition, --m-#{$i} #{random(500)}ms #{random(500)}ms;     }          @return $transition; } div {     width: $width;     height: $width;     background: url(image.jpg);     mask: bgSet($count);     mask-size: $per $per;     mask-repeat: no-repeat;     mask-position: positionSet($sqrt);      transition: transitionSet($count); } div:hover {     @for $i from 1 through $count {                  --m-#{$i}: 0;     } }
登錄后復制

這里,簡單解釋一下,以生成 400 塊小塊為例子:

  • 最上面的 SCSS 變量定義中,

    • $count 是我們最終生成的塊數
    • $sqrt 是每行以及每列會擁有的塊數
    • $per 是每一塊占整體圖片元素的百分比值
    • $width 是整個圖片的寬高值
    • $perWid 是每一塊的寬高值
  • 利用了最上面的一段循環函數,批量的生成 CSS @property 變量,從 --m-0--m-400

  • @function bgSet($n) {} 是生成 400 塊 mask 片段

  • @function positionSet($n) 是生成 400 塊 mask 的 mask-position,也就是生成 400 段不同定位,讓 400 塊 mask 剛好覆蓋整個圖片

  • @function transitionSet($n) {} 是隨機設置每個塊的動畫時間和延遲時間

  • 代碼最下面,還有一段循環函數,生成 400 個 CSS @property 變量的 hover 值,當 hover 的時候,全部變成 0

這樣,我們就實現了 400 分塊的漸隱效果。效果如下:

CSS高階技巧:實現圖片漸隱消的多種方法

CodePen Demo — 基于 @property 和 mask 的圖片漸隱消失術

調整過渡變量,控制方向

當然,上面我們的對每一個小塊的 transition 的過渡時間和過渡延遲時間的設置,都是隨機的:

@function transitionSet($n) {     $transition: --m-1 0.1s 0.1s;      @for $i from 1 through $n {            $transition: $transition, --m-#{$i} #{random(500)}ms #{random(500)}ms;     }          @return $transition; }
登錄后復制

我們完全可以通過一定的控制,讓過渡效果不那么隨機,譬如有一定的方向感。

下面,我們通過讓動畫的延遲時間與 $i,也就是 mask 小塊的 index 掛鉤:

@function transitionSet($n) {     $transition: --m-1 0.1s 0.1s;      @for $i from 1 through $n {            $transition: $transition, --m-#{$i} #{100 + random(500)}ms #{($i / 50) * random(100)}ms;     }          @return $transition; }
登錄后復制

那么,整個動畫的方向就是從左往右逐漸消失:

CSS高階技巧:實現圖片漸隱消的多種方法

CodePen Demo — 基于 @property 和 mask 的圖片漸隱消失術 2

當然,有意思的是,這個效果,不僅僅能夠運用在圖片上,它其實可以作用在任何元素之上!

譬如,我們有的只是一段純文本,同樣適用這個效果:

CSS高階技巧:實現圖片漸隱消的多種方法

CodePen Demo — 基于 @property 和 mask 的文本漸隱消失術

總結

到這里,簡單總結一下。本文,我們核心利用了 CSS @propery 和 mask,實現了一些原本看上去需要非常多 div 才能實現或者是需要借助 Canvas 才能實現的效果。同時,我們借助了 SCSS 預處理器,在尋找到規律后,極大的簡化了 CSS 代碼的書寫量。

到今天,強大的 CSS 已經允許我們去做越來越多更有意思的動效,CSS @propery 和 mask 這兩個屬性在現代 CSS 發揮了非常重要的作用,非常建議大家認真掌握以下這兩個屬性。

原文鏈接:https://juejin.cn/post/7167160342101884935

作者:chokcoco

(學習視頻分享:web前端)

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
日韩精品导航| 国产精品激情| 香蕉成人av| 亚洲成人va| 国产中文一区| 久久av一区| 日韩欧美中文字幕在线视频| 日韩成人av影视| 国产精品夜夜夜| 国产精品igao视频网网址不卡日韩 | 亚洲欧美伊人| 午夜在线视频观看日韩17c| 亚洲激情国产| 日本欧美韩国一区三区| 国产黄色一区| 亚洲天堂免费电影| 午夜在线视频观看日韩17c| 日韩精品三级| 麻豆理论在线观看| 免费视频亚洲| 日韩和欧美一区二区三区| 久久久久九九精品影院| 久久在线电影| 日韩精品国产精品| 手机在线电影一区| 亚洲一区二区三区免费在线观看 | 国产色综合网| 国产视频一区二区在线播放| 国产色播av在线| 视频一区欧美精品| 国产一区二区三区四区二区| 在线国产一区| 久久精品99国产国产精| 国产在线|日韩| 日本成人在线一区| 国产不卡人人| 国产视频一区三区| 国产欧美自拍一区| 九九久久婷婷| 国产美女亚洲精品7777| 91精品蜜臀一区二区三区在线 | www.com.cn成人| 亚洲欧美一级| 成人福利视频| 日韩av二区在线播放| 999精品一区| 久久国产人妖系列| 欧美美女一区| 精品亚洲a∨| 亚洲精品在线a| 色婷婷色综合| 日本成人一区二区| 在线 亚洲欧美在线综合一区| 免费在线成人| 日韩中文字幕一区二区高清99| 日韩欧美精品| 国产精品15p| 中文字幕亚洲精品乱码| 日本精品影院| 精品黄色一级片| 日韩欧美中文字幕电影| 美女久久久久| 丁香婷婷久久| 国产精品免费大片| 亚洲精品观看| 成人午夜国产| 韩国一区二区三区视频| 日韩av中文字幕一区二区三区| 午夜久久tv| 欧洲av不卡| 91麻豆国产自产在线观看亚洲| 91精品尤物| 中文字幕一区二区三区四区久久| 亚洲二区在线| 欧洲av不卡| 日韩一区欧美| 动漫av一区| 精品亚洲a∨一区二区三区18| 日韩不卡手机在线v区| 蜜桃视频在线观看一区二区| 久久精品1区| 97欧美在线视频| 精品一区二区男人吃奶| 国产精品极品在线观看| 国产欧美一区二区精品久久久 | 美女网站久久| 国产精品人人爽人人做我的可爱| 99国产精品免费视频观看| 亚洲1234区| 亚洲成人精品| 亚洲午夜久久久久久尤物| 日韩一区二区三区免费播放| 97精品97| 毛片在线网站| 韩国久久久久久| 五月激情久久| 在线日韩一区| 亚洲在线国产日韩欧美| 午夜久久福利| 日韩中文字幕麻豆| 日韩一区二区三区在线看| 少妇精品久久久一区二区| 日本在线一区二区三区| 人人爱人人干婷婷丁香亚洲| 国产亚洲电影| 精品免费视频| 日韩伦理在线一区| 91国语精品自产拍| 蜜桃视频一区二区三区| 免费观看在线综合色| 日本成人一区二区| 国产精品1区在线| 亚洲三级欧美| 日韩视频一区| 日韩av电影一区| 老司机精品视频网| 亚洲成人精品| 亚洲另类av| 欧美精品97| 国产91一区| 亚洲精品乱码日韩| 欧美激情麻豆| 欧美日韩第一| 欧美日一区二区在线观看| 久久国际精品| 国产福利电影在线播放| 黄页网站一区| 91av一区| av资源中文在线天堂| 国产综合激情| 亚洲精品动态| 韩国久久久久久| 蜜臀久久久久久久| 国产福利一区二区三区在线播放| 日本不良网站在线观看| 国产一区91| 国产精品草草| 国产成人精品亚洲日本在线观看| 亚洲综合小说| 国产精东传媒成人av电影| 日韩在线观看一区| 蜜桃传媒麻豆第一区在线观看| 国产乱码精品一区二区亚洲| 欧美成人基地| 国产免费久久| 婷婷综合五月| 久久影视三级福利片| 伊人成人网在线看| 麻豆精品在线观看| 久久av一区| 国产69精品久久| 亚洲午夜免费| 亚洲成人不卡| 国产另类在线| 波多野结衣一区| 久久精品亚洲一区二区| 久热re这里精品视频在线6| 国产aⅴ精品一区二区三区久久| 亚洲一区激情| 国产在线视频欧美一区| 久久亚洲国产精品一区二区| 国产91在线播放精品| 亚洲毛片视频| 91精品啪在线观看国产18| 国产免费av国片精品草莓男男 | 91精品国产调教在线观看| 欧美欧美黄在线二区| 在线观看精品| 欧美黄色精品| 亚洲日产国产精品| 在线日韩一区| 国产精品久久久久久久免费观看| 五月亚洲婷婷| 在线国产一区二区| 韩国久久久久久| 国产精久久久| 日韩精彩视频在线观看| 欧美日韩视频一区二区三区| 四季av一区二区凹凸精品| 亚洲精品影视| 99成人在线| 欧美+亚洲+精品+三区| 国语精品一区| 国产精品一区二区免费福利视频 | 野花国产精品入口| 日韩精品一区二区三区免费观看| 久久久久九九精品影院| 欧美日韩一区二区三区四区在线观看 | 综合国产精品| 国产模特精品视频久久久久| 婷婷激情久久| 在线观看精品| a日韩av网址| 欧美韩日一区| 高清av一区| 精品欧美日韩精品| 麻豆视频久久| 免费一级欧美片在线观看网站 | 国产精品白丝久久av网站| 日本视频在线一区|