利用 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 相关文章推荐
浅析两列自适应布局的3种思路
May 03 HTML / CSS
css3实现针线缝合效果(图解步骤)
Feb 04 HTML / CSS
浅谈cookie和localStorage那些事
Aug 27 HTML / CSS
HTML5本地存储之Database Storage应用介绍
Jan 06 HTML / CSS
html5跨域通讯之postMessage的用法总结
Nov 07 HTML / CSS
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
Jun 23 HTML / CSS
10个最常见的HTML5面试题 附答案
Jun 06 HTML / CSS
Html5与App的通讯方式详解
Oct 24 HTML / CSS
HTML文本属性&amp;颜色控制属性的实现
Dec 17 HTML / CSS
浅谈amaze-ui中datepicker和datetimepicker注意的几点
Aug 21 HTML / CSS
CSS实现两列布局的N种方法
Aug 02 HTML / CSS
CSS基础详解
Oct 16 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中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
Prototype中dom对象方法汇总
2008/09/17 Javascript
锋利的jQuery 第三章章节总结的例子
2010/03/23 Javascript
Javascript中的window.event.keyCode使用介绍
2011/04/26 Javascript
js中方法重载如何实现?以及函数的参数问题
2013/08/01 Javascript
js+css实现导航效果实例
2015/02/10 Javascript
javascript中FOREACH数组方法使用示例
2016/03/01 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
Vue自定义指令介绍(2)
2016/12/08 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
2017/04/03 jQuery
使用jQuery.Pin垂直滚动时固定导航
2017/05/24 jQuery
vue.js模仿京东省市区三级联动的选择组件实例代码
2017/11/22 Javascript
自定义PC微信扫码登录样式写法
2017/12/12 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
2018/11/02 Javascript
微信小程序webview实现长按点击识别二维码功能示例
2019/01/24 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
2019/02/21 Javascript
Python入门篇之编程习惯与特点
2014/10/17 Python
Python求两个文本文件以行为单位的交集、并集与差集的方法
2015/06/17 Python
Python实现批量压缩图片
2018/01/25 Python
Python设计模式之简单工厂模式实例详解
2019/01/22 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
中国第一家杂志折扣订阅网:杂志铺
2016/08/30 全球购物
NFL加拿大官方网上商店:NHLShop.ca
2019/03/12 全球购物
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
六一儿童节活动策划方案
2014/01/27 职场文书
心理健康教育制度
2014/01/27 职场文书
20年同学聚会感言
2014/02/03 职场文书
责任书格式范文
2014/07/28 职场文书
党员剖析材料范文
2014/12/18 职场文书
人力资源部岗位职责
2015/02/11 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
2016年保险公众宣传日活动总结
2016/04/05 职场文书
「睡美人」爱洛公主粘土人开订
2022/03/22 日漫