摘要:上一篇说了瀑布流,今天说一下小小幻灯片的故事。幻灯片学名又叫轮播。轮播原理这里先说一下基本原理吧,就是将图片向左或向右移,然后接着显示下一张,或者上一张。这里需要感谢一下爱编程提供的图片接着重头戏就是。用来标识当前的元素的序号。
上一篇说了瀑布流,今天说一下小小幻灯片的故事。
幻灯片学名又叫 轮播。应该算是一种最常用的页面展示信息。以前由于ie6/7的拖累,导致我们只能使用,很古老的方式去兼容。(我最爱的css3啊~~~)。不过今年真的是前端的幸福年,各种 polyfill 和 shim,而且现在各大公司已经对ie6/7不予理睬,直接给他一个提醒页面(老子让你用ie6/7)。而且IE的爸爸,ms已经表态了,我当初是怎么生下你来的,太tm丑了,由于开放二胎,ms已经孵化了edge(原名斯巴达),现在基本上是前端的黄金时代了。这里我主要介绍一种比较实用的轮播效果。
简单轮播轮播,在各大网站都是使用,比如在淘宝首页(兼容性比较好), 网易云音乐首页等等。 可以说,写轮播应该算是前端的一个必修课程吧。 我这里就挑一个最简单的实现。
这里实现轮播的技术,主要依赖与css3,js只是作为一个切换class名的作用(只要不写js都简单)。
轮播原理这里先说一下基本原理吧, 就是将图片 向左或向右移,然后接着显示下一张,或者上一张。
特么,逗我呢。你不说我也知道哎喂。
咳咳~
我们来看一下,html部分吧。
这里就是通过ul包裹多个li实现的轮播。(这里需要感谢一下爱编程提供的图片)
接着重头戏就是css3。
看~
.sliderCon { width: 100%; max-width: 100%; height: 100%; position: relative; text-align: center; ul { display: inline-block; position: relative; width: 450px; padding: 0; perspective: 1400px; li { width: 450px; height: 290px; position: absolute; list-style: none; top: 0; left: 0; opacity: 0; pointer-events: none; z-index: 1000; text-align: center; &.navOutNext { animation: rotate3DSlideOutLeft 0.3s forwards; } &.navInNext { animation: rotate3DSlideInRight 0.3s 0.1s forwards; } &.navOutPre{ animation: rotate3DSlideOutLeft 0.3s forwards; } &.navInPre{ animation: rotate3DSlideInRight 0.3s forwards; } &.current { opacity: 1; pointer-events: auto; z-index: 1000; } } } }
我这里只贴出主要部分的。 其实,贴出来根本没用,需要结合js来看。
js原理解析好吧,我继续贴哈。
js部分:
var slider = (function() { var order = 0, lis = $(".sliderCon li"); var toggle = (function() { //通过flag来进行切换 var current, next, isAnimated = false, //标识是否正在执行动画 mark = 0, //用来表示多个动画是否都结束 len = lis.length - 1; //获得总的图片框 var changeState = function() { mark++; if (mark === 2) { isAnimated = false; mark = 0; } } var nextExe = (function() { var setCurrentAnimate = function() { this.removeEventListener(transitionName, setCurrentAnimate); this.classList.remove("current"); this.classList.remove("navOutNext"); changeState(); //检测是否动画都执行完整 } var setNextAnimate = function() { this.removeEventListener(transitionName, setNextAnimate); this.classList.add("current"); this.classList.remove("navInNext"); changeState(); } return function() { var current = lis[order]; order = order + 1 > len ? 0 : order + 1; var next = lis[order]; //获取下一个元素 if (!transitionName) { alert("你浏览器怎么这么垃圾,赶紧换一个吧"); } else { current.addEventListener(transitionName, setCurrentAnimate); next.addEventListener(transitionName, setNextAnimate); } current.classList.add("navOutNext"); //开始执行动画 next.classList.add("navInNext"); } })(); var preExe = (function(){ var setCurrentAnimate = function() { this.removeEventListener(transitionName, setCurrentAnimate); this.classList.remove("current"); this.classList.remove("navOutPre"); changeState(); //检测是否动画都执行完整 } var setPreAnimate = function(){ this.removeEventListener(transitionName, setPreAnimate); this.classList.add("current"); this.classList.remove("navInPre"); changeState(); //检测是否动画都执行完整 } return function(){ var current = lis[order]; order = order-1<0 ? len: order-1; var pre = lis[order]; //获得下一个切换的元素 if (!transitionName) { alert("你浏览器怎么这么垃圾,赶紧换一个吧"); } else { current.addEventListener(transitionName, setCurrentAnimate); pre.addEventListener(transitionName, setPreAnimate); } current.classList.add("navOutPre"); //开始执行动画 pre.classList.add("navInPre"); } })(); return function(flag) { //入口函数 if (isAnimated) return; //如果正在执行动画则退出 isAnimated = true; //标识正在执行动画 if (flag === "next") { nextExe(); }else if(flag==="pre"){ preExe(); } } })(); setInterval(function() { toggle("pre"); }, 1000); })();
由于我过度的使用了闭包和高阶函数,所以看起来会有点累哈。不急,同样,一个程序我们先找入口函数。
可以看出。入口函数就是toggle(就是使用return 的那部分);
return function(flag) { //入口函数 if (isAnimated) return; //如果正在执行动画则退出 isAnimated = true; //标识正在执行动画 if (flag === "next") { nextExe(); }else if(flag==="pre"){ preExe(); } }
isAnimated只是个标识符,用来表示是否正在执行动画。通过传入的flag来表示向前切换还是向后切换。如果向后接环则执行nextExe函数。好,我们来看一下nextExe函数。
切换动画函数var nextExe = (function() { var setCurrentAnimate = function() { this.removeEventListener(transitionName, setCurrentAnimate); this.classList.remove("current"); this.classList.remove("navOutNext"); changeState(); //检测是否动画都执行完整 } var setNextAnimate = function() { this.removeEventListener(transitionName, setNextAnimate); this.classList.add("current"); this.classList.remove("navInNext"); changeState(); } return function() { var current = lis[order]; order = order + 1 > len ? 0 : order + 1; var next = lis[order]; //获取下一个元素 if (!transitionName) { alert("你浏览器怎么这么垃圾,赶紧换一个吧"); } else { current.addEventListener(transitionName, setCurrentAnimate); next.addEventListener(transitionName, setNextAnimate); } current.classList.add("navOutNext"); //开始执行动画 next.classList.add("navInNext"); } })();
对不起,吓到大家了,我这里又写了一个闭包。。。 当然,主要入口函数还是在return 后面。
order用来标识当前的元素的序号。 需要注意的是添加动画监听的那一部分。我这里使用了一个tricks(from moderniz),我贴出来吧。
var transitionName = (function() { var t; var el = document.createElement("fakeelement"); //其实使用animated完全可以取代transition var transitions = { //这里是aniamted事件 "WebkitAnimation": "webkitAnimationEnd", "OAnimation": "oAnimationEnd", "msAnimation": "MSAnimationEnd", "animation": "animationend" //下面是transition事件 // "transition":"transitionend", // "OTransition":"oTransitionEnd", // "MozTransition":"transitionend", // "WebkitTransition":"webkitTransitionEnd", // "MsTransition":"msTransitionEnd" } for (t in transitions) { if (el.style[t] !== undefined) { return transitions[t]; } } })();
其实这个IIFE主要的功能就是检测,你的浏览器到底支持哪一个动画监听函数。 好,pass.
我们回到刚才的主函数nextExe. 接着,我们给current和next添加监听,监听函数先放着。 接着我们给current和next添加动画(就是添加class). 就这样。然后他会触发监听函数。 这里就不过多介绍了, 唯一需要提及的就是,需要在后面对监听进行解绑,避免重复绑定。
废话说完了。 直接看个实例吧。
slider实例
这应该算是最原始的轮播。 接着我们可以在上面加上一些我们想要的功能。这里我加上了一些比较常用的,比如,轮播标识符,左右翻页。
由于比较简单,我这里直接把实例贴出来。其实主要的干货就是最原始的轮播,其余的都是花花草草。
update slider
好了,大部分内容我也差不多介绍完了。
说说轮播上面基本上把简单轮播的原理介绍一遍,虽说低版本的SB IE可能会不支持。 但这个主要取决于你产品leader的规范,如果他要求是ie9+那么你使用这个应该问题不大,就是需要处理一下动画结束事件的支持。如果甚者需要将ie8考虑进来,那么,这个应该使用css的基本属性,而不能使用css3,或者直接使用js进行改变。还是那句话,站在你的角度去造一个unique轮子,就是最好的学习。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/78627.html
摘要:对,滑动式幻灯片的关键就在于隐藏。在条件里我们添加一个事件相当于滑动后的回掉,依赖这个事件在幻灯片滑动执行完毕后立即执行里面的闪回操作。通过添加事件监听滑动是否结束从而迅速闪回,达到貌似无限滑动的效果。 slider轮播组件,在各类网站上出现及其频繁,有渐隐式的,滑动式的等等一系列。栗子在这: 但我当初学习写轮播时却被各种入门教程搞得焦头烂额。不是代码太复杂,就是封装太严重,初学者很难...
摘要:前两天学长回学校进行洗脑宣讲,做了一个看上去很炫的缩放式幻灯片。可以用如下的方法添加第一页的幻灯片你需要写的是和。如果用户刚点开幻灯片而没反应,这个提示会自动浮现。虽然这些东西很简单,但做一个演讲使用的幻灯片,也已经足够好了。 前两天学长回学校进行洗脑宣讲,做了一个看上去很炫的缩放式幻灯片。我不知道是不是太浅薄了,找了很久才找到几个Web幻灯片工具。看了几个之后,我决定学习一下其中最G...
摘要:由于是线上发布,所有有部分人问我怎么正确的使用它。因为没有在实际的项目页面设置帮助文档。需求为了看到效果,请使用目前并不兼容早期的版本。第四张幻灯片来个新花样,使用的值控制其缩放大小。 可以先看一个demo:http://dwqs.github.io/resume 昨天,我写了一些关于Impress.js的东西,对于创建在线的自我展示,这是一个非常不错的JavaScript库。由于是...
摘要:通过后端代码操作幻灯片时,可直接在幻灯片中绘制形状,并在形状中添加文本字符串内容。本篇文章,介绍一种通过字符串来添加内容到幻灯片的的方法,可添加文字图片视频音频等。通过方法将字符串添加到幻灯片。保存文档幻灯片效果通过Java后端代码操作PPT幻灯片时,可直接在幻灯片中绘制形状,并在形状中添加文本字符串内容。本篇文章,介绍一种通过html字符串来添加内容到PPT幻灯片的的方法,可添加文字、图片...
阅读 995·2023-04-25 14:45
阅读 2771·2021-09-30 09:59
阅读 3114·2021-09-22 15:48
阅读 2424·2019-08-30 15:55
阅读 3467·2019-08-30 15:44
阅读 535·2019-08-29 14:07
阅读 3412·2019-08-26 13:45
阅读 535·2019-08-26 11:31