日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

CSS 實現3d輪播圖的一些思路,你學會了嗎?

來源: 責編: 時間:2024-07-03 17:21:20 171觀看
導讀最近在項目中碰到一個比較典型的3d輪播圖動效,如下所示:圖片說難不難,說簡單也不簡單,這是一個無限循環的輪播效果,并且個數是固定的,你會如何實現呢?原效果是通過vue的transition組件實現的,感覺有些笨重,思考了一番,發現純 CS
最近在項目中碰到一個比較典型的3d輪播圖動效,如下所示:

WAc28資訊網——每日最新資訊28at.com

圖片圖片WAc28資訊網——每日最新資訊28at.com

說難不難,說簡單也不簡單,這是一個無限循環的輪播效果,并且個數是固定的,你會如何實現呢?WAc28資訊網——每日最新資訊28at.com

原效果是通過vue的transition組件實現的,感覺有些笨重,思考了一番,發現純 CSS也能實現這樣的效果,而且性能更好,實現也更簡潔,一起來看看吧!WAc28資訊網——每日最新資訊28at.com

一、CSS 動畫實現思路

首先來分析一下思路??粗且粋€連貫的輪播效果,其實單獨看每一個子項,都是完全相同的運動軌跡。WAc28資訊網——每日最新資訊28at.com

圖片圖片WAc28資訊網——每日最新資訊28at.com

然后是這個動畫,其實就是6個關鍵幀,逐一去位移和縮放,如下:WAc28資訊網——每日最新資訊28at.com

圖片圖片WAc28資訊網——每日最新資訊28at.com

然后給每個子項不同的“負延遲”,是不是就剛好錯開,形成一個完整的輪播效果了呢?WAc28資訊網——每日最新資訊28at.com

無論CSS怎么實現,動畫原理就這些了,下面來看幾個實現方式WAc28資訊網——每日最新資訊28at.com

二、CSS 動畫關鍵幀

首先簡單布局一下,先用一個元素實現動畫;WAc28資訊網——每日最新資訊28at.com

<div class="item"></div>

加點修飾;WAc28資訊網——每日最新資訊28at.com

html,body{  font-family: -apple-system, "BlinkMacSystemFont", sans-serif;  margin: 0;  height: 100%;  display: flex;  justify-content: center;  flex-direction: column;  align-items: center;  background: aliceblue;  counter-reset: num;}.item{  position: absolute;  display: grid;  place-content: center;  width: 100px;  height: 100px;  border-radius: 8px;  background-color: #3E65FF;  color: #fff;  font-size: 30px;  counter-increment: num;}

這里的數字是用CSS計數器生成的,效果如下:WAc28資訊網——每日最新資訊28at.com

圖片圖片WAc28資訊網——每日最新資訊28at.com

根據前面的關鍵幀,很容易用代碼實現,就是。WAc28資訊網——每日最新資訊28at.com

.item{  animation: slide 12s infinite;}@keyframes slide {  0%,100% {    transform: translate(0%, 0%) scale(1);  }  16.67% {    transform: translate(120%, -30%) scale(0.9);  }  33.33% {    transform: translate(100%, -70%) scale(0.8);  }  50% {    transform: translate(0, -90%) scale(0.7);  }  66.67% {    transform: translate(-100%, -70%) scale(0.8);  }  83.33% {    transform: translate(-120%, -30%) scale(0.9);  }}

這里的16.67%關鍵幀是將100%進行6等分得到的,如下所示:WAc28資訊網——每日最新資訊28at.com

圖片圖片WAc28資訊網——每日最新資訊28at.com

效果如下:WAc28資訊網——每日最新資訊28at.com

圖片圖片WAc28資訊網——每日最新資訊28at.com

雖然有動畫了,但是效果有點奇怪,每次改變位置的時候好像沒有停頓,顯得過渡有些緩慢,只是有減速和加速的過程,這是默認的ease-in-out的淡入淡出緩沖效果。WAc28資訊網——每日最新資訊28at.com

那么,如何拉開一定的間隔呢?也就是希望每次運動的快一點,然后停留一會。其實也很簡單,在之前的每個關鍵點前再添加一個相同的關鍵幀,比如在16.67%的前面一點6.67%,由于是相同的,所以這段時間內是沒有動畫的,也就相當于停留了一會。WAc28資訊網——每日最新資訊28at.com

圖片圖片WAc28資訊網——每日最新資訊28at.com

用代碼實現就是:WAc28資訊網——每日最新資訊28at.com

@keyframes slide {  0%,90%,100% {    transform: translate(0%, 0%) scale(1);  }  6.67%,  16.67% {    transform: translate(120%, -30%) scale(0.9);  }  23.33%,  33.33% {    transform: translate(100%, -70%) scale(0.8);  }  40%,  50% {    transform: translate(0, -90%) scale(0.7);  }  56.67%,  66.67% {    transform: translate(-100%, -70%) scale(0.8);  }  73.33%,  83.33% {    transform: translate(-120%, -30%) scale(0.9);  }}

這樣是不是就好多了?WAc28資訊網——每日最新資訊28at.com

圖片圖片WAc28資訊網——每日最新資訊28at.com

實現了一個,多個子元素也就好辦了。WAc28資訊網——每日最新資訊28at.com

<div class="item" style="--i: 0"></div><div class="item" style="--i: 1"></div><div class="item" style="--i: 2"></div><div class="item" style="--i: 3"></div><div class="item" style="--i: 4"></div><div class="item" style="--i: 5"></div>

我們給每個子元素加個CSS變量,然后給每個動畫加個“負延遲”,讓這個動畫提前運行到指定位置;WAc28資訊網——每日最新資訊28at.com

.item{   animation: slide 12s calc(-2s * var(--i)) infinite;}

效果如下:WAc28資訊網——每日最新資訊28at.com

基本就實現這個這個輪播動畫,不過層級還有點問題。WAc28資訊網——每日最新資訊28at.com

所以還需要再關鍵幀里加入層級變化;WAc28資訊網——每日最新資訊28at.com

@keyframes slide {  0%,90%,100% {    z-index: 4;    transform: translate(0%, 0%) scale(1);  }  6.67%,  16.67% {    z-index: 3;    transform: translate(120%, -30%) scale(0.9);  }  23.33%,  33.33% {    z-index: 2;    transform: translate(100%, -70%) scale(0.8);  }  40%,  50% {    z-index: 1;    transform: translate(0, -90%) scale(0.7);  }  56.67%,  66.67% {    z-index: 2;    transform: translate(-100%, -70%) scale(0.8);  }  73.33%,  83.33% {    z-index: 3;    transform: translate(-120%, -30%) scale(0.9);  }}

這樣就完美了。WAc28資訊網——每日最新資訊28at.com

這種實現兼容性最好,只用到了 CSS 動畫,兼容市面所有瀏覽器,可以放心使用WAc28資訊網——每日最新資訊28at.com

  • CSS 3d swiper (codepen.io)[1]
  • CSS 3d swiper (juejin.cn)[2]

三、CSS @property

其實目前來說,用上面這種方式就足夠了,沒有任何問題。WAc28資訊網——每日最新資訊28at.com

不過,上面對于中間停頓的處理方式可能有些繁瑣,下面再介紹另一種思路,可能更符合常規。WAc28資訊網——每日最新資訊28at.com

先思考一下,如果是用 JS要如何實現?是不是可以直接每隔2秒改變位移和縮放,然后通過transition實現過渡效果?WAc28資訊網——每日最新資訊28at.com

首先,我們還是需要像之前一樣,定義一些關鍵幀,不過不是直接改變位移和縮放,而是改變一些 CSS變量。WAc28資訊網——每日最新資訊28at.com

@keyframes slide {  0%,100% {    --translate: 0,0;    --scale: 1;    --z: 4;  }  16.67% {    --translate: 120%,-30%;    --scale: 0.9;    --z: 3;  }  33.33% {    --translate: 100%,-70%;    --scale: 0.8;    --z: 2;  }  50% {    --translate: 0%,-90%;    --scale: 0.7;    --z: 1;  }  66.67% {    --translate: -100%,-70%;    --scale: 0.8;    --z: 2;  }  83.33% {    --translate: -120%,-30%;    --scale: 0.9;    --z: 3;  }}

然后每個子項就需要用transfrom來應用這些變量了;WAc28資訊網——每日最新資訊28at.com

.item{  transform: translate(var(--translate)) scale(var(--scale));  transition: .5s transform;  animation: slide 12s calc(-2s * var(--i)) infinite;}

我們來看看效果:WAc28資訊網——每日最新資訊28at.com

好像并沒有過渡動畫?這是因為animation覆蓋了transition,所以需要分離開來,我們嵌套一層父級。WAc28資訊網——每日最新資訊28at.com

<div class="item-wrap" style="--i: 0">  <div class="item"></div></div><div class="item-wrap" style="--i: 1">  <div class="item"></div></div><div class="item-wrap" style="--i: 2">  <div class="item"></div></div><div class="item-wrap" style="--i: 3">  <div class="item"></div></div><div class="item-wrap" style="--i: 4">  <div class="item"></div></div><div class="item-wrap" style="--i: 5">  <div class="item"></div></div>

然后將動畫寫在父級上;WAc28資訊網——每日最新資訊28at.com

.item-wrap{  animation: slide 12s calc(-2s * var(--i)) infinite;  display: contents;}

這樣就不影響了,效果如下:WAc28資訊網——每日最新資訊28at.com

不過還是有點怪怪的。這是因為animation的默認效果也是ease-in-out,所以有這種漸入漸出的效果。我們需要瞬間變化,不需要過渡效果,因為過渡效果可以由transition完成。WAc28資訊網——每日最新資訊28at.com

這里我們可以用steps來實現,steps(1)表示直接切換,中間沒有任何過渡。WAc28資訊網——每日最新資訊28at.com

.item-wrap{  animation: slide 12s calc(-2s * var(--i)) steps(1) infinite;}

這樣效果就和前面基本一致了。WAc28資訊網——每日最新資訊28at.com

你也可以訪問以下鏈接來查看實際效果:WAc28資訊網——每日最新資訊28at.com

  • CSS 3d swiper @property (codepen.io)[3]
  • CSS 3d swiper @property (juejin.cn)[4]

雖然里面沒有提到CSS @property,但實際上是依賴這個特性的,因此兼容性稍差,需要Safari 16.4+,Firefox目前還不支持。WAc28資訊網——每日最新資訊28at.com

四、CSS 樣式查詢

拋開兼容性,其實還有一種方式可以實現,而且更容易理解,也更符合JS的思路。WAc28資訊網——每日最新資訊28at.com

我們要做的動畫很簡單,只需要改變一個 CSS變量就行,如下:WAc28資訊網——每日最新資訊28at.com

@property --index {  syntax: "<number>";  initial-value: 0;  inherits: false;}@keyframes slide {  0% {    --index: 0;  }  100% {    --index: 6;  }}

通過@property可以讓--index變量從0→6一次變化。WAc28資訊網——每日最新資訊28at.com

關于這個技巧,之前在多篇文章中都有提到。WAc28資訊網——每日最新資訊28at.com

你可能不需要 JS!CSS實現一個計時器。WAc28資訊網——每日最新資訊28at.com

如何讓CSS計數器支持小數的動態變化?WAc28資訊網——每日最新資訊28at.com

還在使用定時器嗎?CSS 也能實現電子時鐘。WAc28資訊網——每日最新資訊28at.com

動畫合成小技巧!CSS 實現動感的倒計時效果。WAc28資訊網——每日最新資訊28at.com

自定義計數器小技巧!CSS 實現長按點贊累積動畫。WAc28資訊網——每日最新資訊28at.com

WAc28資訊網——每日最新資訊28at.com

實現如下:WAc28資訊網——每日最新資訊28at.com

.item-wrap{  display: contents;  animation: slide 12s calc(-2s * var(--i)) steps(6) infinite;}

這樣就實現了一個--index不斷變化的動畫。WAc28資訊網——每日最新資訊28at.com

當然僅僅只是這樣還不夠,我們需要根據這個變量來匹配具體的樣式,這就要用到CSS樣式查詢了,具體實現如下:WAc28資訊網——每日最新資訊28at.com

@container style(--index: 0) {  .item {    transform: translate(0, 0) scale(1);    z-index: 4;  }}@container style(--index: 1) {  .item {    transform: translate(120%, -30%) scale(0.9);    z-index: 3;  }}@container style(--index: 2) {  .item {    transform: translate(100%, -70%) scale(0.8);    z-index: 2;  }}@container style(--index: 3) {  .item {    transform: translate(0, -90%) scale(0.7);    z-index: 1;  }}@container style(--index: 4) {  .item {    transform: translate(-100%, -70%) scale(0.8);    z-index: 2;  }}@container style(--index: 5) {  .item {    transform: translate(-120%, -30%) scale(0.9);    z-index: 3;  }}

這段應該很好理解,比如@container style(--index: 5) 表示,當查詢到--index為5的時候,下面的樣式就生效了,非常像通過 JS 來改變類名一樣,這種方式也能實現類似的效果。WAc28資訊網——每日最新資訊28at.com

你也可以訪問以下鏈接來查看實際效果:WAc28資訊網——每日最新資訊28at.com

  • CSS 3d swiper @style (codepen.io)[5]
  • CSS 3d swiper @style (juejin.cn)[6]

由于要用到樣式查詢,所以兼容性更差一點,需要Chrome 111+,酌情使用。WAc28資訊網——每日最新資訊28at.com

五、總結一下

以上就是本文的全部內容了,共介紹了3種不同的實現思路,兼容性從高到低,大家可以自行選擇。WAc28資訊網——每日最新資訊28at.com

對了,還有一點,有時候我們需要鼠標hover時暫停動畫,這個就體現出CSS的優勢了,直接用:hover實現,類似這樣WAc28資訊網——每日最新資訊28at.com

.wrap:hover .item{    animation-play-state: paused;}

下面總結一下實現要點:WAc28資訊網——每日最新資訊28at.com

  1. 整體看著是一個連貫的輪播效果,其實單獨看每一個子項,都是完全相同的運動軌跡。
  2. 給每個子項不同的“負延遲”,就能形成一個完整的輪播效果。
  3. 動畫本質上是6個關鍵幀,只是位移和縮放的變化。
  4. 直接使用關鍵幀雖然有動畫,但是效果有點奇怪,每次改變位置的時候好像沒有停頓,顯得過渡有些緩慢。
  5. 可以手動在每個關鍵點前再添加一個相同的關鍵幀,手動停頓一下。
  6. 給每個子元素加個CSS變量,通過這個變量可以計算每個動畫的“負延遲”,讓這個動畫提前運行到指定。
  7. 我們還定義一些關鍵幀,不過不是直接改變位移和縮放,而是改變一些 CSS變量。
  8. 這樣可以實現每隔2秒改變位移和縮放,然后通過transition實現過渡效果。
  9. 這種思路依賴CSS @property,兼容性稍差,需要Safari 16.4+,Firefox目前還不支持。
  10. 還可以通過樣式查詢,自動匹配每種變量的位移和縮放,更符合常規思路,需要Chrome 111+

本文鏈接:http://www.www897cc.com/showinfo-26-98557-0.htmlCSS 實現3d輪播圖的一些思路,你學會了嗎?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 六個常見的 Go 接口設計錯誤

下一篇: 掌握 Python:15 個關于字符串操作的神級單行代碼

標簽:
  • 熱門焦點
  • 7月安卓手機性能榜:紅魔8S Pro再奪榜首

    7月份的手機市場風平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領先版處理器的新機之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機廠商修整的時間,進入8月份之
  • 28個SpringBoot項目中常用注解,日常開發、求職面試不再懵圈

    前言在使用SpringBoot開發中或者在求職面試中都會使用到很多注解或者問到注解相關的知識。本文主要對一些常用的注解進行了總結,同時也會舉出具體例子,供大家學習和參考。注解
  • 把LangChain跑起來的三個方法

    使用LangChain開發LLM應用時,需要機器進行GLM部署,好多同學第一步就被勸退了,那么如何繞過這個步驟先學習LLM模型的應用,對Langchain進行快速上手?本片講解3個把LangChain跑起來
  • 多線程開發帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開https://start.spring.io/,按照屏幕截圖中的內容創建項目,添加 Spring Web 依賴項,并單擊“生成”按鈕下載 .zip 文件,為下一步做準備。請在進入步驟2之前進行解壓。圖
  • 年輕人的“職場羞恥感”,無處不在

    作者:馮曉亭 陶 淘 李 欣 張 琳 馬舒葉來源:燃次元&ldquo;人在職場,應該選擇什么樣的著裝?&rdquo;近日,在網絡上,一個與著裝相關的帖子引發關注,在該帖子里,一位在高級寫字樓亞洲金
  • 信通院:小米、華為等11家應用商店基本完成APP簽名及驗簽工作

    中國信通院表示,目前,小米、華為、OPPO、vivo、360手機助手、百度手機助手、應用寶、豌豆莢和努比亞等9家應用商店,以及抖音和快手2家新型應用分發平
  • 機構稱Q2全球智能手機出貨量同比下滑11% 蘋果份額依舊第2

    7月20日消息,據外媒報道,研究機構的報告顯示,由于需求下滑,今年二季度全球智能手機的出貨量,同比下滑了11%,三星、蘋果等主要廠商的銷量,較去年同期均有下
  • 由于成本持續增加,筆記本產品價格預計將明顯上漲

    根據知情人士透露,由于材料、物流等成本持續增加,筆記本產品價格預計將在2021年下半年有明顯上漲。進入6月下旬以來,全球半導體芯片缺貨情況加劇,顯卡、處理器
Top 主站蜘蛛池模板: 腾冲县| 黄陵县| 泽库县| 北辰区| 洛宁县| 乌兰察布市| 长宁区| 上饶市| 武功县| 同心县| 广东省| 连城县| 沽源县| 江口县| 玉山县| 永仁县| 绥芬河市| 杭州市| 洛浦县| 吐鲁番市| 辽中县| 米易县| 吴堡县| 花莲市| 兴城市| 迁安市| 公主岭市| 钟祥市| 宁明县| 什邡市| 灵璧县| 丹阳市| 嘉定区| 青龙| 资阳市| 临沭县| 安丘市| 三都| 无锡市| 长顺县| 金湖县|