HTML实现横向滚动换页

平常做滑动切屏一般都会使用swiper.js,最近因个人项目需要,不想引入其他库,所以用原生js+css3写了个横向滚动换页,在此跟大家分享一下。效果如下:
HTML实现横向滚动换页

1、页面布局

因为主要在移动端使用,所以其中screen模拟了个手机屏幕大小

<div class="screen">
        <ul class="list">
            <li style="background-color: red"></li>
            <li style="background-color: green"></li>
            <li style="background-color: blue"></li>
            <li style="background-color: yellow"></li>
            <li style="background-color: deepskyblue"></li>
            <li style="background-color: orange"></li>
        </ul>
    </div>

2、样式

清除了ul、li的原本样式,ul相对布局包裹绝对布局的li,这是滚动切屏基本的东西。pre、current、next分别代表当显示item的前一个,当前item,后一个item的样式。

ul, li {
    list-style-type: none;
    padding: 0;
    margin: 0;
}
.screen {
    width: 320px;
    height: 568px;
    background-color: white;
    border: 1px solid #ccc;
    overflow-x: hidden;
}
.list {
    height: 400px;
    position: relative;
    transition: all 1s;
}
.list li {
    width: 70%;
    height: 100%;
    position: absolute;
    transition: all 1s;
    top: 0;
}
.list li.pre {
    transform: skewY(10deg) scale(0.9)
}
.list li.current {
    transform: none
}
.list li.next {
    transform: skewY(-10deg) scale(0.9)
}

3、关键

好了,样式和html都比较简单,接下来就该js了

1)首先我们获取到包裹item的元素,并选取到我们所有的item元素

    var wrapper = document.querySelector('.list')
    var els = wrapper.querySelectorAll('li')

2)接下来定义两个下标,一个是默认选择的,一个是当前选择的,我们这里默认选择0。

    var defaultIndex = 0
    var curIndex = 0

3)好了,我们接下来设置每个item的初始状态,初始化就算完成了

for (var i = 0;i < els.length; i++) {
    els[i].style.left = (15 + (i - defaultIndex) * 70) + '%'
    if (i === defaultIndex) {
        els[i].className = 'current'
    } else if (i === defaultIndex - 1) {
        els[i].className = 'pre'
    } else if (i === defaultIndex + 1) {
        els[i].className = 'next'
    }
}

4)下面是核心部分,每次前进或后退的时候都触发change方法,重新设置item和wrapper样式。

function toNext () {
     if (curIndex >= els.length - 1) {
         return
     }
     curIndex++
     change()
 }

function toPre () {
     if (curIndex <= 0) {
         return
     }
     curIndex--
     change()
 }

change方法如下:

function change () {
    var translateX = -(curIndex - defaultIndex) * 70 + '%'
    wrapper.style.transform = 'translate(' + translateX + ', 0)'
    wrapper.webkitTransform = 'translate(' + translateX + ', 0)'
    els[curIndex].className = 'current'
    if (curIndex !== els.length - 1) {
        els[curIndex + 1].className = 'next'
    }
    if (curIndex !== 0) {
        els[curIndex - 1].className = 'pre'
    }
}

5)好了,到此我们就算写完了,再需要的时候只用调用toPre()或者toNext()就可以了,这里我使用的定时器调用。

var i = 0
var interval = setInterval(function () {
    toNext()
    if (i === 2) {
        clearInterval(interval)
        setInterval(function () {
            toPre()
        }, 1000)
    }
    i++
}, 1000)
  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值