91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

CSS怎么實現多屏復雜動畫效果

發布時間:2022-03-05 17:06:18 來源:億速云 閱讀:345 作者:iii 欄目:web開發

本篇內容介紹了“CSS怎么實現多屏復雜動畫效果”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

技巧一、使用animation-play-state控制每屏動畫播放

1. 類名active與動畫觸發

首先,使用active觸發每一屏的動畫,幾乎已經約定俗成,應該也建議成為默認的行業規范。

一般做法是,當對應一屏內容進入的時候,使用JS給容器添加類名active:

1

container.classList.add("active");

如果你做的動畫逼格較高,希望每次瀏覽這一屏內容的時候,動畫都走一遍,可以使用reflow重新觸發一下animation:

1

2

3

container.classList.remove("active");

container.offsetWidth=container.offsetWidth;

container.classList.add("active");

2. 類名active與動畫控制技巧

如何具體控制動畫的播放呢?我們通常第一反應是使用下面的方法實現,動畫的完整CSS代碼在active狀態下呈現,如:

1

2

3

4

5

6

7

8

.element1{/*尺寸與定位*/}

.element2{/*尺寸與定位*/}

.element3{/*尺寸與定位*/}

...

.active.element1{animate:name11s;}

.active.element2{animate:name21s;}

.active.element3{animate:name21s;}

...

從實現和功能上將,上面方法是很不錯的,通俗易懂,不易犯錯。不過我個人更喜歡使用配合CSS3的animation-play-state屬性對每屏動畫進行控制,實現如下:

動畫相關CSS代碼直接寫在元素上:

1

2

3

4

.element1{/*尺寸與定位*/animate:name11s;}

.element2{/*尺寸與定位*/animate:name21s;}

.element3{/*尺寸與定位*/animate:name31s;}

...

創建一個類名,如.animate,凡是使用到了animation動畫的元素都添加這個類名;

如下CSS代碼:

1

2

3

4

5

6

.animate{

animation-play-state:paused;

}

.active.animate{

animation-play-state:running;

}

之所以個人更喜歡后面的方法,是因為有一種“無侵入”的感覺,代碼層次清晰,控制關系明確。有利于后期的維護與擴展。

然而,使用animation-play-state還是有些需要注意的,對于IE10/IE11瀏覽器,animation-play-state是不能簡寫的。如:

1

.element{animate:shake4s2sbothinfinitepaused;}

只會讓整個CSS聲明掛掉的!如下寫法支持:

1

2

3

4

.element{

animate:shake4s2sbothinfinite;

animation-play-state:paused;

}

有人可能要奇怪了,怎么突然IE瀏覽器亂入了?

首先,我們不能無視主流手機之Windows Phone. 其次,帥氣的翻屏動畫并不是移動端專有,桌面端也適用。稍稍用力,桌面移動全適配,何樂而不為!

技巧二、不同狀態下的連續動畫

有時候,動畫可能不是一波流,分狀態。

關鍵點就是動畫分解與延時。

據我所知,沒辦法只使用一個keyframes關鍵幀聲明就實現這個效果,因為,這里有動畫狀態的變化:一個只執行一次的動畫和一個無限循環動畫。

怎么辦?我們可以將動畫分解,寫2個animation keyframes動畫關鍵幀描述。

1

2

@keyframesfadeIn{/*...*/}

@keyframesfloat{/*...*/}

① 提取公用動畫

這類多屏動畫是有N多元素同時執行不同的動畫。比方說,火箭是淡出,然后上下漂浮;火箭的火焰是淡出,然后大小變化;黑洞是淡出,然后左右隨波。你如何實現?

如果純粹借助animation語法,應該是:

1

2

3

.element1{animation:fadeIn1s,float.5s1sinfinite;}/*我淡出,需要1秒;我1秒后開始無限漂浮*/

.element2{animation:fadeIn1s,size.5s1sinfinite;}/*我淡出,需要1秒;我1秒后開始大小變化*/

.element3{animation:fadeIn1s,move.5s1sinfinite;}/*我淡出,需要1秒;我1秒后開始左右移動*/

可以看到,淡出是公用的動畫效果,我們可以借助嵌套標簽,實現公用語法的合并,方面后期維護:

1

2

3

4

.element-wrap{animation:fadeIn1s;}/*大家都1秒淡出*/

.element1{animation:float.5s1sinfinite;}/*我1秒后無限漂浮*/

.element2{animation:size.5s1sinfinite;}/*我1秒后忽大忽小*/

.element3{animation:move.5s1sinfinite;}/*我1秒后左右移動*/

②避免變換沖突

有個元素動畫是邊360度旋轉、邊放大(從0放大到100%),像這種具有典型特征的動畫我們顯然要獨立提取與公用的:

1

2

@keyframesspin{/*transform:rotate...*/}

@keyframeszoomIn{/*transform:scale...*/}

好了,現在問題來了,變放大邊旋轉:

1

.element{animation:spin1s,zoomIn1s;}/*旋轉:啊,完蛋啦,我被放大覆蓋啦!*/

由于都是使用transform, 發生了殘忍的覆蓋。當然,有好事的人會說,你使用zoom不就好了!確實,如果只是移動端,使用zoom確實棒棒噠!但是,我們這個企業活動,PC是主戰場,因此,FireFox瀏覽器(FF不識zoom)是不能無視的。

怎么辦?重新建一個名為spinZoomIn的動畫關鍵幀描述還是?

對啊,你直接外面套一層標簽不就萬事大吉了。

1

2

.element-wrap{animation:spin1s;}/*我轉轉轉*/

.element{animation:zoomIn1s;}/*我大大大*/

技巧三、無侵入定位和居中定位準則

1. 這里的“無侵入定位”指不受animation影響的元素定位,包含兩部分:一是不使用keyframes關鍵幀決定初始位置;二是不要使用keyframes中出現的屬性定位。

①. 不使用keyframes決定初始位置

應該都知道,CSS3   animation的fill-mode可以決定元素動畫結束前后的位置,也就是也具有定位的作用。此時,可能就會有小伙伴,故作聰明,利用animation  keyframes 0% {}或form  {}去做定位,貌似,還省了寫代碼。看上去很贊,實際上狹隘了,這對于對animation支持不佳或不支持的瀏覽器實際上是不友好的,例如Android2.3不支持animation-fill-mode,  IE6-IE9不支持CSS3  animation,于是乎,當遭遇這些瀏覽器的時候,頁面動畫元素的布局實際上是毀掉的。所以,這些動畫元素定位的時候,需要使用“無侵入定位”,也就是,就算頁面沒有animation,  我也是個“標致人兒”。

②. 不使用keyframes中出現的屬性定位

舉個例子,有個球,正好定位在模塊的中心,同時有個無限旋轉效果。使用transform:   translate(-50%,-50%)居中定位再合適不過了,不用我心里難受,于是,使用了transform定位。此時,沖突發生,旋轉動畫也是需要transform變換的。

1

2

3

4

@keyframesspin{

0%{transform:rotate(0);}

100%{transform:rotate(360deg);}

}

要么使用業界約定俗成spin覆蓋,要么另起爐灶沒法重用:

1

2

3

4

@keyframesspin-trans{

0%{transform:rotate(0)translate(-50%,-50%);}

100%{transform:rotate(360deg)translate(-50%,-50%);}

}

顯然,都是不合適的。建議使用傳統left/top/margin進行定位,與transform變換動畫“無侵入”。

2. 這里的“居中定位準則”包含兩部分:一是元素定位在容器中間位置;二是元素的定位方式為居中定位。

①. 元素定位在容器中間

容器以及容器內的動畫元素可以看成是一個動畫模塊,為了這個模塊可以輕松駕馭水平布局和垂直局部,里面的動畫元素形成的整體一定要在容器的中間,不要被設計稿或周圍環境影響。

舉個簡單例子,本文一開始展示的「企業QQ-新年祝福」活動。

企業產品用戶特點比較鮮明:一是訪問主要集中在桌面端,二是有70~80%用戶使用的是webkit/blink內核瀏覽器。所以,大家可以理解為何設計稿明明針對桌面端,卻有如此多細膩的動畫設計了。

故事是這樣的,桌面版做好了,1024-1224自適應,IE7以上都兼容(無侵入定位準則)(除了沒動畫),經驗分享:多屏復雜動畫CSS技巧三則!此時負責視覺的同學希望也能適配移動端,可以增加一定的傳播,我覺得挺好的,于是,決定通過技術手段,讓活動頁面能游走于桌面和移動之間,同時,保證各種動畫效果棒棒噠!

②. 定位方式為居中定位

所謂“居中定位”是相對“傳統定位”而言的。Web頁面中的模塊、文字什么的默認都是相對于左上角堆砌的,所以,很自然地,我們在重構頁面,做布局,寫交互效果的時候,也都是相對左上角定位。活用元素本身的定位特性,這是很贊的也推薦這么做!但是,如果你和多元素CSS動畫打交道,可能就需要改變下慣性思維了,很重要的一點就是“從以左上角為參考點變成以中心點為參考點”。

我們在實現多元素動畫效果時候,會出現兩類角色:一是容器;二是容器里面諸多動畫元素。

其中,對于容器元素,尤其在做移動端產品時候,我們很自然會讓其居中定位:

1

2

3

4

.container{

position:absolute;left:50%;top:50%;

transform:translate3d(-50%,-50%,0);

}

這樣,各種尺寸的手機,我們都能讓其居中顯示(大尺寸可能需要一定的縮放)。

但是,我們有沒有想過讓容器里面的諸多動畫元素也居中定位顯示呢?

用代碼來解釋就是從左上角定位(或右上角定位):

1

2

3

.example{

position:absolute;left:100px;top:100px;

}

變成中心點定位+ margin偏移:

1

2

3

4

.example{

position:absolute;left:50%;top:50%;

margin-left:-100px;margin-top:-100px;

}

“CSS怎么實現多屏復雜動畫效果”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

css
AI

中西区| 长治县| 淮南市| 英山县| 大新县| 睢宁县| 搜索| 六盘水市| 永顺县| 康保县| 永城市| 克什克腾旗| 沾化县| 泸西县| 武清区| 万载县| 武城县| 嵩明县| 南充市| 麦盖提县| 静安区| 佛山市| 甘谷县| 库车县| 临汾市| 贺兰县| 天祝| 平湖市| 通州市| 建湖县| 朝阳区| 宜章县| 郎溪县| 贵德县| 永新县| 西青区| 婺源县| 西宁市| 呼玛县| 德保县| 清镇市|