利用 CSS3 实现的无缝轮播功能代码


Posted in HTML / CSS onSeptember 25, 2017

无缝轮播的原理图

利用 CSS3 实现的无缝轮播功能代码

1 . html的架构 :

<div class="layout">
    <div class="jd_banner">
        <ul class="clearfix">
            <li><a href="#"><img src="images/l1.jpg"></a></li>
            <li><a href="#"><img src="images/l2.jpg"></a></li>
            <li><a href="#"><img src="images/l3.jpg"></a></li>
            <li><a href="#"><img src="images/l4.jpg"></a></li>
            <li><a href="#"><img src="images/l5.jpg"></a></li>
            <li><a href="#"><img src="images/l6.jpg"></a></li>
            <li><a href="#"><img src="images/l7.jpg"></a></li>
            <li><a href="#"><img src="images/l8.jpg"></a></li>
            <li><a href="#"><img src="images/l1.jpg"></a></li>
        </ul>
    </div>
</div>

JavaScript:

/*轮播图*/
function banner() {
    var banner = document.querySelector('.banner');
    /*获取设备宽度*/
    var offsetWidth = banner.offsetWidth;
    /*图片容器*/
    var imageBox = banner.querySelector('ul:first-child');
    /*给图片容器添加过渡动画属性*/
    function addTransition() {
        imageBox.style.transition = 'all 0.5s';
        imageBox.style.webkitTransition = 'all 0.5s';
    }
    /*清除图片容器添加过渡动画属性*/
    function removeTransition() {
        imageBox.style.transition = 'none';
        imageBox.style.webkitTransition = 'none';
    }
    /*设置X轴定位*/
    function setTranslateX(offsetX) {
        imageBox.style.transform = 'translateX(' + offsetX + 'px)';
        imageBox.style.webkitTransform = 'translateX(' + offsetX + 'px)';
    }
    // 定义当前索引
    var index = 1;
    // 自动轮播
    var timer = setInterval(function () {
        index++;
        addTransition();
        setTranslateX(-index * offsetWidth);
        //同步设置css
        //底层异步操作
    }, 2000);
    transVar.transitionEnd(imageBox, function () { //监听每一次动画的结束
        if (index >= 9) { // 当轮播到第9张的时候,无缝切换到第1张图片
            index = 1;
            // 清除过渡
            removeTransition();
            //无动画效果的定位到第一张图片
            setTranslateX(-index * offsetWidth);
        } 
    });
  }

JavaScript : 监听动画结束事件

window.transVar = {};   //定义一个window的全局对象
//监听css3过渡动画的结束事件
transVar.transitionEnd = function(obj,callback){
    if (typeof  obj == 'object'){
        obj.addEventListener('webkitTransitionEnd',function(){  // 兼容写法
            callback && callback();  // && 运算符 , 如果callback函数存在,则调用callback()函数
        })
        obj.addEventListener('transitionEnd',function(){
            callback && callback();
        })
    }
}

小结 : 在利用CSS3实现无缝轮播时,一开始一直在纠结怎样做到无缝切换到第一张, 当初有一个比较单纯的想法

想着在轮播的过程中,直接判断是否到了第9张图片,然后调用removeTransition();取消过渡 , 然后改变index=1,让它无缝切换到第1张, 正当我信心满满以为完成了,却结果却给了我一巴掌!!!!!!

var timer = setInterval(function () {
        index++;
        addTransition();
        setTranslateX(-index * offsetWidth);
        if (index >= 9) {   // 当轮播到第9张时,不调用监听动画事件,直接取消过渡状态
            removeTransition();
            index = 1;
            setTranslateX(-index * offsetWidth);
        } 
    }, 2000);

那么….原因到底是为什么呢 ?

因为 CSS3的过渡是异步事件, 那时候的我恍然大悟,才意识到了自己的年少无知.

那么既然是异步事件, 我们就需要利用监听事件,来监听每一次过渡状态结束的时候,

然后再判断当前的下标是否到了最后一张,

再无动画状态的切换到第1张.

这就是完整是利用CSS3实现无缝轮播 , 平时多踩坑,然后通过自己研究解决,慢慢的自然而然的就不会犯这种问题了,前端的路漫漫,让我们继续加油!!!!!

HTML / CSS 相关文章推荐
用CSS禁用输入法(CSS3 UI规范)实例解析
Dec 04 HTML / CSS
css3闪亮进度条效果实现思路及代码
Apr 17 HTML / CSS
css3实现超炫风车特效
Nov 12 HTML / CSS
使用 css3 实现圆形进度条的示例
Jul 05 HTML / CSS
CSS3颜色值RGBA与渐变色使用介绍
Mar 06 HTML / CSS
详解CSS3:overflow属性
Nov 17 HTML / CSS
html5 canvas-1.canvas介绍(hello canvas)
Jan 07 HTML / CSS
html5的canvas方法使用指南
Dec 15 HTML / CSS
HTML5手机端弹出遮罩菜单特效代码
Jan 27 HTML / CSS
HTML5中使用json对象的实例代码
Sep 10 HTML / CSS
详解CSS3浏览器兼容
Dec 24 HTML / CSS
html原生table实现合并单元格以及合并表头的示例代码
May 07 HTML / CSS
CSS3中伪元素::before和::after的用法示例
Sep 18 #HTML / CSS
css3 pointer-events 介绍详解
Sep 18 #HTML / CSS
详解CSS3选择器:nth-child和:nth-of-type之间的差异
Sep 18 #HTML / CSS
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
Sep 15 #HTML / CSS
CSS3 Calc实现滚动条出现页面不跳动问题
Sep 14 #HTML / CSS
基于CSS3 animation动画属性实现轮播图效果
Sep 12 #HTML / CSS
用css3写出气球样式的示例代码
Sep 11 #HTML / CSS
You might like
一步一步学习PHP(5) 类和对象
2010/02/16 PHP
php将数组存储为文本文件方法汇总
2015/10/28 PHP
分享PHP守护进程类
2015/12/30 PHP
PHP里的$_GET数组介绍
2019/03/22 PHP
javascript 清空form表单中某种元素的值
2009/12/26 Javascript
Javascript 面向对象 继承
2010/05/13 Javascript
Javascript中的isNaN函数使用说明
2011/11/10 Javascript
javascript控制swfObject应用介绍
2012/11/29 Javascript
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
js 使用form表单select类实现级联菜单效果
2012/12/19 Javascript
js获取指定日期周数以及星期几的小例子
2014/06/27 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
2014/08/07 Javascript
jQuery异步加载数据并添加事件示例
2014/08/24 Javascript
JavaScript知识点总结(十)之this关键字
2016/05/31 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
JavaScript队列函数和异步执行详解
2017/06/19 Javascript
解决Jquery下拉框数据动态获取的问题
2018/01/25 jQuery
JavaScript的词法结构精华篇
2018/10/17 Javascript
Layui 带多选框表格监听事件以及按钮自动点击写法实例
2019/09/02 Javascript
js仿360开机效果
2019/12/26 Javascript
详解JavaScript中精度失准问题及解决方法
2020/02/04 Javascript
[01:39]2014DOTA2国际邀请赛 Newbee经理CU专访队伍火力全开
2014/07/15 DOTA
在Python中操作字典之clear()方法的使用
2015/05/21 Python
TensorFlow实现简单卷积神经网络
2018/05/24 Python
pandas 对每一列数据进行标准化的方法
2018/06/09 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
Python求解正态分布置信区间教程
2019/11/20 Python
python3 使用ssh隧道连接mysql的操作
2020/12/05 Python
CSS3标注引用的出处和来源的方法
2020/02/25 HTML / CSS
网络宣传方案
2014/03/15 职场文书
教师读书活动总结
2014/05/07 职场文书
学习十八大的心得体会
2014/09/01 职场文书
司机岗位职责范本
2015/04/10 职场文书
农村老人去世追悼词
2015/06/23 职场文书
Java内存模型之happens-before概念详解
2021/06/13 Java/Android
python机器学习Github已达8.9Kstars模型解释器LIME
2021/11/23 Python