资讯专栏INFORMATION COLUMN

几种原生js轮播图

CollinPeng / 3353人阅读

摘要:由于各种各样的原因比如说懒,本文直接在代码里面用注释序号记录实现的思路普通版原理一个包含多张图片的其中所有的左浮动成一排,实际过程就是将往左右边移动,改变值。

由于各种各样的原因(比如说懒),本文直接在代码里面用注释+序号记录实现的思路

1.普通版

原理:一个包含多张图片的ul,其中所有的li左浮动成一排,实际过程就是将ul往左(右)边移动,改变left值。

效果图:实际应用的时候.screen的overflow:hidden。只能看到中间方框的部分
在线demo

HTML

<>

其中

    用来存放动态生成的小方块。

    css部分代码

    .screen li {
      width: 200px;
      height: 200px;
      overflow: hidden;
      float: left;
    }
    .all ol li {
      float: left;
      width: 20px;
      height: 20px;
      background: #fff;
      border: 1px solid red;
      margin-left: 10px;
      cursor: pointer;
    }
    .all ol li.current {
      background: yellow;
    }

    js(有用了自己封装的一个动画函数)

    //动画函数
    function animate(el, target){
        if(el.timer) {
            clearInterval(el.timer);
        }
        el.timer = setInterval(function () {
            //leader = leader + step
            var leader = el.offsetLeft;
            var step = 30;
            if(target < leader) {
                step = -step;
            }
            //如果到达终点的距离已经小于一步了,就直接跨到终点。
            if(Math.abs(target-leader) >= Math.abs(step)) {
                leader = leader + step;
                el.style.left = leader + "px";
            }else {
                clearInterval(el.timer);
                el.style.left = target + "px";
            }
        }, 15);
    }
        //1. 找对象
        var box = document.querySelector(".all");
        var screen = document.querySelector(".screen");
        var ul = screen.children[0];
        var ullis = ul.children;
        var ol = screen.children[1];
        var arr = document.querySelector("#arr");
        var leftArr = arr.querySelector(".left");
        var rightArr = arr.querySelector(".right");
        var imgwidth = screen.offsetWidth;
    
        var pic = fk = 0;
        var timer;
        //2. 动态创建结构
        //2.1 创建小方块,ulLis
        //根据ul中li的个数创建小方块
        for(var i = 0; i < ullis.length; i++){
            var li = document.createElement("li");
            ol.appendChild(li);
            li.innerHTML = i + 1;
        }
        var ollis = ol.children;
        ollis[0].className = "current";
    
        //2.2 创建假图片
        //2.2.1 克隆ul下的第一个li
        var cloneli = ullis[0].cloneNode(true);
        ul.appendChild(cloneli);
        //3. 简单轮播功能
        //3.1 给小方块注册点击事件
        for(var i=0;i
    2. 3D版
    

    原理:切割的思路其实是让四个图片拼成一个图片 ,并且让每一张图片都往左走一定的距离结合了css3动画

    效果图:在线demo

    HTML

    不要把按钮放到box里面,一旦放到这里面,它默认就会成为一个项目,从而影响整个的ul。

    css部分代码

        *{
            padding:0;
            margin:0;
            list-style-type: none;
        }
        .box{
            width:533px;
            height:300px;
            margin:100px auto 0;
            border: 1px solid #000;
            /* 让盒子变成一个伸缩容器 */
            display:flex;
        }
        /* 第一步  需要制作出一个长方体 */
        .box ul{
            width:533px;
            height:300px;
            position:relative;
            transform-style: preserve-3d;
            transition: transform 1s;
        }
        .box ul:nth-child(1){
            transition-delay: 0s;
        }
        .box ul:nth-child(2){
            transition-delay: 0.2s;
        }
        .box ul:nth-child(3){
            transition-delay: 0.4s;
        }
        .box ul:nth-child(4){
            transition-delay: 0.6s;
        }
        .box > ul > li{
            /* 这里最好是设置成width:100%  让它继承收缩后的UL的宽度*/
            width:100%;
            height:100%;
            position:absolute;
            left:0;
            top:0;
            /* 这个切割一定是加给li的 ul加的话会把3D空间给干掉*/
            overflow:hidden;
        }
        .box > ul > li:nth-child(1){
            transform:rotateX(90deg) translateZ(150px);/* 上面 */
        }
        .box > ul > li:nth-child(2){
            transform:rotateX(-90deg) translateZ(150px);/* 下面 */
        }
        .box > ul > li:nth-child(3){
            transform:translateZ(150px);/* 正面 */
        }
        .box > ul > li:nth-child(4){
            transform:rotateX(180deg) translateZ(150px);/* 背面 */
        }
        .box > ul:nth-child(2) img{
            margin-left: -134px;
        }
        .box > ul:nth-child(3) img{
            margin-left: -268px;
        }
        .box > ul:nth-child(4) img{
            margin-left: -402px;
        }
        .btn_wrap{
            width:760px;
            height:0px;
            margin:0 auto;
            position:relative;
            top:-250px;
        }
        .btn_wrap button{
            width:100px;
            height:100px;
        }
        .btn_wrap button:nth-child(1){
            float: left;
        }
        .btn_wrap button:nth-child(2){
            float: right;
        }

    js部分

        // 需求 点击按钮一次,就让长方体沿着X轴旋转90度(是基于上一次的角度累加或者累减)
        var box = document.querySelector(".box");
        var _ul = box.querySelectorAll("ul");
        var _li = box.querySelectorAll("li");
        var btns = document.querySelectorAll("button");
        // 声明一个信号量,以便计算需要旋转的度数
        var num = 0;
        // 当用户暴力点击的时候会出现过度执行不过来的BUG情况,需要函数节流。声明一个开关变量
        var flag = true;
        
        _ul[_ul.length -1].addEventListener("transitionend",function(){
            console.log(1);
            // 在过渡执行完毕之后重新打开开关
            flag = true;
        })
    
        for(var i = 0; i < btns.length; i++){
            btns[i].setAttribute("data-index", i);
            btns[i].addEventListener("click",function(){
                if(flag){
                    flag = false;
                    // 每次点击进行一次判断后在累加或者累减
                    // 通过this去找到当前对象的自定义下标
                    var index = this.dataset["index"];
                    if(index == 1){
                        num++;
                    }else if(index == 0){
                        num--;
                    }
                    // 给所有的UL添加翻转效果
                    for(var i = 0; i < _ul.length; i++){
                        _ul[i].style.transform = "rotateX("+num*90+"deg)";
                    }
                }
            })
        }
    3. 移动端

    原理:利用定位,分为左中右

    效果图:在线demo

    HTML

    同普通版

    css部分代码

    .carouse-wrap {
        position: relative;
        min-height: 143px;
    }
    
    .carouse-wrap li {
        width: 100%;
        position: absolute;
        left: 0;
        top: 0;
        transform : translateX(100%);
    }

    js部分(代码较长,只放了重点部分,完整代码见文末)

    // 将最初始的位置赋值
    left = carouseWrapLi.length - 1;
    center = 0;
    right = 1;
    // 将最开始的三张先就位
    carouseWrapLi[left].style.transform = "translateX("+ -windowWidth +"px)";
    carouseWrapLi[center].style.transform = "translateX(0px)";
    carouseWrapLi[right].style.transform = "translateX("+ windowWidth +"px)";
    // 看到下一张的逻辑
    function showNext(){
        // 轮转下标
        left = center;
        center = right;
        right++;
    
        // 极值判断
        if(right > carouseWrapLi.length - 1){
            right = 0;
        }
    
    ....
    
    // 手指touch的时候去切换图片
    jdCarouse.addEventListener("touchstart",touchstartHandler);
    jdCarouse.addEventListener("touchmove",touchmoveHandler);
    jdCarouse.addEventListener("touchend",touchendHandler);
    
    var startX = 0;  // 记录开始的时候的手指落点
    var moveX = 0;    // 记录移动最终的手指落点
    var starTime = null;
    
    function touchstartHandler(event){
        // 记录滑动开始的时间
        starTime = new Date();
        // 在最开始的时候清除定时器
        clearInterval(carouseTimer);
        // 获取手指的落点
        startX = event.touches[0].pageX;
    4. 纯css3无缝滚动版

    原理:结合CSS3的@keyframes

    效果图:在线demo

    HTML

    css

    * {
        padding: 0;
        margin: 0;
        list-style-type: none;
    }
    .box {
        width: 533px;
        height: 200px;
        border: 1px solid #000;
        margin: 100px auto;
        position: relative;
        overflow: hidden;
    }
    .box:hover ul{
        /* 在hover的时候让动画暂停 */
        animation-play-state:paused;
    }
    img{
        display: block;
    }
    ul {
        width: 3198px;
        height: 200px;
        position: absolute;
        left: 0;
        top: 0;
        animation: wufeng 10s linear infinite;
    }
    @keyframes wufeng{
        0%{
            left: 0;
        }
        100%{
            left: -2132px;
        }
    }
    ul li{
        float: left;
    }

    完整代码可以去:
    https://github.com/aloe2014/s...
    https://github.com/aloe2014/s... (移动版)

    (此文献与对原生js动画保有热爱的我们......)

    文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

    转载请注明本文地址:https://www.ucloud.cn/yun/51202.html

    相关文章

    • 几种原生js播图

      摘要:由于各种各样的原因比如说懒,本文直接在代码里面用注释序号记录实现的思路普通版原理一个包含多张图片的其中所有的左浮动成一排,实际过程就是将往左右边移动,改变值。 由于各种各样的原因(比如说懒),本文直接在代码里面用注释+序号记录实现的思路 1.普通版 原理:一个包含多张图片的ul,其中所有的li左浮动成一排,实际过程就是将ul往左(右)边移动,改变left值。 效果图:实际应用的时候.s...

      Jenny_Tong 评论0 收藏0
    • 几种原生js播图

      摘要:由于各种各样的原因比如说懒,本文直接在代码里面用注释序号记录实现的思路普通版原理一个包含多张图片的其中所有的左浮动成一排,实际过程就是将往左右边移动,改变值。 由于各种各样的原因(比如说懒),本文直接在代码里面用注释+序号记录实现的思路 1.普通版 原理:一个包含多张图片的ul,其中所有的li左浮动成一排,实际过程就是将ul往左(右)边移动,改变left值。 效果图:实际应用的时候.s...

      cod7ce 评论0 收藏0
    • 手把手教你用原生JavaScript造轮子(2)——播图(更新:ES6版本)

      摘要:绑定轮播事件然后是鼠标移入移出事件的绑定鼠标移入移出事件移入时停止轮播播放的定时器,移出后自动开始下一张的播放。 通过上一篇文章的学习,我们基本掌握了一个轮子的封装和开发流程。那么这次将带大家开发一个更有难度的项目——轮播图,希望能进一步加深大家对于面向对象插件开发的理解和认识。 So, Lets begin! 目前项目使用 ES5及UMD 规范封装,所以在前端暂时只支持标签的引入方式...

      jasperyang 评论0 收藏0
    • 原生js写一个无缝播图插件(支持vue)

      摘要:轮播图插件前言写这个插件的原因前段时间准备用加上网易云的接口,模拟网易云音乐移动端。目前主要实现了无缝轮播,自动播放,端左右按钮点击切换,移动端手势滑动切换。 轮播图插件(Broadcast.js) 前言:写这个插件的原因 前段时间准备用vue加上网易云的nodejs接口,模拟网易云音乐移动端。因为想自己写一遍所有的代码以及加固自己的flex布局,所以没有使用UI组件。在轮播图部分,...

      MSchumi 评论0 收藏0
    • 原生js写一个无缝播图插件(支持vue)

      摘要:轮播图插件前言写这个插件的原因前段时间准备用加上网易云的接口,模拟网易云音乐移动端。目前主要实现了无缝轮播,自动播放,端左右按钮点击切换,移动端手势滑动切换。 轮播图插件(Broadcast.js) 前言:写这个插件的原因 前段时间准备用vue加上网易云的nodejs接口,模拟网易云音乐移动端。因为想自己写一遍所有的代码以及加固自己的flex布局,所以没有使用UI组件。在轮播图部分,...

      hatlonely 评论0 收藏0

    发表评论

    0条评论

    CollinPeng

    |高级讲师

    TA的文章

    阅读更多
    最新活动
    阅读需要支付1元查看
    <