原生javascript实现图片轮播效果——续
2016-06-10 21:05
911 查看
在上一篇中只是简单的实现了原生javascript实现图片轮播效果中的自动播放和手动暂停,在这一篇中笔者加入了切换的动画效果、左右上下轮播可调、以及切换图片计数功能。
其次在封装的库函数中加入设置动画的animate()函数,源码如下
最后就是在index.js中实现上述功能,源码如下,有注释不详解。
文章最后上几张效果图,上下轮播(动态图太大不能上传,运行效果可直接下载源码跑)
左右轮播在上一篇已体现,单是图片还看不出效果,总体来说算是不错的。源码下载地址:http://pan.baidu.com/s/1o7WiFz0
<div id="index"> <em class="in_index" > <strong> </strong></em> </div>在html中加入一个div,作为图片计数用处,同样css参见给出的源码。
其次在封装的库函数中加入设置动画的animate()函数,源码如下
Base.prototype.animate = function (obj) { for (var i = 0; i < this.elements.length; i ++) { var element = this.elements[i]; var attr = obj['attr'] == 'x' ? 'left' : obj['attr'] == 'y' ? 'top' : obj['attr'] == 'w' ? 'width' : obj['attr'] == 'h' ? 'height' : obj['attr'] == 'o' ? 'opacity' : obj['attr'] != undefined ? obj['attr'] : 'left'; var start = obj['start'] != undefined ? obj['start'] : attr == 'opacity' ? parseFloat(getStyle(element, attr)) * 100 : parseInt(getStyle(element, attr)); var t = obj['t'] != undefined ? obj['t'] : 10; //可选,默认10毫秒执行一次 var step = obj['step'] != undefined ? obj['step'] : 20; //可选,每次运行10像素 var alter = obj['alter']; var target = obj['target']; var mul = obj['mul']; var speed = obj['speed'] != undefined ? obj['speed'] : 6; //可选,默认缓冲速度为6 var type = obj['type'] == 0 ? 'constant' : obj['type'] == 1 ? 'buffer' : 'buffer'; //可选,0表示匀速,1表示缓冲,默认缓冲 if (alter != undefined && target == undefined) { target = alter + start; } else if (alter == undefined && target == undefined && mul == undefined) { throw new Error('alter增量或target目标量必须传一个!'); } if (start > target) step = -step; if (attr == 'opacity') { element.style.opacity = parseInt(start) / 100; element.style.filter = 'alpha(opacity=' + parseInt(start) +')'; } else { //element.style[attr] = start + 'px'; } if (mul == undefined) { mul = {}; mul[attr] = target; } clearInterval(element.timer); element.timer = setInterval(function () { /* 问题1:多个动画执行了多个列队动画,我们要求不管多少个动画只执行一个列队动画 问题2:多个动画数值差别太大,导致动画无法执行到目标值,原因是定时器提前清理掉了 解决1:不管多少个动画,只提供一次列队动画的机会 解决2:多个动画按最后一个分动画执行完毕后再清理即可 */ //创建一个布尔值,这个值可以了解多个动画是否全部执行完毕 var flag = true; //表示都执行完毕了 for (var i in mul) { attr = i == 'x' ? 'left' : i == 'y' ? 'top' : i == 'w' ? 'width' : i == 'h' ? 'height' : i == 'o' ? 'opacity' : i != undefined ? i : 'left'; target = mul[i]; if (type == 'buffer') { step = attr == 'opacity' ? (target - parseFloat(getStyle(element, attr)) * 100) / speed : (target - parseInt(getStyle(element, attr))) / speed; step = step > 0 ? Math.ceil(step) : Math.floor(step); } if (attr == 'opacity') { if (step == 0) { setOpacity(); } else if (step > 0 && Math.abs(parseFloat(getStyle(element, attr)) * 100 - target) <= step) { setOpacity(); } else if (step < 0 && (parseFloat(getStyle(element, attr)) * 100 - target) <= Math.abs(step)) { setOpacity(); } else { var temp = parseFloat(getStyle(element, attr)) * 100; element.style.opacity = parseInt(temp + step) / 100; element.style.filter = 'alpha(opacity=' + parseInt(temp + step) + ')'; } if (parseInt(target) != parseInt(parseFloat(getStyle(element, attr)) * 100)) flag = false; } else { if (step == 0) { setTarget(); } else if (step > 0 && Math.abs(parseInt(getStyle(element, attr)) - target) <= step) { setTarget(); } else if (step < 0 && (parseInt(getStyle(element, attr)) - target) <= Math.abs(step)) { setTarget(); } else { element.style[attr] = parseInt(getStyle(element, attr)) + step + 'px'; } if (parseInt(target) != parseInt(getStyle(element, attr))) flag = false; } //document.getElementById('test').innerHTML += i + '--' + parseInt(target) + '--' + parseInt(getStyle(element, attr)) + '--' + flag + '<br />'; } if (flag) { clearInterval(element.timer); if (obj.fn != undefined) obj.fn(); } }, t); function setTarget() { element.style[attr] = target + 'px'; } function setOpacity() { element.style.opacity = parseInt(target) / 100; element.style.filter = 'alpha(opacity=' + parseInt(target) + ')'; } } return this; }; <span style="font-size:18px;"><span style="font-size:14px;"></span></span>其中涉及的跨浏览器获取Style函数封装在tools中:
function getStyle(element, attr) { var value; if (typeof window.getComputedStyle != 'undefined') { //W3C value = window.getComputedStyle(element, null)[attr]; } else if (typeof element.currentStyle != 'undeinfed') { //IE value = element.currentStyle[attr]; } return value; }<span style="font-size:18px;"><span style="font-size:14px;"></span></span> <span style="font-size:18px;"><span style="font-size:14px;"></span></span>
最后就是在index.js中实现上述功能,源码如下,有注释不详解。
$(function () { //轮播器初始化 //$('banner img').css('display','none'); //alert(); //$('#banner img').eq(0).css('display', 'block'); $('#banner img').opacity(0); $('#banner img').eq(0).opacity(100); //设置第一张图片 $('#banner ul li').eq(0).css('color', '#333'); //$('#banner strong').html('asfsdc'); $('#banner strong').html($('#banner img').eq(0).attr('alt')); //获取alt的属性值 //轮播器计数器 var banner_index = 1; //轮播器的种类 var banner_type = 2; //1表示左右切换,2表示上下滚动 //自动轮播 var banner_timer = setInterval(banner_fn,1000); //手动轮播器 $('banner ul li').hover(function () { //var num = $(this).index(); // alert(num); clearInterval(banner_timer); //清理计时器,停止播放 // alert($(this).css('color')); banner(this,banner_index == 0 ? $('#banner ul li').length() - 1 : banner_index - 1); },function () { banner_index = $(this).index() + 1; banner_timer = setInterval(banner_fn, 3000); }); function banner(obj,prev) { $('#index .in_index').html(parseInt($(obj).index()) + 1 + '/' + $('#banner ul li').length()); $('#banner ul li').css('color', '#999'); $(obj).css('color', '#333'); if (banner_type == 1) { $('#banner strong').html($('#banner img').eq($(obj).index()).attr('alt')); $('#banner img').eq(prev).animate({ attr : 'o', target : 0, t : 30, step : 10 }).css('zIndex', 1); $('#banner img').eq($(obj).index()).animate({ attr : 'o', target : 100, t : 30, step : 10 }).css('zIndex', 2); }else if (banner_type == 2) { //$('#banner img').opacity(100); $('#banner strong').html($('#banner img').eq($(obj).index()).attr('alt')); $('#banner img').eq(prev).animate({ attr : 'y', target : 150, t : 30, step : 10 }).css('zIndex', 1).opacity(100); $('#banner img').eq($(obj).index()).animate({ attr : 'y', target : 0, t : 30, step : 10 }).css('top','-150').css('zIndex', 2).opacity(100); //强制设置初始值,并设置层次 }; }; function banner_fn() { if (banner_index >= $('#banner ul li').length()) banner_index = 0; banner($('#banner ul li').eq(banner_index).first(), banner_index == 0 ? $('#banner ul li').length() - 1 : banner_index - 1); // 根据当前索引获取下一张索引值 banner_index++; } }); <span style="font-size:18px;"><span style="font-size:14px;"></span></span>
文章最后上几张效果图,上下轮播(动态图太大不能上传,运行效果可直接下载源码跑)
左右轮播在上一篇已体现,单是图片还看不出效果,总体来说算是不错的。源码下载地址:http://pan.baidu.com/s/1o7WiFz0
相关文章推荐
- 通过服务器返回来JSON歌词数据进行解析
- [ASP.NET] 如何利用Javascript分割檔案上傳至後端合併
- JS设计模式之模板方法
- (八)JavaScript Date对象属性方法
- ajax获取json对象
- js 格式验证总结
- json_encode转成带 花括号的{ } 和 中括号的[ ] 2种 形式 json数据
- 浅谈JavaScript的全局变量与局部变量
- JS 字符串编码函数(解决URL特殊字符传递问题):escape()、encodeURI()、encodeURIComponent()区别详解
- 《JavaScript DOM 编程艺术》读书笔记
- javaScript知识点总结(必看篇)
- JSF中DataTable和SelectOneRadio搭配,每条记录每一行一个radio进行单选的解决办法
- js之iframe子页面与父页面通信
- 关于js中onclick字符串传参问题
- JSON Viewer json字符串的查看工具
- (七)JavaScript string对象及方法
- JavaScript 控制字体大小设置
- js 方法重载
- js页面取值的三种方式
- JS禁止右键