仿淘宝APP 2017双11滑动效果
HTML代码:
<div class="swiper">
<ul>
<li>
<div class="box">1</div>
</li>
<!-- 共10个li -->
</ul>
</div>
JS代码:
var items = document.querySelectorAll('li'), itemSize = items.length, isOdd = true;
var swiper = document.querySelector('.swiper'),
ul = swiper.querySelector('ul'),
swipeIndex = 0,
isTouch = false,
touchstartX;
swiper.addEventListener('touchstart', function (e) {
touchstartX = e.touches[0].pageX;
isTouch = true;
}, false);
document.addEventListener('touchmove', function (e) {
isTouch && e.preventDefault();
}, false);
document.addEventListener('touchend', function (e) {
if (isTouch) {
var touchendX = e.changedTouches[0].pageX;
isOdd = !isOdd;
touchendX < touchstartX ? goNext() : goPrev();
}
isTouch = false;
}, false);
function setBubble () {
items.forEach(function (el, i) {
if (isOdd) {
if (i%4 === 0 || (i-3)%4 === 0) {
el.classList.add('small');
} else {
el.classList.remove('small');
}
} else {
if ((i-1)%4 === 0 || (i-2)%4 === 0) {
el.classList.add('small');
} else {
el.classList.remove('small');
}
}
});
}
function goNext () {
if (swipeIndex++ >= itemSize / 6) {
swipeIndex = itemSize / 6;
} else {
ul.classList.remove('nomore');
go();
}
}
function goPrev () {
if (swipeIndex-- <= 0) {
swipeIndex = 0;
ul.classList.add('nomore');
ul.addEventListener('webkitAnimationEnd', function () {
this.classList.remove('nomore');
});
} else {
go();
}
}
function go () {
ul.style.cssText = 'transform: translateX(-'+ swipeIndex * 100 +'px)';
setBubble();
}
setBubble();
LESS代码:
.swiper {
width: 100%;
overflow: hidden;
padding: 20px 0;
ul {
display: flex;
flex-wrap: wrap;
flex-direction: column;
height: 200px;
transition: 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275);
&.nomore {
animation: nomore .8s forwards linear;
}
}
li {
width: 100px;
height: 100px;
transition: 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275);
&.small {
transform: scale(.7);
}
.box {
height: 100px;
background-color: #eeeeee;
border-radius: 20px;
animation: float 5s infinite linear;
text-align: center;
line-height: 170px;
overflow: hidden;
color: #fff;
&:after {
content: '';
position: absolute;
width: 100%;
height: 30px;
left: 0;
bottom: 0;
background: linear-gradient(-45deg, #d89e00, #e44474);
border-radius: 0 0 20px 20px;
z-index: -1;
}
}
&:nth-of-type(3n - 1), &:nth-of-type(3n + 1) {
.box {
animation-delay: 2s;
}
}
}
}
@keyframes float {
0%,
100% {
transform: translateY(0);
}
50% {
transform: translateY(12px);
}
}
@keyframes nomore {
20% {
transform: translateX(20px);
}
50% {
transform: translateX(-6px);
}
80% {
transform: translateX(2px);
}
100% {
transform: translateX(0);
}
}