自制 移动端 纯原生 Slider滑动插件

在Google搜关键字“slider”或“swiper”能找到一大堆相关插件,自己造轮子是为了能更好的理解其中的原理。

给这个插件取名为“veSlider”是指“very easy slider”非常简单的一个滑动插件。

这只是个半成品,仅仅实现了手指滑动、自动轮播、跳转等基本功能。代码撑死了200行不到,用的原理也比较简单粗暴。

点击跳转到Github上代码地址。扫描下面的二维码可以查看在线demo:

 

一、实现原理与效果

1)在下图中,将“ul”容器设置为相对定位,子标签“li”设置为绝对定位

2)移动的效果,其实就是动态修改translateX的值

3)相邻的两张图片能够贴在一起,就是translateX起的作用

4)动态给“li”添加或移除过渡效果,可以实现缓动

5)当你向左滑动最后一张图片,跟着出来的是第一张;或者当你向右滑动第一张图片,跟着出来的是最后一张图片

6)在第5点中,要实现这种效果需要做些控制,注意“li”标签最后会被设置为visibility,就是在做相关的控制,后面会讲到

7)根据下图可以看到,当前的“li”的translateX值肯定是0,然后上一张为-320px,下一张320px

 

二、结构

1)CSS

只是做了简单通用设置,可以自定义扩充。

 1 .veSlider {
 2   position: relative;
 3   list-style: none;
 4   margin: 0;
 5   padding: 0;
 6   width: 100%;
 7   overflow: hidden;
 8 }
 9 .veSlider > li {
10   position: absolute;
11   top: 0;
12   left: 0;
13   list-style: none;
14   overflow: hidden;
15   height: inherit;
16 }

 

2)HTML

为了实现方便,我直接将相关的ul与li标签写死在页面中。

高级点的话,可以通过JS脚本动态输出,并且在输出的时候可以做图片预加载等处理。

height写在了style中,因为各种情况下的高度是不同的,所以自定义设置

1 <ul class="veSlider" style="height:180px" id="veSlider">
2   <li>
3     <a href="http://www.cnblogs.com/strick/">
4       <img src="img/banner.jpg" width="100%" />
5     </a>
6   </li>
7 </ul>

 

3)JavaScript

通过new一个veSlider对象做初始化。

var slider = new veSlider({container: document.getElementById('veSlider')
});

目前可以传入的参数只有4个。容器container目前只支持单个的,例如上面的“getElementById”;不支持列表初始化,例如“getElementsByTagName”等

var defaults = {container: '', //容器对象auto: false, //自动轮播easing: 'ease-in', //缓动类型duration: 3000 //自动轮播间隔时间
};

 

三、实现代码

1)插件封装

现在有比较时髦的AMD、UMD模块规范,为了让插件支持这些规范,需要做一些声明。

为了防止在引入其他JS脚本的时候,将window或undefined重写掉,会传入原生的window与undefined。

;(function(factory) {/* CommonJS module. */if (typeof module === "object" && typeof module.exports === "object") {module.exports = factory(window);/* AMD module. */} else if (typeof define === "function" && define.amd) {define(factory(window));/* Browser globals. */} else {factory(window);}
}(function(global, undefined) {"use strict";}));

 

2)构造函数

1. 默认参数与传入的参数做合并

2. 一些值的初始化,例如容器container、偏移对象offset

3. 容器尺寸的获取,通过方法“getBoundingClientRect”获得。关于尺寸获取可以参考《JavaScript中尺寸、坐标

4. 给容器绑定事件,“touchstart”、“touchmove”等。事件绑定用到了“handleEvent”方式绑定。事件方面的资料可以参考《JavaScript中事件处理

5. 获取容器中的子集,并将这些子集的translateX值初始化

6. 初始化自动轮播。下面是部分代码:

function veSlider(opts) {this.opts = extend(opts, defaults);//默认参数与传入参数合并this.size = this.container.getBoundingClientRect(); //容器尺寸this.children = slice.call(this.container.children); //容器的子集this.currentIndex = 0; //当前索引this._bind(); //绑定动画事件this.caculate(this.currentIndex); //初始化子集的偏移量this.opts.auto && this.play(); //初始化自动轮播
};

 

3)切换子集的判断

在“touchend”事件中,做了简单的判断。

1. 对于慢速滑动,如果滑动的距离超过了当前容器的一半,那就做切换操作

2. 间隔时间在 300ms 内就算快速滑动,滑动距离只要超过 14,就做切换操作

3. 下图第一次是慢速,第二次是快速

 

4)slideTo方法控制某个子集滑动到指定位置

veSliderProtytype.slideTo = function(index, time) {this.currentIndex = index = this._setThreshold(index);var other = this.direction == CONST.LEFT ? (index - 1) : (index + 1);other = this._setThreshold(other);//隐藏需要移动的子集this.children.forEach(function(dom, i) {if (i == index || i == other) {return;}dom.style.visibility = 'hidden';});//手指移动的时候用.1 自动移动的时候用.4this.caculate(index, time || '.1');
};

1. 传入当前的子集索引,然后根据_setThreshold方法获取到正确的索引值

2. _setThreshold控制“<0”的数设置为0,“>last”也就是最大索引值的数,设置为last

3. 给other值赋值,根据缓存的direction方向,判断贴在一起的子集是上一个还是下一个,同样也要做_setThreshold判断

4. 隐藏会移动的图片,这个代码就是用来解决上面“实现原理与效果”中第6点提到的问题

5. 下图是演示如果不隐藏会出现的问题,滑动的时候出现了最后那张图片

5. 最后做位移计算

 

 

5)caculate方法计算偏移值

veSliderProtytype.caculate = function(index, time, offsetX) {var _this = this, last = this.last;this.children.forEach(function(dom, i) {var x = i - index;if (index == 0 && i == last) {x = -1;} else if (index == last && i == 0) {x = 1;}setTransition(dom, _this.opts.easing, time);setTranslateX(dom, x, _this.size, offsetX || 0);});
};

1. 计算相对当前子集的尺寸偏移倍数,通过“i - index”取得值

2. 再判断当前子集是第一个或最后一个,这两个位置比较特殊

3. 设置过渡与translateX的相关值

4. 偏移值是通过计算的“offsetX + size.width * i”,容器宽度的倍数加上当前移动的距离

5. 以容器宽度为320px为例,通过上面的计算,可以让当前子集translateX为0,前一张为-320px,后一张为320px,再后一张就是两倍640px

 

四、可以改进的部分

1、CSS可以有更多的效果,也可以嵌入到JavaScript中

2、li标签可以用JS脚本输出,而不用写死在页面中

3、支持数组初始化,例如container设置为通过“getElementsByTagName”获取到的数组

4、支持更多的自定义参数设置,目前只有4个

5、浏览器兼容性,目前只支持webkit内核相关的

6、在各个事件里,可以有自己定义的事件

7、目前只支持左右滑动,上下滑动的话要做些更灵活的修改

还有很多方面可以改进,这里就不列举了。

 





    本文转自 咖啡机(K.F.J)   博客园博客,原文链接:http://www.cnblogs.com/strick/p/5297491.html,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ISA Server 2006 部署步骤

ISA Server 2006 部署步骤 Posted by 尹揆 在这里先把ISA2006的安装步骤给大家贴出来,后面陆续会有一些配置及日常的应用,希望大家多多指教!呵呵.ISA功能的强大自然不用多说了,一句话只要能想到它就能做到!放入光盘出现在我们面前还是其人性化的界面点默认的下一步吧接受协议序…

mysql将查询数据另存

1.查询mysql的存储执行目录&#xff08;secure-file-priv是指定文件夹作为导出文件存放的地方&#xff09;所以需要查询以下&#xff0c;不然会报1290错误 show variables like %secure%;2.查询并转存 SELECT * into outfile C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\zo…

重新捡起flask(三)

记一次bug调试。 本来以为模板这一章可以很快的过掉的&#xff0c;刚刚写完的2其实只剩下个flask-moment时间库了&#xff0c;之前早就做过&#xff0c;记得很简单&#xff0c;本来说只要敲一下代码就结束&#xff0c;没想到&#xff0c;踩坑里去了。 调试bug吗&#xff0c;我想…

远程服务器部署spring boot 项目(centos7为例)

1.打包项目&#xff08;可以是jar包&#xff0c;也可以是war包&#xff09;以jar包为例&#xff08;用eclipse打包&#xff09;&#xff1a;1.项目目录右击--debug as&#xff08;run as&#xff09;--maven build&#xff0c;然后输入package&#xff0c;点击debug&#xff0c…

SIN的服务器配置

统计了新加坡服务器中IBM XIV存储挂载的主机列表。 对于vmware虚拟机来说&#xff0c;是这么组成的&#xff1a; 存储分了多个lun&#xff0c;在os侧叫做data store&#xff0c;多个datastore挂给多个物理机&#xff0c;物理机(安装了esxi软件)称为ESXI主机&#xff0c;多个ESX…

sklearn机器学习实例

原创网址&#xff1a;https://blog.csdn.net/qq_27150893/article/details/80169736 sklearn是非常流行的机器学习库&#xff0c;实现了很多的机器学习模型。官网&#xff1a;http://scikit-learn.org/stable/ 里面有全面的实例和模型参数讲解&#xff0c;用到哪个模型就去官…

CSVDE批量导入域用户

CSVDE批量导入用户 你可以使用Csvde格式的文件在活动目录中创建用户帐号和其他类型的帐号。但你不能使用Csvde删除活动目录中的对象。 使用Csvde命令行工具创建用户帐号&#xff0c;采用下列步骤&#xff1a; 1. 创建Csvde输入文件。文件应包含下列信息。 属性行&#xff1a;这…

【转载】细聊冗余表数据一致性(架构师之路)

本文主要讨论四个问题&#xff1a; &#xff08;1&#xff09;为什么会有冗余表的需求 &#xff08;2&#xff09;如何实现冗余表 &#xff08;3&#xff09;正反冗余表谁先执行 &#xff08;4&#xff09;冗余表如何保证数据的一致性 一、需求缘起 互联网很多业务场景的数据量…

ethtool如何让接口闪灯_如何解决专业家庭影院与卡拉OK的声学问题?

现在越来越多的专业家庭影院走进人们的家中&#xff0c;享受体验娱乐氛围的空间。在实际的生活中&#xff0c;许多人都把这个空间设计为多功能的影音娱乐室&#xff0c;集看电影、听音乐、卡拉OK、游戏娱乐等于一体&#xff0c;在这其中看电影与卡拉OK将这两个功能组合在同一个…

关于MapReduce单词统计的例子:

要统计的文件的文件名为hello hello中的内容如下 hello  you hello  me 通过MapReduce程序统计出文件中的各个单词出现了几次.(两个单词之间通过tab键进行的分割) 1 import java.io.IOException;2 3 import mapreduce.WordCountApp.WordCountMapper.WordCountReducer;4 5 i…

朵朵糖故事机器人怎么更新_“故事贩卖机”专栏创始人温酒的新作,奇幻世界的暖心物语很治愈...

我有酒&#xff0c;你有故事吗&#xff1f;2015年&#xff0c;知乎上一个叫“故事贩卖机”的专栏横空出世&#xff0c;凭着一个个脑洞大开的故事&#xff0c;这个温吞而又温暖的专栏很快得到了读者的认可。而其中的创始人兼主打写手温酒&#xff0c;更是被粉丝们亲切地称呼为“…

使用dropwizard(3)-加入DI-dagger2

前言 习惯了Spring全家桶&#xff0c;对spring的容器爱不释手。使用dropwizard&#xff0c;看起来确实很轻&#xff0c;然而&#xff0c;真正使用的时候不得不面临一个问题。我们不可能一个resource就能把所有的业务逻辑囊括&#xff01;那么&#xff0c;必然就要有负责处理逻辑…

日历对象导哪个包_微信新表情瞬间炸裂,文物表情包永恒萌呆!

11月18日晚微信上架了6个全新表情瞬间炸裂网友一天时间阅读达16.2亿&#xff0c;讨论15.8万次#微信新表情#话题翻白眼、666、让我看看叹气、苦涩、裂开微信新表情虽然666但文物表情包的呆萌也能让人瞬间裂开更能完全诠释我的各(bu)种(wen ding)情绪先对比一下最新的6个表情[翻白…

Tensorflow一些常用基本概念与函数(1)

文章转至 作者&#xff1a;林海山波出处&#xff1a;https://me.csdn.net/lenbow版权&#xff1a;本文版权归作者和CSDN博客共有 写这篇博客只为自己学习路上做个笔记&#xff0c;方便自己学习记忆&#xff0c;大家如果想看详细文章可以去原作者主页去看&#xff0c;同时他…

蓝牙连接不上车要hfp_如何正确使用车载蓝牙播放器呢?

车载蓝牙是以无线蓝牙技术为基础而设计研发的车内无线免提系统。可以连接我们设计进行听歌和打电话十分方便&#xff0c;下面诺金小编带大家一起来看看&#xff01;下面诺金小编带大家一起来看看一、首先是把手机和车载蓝牙播放器打开&#xff0c;搜索车载蓝牙播放器“809”&am…

使用Eclipse+PyDev创建Django项目一windows下

开发条件&#xff1a;eclipsepydev插件django editor插件 关于eclipse安装小编就不多做介绍&#xff0c;我自己用的版本如下 1.安装pydev插件 启动Eclipse, 点击Help->Install New Software 弹出如下框 点击add 分别在 Name中填:Pydev, Location中填http://pydev.org/up…

查询空缺_携程旅行2021校招开启,9大类职位,1000+岗位空缺,本科及以上学历...

携程旅行2021秋季校招正式开启&#xff01;携程集团(纳斯达克股票代码&#xff1a;TCOM)是一家领先的在线旅游服务提供商&#xff0c;旗下品牌包括携程、Trip.com、天巡和去哪儿。携程集团能够整合复杂的旅游相关信息并通过其先进的移动端App、网站以及24小时无间断的免费客户服…

Django web开发笔记

一、Django开发环境搭建&#xff1a; 1.安装python&#xff1a;django可运行于版本python 2.7、3.x 2.安装相应的IDE 3.安装pip&#xff1a;sudo apt-get install python-pip(linux为例&#xff09; 4.安装django&#xff1a;1&#xff09;pip安装&#xff1a;sudo pip ins…

android 前置摄像头预览时 镜像翻转_全面屏时代,原来手机前置摄像头都隐藏着一些缺点,你发现了吗?...

随着真全面屏时代的到来&#xff0c;人们已经不再满足于刘海屏、水滴屏以及挖孔屏等&#xff0c;越来越多的手机厂商和消费者开始追求"100%全面屏"。于是如何解决手机前置摄像头便成了最大的难题&#xff0c;毕竟只要在屏幕上放置摄像头必然会影响屏占比&#xff0c;…

Java 调用 Python 方法学习笔记

文章转载自&#xff1a; 作者&#xff1a;IT_xiao_bai 来源&#xff1a;CSDN 原文&#xff1a;https://blog.csdn.net/IT_xiao_bai/article/details/79074988 前一阵自刚好用python做了一个sae的算法模型&#xff0c;结果公…