国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
CSS滑塊系列
基本設置
訣竅是什麼?
解剖動畫
好吧,我迷路了。那麼所有邏輯都是錯的嗎?
哦,不,這永遠不會結(jié)束!
支持任意數(shù)量的圖像
總結(jié)
首頁 web前端 css教學 CSS無限滑塊翻過寶麗來圖像

CSS無限滑塊翻過寶麗來圖像

Mar 09, 2025 pm 12:28 PM

CSS Infinite Slider Flipping Through Polaroid Images

上一篇文章中,我們製作了一個非??犰诺男⌒突瑝K(或者如果您更喜歡的話,可以稱之為“旋轉(zhuǎn)木馬”),它以圓形方向旋轉(zhuǎn)。這次,我們將製作一個可以翻閱寶麗來圖片堆棧的滑塊。

很酷吧?先別看代碼,因為有很多東西需要解釋。加入我吧?

CSS滑塊系列

  • 圓形旋轉(zhuǎn)圖片滑塊
  • 寶麗來圖片翻頁 (您現(xiàn)在所處位置!)
  • 無限3D滑塊

基本設置

此滑塊的大部分HTML和CSS與我們上次製作的圓形滑塊類似。事實上,我們使用的是完全相同的標記:

<code><div>
  <img alt="" src=""><img alt="" src=""><img alt="" src=""><img alt="" src="">
</div></code>

這是基本的CSS,它將我們的父級.gallery容器設置為網(wǎng)格,所有圖像都在彼此之上堆疊:

<code>.gallery  {
  display: grid;
  width: 220px; /* 控制大小 */
}
.gallery > img {
  grid-area: 1 / 1;
  width: 100%;
  aspect-ratio: 1;
  object-fit: cover;
  border: 10px solid #f2f2f2;
  box-shadow: 0 0 4px #0007;
}</code>

到目前為止,沒有什麼複雜的。即使對於寶麗來風格的圖像,我使用的也只是邊框和陰影。您可能能夠做得更好,因此請隨意嘗試這些裝飾樣式!我們將把大部分精力放在動畫上,這是最棘手的部分。

訣竅是什麼?

此滑塊的邏輯依賴於圖像的堆疊順序——是的,我們將使用z-index。所有圖像都以相同的z-index值(2)開始,這將使堆棧中的最後一張圖像位於頂部。

我們?nèi)∽钺嵋粡垐D像,將其向右滑動,直到顯示堆棧中的下一張圖像。然後我們降低圖像的z-index值,然後將其滑回卡組。由於它的z-index值低於其餘圖像,因此它成為堆棧中的最後一張圖像。

這是一個簡化的演示,它展示了這個技巧。將鼠標懸停在圖像上以激活動畫:

現(xiàn)在,想像一下相同的技巧應用於所有圖像。如果我們使用:nth-child()偽選擇器來區(qū)分圖像,那麼這就是模式:

  • 我們滑動最後一張圖像 (N)。下一張圖像可見 (N - 1)。
  • 我們滑動下一張圖像 (N - 1)。下一張圖像可見 (N - 2)
  • 我們滑動下一張圖像 (N - 2)。下一張圖像可見 (N - 3)
  • (我們繼續(xù)相同的過程,直到到達第一張圖像)
  • 我們滑動第一張圖像 (1)。最後一張圖像 (N) 再次可見。

這就是我們的無限滑塊!

解剖動畫

如果您還記得上一篇文章,我只定義了一個動畫並使用延遲來控制每張圖像。我們在這裡也將做同樣的事情。讓我們首先嘗試可視化動畫的時間線。我們將從三張圖像開始,然後將其推廣到任意數(shù)量 (N) 的圖像。

我們的動畫分為三個部分:“向右滑動”、“向左滑動”和“不動”。我們可以很容易地識別每張圖像之間的延遲。如果我們認為第一張圖像從 0s 開始,並且持續(xù)時間等於 6s,那麼第二張圖像將從 -2s 開始,第三張圖像將從 -4s 開始。

<code><div>
  <img alt="" src=""><img alt="" src=""><img alt="" src=""><img alt="" src="">
</div></code>

我們還可以看到,“不動”部分佔據(jù)了整個動畫的三分之二 (2*100%/3),而“向右滑動”和“向左滑動”部分一起佔據(jù)了三分之一——因此,每個部分都等於總動畫的 100%/6。

我們可以這樣編寫動畫關(guān)鍵幀:

<code>.gallery  {
  display: grid;
  width: 220px; /* 控制大小 */
}
.gallery > img {
  grid-area: 1 / 1;
  width: 100%;
  aspect-ratio: 1;
  object-fit: cover;
  border: 10px solid #f2f2f2;
  box-shadow: 0 0 4px #0007;
}</code>

120% 是一個任意值。我需要一個大於 100% 的值。圖像需要向右滑動,遠離其餘圖像。為此,它需要移動至少其大小的 100%。這就是我選擇 120% 的原因——以獲得一些額外的空間。

現(xiàn)在我們需要考慮z-index。別忘了,我們需要在圖像滑出堆棧之後和滑回堆棧底部之前更新圖像的z-index值。

<code>.gallery > img:nth-child(2) { animation-delay: -2s; } /* -1 * 6s / 3 */
.gallery > img:nth-child(3) { animation-delay: -4s; } /* -2 * 6s / 3 */</code>

我們不是在時間線上的 16.67% (100%/6) 點定義一個狀態(tài),而是在幾乎相同的點 (16.66% 和 16.67%) 定義兩個狀態(tài),其中z-index值在我們將圖像滑回卡組之前降低。

這就是我們將所有這些結(jié)合在一起時發(fā)生的情況:

嗯,滑動部分似乎工作正常,但是堆疊順序全部混亂了!動畫開始得很好,因為頂部的圖像正在移動到後面……但是後續(xù)的圖像並沒有跟上。如果您注意到,序列中的第二張圖像在下一張圖像閃爍到其頂部之前返回到堆棧頂部。

我們需要仔細跟蹤z-index的變化。最初,所有圖像的z-index都是:2。這意味著堆疊順序應該是……

<code>@keyframes slide {
  0%     { transform: translateX(0%); }
  16.67% { transform: translateX(120%); }
  33.34% { transform: translateX(0%); }
  100%   { transform: translateX(0%); } 
}</code>

我們滑動第三張圖像並將其z-index更新為:

<code>@keyframes slide {
  0%     { transform: translateX(0%);   z-index: 2; }
  16.66% { transform: translateX(120%); z-index: 2; }
  16.67% { transform: translateX(120%); z-index: 1; } /* 我們在這里更新 z-order */
  33.34% { transform: translateX(0%);   z-index: 1; }
  100%   { transform: translateX(0% );  z-index: 1; }  
}</code>

我們對第二張圖像也這樣做:

<code>我們的眼睛 ? --> 第三張 (2) | 第二張 (2) | 第一張 (2)</code>

……以及第一張圖像:

<code>我們的眼睛 ? --> 第二張 (2) | 第一張 (2) | 第三張 (1)</code>

我們這樣做,一切似乎都很好。但實際上並非如此!當?shù)谝粡垐D像移動到後面時,第三張圖像將開始另一個迭代,這意味著它返回到z-index:2:

<code>我們的眼睛 ? --> 第一張 (2) | 第三張 (1) | 第二張 (1)</code>

因此,實際上我們根本沒有所有圖像的z-index:2!當圖像沒有移動(即動畫的“不動”部分)時,z-index為 1。如果我們滑動第三張圖像並將其z-index值從 2 更新為 1,它將保留在頂部!當所有圖像具有相同的z-index時,源順序中的最後一個圖像——在這種情況下是我們的第三張圖像——位於堆棧頂部?;瑒拥谌龔垐D像會導致以下結(jié)果:

<code>我們的眼睛 ? --> 第三張 (1) | 第二張 (1) | 第一張 (1)</code>

第三張圖像仍然位於頂部,之後,當它的動畫以z-index:2 重新啟動時,我們將第二張圖像移動到頂部:

<code><div>
  <img alt="" src=""><img alt="" src=""><img alt="" src=""><img alt="" src="">
</div></code>

一旦我們滑動它,我們得到:

<code>.gallery  {
  display: grid;
  width: 220px; /* 控制大小 */
}
.gallery > img {
  grid-area: 1 / 1;
  width: 100%;
  aspect-ratio: 1;
  object-fit: cover;
  border: 10px solid #f2f2f2;
  box-shadow: 0 0 4px #0007;
}</code>

然後第一張圖像將跳到頂部:

<code>.gallery > img:nth-child(2) { animation-delay: -2s; } /* -1 * 6s / 3 */
.gallery > img:nth-child(3) { animation-delay: -4s; } /* -2 * 6s / 3 */</code>

好吧,我迷路了。那麼所有邏輯都是錯的嗎?

我知道,這很令人困惑。但是我們的邏輯並不完全錯誤。我們只需要稍微糾正一下動畫即可使一切按我們想要的方式工作。訣竅在於正確重置z-index。

讓我們考慮第三張圖像位於頂部的這種情況:

<code>@keyframes slide {
  0%     { transform: translateX(0%); }
  16.67% { transform: translateX(120%); }
  33.34% { transform: translateX(0%); }
  100%   { transform: translateX(0%); } 
}</code>

我們看到滑動第三張圖像並更改其z-index會使其保持在頂部。我們需要做的是更新第二張圖像的z-index。因此,在我們滑動第三張圖像遠離卡組之前,我們將第二張圖像的z-index更新為 2。

換句話說,我們在動畫結(jié)束之前重置第二張圖像的z-index

綠色加號表示將z-index增加到 2,紅色減號與z-index:1 相關(guān)。第二張圖像以z-index:2 開始,然後當它從卡組中滑出時,我們將它更新為 1。但在第一張圖像從卡組中滑出之前,我們將第二張圖像的z-index更改回 2。這將確保兩張圖像具有相同的z-index,但是,第三張圖像將仍然位於頂部,因為它在DOM中出現(xiàn)較晚。但在第三張圖像滑動並更新其z-index之後,它會移動到底部。

這是動畫的三分之二,因此讓我們相應地更新關(guān)鍵幀:

<code>@keyframes slide {
  0%     { transform: translateX(0%);   z-index: 2; }
  16.66% { transform: translateX(120%); z-index: 2; }
  16.67% { transform: translateX(120%); z-index: 1; } /* 我們在這里更新 z-order */
  33.34% { transform: translateX(0%);   z-index: 1; }
  100%   { transform: translateX(0% );  z-index: 1; }  
}</code>

好了一點,但仍然不夠好。還有一個問題……

哦,不,這永遠不會結(jié)束!

別擔心,我們不會再次更改關(guān)鍵幀,因為這個問題只在涉及最後一張圖像時才會發(fā)生。我們可以為最後一張圖像製作一個“特殊”的關(guān)鍵幀動畫來修復問題。

當?shù)谝粡垐D像位於頂部時,我們有以下情況:

<code>我們的眼睛 ? --> 第三張 (2) | 第二張 (2) | 第一張 (2)</code>

考慮到我們之前所做的調(diào)整,在第一張圖像滑動之前,第三張圖像將跳到頂部。這只會發(fā)生在這種情況下,因為在第一張圖像之後移動的下一張圖像是 DOM 中順序較高的最後一張圖像。其餘圖像很好,因為我們有 N,然後是 N - 1,然後我們從 3 到 2,從 2 到 1……但然後我們從 1 到 N。

為了避免這種情況,我們將對最後一張圖像使用以下關(guān)鍵幀:

<code>我們的眼睛 ? --> 第二張 (2) | 第一張 (2) | 第三張 (1)</code>

我們在動畫進行到 5/6 時(而不是三分之二)重置z-index值,此時第一張圖像已移出堆棧。所以我們看不到任何跳躍!

成功!我們的無限滑塊現(xiàn)在完美無缺了!這是我們最終代碼的全部內(nèi)容:

<code>我們的眼睛 ? --> 第一張 (2) | 第三張 (1) | 第二張 (1)</code>

支持任意數(shù)量的圖像

現(xiàn)在我們的動畫適用於三張圖像,讓我們使其適用於任意數(shù)量 (N) 的圖像。但首先,我們可以通過將動畫拆分來稍微優(yōu)化我們的工作,以避免冗餘:

<code><div>
  <img alt="" src=""><img alt="" src=""><img alt="" src=""><img alt="" src="">
</div></code>

現(xiàn)在代碼更易於閱讀和維護了!我們?yōu)榛瑒硬糠盅u作一個動畫,為z-index更新製作另一個動畫。請注意,我們在z-index動畫上使用steps(1)。這是因為我希望突然更改z-index值,與滑動動畫不同,在滑動動畫中我們希望平滑移動。

現(xiàn)在代碼更易於閱讀和維護,我們可以更好地了解如何支持任意數(shù)量的圖像。我們需要做的是更新動畫延遲和關(guān)鍵幀的百分比。延遲很容易,因為我們可以使用我們在上一篇文章中製作的完全相同的循環(huán)來支持圓形滑塊中的多個圖像:

<code>.gallery  {
  display: grid;
  width: 220px; /* 控制大小 */
}
.gallery > img {
  grid-area: 1 / 1;
  width: 100%;
  aspect-ratio: 1;
  object-fit: cover;
  border: 10px solid #f2f2f2;
  box-shadow: 0 0 4px #0007;
}</code>

這意味著我們正在從普通的CSS轉(zhuǎn)向Sass。接下來,我們需要想像一下時間線如何隨著 N 張圖像而變化。別忘了動畫分為三個階段:

在“向右滑動”和“向左滑動”之後,圖像應該保持不動,直到其餘圖像完成序列。因此,“不動”部分需要花費與 (N - 1) 相同的時間作為“向右滑動”和“向左滑動”。在一個迭代中,N 張圖像將滑動。因此,“向右滑動”和“向左滑動”都佔據(jù)總動畫時間線的 100%/N。 “向右滑動”和“向左滑動”都佔據(jù)總動畫時間線的 100%/N。圖像在 (100%/N)/2 時從堆棧中滑出,並在 100%/N 時滑回。

我們可以更改這個:

<code>.gallery > img:nth-child(2) { animation-delay: -2s; } /* -1 * 6s / 3 */
.gallery > img:nth-child(3) { animation-delay: -4s; } /* -2 * 6s / 3 */</code>

……到這個:

<code>@keyframes slide {
  0%     { transform: translateX(0%); }
  16.67% { transform: translateX(120%); }
  33.34% { transform: translateX(0%); }
  100%   { transform: translateX(0%); } 
}</code>

如果我們將 N 替換為 3,當堆棧中有 3 張圖像時,我們將得到 16.67% 和 33.33%。堆疊順序的邏輯相同,我們將有:

<code>@keyframes slide {
  0%     { transform: translateX(0%);   z-index: 2; }
  16.66% { transform: translateX(120%); z-index: 2; }
  16.67% { transform: translateX(120%); z-index: 1; } /* 我們在這里更新 z-order */
  33.34% { transform: translateX(0%);   z-index: 1; }
  100%   { transform: translateX(0% );  z-index: 1; }  
}</code>

我們?nèi)匀恍枰?66.33% 的點。這應該是圖像在動畫結(jié)束之前重置其z-index的地方。與此同時,下一張圖像開始滑動。由於滑動部分需要 100%/N,因此重置應該發(fā)生在 100% - 100%/N:

<code>我們的眼睛 ? --> 第三張 (2) | 第二張 (2) | 第一張 (2)</code>

但是為了使我們的z-order-last動畫工作,它應該在序列中稍後發(fā)生。還記得我們對最後一張圖像所做的修復嗎?重置z-index值需要在第一張圖像移出堆棧時發(fā)生,而不是在它開始滑動時發(fā)生。我們可以在關(guān)鍵幀中使用相同的推理:

<code>我們的眼睛 ? --> 第二張 (2) | 第一張 (2) | 第三張 (1)</code>

我們完成了!以下是使用五張圖像時得到的結(jié)果:

我們可以添加一點旋轉(zhuǎn)來使事情變得更漂亮:

我所做的只是將rotate(var(--r))附加到transform屬性。在循環(huán)中,--r使用隨機角度定義:

<code>我們的眼睛 ? --> 第一張 (2) | 第三張 (1) | 第二張 (1)</code>

旋轉(zhuǎn)會產(chǎn)生小的故障,因為我們有時可以看到一些圖像跳到堆棧的後面,但這並不重要。

總結(jié)

所有這些z-index工作都是一個巨大的平衡行為,對吧?如果您在此練習之前不確定堆疊順序的工作方式,那麼您現(xiàn)在可能對它有了更好的了解!如果您發(fā)現(xiàn)某些解釋難以理解,我強烈建議您再次閱讀本文並使用鉛筆和紙張繪製內(nèi)容。嘗試使用不同數(shù)量的圖像來說明動畫的每個步驟,以更好地理解這個技巧。

上次,我們使用了一些幾何技巧來創(chuàng)建一個圓形滑塊,該滑塊在完成一個完整序列後旋轉(zhuǎn)回第一張圖像。這次,我們使用z-index完成了類似的技巧。在這兩種情況下,我們都沒有復制任何圖像來模擬連續(xù)動畫,也沒有使用 JavaScript 來幫助進行計算。

下次,我們將製作 3D 滑塊。敬請期待!

以上是CSS無限滑塊翻過寶麗來圖像的詳細內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔相應的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

什麼是AutoPrefixer,它如何工作? 什麼是AutoPrefixer,它如何工作? Jul 02, 2025 am 01:15 AM

Autoprefixer是一個根據(jù)目標瀏覽器範圍自動為CSS屬性添加廠商前綴的工具。 1.它解決了手動維護前綴易出錯的問題;2.通過PostCSS插件形式工作,解析CSS、分析需加前綴的屬性、依配置生成代碼;3.使用步驟包括安裝插件、設置browserslist、在構(gòu)建流程中啟用;4.注意事項有不手動加前綴、保持配置更新、非所有屬性都加前綴、建議配合預處理器使用。

CSS教程,用於創(chuàng)建粘性標頭或頁腳 CSS教程,用於創(chuàng)建粘性標頭或頁腳 Jul 02, 2025 am 01:04 AM

TocreatestickyheadersandfooterswithCSS,useposition:stickyforheaderswithtopvalueandz-index,ensuringparentcontainersdon’trestrictit.1.Forstickyheaders:setposition:sticky,top:0,z-index,andbackgroundcolor.2.Forstickyfooters,betteruseposition:fixedwithbot

什麼是圓錐級函數(shù)? 什麼是圓錐級函數(shù)? Jul 01, 2025 am 01:16 AM

theconic-Gradient()functionIncsscreatesCircularGradientsThatRotateColorStopSaroundAcentralPoint.1.IsidealForPieCharts,ProgressIndicators,colordichers,colorwheels和decorativeBackgrounds.2.itworksbysbysbysbydefindefingincolordefingincolorstopsatspecificains off.

CSS教程,用於創(chuàng)建加載旋轉(zhuǎn)器和動畫 CSS教程,用於創(chuàng)建加載旋轉(zhuǎn)器和動畫 Jul 07, 2025 am 12:07 AM

創(chuàng)建CSS加載旋轉(zhuǎn)器的方法有三種:1.使用邊框的基本旋轉(zhuǎn)器,通過HTML和CSS實現(xiàn)簡單動畫;2.使用多個點的自定義旋轉(zhuǎn)器,通過不同延遲時間實現(xiàn)跳動效果;3.在按鈕中添加旋轉(zhuǎn)器,通過JavaScript切換類來顯示加載狀態(tài)。每種方法都強調(diào)了設計細節(jié)如顏色、大小、可訪問性和性能優(yōu)化的重要性,以提升用戶體驗。

CSS教程專注於移動優(yōu)先設計 CSS教程專注於移動優(yōu)先設計 Jul 02, 2025 am 12:52 AM

Mobile-firstCSSdesignrequiressettingtheviewportmetatag,usingrelativeunits,stylingfromsmallscreensup,optimizingtypographyandtouchtargets.First,addtocontrolscaling.Second,use%,em,orreminsteadofpixelsforflexiblelayouts.Third,writebasestylesformobile,the

如何創(chuàng)建本質(zhì)上響應的網(wǎng)格佈局? 如何創(chuàng)建本質(zhì)上響應的網(wǎng)格佈局? Jul 02, 2025 am 01:19 AM

要創(chuàng)建內(nèi)在響應式網(wǎng)格佈局,核心方法是使用CSSGrid的repeat(auto-fit,minmax())模式;1.設置grid-template-columns:repeat(auto-fit,minmax(200px,1fr))讓瀏覽器自動調(diào)整列數(shù)並限制每列最小和最大寬度;2.使用gap控制格子間距;3.容器應設為相對單位如width:100%、配合box-sizing:border-box避免寬度計算錯誤並用margin:auto居中;4.可選設置行高與內(nèi)容對齊方式提升視覺一致性,如row

如何將整個網(wǎng)格集中在視口中? 如何將整個網(wǎng)格集中在視口中? Jul 02, 2025 am 12:53 AM

要讓整個網(wǎng)格佈局在視口中居中顯示,可通過以下方法實現(xiàn):1.使用margin:0auto實現(xiàn)水平居中,需設定容器固定寬度,適用於固定佈局;2.利用Flexbox在外層容器設置justify-content和align-items屬性,結(jié)合min-height:100vh可實現(xiàn)垂直和水平居中,適合全屏展示場景;3.直接使用CSSGrid的place-items屬性在父容器上快速居中,簡潔且現(xiàn)代瀏覽器支持良好,同時需確保父容器有足夠高度。每種方式均有適用場景和限制,根據(jù)實際需求選擇合適的方案即可。

CSS中使用@supports的功能檢測是什麼? CSS中使用@supports的功能檢測是什麼? Jul 02, 2025 am 01:14 AM

prainuredetectionIncsssusissuse@supportScheckSifabRowsEsuppecifortSupecifortEfeatureBeforeApplyingReplyingStyles.1.itusesconditionalcsssssbasssbasedonproperty-valueperty-valuepairs,suessas@supports@supports@supports@supports(display:grid)

See all articles