精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

借助 :has 實現3D輪播圖

開發 前端
這次借助:has來實現這樣的功能,相信可以帶來不一樣的思路,一起看看吧!

這次帶來一個比較常見的案例,3d 輪播圖,就像這樣的:

圖片

這個輪播圖有幾個需要實現的點:

  1. 3d 視覺,也就是中間大,兩邊小。
  2. 自動輪播,鼠標放上自動暫停。
  3. 點擊任意卡片會立即跳轉到該卡片。

這次借助:has來實現這樣的功能,相信可以帶來不一樣的思路,一起看看吧!

溫馨提醒:兼容性要求需要 Chrome 101+,并且開始實驗特性(105+正式支持),Safari 15.4+,Firefox 官方說開啟實驗特性可以支持,但是實測并不支持。

一、3d 視覺樣式

這一部分才是重點。

首先我們來簡單布局一下,假設HTML是這樣的:

<div class="view" id="view">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item current">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
</div>

為了盡可能減少復雜度,我們可以將所有的變化都集中在一個類名上。

比如.current?表示當前選中項,也就是中間的那項。這里采用絕對定位的方式,將所有卡片項都堆疊在一起,然后設置3d?視圖,將卡片的Z?軸往后移動一段距離,讓.current在所有卡片的最前面,實現近大遠小的效果,具體實現如下:

.view {
position: relative;
width: 400px;
height: 250px;
transform-style: preserve-3d;
perspective: 500px;
}
.item {
position: absolute;
width: 100%;
height: 100%;
border-radius: 8px;
display: grid;
place-content: center;
box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.1);
transform: translate3d(0, 0, -100px);
}
.item.current {
transform: translate3d(0, 0, 0);
}

效果如下:

圖片

其實層級是這樣的,可以在 Chrome 圖層中看到:

圖片

現在,我們需要讓相鄰左右兩邊的都漏出來,右邊的比較容易,用相鄰兄弟選擇器??+??就可以了

.item.current + .item{
transform: translate3d(30%, 0, -100px);
}

那相鄰左邊的呢?以前是無解的,只能通過 JS 分別設置不同的類名,非常麻煩,但現在有了??:has??偽類,也可以輕松實現了,如下

.item:has(+.item.current){
transform: translate3d(-30%, 0, -100px);
}

效果如下:

圖片

不過還有一些臨界情況,比如在第一個卡片時,由于前面沒有兄弟節點了,所以就成了這樣。

圖片

所以需要再在第一個元素時,把最后一個元素放在它的左邊,第一個元素是:first-child?,最后一個元素是:last-child,所以實現是這樣的(最后一個元素處理同理)。

.item.current:first-child ~ .item:last-child {
transform: translate3d(-30%, 0, -100px);
opacity: 1;
}
.item:first-child:has(~ .item.current:last-child) {
transform: translate3d(30%, 0, -100px);
opacity: 1;
}

這樣就處理好了邊界情況。

圖片

進一步,還可以向兩側露出兩個卡片,實現也是類似的,完整實現如下:

/*當前項*/
.item.current {
transform: translate3d(0, 0, 0);
}
/*當前項右1*/
.item.current + .item,
.item:first-child:has(~ .item.current:last-child) {
transform: translate3d(30%, 0, -100px);
}
/*當前項左1*/
.item:has(+ .item.current),
.item.current:first-child ~ .item:last-child {
transform: translate3d(-30%, 0, -100px);
}
/*當前項右2*/
.item.current + .item + .item,
.item:first-child:has(~ .item.current:nth-last-child(2)),
.item:nth-child(2):has(~ .item.current:last-child) {
transform: translate3d(50%, 0, -150px);
}
/*當前項左2*/
.item:has(+.item + .item.current),
.item.current:first-child ~ .item:nth-last-child(2),
.item.current:nth-child(2) ~ .item:last-child{
transform: translate3d(-50%, 0, -150px);
}

這樣就實現了關于.current的全部樣式處理了,只用一個變量就控制了所有變化。

圖片

二、自動輪播和暫停

有了上面的處理,接下來的邏輯就非常簡單了,只需要通過js動態控制.current的變化就行了。

一般情況下,我們可能會想到用定時器setInterval,但這里,我們也可以不使用定時器,借助 CSS 動畫的力量,可以更輕松地完整這樣的交互。

要做的事情很簡單,給容器添加一個無關緊要的 CSS 動畫。

.view {
/**/
animation: scroll 3s infinite;
}
@keyframes scroll {
to {
transform: translateZ(.1px); /*無關緊要的動畫樣式*/
}
}

這樣就得到了一個時長為3s,無限循環的動畫了。

然后,監聽animationiteration?事件,這個事件在動畫每次運行一次就會回調一次,在這里也就是每3s?運行一次,就像setInterval的功能一樣

GlobalEventHandlers.onanimationiteration - Web API 接口參考 | MDN (mozilla.org)[1]。

在animationiteration?回調中處理.current?邏輯,很簡單,移除當前的.current?,給下一個添加.current,注意一下邊界就行了,具體實現如下:

view.addEventListener("animationiteration", () => {
const current = view.querySelector(".current") || view.firstElementChild;
current.classList.remove("current");
if (current.nextElementSibling) {
current.nextElementSibling.classList.add("current");
} else {
view.firstElementChild.classList.add("current");
}
});

使用animationiteration的最大好處是,可以直接通過 CSS 進行動畫的控制,再也無需監聽鼠標移入移出事件了。

.view:hover{
animation-play-state: paused;
}

效果如下(方便演示,速度調快了)。

圖片

三、點擊快速切換

點擊切換,我其實最先想到的是通過:checked,也就是類似單選,比如:

<div class="view" id="view">
<label class="item"><input type="radio" checked name="item"></label>
<label class="item"><input type="radio" name="item"></label>
<label class="item"><input type="radio" name="item"></label>
<label class="item"><input type="radio" name="item"></label>
<label class="item"><input type="radio" name="item"></label>
<label class="item"><input type="radio" name="item"></label>
</div>

但是目前來看??:has??偽類貌似不支持多層嵌套,比如下面這條語句。

.item:has(+.item:has(:checked)){
/*不生效*/
}

.item:has(:checked)選中的是子元素被選中的父級,然后.item:has(+.item:has(:checked))表示選中它的前面一個兄弟節點,這樣就能實現選中功能了,可惜現在并不支持??(以后可能支持)。

沒辦法,只能通過傳統方式來實現,直接綁定監聽click事件。

view.addEventListener("click", (ev) => {
const current = view.querySelector(".current") || view.firstElementChild;
current.classList.remove("current");
ev.target.closest('.item').classList.add("current");
});

效果如下:

圖片

完整代碼可以查看線上 demo:CSS 3d scroll (codepen.io)[2]或者CSS 3dscroll(runjs.work)[3]。

四、總結一下

以上就是借助:has偽類來實現一個3d輪播圖的全部細節了,所有的視覺變化全部在 CSS 中完成,JS 只需要處理切換邏輯就行了,相比以前而言,實現上更加簡潔和優雅,下面總結一下。

  1. 3d 視覺樣式可以通過transform-style: preserve-3d;實現近大遠小的效果。
  2. 通過.item:has(+.item.current)可以設置當前項前面的兄弟節點。
  3. 還需要考慮第一個和最后一個這兩種臨界情況。
  4. 輪播圖自動輪播和暫停可以借助animationiteration?回調,這種方式的優勢是可以通過:hover控制。
  5. :has偽類貌似不支持多層嵌套,希望以后可以支持吧~

:has非常強大,目前唯一的缺陷在于兼容性。好在瀏覽器對于這一新特性跟進的都比較積極,明年這個時候差不多可以在內部項目用起來了。

參考資料

?[1]GlobalEventHandlers.onanimationiteration - Web API 接口參考 | MDN (mozilla.org): https://developer.mozilla.org/zh-CN/docs/Web/API/Element/animationiteration_event。

[2]CSS 3d scroll (codepen.io): https://codepen.io/xboxyan/pen/PoeGjdg。

[3]CSS 3dscroll(runjs.work): https://runjs.work/projects/6a42a4c284e4442c。?

責任編輯:姜華 來源: 前端偵探
相關推薦

2024-07-03 10:36:14

2011-09-22 10:07:52

奧圖碼投影儀

2011-12-21 12:46:43

2012-06-16 16:57:52

WebGL

2012-02-27 10:00:50

HTML 5

2024-12-23 15:46:59

2011-05-26 10:55:39

2024-07-16 12:02:11

2013-07-23 07:03:51

Android開發學習Gallery實現3DAndroid源碼下載

2014-09-12 10:30:51

HTML5熱力圖

2021-09-16 07:52:18

SwiftUScroll效果

2011-10-06 13:30:45

宏碁投影儀

2012-11-26 12:51:44

木材3D打

2024-03-20 15:51:00

AI數據

2016-12-01 09:24:56

Android

2023-05-26 07:08:05

CSS模糊實現文字

2010-06-09 10:50:08

OpenSUSE 3D

2024-12-10 15:17:11

2011-05-26 10:05:07

優派投影機

2009-04-02 13:44:59

linuxOpenSUSE安裝界面
點贊
收藏

51CTO技術棧公眾號

四虎在线精品| 飘雪影院手机免费高清版在线观看 | 69久久久久久| 91高清在线观看视频| 91在线视频播放地址| 国产日韩欧美在线看| 久久亚洲av午夜福利精品一区| 亚洲理论电影| 7777精品伊人久久久大香线蕉经典版下载 | 日本少妇吞精囗交| 精品欧美激情在线观看| 欧美成人r级一区二区三区| 女人扒开屁股爽桶30分钟| 老司机免费在线视频| 91首页免费视频| 亚洲一区二区三区乱码aⅴ| 特一级黄色大片| 久久精品一区二区不卡| 亚洲欧洲日韩国产| 美女日批在线观看| 国产亚洲精品精品国产亚洲综合| 亚洲高清免费观看| 一区二区日本伦理| 三级理论午夜在线观看| 国产91精品在线观看| 91精品久久久久久久| 中文字幕激情小说| 黄色另类av| 欧美成人精品激情在线观看| 亚洲av毛片基地| 婷婷成人综合| 亚洲第一级黄色片| 日本在线视频播放| www久久久| 欧美日韩电影一区| 不卡av免费在线| 亚洲最大网站| 亚洲va国产天堂va久久en| 日本一道在线观看| a在线免费观看| 中文字幕在线观看一区| 日韩福利视频| 天堂中文在线观看视频| 成人美女视频在线观看| 成人在线视频电影| 国产丰满果冻videossex| 激情欧美日韩一区二区| 国产综合久久久久| 97在线视频人妻无码| 蜜桃视频一区二区三区在线观看| 国产精品老牛影院在线观看| 中文字幕精品无码一区二区| 乱人伦精品视频在线观看| 欧美性做爰毛片| 日韩三级小视频| 国产亚洲精品bv在线观看| 97超级碰在线看视频免费在线看| 国产午夜精品无码| 亚洲影院在线| 国产99在线|中文| 一级片在线免费播放| 日韩电影在线观看网站| 国产精品无码专区在线观看| 在线免费观看一区二区| 精品综合久久久久久8888| 91麻豆国产语对白在线观看| a在线观看免费| 高清shemale亚洲人妖| 狠狠爱一区二区三区| 日韩私人影院| 国产精品乱人伦中文| 中文字幕第一页亚洲| 婷婷色在线播放| 亚洲成人自拍偷拍| 亚洲中文字幕久久精品无码喷水| 51一区二区三区| 欧美精品一级二级三级| 日本中文字幕精品| 亚洲69av| 久久国产精品网站| 国产九色在线播放九色| 日韩一区精品字幕| 91精品免费| 三区在线观看| 亚洲欧美在线另类| 野外做受又硬又粗又大视频√| 中文字幕在线视频久| 欧美日韩免费不卡视频一区二区三区| 超碰在线免费av| 欧美黑人做爰爽爽爽| 色妞欧美日韩在线| 国产无遮无挡120秒| 欧美a一区二区| caoporn国产精品免费公开| 三级国产在线观看| 一级精品视频在线观看宜春院| 国产二区视频在线播放| 日本国产亚洲| 精品亚洲aⅴ在线观看| 国产精品免费在线视频| 亚洲精品美女91| 亚洲成人免费在线| 18禁网站免费无遮挡无码中文| 国产精品伦理| 日韩欧美123| 亚洲自拍偷拍图| 亚洲午夜电影| 日韩不卡在线观看日韩不卡视频| 成人网址在线观看| 你懂的在线观看视频网站| 亚洲欧洲精品天堂一级| 国产亚洲综合视频| 精品一区二区三区中文字幕在线| 亚洲社区在线观看| 国产无码精品一区二区| 精品系列免费在线观看| 欧美日韩亚洲免费| 77thz桃花论族在线观看| 欧美美女视频在线观看| 手机免费看av| 99亚洲视频| 国产伦精品一区二区三区视频黑人| 91官网在线| 色综合色综合色综合 | 狠狠色综合播放一区二区| 免费99视频| 77thz桃花论族在线观看| 日韩欧美亚洲国产精品字幕久久久| 精品熟妇无码av免费久久| 丝袜美腿一区二区三区| 欧美高清视频一区| 深夜av在线| 亚洲国产成人av在线| 免费在线黄色片| 国产在线日韩欧美| 自拍偷拍99| 日韩专区视频| 日韩中文字幕在线| 一本色道久久综合亚洲| 国产精品三级在线观看| 久久久精品麻豆| 精品国产一区一区二区三亚瑟| 91高潮精品免费porn| 亚洲av电影一区| 亚洲.国产.中文慕字在线| 岛国av免费观看| 黑人一区二区| 国产一级二级三级精品| 草草在线观看| 亚洲免费高清视频| 国产精品久久久久久久久久精爆| 久久免费的精品国产v∧| 成人观看免费完整观看| heyzo久久| 国产日韩在线亚洲字幕中文| 欧美另类极品| 欧美电影精品一区二区| 日韩免费一二三区| 99麻豆久久久国产精品免费| 无码人妻丰满熟妇区毛片18| 欧美一级精品片在线看| 欧美中文字幕一区| 天堂久久精品忘忧草| 日韩av不卡在线观看| 亚洲一区二区三区免费看| 四虎影视精品永久在线观看| 欧美黑人xxxx| 欧美成人免费| 69堂国产成人免费视频| 免费日韩在线视频| 94色蜜桃网一区二区三区| 国产免费视频传媒| 亚洲女同一区| 精品麻豆av| 成人免费在线观看视频| 久久精品最新地址| 五月色婷婷综合| 在线观看亚洲精品视频| 久久高清内射无套| 99精品视频在线免费观看| 天天操天天爽天天射| 亚洲色图国产| 欧美aaaaa喷水| av在线亚洲一区| 97精品视频在线| 91这里只有精品| 亚洲国产精久久久久久| 性高潮视频在线观看| 一区二区三区四区中文字幕| 51调教丨国产调教视频| 激情综合一区二区三区| 2022亚洲天堂| 午夜亚洲福利| 亚洲看片网站| 欧美色图五月天| 成人福利视频网| 水蜜桃在线视频| 欧美www在线| 国产亚洲依依| 欧美精品一区二区久久久| 国产精品欧美综合| 午夜精品视频一区| 五月天色婷婷丁香| 久久老女人爱爱| 无码人妻aⅴ一区二区三区玉蒲团| 噜噜噜久久亚洲精品国产品小说| 国产一区二区三区在线免费| 精品国内自产拍在线观看视频| 成人羞羞视频免费| 91麻豆精品| 国产欧美精品日韩| 在线一区av| 高清欧美性猛交| 国产人成网在线播放va免费| 国产一区二区三区在线免费观看| 成人免费一级视频| 91精品国产综合久久久蜜臀粉嫩| 久久久精品毛片| 精品日韩中文字幕| 久久中文字幕在线观看| 亚洲少妇屁股交4| 一级片黄色录像| 久久久久久久久久久久久久久99| 男人的天堂影院| 国产一区二区三区免费播放| 亚洲欧美久久久久| 日韩福利电影在线| 男人女人黄一级| 久久福利影视| 91精品91久久久中77777老牛| 影音先锋中文字幕一区二区| 白白操在线视频| 中文在线播放一区二区| 国产免费xxx| 中文字幕免费一区二区| 免费观看国产视频在线| 天天久久综合| 路边理发店露脸熟妇泻火| 艳女tv在线观看国产一区| 亚洲图片欧洲图片日韩av| 色小子综合网| 中文字幕一区二区三区四区五区六区| 日韩精品一卡| 一区不卡字幕| 久久久久久久久久久9不雅视频| 伊人久久大香线蕉午夜av| 日韩大片在线播放| 亚洲一区三区电影在线观看| 久久美女精品| 在线免费观看成人网| 亚洲精彩视频| 欧美乱做爰xxxⅹ久久久| 黄色成人精品网站| 国产二区视频在线播放| 日本成人在线一区| 久久久久久久久久久久久久久国产| 麻豆成人久久精品二区三区小说| 91高清国产视频| 国产老女人精品毛片久久| 亚洲AV无码久久精品国产一区| 国产黄色精品视频| 中国一级特黄录像播放| 久久精品一区二区三区不卡 | 狠狠人妻久久久久久综合麻豆| 亚洲第一中文字幕在线观看| 三级黄视频在线观看| 中文字幕在线成人| h片在线免费| 26uuu亚洲国产精品| 天然素人一区二区视频| 91香蕉亚洲精品| 老汉色老汉首页av亚洲| 日本欧美精品久久久| 亚洲精品极品少妇16p| 国产精品久久久久7777| 天堂va蜜桃一区二区三区漫画版 | 国产iv一区二区三区| 强迫凌虐淫辱の牝奴在线观看| 国产视频亚洲色图| 中文字幕影音先锋| 色综合久久精品| 国产视频aaa| 国产视频亚洲视频| 国产成人午夜| 国产不卡视频在线| 日韩成人在线看| 日本不卡二区高清三区| 亚洲国产精品日韩专区av有中文| 免费成人在线视频网站| 久久aⅴ国产欧美74aaa| 在线视频 日韩| 亚洲欧洲一区二区在线播放| 可以免费在线观看的av| 欧美日本视频在线| 天天在线女人的天堂视频| 久久精品一区中文字幕| 中国字幕a在线看韩国电影| 亚洲一区二区三区四区视频| 蜜桃精品wwwmitaows| 亚洲乱码日产精品bd在线观看| 日韩精品电影一区亚洲| 漂亮人妻被黑人久久精品| 亚洲女人小视频在线观看| 国产精品免费av一区二区| 欧美伦理视频网站| 激情小说 在线视频| 久久久最新网址| 亚洲香蕉久久| 性欧美精品一区二区三区在线播放| 亚洲精品国产日韩| 色哟哟免费视频| 国产精品国产三级国产有无不卡| 国产精品777777| 亚洲第一中文字幕在线观看| caoporn免费在线| 91精品久久久久久久久久久久久久| 麻豆一区二区麻豆免费观看| 国产亚洲精品久久久久久久| 激情综合网av| 精品国产国产综合精品| 91国偷自产一区二区使用方法| 日韩一级在线播放| 久久久久久国产精品三级玉女聊斋 | 91精品久久久久| 奇米影视亚洲| 欧洲av无码放荡人妇网站| 不卡av在线网| 日韩 欧美 亚洲| 精品国产一区久久| 欧美大片黄色| 99高清视频有精品视频| 亚洲老妇激情| 国产在线观看中文字幕| 中文字幕在线不卡视频| 一区二区视频免费观看| 中文字幕欧美专区| 高清在线一区| 亚洲毛片aa| 精一区二区三区| 人妻人人澡人人添人人爽| 欧美一区午夜精品| 91在线中字| 成人动漫视频在线观看免费| 国内精品久久久久久久97牛牛 | 成人黄色av| www.精品在线| 国产精品久久久久久久浪潮网站| 艳妇乳肉豪妇荡乳av无码福利| 在线视频一区二区| 国产精品第一国产精品| 午夜在线视频免费观看| 国产精品一二三区在线| 久久精品国产av一区二区三区| 亚洲成人精品久久久| 夜鲁夜鲁夜鲁视频在线播放| 人偷久久久久久久偷女厕| 裸体在线国模精品偷拍| www深夜成人a√在线| 精品国产乱码久久久久久久久| 男女在线观看视频| 久久久久久国产精品mv| 天堂av在线一区| 欧美xxxooo| 精品少妇一区二区三区日产乱码| 51精品视频| 亚洲精品电影在线一区| 国产精品自在在线| 国产成人亚洲欧洲在线| 亚洲欧美激情一区| 亚洲精品成人一区| 免费看黄在线看| 国产偷国产偷精品高清尤物| 一级黄色大片免费| 久久久久国产精品一区| 国产精品手机在线播放| 蜜桃福利午夜精品一区| 五月婷婷综合在线| 成年网站在线| 99re6热在线精品视频播放速度| 99精品视频网| 天堂网中文在线观看| 欧美α欧美αv大片| 色香欲www7777综合网| 日韩国产精品毛片| 91免费看片在线观看| 97在线公开视频| 欧洲中文字幕国产精品| 91av精品| 在线不卡av电影| 精品日韩一区二区| 久久久久久久性潮| 18禁免费观看网站| 亚洲情趣在线观看| 黄色在线观看网| 国产精品久久亚洲| 男人的天堂亚洲| 动漫精品一区一码二码三码四码| 中文字幕精品久久久久| 97久久超碰| 亚洲欧美日韩精品一区|