zoukankan      html  css  js  c++  java
  • JS实现移动端可滑动轮播图

    JS实现移动端可滑动轮播图

    HTML:

    <!--轮播图-->
    
    <div class="jd_banner">
    <ul class="clearFix">
    <li><a href="#"><img src="images/l8.jpg" alt=""></a></li>
    <li><a href="#"><img src="images/l1.jpg" alt=""></a></li>
    <li><a href="#"><img src="images/l2.jpg" alt=""></a></li>
    <li><a href="#"><img src="images/l3.jpg" alt=""></a></li>
    <li><a href="#"><img src="images/l4.jpg" alt=""></a></li>
    <li><a href="#"><img src="images/l5.jpg" alt=""></a></li>
    <li><a href="#"><img src="images/l6.jpg" alt=""></a></li>
    <li><a href="#"><img src="images/l7.jpg" alt=""></a></li>
    <li><a href="#"><img src="images/l8.jpg" alt=""></a></li>
    <li><a href="#"><img src="images/l1.jpg" alt=""></a></li>
    </ul>
    <ul>
    <li class="now"></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    </ul>
    </div>

    CSS:

    /*轮播图*/
    .jd_banner{
    width: 100%;
    overflow: hidden;
    position: relative;
    }
    .jd_banner ul:first-child{
    width: 1000%;
    transform: translateX(-10%);
    -webkit-transform: translateX(-10%);
    }
    .jd_banner ul:first-child li{
    width: 10%;
    float: left;
    }
    .jd_banner ul:first-child li a{
    display: block;
    width: 100%;
    }
    .jd_banner ul:first-child li a img{
    display: block;
    width: 100%;
    }
    .jd_banner ul:last-child{
    position: absolute;
    width: 118px;
    height: 6px;
    left: 50%;
    margin-left:-59px;
    bottom: 6px;
    }
    .jd_banner ul:last-child li{
    width: 6px;
    height: 6px;
    border-radius: 3px;
    border: 1px solid #fff;
    margin-left:10px;
    float: left;
    }
    .jd_banner ul:last-child li:first-child{
    margin-left:0;
    }
    .jd_banner ul:last-child li.now{
    background: #fff;
    }

    js:

    var banner = function () {
    /*1. 自动轮播图且无缝 定时器,过渡*/
    /*2. 点要随着图片的轮播改变 根据索引切换*/
    /*3. 滑动效果 利用touch事件完成*/
    /*4. 滑动结束的时候 如果滑动的距离不超过屏幕的1/3 吸附回去 过渡*/
    /*5. 滑动结束的时候 如果滑动的距离超过屏幕的1/3 切换(上一张,下一张)根据滑动的方向,过渡*/
    
    /*轮播图*/
    var banner = document.querySelector('.jd_banner');
    /*屏幕宽度*/
    var width = banner.offsetWidth;
    /*图片容器*/
    var imageBox = banner.querySelector('ul:first-child');
    /*点容器*/
    var pointBox = banner.querySelector('ul:last-child');
    /*所有的点*/
    var points = pointBox.querySelectorAll('li');
    
    var addTransition = function () {
    imageBox.style.transition = 'all 0.2s';
    imageBox.style.webkitTransition = 'all 0.2s';
    }
    var removeTransition = function () {
    imageBox.style.transition = 'none';
    imageBox.style.webkitTransition = 'none';
    }
    var setTranslateX = function (translateX) {
    imageBox.style.transform = 'translateX(' + translateX + 'px)';
    imageBox.style.webkitTransform = 'translateX(' + translateX + 'px)';
    }
    
    
    /*程序的核心 index */
    var index = 1;
    var timer = setInterval(function () {
    index++;
    /*加过渡*/
    addTransition();
    /*做位移*/
    setTranslateX(-index * width);
    }, 1000);
    /*需要等最后一张动画结束去判断 是否瞬间定位第一张*/
    //在每次过渡结束后会触发该函数
    imageBox.addEventListener('transitionend', function () {
    /*自动滚动的无缝*/
    if (index >= 9) {
    index = 1;
    /*瞬间定位*/
    /*清过渡*/
    removeTransition();
    /*做位移*/
    setTranslateX(-index * width);
    }
    /*滑动的时候也需要无缝*/
    else if (index <= 0) {
    index = 8;
    /*瞬间定位*/
    /*清过渡*/
    removeTransition();
    /*做位移*/
    setTranslateX(-index * width);
    }
    /*根据索引设置点*/
    /*此时此刻 index 的取值范围 1-8(0,8--1,9)*/
    /*点索引 index - 1 */
    setPoint();
    });
    
    /*设置点的方法*/
    var setPoint = function () {
    /*index 1-8*/
    /*清除样式*/
    for (var i = 0; i < points.length; i++) {
    var obj = points[i];
    obj.classList.remove('now');
    }
    /*给对应的加上样式*/
    points[index - 1].classList.add('now');
    }
    
    /*绑定事件*/
    var startX = 0;
    var distanceX = 0;
    var isMove = false;
    imageBox.addEventListener('touchstart', function (e) {
    /*清除定时器*/
    clearInterval(timer);
    /*记录起始位置的X坐标*/
    startX = e.touches[0].clientX;
    });
    imageBox.addEventListener('touchmove', function (e) {
    /*记录滑动过程当中的X坐标*/
    var moveX = e.touches[0].clientX;
    /*计算位移 有正负方向*/
    distanceX = moveX - startX;
    /*计算目标元素的位移 不用管正负*/
    /*元素将要的定位=当前定位+手指移动的距离*/
    var translateX = -index * width + distanceX;
    /*滑动--->元素随着手指的滑动做位置的改变*/
    removeTransition();
    setTranslateX(translateX);
    //是否发生了移动
    isMove = true;
    });
    imageBox.addEventListener('touchend', function (e) {
    /*4. 5. 实现*/
    /*要使用移动的距离*/
    if (isMove) {
    if (Math.abs(distanceX) < width / 3) {
    /*吸附*/
    addTransition();
    setTranslateX(-index * width);
    } else {
    /*切换*/
    /*右滑动 上一张*/
    if (distanceX > 0) {
    index--;
    }
    /*左滑动 下一张*/
    else {
    index++;
    }
    /*根据index去动画的移动*/
    addTransition();
    setTranslateX(-index * width);
    }
    }
    /*最好做一次参数的重置*/
    startX = 0;
    distanceX = 0;
    isMove = false;
    /*加上定时器*/
    clearInterval(timer);
    timer = setInterval(function () {
    index++;
    /*加过渡*/
    addTransition();
    /*做位移*/
    setTranslateX(-index * width);
    }, 1000);
    });
    
    
    }
  • 相关阅读:
    [PHP] yield沟通函数循环内外
    [Linux] scp本地服务器和远程服务器拷贝文件
    [Linux] 大数据库导出大文件统计并去重
    [Go] golang连接查询mysql
    [日常] 解决mysql不允许外部访问
    [Go] golang创建目录写文件判断文件
    [日常] imap协议读取邮件
    [Go] golang使用github里的imap类库
    [Go] golang无缓冲通道实现工作池控制并发
    [Go] golang的range循环遍历通道
  • 原文地址:https://www.cnblogs.com/yztdd99/p/12487001.html
Copyright © 2011-2022 走看看