卡片Y轴旋转功能异常排查:Up/Down点击逻辑Bug修复请求
修复卡片Y轴旋转的平滑切换问题
我仔细看了你的代码,发现问题出在Previous函数依赖的res数组上——这个数组的初始状态和卡片的实际初始位置完全不匹配,导致第一次点击Down按钮时,卡片先跳到错误的位置,再执行正确的旋转,就出现了你说的“先向上转再向下转”的突兀效果。
问题根源分析
初始状态下,你的nexttransforms数组对应卡片的位置是:
- 索引0:上方卡片(
y: '-55%') - 索引1:下方卡片(
y: '55%') - 索引2:中间卡片(
y: 0)
但你通过倒序创建的res数组,初始顺序是[中间卡片, 下方卡片, 上方卡片],和实际卡片的初始位置对应不上。第一次调用Previous时,卡片会先应用这个错误的res数组样式,然后才开始循环位移数组,自然就出现了异常跳转。
修复方案
其实我们完全不需要维护两个独立的变换数组,直接复用一个数组,通过调整数组元素的位置来实现Up和Down的逻辑即可:
- Up按钮:把数组第一项移到末尾(
shift()+push()) - Down按钮:把数组最后一项移到开头(
pop()+unshift())
这样就能保证每次切换时,变换数组的顺序和卡片的实际状态始终同步,实现平滑旋转。
修复后的完整代码
HTML(无需修改)
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" href="css/style.css"> <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script> </head> <body> <div id="carousel"> <div class="card">1</div> <div class="card">2</div> <div class="card">3</div> </div> <button id="up">Up</button> <button id="down">Down</button> <script src="js/index.js"></script> </body> </html>
CSS(无需修改)
#carousel { position: absolute; top: 40px; left: 200px; -webkit-transform-style: preserve-3d; transform-style: preserve-3d; opacity: 1; } .card { position: absolute; width: 200px; height: 200px; -webkit-transform-style: preserve-3d; transform-style: preserve-3d; transition: 1s; background: black; -webkit-transform: translateY(-55%) translateZ(-50px) scale(0.8); transform: translateY(-55%) translateZ(-50px) scale(0.8); } .card:nth-child(3) { -webkit-transform: translateY(0) translateZ(0); transform: translateY(0) translateZ(0); background: #add8e6; } .card:nth-child(1) { -webkit-transform: translateY(-55%) translateZ(-50px) scale(0.8); transform: translateY(-55%) translateZ(-50px) scale(0.8); background: #ff7f50; } .card:nth-child(2) { -webkit-transform: translateY(55%) translateZ(-50px) scale(0.8); transform: translateY(55%) translateZ(-50px) scale(0.8); background: #7fff00; }
JavaScript(核心修改)
var cards = $('#carousel > .card'); // 初始变换数组,和卡片初始状态完全对应 const transforms = [ {y: '-55%', z: '-50px', scale: 0.8}, {y: '55%', z: '-50px', scale: 0.8}, {y: 0, z: 0, scale: 1}, ]; // Up按钮逻辑:把第一个变换移到最后,实现向上旋转 function rotateUp() { for (let i = 0; i < cards.length; i++) { const card = cards[i]; const t = transforms[i]; $(card).css({ 'transform': `translateY(${t.y}) translateZ(${t.z}) scale(${t.scale})` }); } transforms.push(transforms.shift()); } // Down按钮逻辑:把最后一个变换移到最前,实现向下旋转 function rotateDown() { // 先调整数组顺序,再应用样式,和Up逻辑保持一致,避免状态错位 transforms.unshift(transforms.pop()); for (let i = 0; i < cards.length; i++) { const card = cards[i]; const t = transforms[i]; $(card).css({ 'transform': `translateY(${t.y}) translateZ(${t.z}) scale(${t.scale})` }); } } $('#down').on('click', rotateDown); $('#up').on('click', rotateUp);
关键修改点说明
- 移除了多余的
revert、sorted、res变量,只用一个transforms数组维护状态,彻底避免多数组导致的状态不一致问题 - 调整
rotateDown的执行顺序:先修改数组顺序,再应用样式,和rotateUp逻辑对齐,确保每次切换时样式和数组状态完全同步 - 使用
let替代var,避免全局变量污染,代码更规范
现在你再点击Up和Down按钮,卡片就能平滑地向对应方向旋转,不会出现第一次点击Down时的异常跳转了。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

