堆叠卡片动画问题:首元素背景色不切换且卡片穿越
卡片堆叠轮播动画问题修复
问题1:仅显示第一张卡片背景色修复
原因
- CSS通过
[data-slide="n"]直接指定各位置卡片的背景色,但JS中错误尝试添加不存在的color-*类,导致样式逻辑混乱。 - 轮播时卡片的
data-slide值更新后,CSS规则未正确匹配对应卡片的背景色。
修复
移除JS中冗余的color-*类操作,让CSS的[data-slide]规则直接控制对应位置的背景色,确保轮播时data-slide值正确映射到卡片样式。
问题2:前方卡片穿透后方卡片修复
原因
data-slide="0"的卡片z-index为6(最高层级),即使添加fade-out类,仍处于所有卡片上方,消失时视觉上穿透下方卡片。
修复
在fade-out类中设置极低的z-index,让消失的卡片移到最底层;同时给队尾卡片添加淡入效果,让动画更自然。
完整修改后代码
JavaScript
window.onload = () => { let sliderImagesBox = document.querySelectorAll('.cards-box'); sliderImagesBox.forEach(el => { let imageNodes = el.querySelectorAll('.card:not(.hide)'); let arrIndexes = []; (() => { let start = 0; while (imageNodes.length > start) { arrIndexes.push(start++); } })(); let setIndex = (arr) => { for (let i = 0; i < imageNodes.length; i++) { imageNodes[i].dataset.slide = arr[i]; if (arr[i] === 0) { imageNodes[i].classList.add('fade-out'); imageNodes[i].classList.remove('fade-in'); } else if (arr[i] === imageNodes.length - 1) { imageNodes[i].classList.add('fade-in'); imageNodes[i].classList.remove('fade-out'); } else { imageNodes[i].classList.remove('fade-out', 'fade-in'); } } } let rotateCards = () => { arrIndexes.unshift(arrIndexes.pop()); setIndex(arrIndexes); } el.addEventListener('click', rotateCards); setIndex(arrIndexes); setInterval(rotateCards, 2000); }); };
CSS
body { background: #D6D3CE; display: flex; align-items: center; justify-content: center; height: 100vh; font-family: Helvetica; } .cards-box { position: relative; transform: translateX(-15px); } .cards-box .card { width: calc(18rem + 19vh); max-width: 80vw; background: #f7fffd; border-radius: 14px; cursor: pointer; opacity: 1; transition: opacity 0.8s cubic-bezier(0.18, 0.98, 0.45, 1); } .cards-box .card.fade-out { opacity: 0; pointer-events: none; z-index: 0; /* 让消失的卡片移到最底层 */ } .cards-box .card.fade-in { opacity: 0.5; transition: opacity 0.8s cubic-bezier(0.18, 0.98, 0.45, 1); } .cards-box .card:not(.hide) { position: absolute; top: 0; left: 0; transition: all 0.8s cubic-bezier(0.18, 0.98, 0.45, 1); box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.07); } .cards-box .card:not(.hide)[data-slide="0"] { transform: translate(0px, 0px) scale(1); z-index: 6; opacity: 1; background-color: #F6FF94; } .cards-box .card:not(.hide)[data-slide="1"] { transform: translate(30px, -35px) scale(0.975); z-index: 5; background-color: #fff; } .cards-box .card:not(.hide)[data-slide="2"] { transform: translate(60px, -65px) scale(0.95); z-index: 4; background-color: #B5B2A9; } .cards-box .card:not(.hide)[data-slide="3"] { transform: translate(90px, -95px) scale(0.925); z-index: 3; background-color: #000000; } .cards-box .card:not(.hide)[data-slide="4"] { transform: translate(120px, -120px) scale(0.9); z-index: 2; background-color: #F6FF94; } .cards-box .card:not(.hide)[data-slide="5"] { transform: translate(85px, -85px) scale(0.875); z-index: 1; opacity: 0.5; } .cards-box .card:not(.hide)[data-slide="0"] { transition: all 0.32s cubic-bezier(0.18, 0.98, 0.45, 1); } .content-placeholder { padding: 14px 18px 20px; } .content-placeholder .row { display: flex; flex-flow: row nowrap; align-items: center; margin-bottom: calc(.8rem + 0.4vw); } .content-placeholder .row .img { flex-shrink: 0; position: relative; margin-right: 20px; background: #000; width: calc(56px + 2vw); height: calc(56px + 2vw); border-radius: 50%; } .content-placeholder .row .img::after { content: attr(data-letter); position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: calc(30px + 1vw); font-weight: bold; color: white; } .content-placeholder .row .img-text { background: #000; width: 45%; min-width: 145px; height: 20px; margin-top: -20px; border-radius: 10px; } .content-placeholder .row .img-text::after { content: ""; display: block; width: 80%; height: 10px; margin-top: 30px; background: #000; border-radius: 10px; } .content-placeholder .text { background: #000; width: 90%; height: 2vh; min-height: 12px; max-height: 14px; border-radius: 10px; } .content-placeholder .text.text--m { width: 80%; margin-top: 2vh; height: 2vh; min-height: 12px; } .content-placeholder .text.text--s { width: 70%; margin-top: 2vh; height: 2vh; min-height: 12px; }
HTML
<div class="cards-box"> <div class="card hide"> <div class="content-placeholder"> <div class="row"> <div class="img"></div> </div> <div class="text text--l"></div> <div class="text text--m"></div> <div class="text text--s"></div> </div> </div> <div class="card"> <div class="content-placeholder"> <div class="row"> <div class="img" data-letter="T"></div> </div> <div class="text text--l"></div> <div class="text text--m"></div> <div class="text text--s"></div> </div> </div> <div class="card"> <div class="content-placeholder"> <div class="row"> <div class="img" data-letter="M"></div> </div> <div class="text text--l"></div> <div class="text text--m"></div> <div class="text text--s"></div> </div> </div> <div class="card"> <div class="content-placeholder"> <div class="row"> <div class="img" data-letter="K"></div> </div> <div class="text text--l"></div> <div class="text text--m"></div> <div class="text text--s"></div> </div> </div> <div class="card"> <div class="content-placeholder"> <div class="row"> <div class="img" data-letter="G"></div> </div> <div class="text text--l"></div> <div class="text text--m"></div> <div class="text text--s"></div> </div> </div> <div class="card"> <div class="content-placeholder"> <div class="row"> <div class="img" data-letter="G"></div> </div> <div class="text text--l"></div> <div class="text text--m"></div> <div class="text text--s"></div> </div> </div> </div>
内容的提问来源于stack exchange,提问作者p_e_88
相关产品推荐
相关产品推荐

