图片轮播--高效版

作为一个专业的前端(笑),图片轮播插件应该是一个很容易实现的功能插件

随着境界的提高,我们编写插件越来越注重它的效率。于是,鉴于工作的关系,我仿照了一下淘宝的插件设计,写了一款我个人比较满意的图片轮播插件(淘宝的插件有bug!)

事先声明,这个插件是基于angular的directive的(换成其他编写形式同理)

特点:

  1. translateX + transition 制作动画(css3处理动画的速度比较高)
  2. 事件代理
  3. 字符串形式生成DOM


streamModule.directive(‘picscroll‘, function() {
    return {
        restrict: ‘E‘,
        scope: {
        	list: "=",
        	space: ‘@‘
        },
        template: [
        	‘<div class="picscroll-con">‘,
			‘	<div class="outer-con">‘,
			‘		<div class="inner-con">‘,
			// ‘			<div class="page" ng-repeat="url in list"><img src="{{url}}"></div>‘,
			‘		</div>‘,
			‘	</div>‘,
			‘	<ul class="points">‘,
			// ‘		<li ng-class="{\‘curLi\‘: cuIndex == $index}" ng-repeat="url in list"></li>‘,
			‘	</ul>‘,
			‘</div>‘
        ].join(‘‘),
        link: function(scope, elem, attr) {
        	var contain = elem.find(‘.inner-con‘);
        	var points = elem.find(‘.points‘);
        	var width = 0;
        	var space = Number(scope.space) || 500;
        	var tmpl = {
        		page: ‘<div class="page"><img src="{url}"></div>‘,
        		point: ‘<li index="{index}"></li>‘,
        	};
        	// 初始化监听器
        	contain.css(‘transition‘, ‘transform ‘ + space / 1000.0 + ‘s ease‘);
        	contain.css(‘position‘, ‘relative‘);
        	points.bind(‘click‘, function(event) {
        		var tar = event.target || {};
        		if(tar.nodeName.toUpperCase() != ‘LI‘)
        			return ;
        		jump(tar.getAttribute(‘index‘));
        	});

        	// 初始化功能(刷新界面什么的调用一下这个方法即可)
        	init();
			function init() {
				var html1 = tmpl.page.replace(‘{url}‘, scope.list[scope.list.length - 1]);
				var html2 = ‘‘;
				width = elem.find(‘.outer-con‘).width();
				for (var i = 0; i < scope.list.length; i++) {
					html1 += tmpl.page.replace(‘{url}‘, scope.list[i]);
					html2 += tmpl.point.replace(‘{index}‘, i);
				};
				html1 += tmpl.page.replace(‘{url}‘, scope.list[0]);
				contain.html(html1);
				points.html(html2);
				jump(0);
			}
			// 初始化页面运动
			var curIndex = 0;
			var movebase = 0;
			function jump(index) {
				index = Number(index);
				movebase = movebase || 0;
				// 锚点
				var children = points.children();
				var len = children.length;
				children.eq(curIndex).removeClass(‘curLi‘);
				children.eq(index).addClass(‘curLi‘);
				// 页面轮动
				if (index == len - 1 && curIndex == 0) {
					// 第一张到最后一张
					contain.css(‘transform‘, ‘translateX(‘ + -movebase + ‘px)‘);
					setTimeout(function() {
						movebase = -width * len + movebase;
						contain.css(‘left‘, movebase + ‘px‘);
					}, space);
				} else if (index == 0 && curIndex == len - 1) {
					// 最后一张到第一张
					contain.css(‘transform‘, ‘translateX(‘ + (-width * (len + 1) - movebase) + ‘px)‘);
					setTimeout(function() {
						movebase = width * len + movebase;
						contain.css(‘left‘, movebase + ‘px‘);
					}, space);
				} else {
					contain.css(‘transform‘, ‘translateX(‘ + (-width * (index + 1) - movebase) + ‘px)‘);
				}
				// 结束
				curIndex = index;
			}
			/**********************
			 **********************
			 * 鉴于上面算法有点复杂,我稍稍的解释一下吧
			 * transition控制translate的动画,translate做移动(动画),left做跳转(瞬间)
			 * 前后加上附加的最后,最前帧
			 * 当first->last或者last->first,先动画到附加帧,动画后left跳转到真实的那帧上
			 * 更新基准线movebase
			 * movebase的更新规律就是
			 * 向前(后)滚len个帧,加上基准
			 *********************
			 **********************/
        }
    };
});

其实代码功能还没有实现完,譬如:自动轮播等~以后补上

时间: 2024-10-11 11:28:38

图片轮播--高效版的相关文章

Android高级图片滚动控件,编写3D版的图片轮播器

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482089 大家好,好久不见了,最近由于工作特别繁忙,已经有一个多月的时间没写博客了,我也是深感惭愧.那么今天的这篇既然是阔别了一个多月的文章,当然要带来更加给力点的内容了,那么话不多说,赶快进入到今天的正题吧. 说 到图片轮播器,很多的Android应用中都会带有这个功能,比如说网易新闻.淘宝等.最新我们公司的一款应用也加入了这个功能,并且在图片轮播的基础上 还增加了三维立体

jQuery 简易版的无缝图片轮播切换

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <style> *{padding:0;margin:0;} ul,li{list-style:none;} .wrap{position: relative;width:200px;height:1

20款带左右箭头的焦点图片轮播特效代码

20款带左右箭头的焦点图片轮播特效代码分享 html5带倒影3D图片叠加轮播切换特效 jQuery slide图片自动轮播滚动插件 jQuery焦点图插件带按钮控制图片轮播滚动代码 jquery仿hao123带新闻标题图片轮播滚动效果 jQuery仿瑞丽全屏透明遮罩图片轮播滚动代码 jQuery带网上开户表单的焦点图轮播代码 jquery左右箭头控制带缩略图片轮播切换 jQuery responsiveslides.js响应式图片轮播特效 jQuery OwlCarousel图片滚动插件世界杯图

css3实践之摩天轮式图片轮播+3D正方体+3D标签云(perspective、transform-style、perspective-origin)

本文主要通过摩天轮式图片轮播的例子来讲解与css3 3D有关的一些属性. demo预览: 摩天轮式图片轮播(貌似没兼容360 最好用chrome) 3D正方体(chrome only) 3D标签云(css3版 chrome only) 3D标签云(js版 chrome only) 前文回顾 在前面的文章css3实践之图片轮播(Transform,Transition和Animation)中我们简单地了解了css3旗下的transform.transition以及animation.回顾一下,tr

Android之——史上最简单图片轮播广告效果实现

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/48049913 如今的Android开发需求越来越来多,实现效果越来越酷炫,很多Android APP都要实现PC网站上那样的图片轮播效果,那么,这些图片的轮播效果是如何实现的呢?下面,我就跟大家一起来实现这些酷炫的功能. 一.原理 首先,将这些要轮播的图片和一些文本分别放置在不同的数据集合中,程序启动的时候默认显示一组图片和文本数据,然后启动一个定时器,每隔一段时间便替换掉显示的

CSS3图片轮播效果

原文:CSS3图片轮播效果 在网页中用到图片轮播效果,单纯的隐藏.显示,那再简单不过了,要有动画效果,如果是自己写的话(不用jquery等),可能要费点时间.css3的出现,让动画变得不再是问题,而且简单易用.下面介绍我用css3与js写的一个图片轮播效果. 一般图片轮播就是三四张图片: <div class="wrap"> <div class="carousel"> <div><img src="http://

UISCrollView —— 图片轮播器封装实现(三)——(第三讲)

1.分析 利用xib布局,然后自定义一个UIView,解析xib,然后利用控制器传入数据,将其加载到控制器的view上展示即可 2. 程序结构 3. 代码具体实现 1>  xib文件 2>  创建类 XMGPageView,然后将其与xib文件关联,选中xib文件,然后设置下文中 " custom class " 为定义的类,让其来管理xib 1>    (如图,设置xib与类关联) 2>  XMGPageView.h 文件中,声明分页图片数组属性,及其一个快速

ionic 图片轮播问题

1.使用ion-slide可以实现图片轮播,但是如果在html中仅仅增加ion-slide是远远不够的,会出现两个问题: (注:使用的是angularjs.首先需要在,js文件中注入:$ionicSlideBoxDelegate) 一.有时候会出现图片无法加载出来.解决办法是: 在相应的controller文件增加 $ionicSlideBoxDelegate.update(); 二.轮播至最后一个不轮播的问题,解决的办法是: 在相应的controller文件增加 $ionicSlideBoxD

js图片轮播与索引变色

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-