位置: 编程技术 - 正文

Hammer.js+轮播原理实现简洁的滑屏功能(轮播怎么实现)

编辑:rootadmin

推荐整理分享Hammer.js+轮播原理实现简洁的滑屏功能(轮播怎么实现),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:轮播的设置,轮播器html,轮播实现,轮播器html,轮播器html,轮播的设置,轮播器html,请问轮播,内容如对您有帮助,希望把文章链接给更多的朋友!

最近有个任务,做一个非常小的h5的应用,只有2屏,需要做横向的全屏滑动切换和一些简单的动画效果,之前做这种东西用的是fullpage.js和jquery,性能不是很好,于是就想自己动手弄一个简单的东西来实现。最后我用zepto + hammer.js 和轮播的方式解决了这个问题,效果还不错,整个页面不开启Gzip时所有资源请求的数据大小为KB左右。这篇文章总结下这个方法的实现思路。

效果演示:

1. 实现要点

1)滑屏借鉴bootstrap的carousel插件,不过完全没有它那个复杂,只需要借鉴它的轮播实现思路即可;

2)滑屏切换的触发,跟PC不一样,PC通常都是通过元素的点击回调来触发,对于滑屏的页面,完全可以利用window的hashchange事件来处理,这样只要通过超链接设置锚点或者通过js改变location.hash就能触发切换;

3)考虑到移动还得支持手势操作,可以使用hammer.js这个手势库,API非常简单易用;

4)动画效果可以用animate.css,不过不用把它所有的代码都弄到代码里,只需要拷贝需要的动画效果相关的代码即可;

5)替代jquery,首选zepto;

6)滑屏效果使用transition动画,为了能够响应动画结束的回调,可以考虑使用transition.js,这个也是Bootstrap提供的工具,不过它默认只能跟jquery使用,要对它稍微改变一下才能跟zepto联合使用。

这些要点说的比较粗糙,后面的内容会一一详细介绍。

2. html结构

空的滑屏页的html结构是这样的:

html,

.container与.page初始化的时候采用绝对定位,全屏布局。每一个section.page代表一页,并且默认不显示,所有页的定位都相同,也就是说如果所有页都显示的话,这些页会重叠在一块。

demo页的html结构是:

demo相关的css就不展示了。其中animated是应用animate.css需要的,animate.css是一个动画库,github上有。

3. 滑屏切换的实现思路

滑屏切换就是通过js控制2个要滑动的页增加和删除以下定义的这一些css类实现的:

.page--active表示当前显示的页,页面初始化后,通过以下js调用,给第一页加上.page—active:

这样页面默认就显示了第一页。以向左滑屏说明这些css的使用原理:

第一步,找到下一页的section,添加page--next类,将它定位当前页的右边,为滑屏做准备;

第二步,找到当前页的section,给它添加page--active-left,由于这个类改变了translate3D属性的值,所以当前页会往左滑动一屏;

在第二步的同时,给下一页的section,添加page--next-left,由于这个类改变了translate3D属性的值,所以下一页会往左滑动一屏;

Hammer.js+轮播原理实现简洁的滑屏功能(轮播怎么实现)

第三步,在当前页跟下一页滑屏动画结束后,找到原来的当前页,移除掉page--active和page--active-left类;

在第三步的同时,找到下一页,移除掉page--next和page--next-left类,添加page--active。

gif图说明如下:

向右滑屏原理类似:

第一步,找到上一页的section,添加page--prev类,将它定位当前页的左边,为滑屏做准备;

第二步,找到当前页的section,给它添加page--active-right,由于这个类改变了translate3D属性的值,所以当前页会往右滑动一屏;

在第二步的同时,给上一页的section,添加page--prev-right,由于这个类改变了translate3D属性的值,所以上一页会往右滑动一屏;

第三步,在当前页跟上一页滑屏动画结束后,找到原来的当前页,移除掉page--active和page--active-right类;

在第三步的同时,找到上一页,移除掉page--prev和page--prev-right类,添加page--active。

综合以上实现原理,封装成JS函数如下:

由于$activePage在页面初始化的时候默认指定为第一页,在每次滑屏结束后都会更新成最新的当前页,所以调用的时候只要把目标页的ID传给slide函数即可。以上代码可能会有疑问的是:

1)$targetPage[0].offsetWidth的作用,这个代码用来触发浏览器的重绘,因为目标页原来是display: none的,如果不触发重绘的话,下一步添加css类后将看不到动画效果;

2)$.transitionEnd.end以及emulateTransitionEnd的作用,这个在下一部分说明。

4. 浏览器css动画结束的回调及模拟

bootstrap提供了一个工具,transition.js,用来判断浏览器是否支持css动画回调事件,以及在浏览器没有在动画结束后自动触发回调的特殊情况下通过模拟的方式来手动触发回调,原先这个工具只能配合jquery使用,为了在zepto中使用,必须稍微改变一下,下面就是改变之后的代码:

$.transitionEnd.end表示当前浏览器支持的动画结束事件的名称。$.fn.emulateTransitionEnd是一个扩展了Zepto原型的一个方法,传入一个动画的过渡时间,当这个时间段过完之后,如果浏览器没有自动触发回调事件,called就始终是false,setTimeout会导致callback被调用,然后callback内部就会手动触发动画结束的回调。为什么要通过这个方式来模拟动画结束,是因为浏览器即使支持动画结束事件的回调,但是有些时候并不会触发这个事件,或者在动画结束后不能立即触发,影响回调的准确性。传入的duration应该与执行动画的元素,在css上设置的transtion-duration相同,注意以下代码中标黄的部分:

5. hashchange事件

PC端滑屏都是给元素添加点击事件触发的,移动端可以利用window的hashchange事件:

hashchange事件,在js代码中通过改变loaction.hash或者是点击<a href="#page-2" title="">下一页</a>这样的超链接时,都会触发,所以只要在这个事件的回调去做滑屏切换即可。这样那些上一页和下一页的链接元素都不用加事件了。

6. hammer.js使用简介

hammer.js是一个手势库,支持常用的手势操作,使用简单,引入它的js之后,通过以下的方式来支持手势滑屏:

把整个container元素作为滑屏的stage,监听到swipeleft事件,就表示向左滑,页面应该显示下一页;监听到swiperight事件,就表示向右滑,页面应该显示下一页。

7. 结束语

animate.css的使用就不详细介绍了,比较简单,这是它的github地址:

javascript实现瀑布流加载图片原理 讲一下大概的原理吧,还是先上图:功能描述:根据不同菜单的属性值分别加载不同的数据下拉滚动条到一定位置预加载图片,滚动条拉到最底下的时

JavaScript实现的SHA-1加密算法完整实例 本文实例讲述了JavaScript实现的SHA-1加密算法。分享给大家供大家参考,具体如下:/****SecureHashAlgorithm(SHA1)*

原生js实现图片层叠轮播切换效果 本文实例介绍了js焦点图片层叠轮播切换滚动效果,分享给大家供大家参考,具体内容如下效果图:功能描述:自定义图片尺寸;每隔一段时间自动滚动

标签: 轮播怎么实现

本文链接地址:https://www.jiuchutong.com/biancheng/381704.html 转载请保留说明!

上一篇:JavaScript实现的MD5算法完整实例(javascript的dom)

下一篇:javascript实现瀑布流加载图片原理(js debounce实现)

  • 2023小规模纳税人所得税税收优惠政策
  • 企业税后利润留用比例怎么算?
  • 税财通财务软件备份与恢复
  • 未签购销合同需不需要印花税
  • 出口退税进项发票认证勾选
  • 税务局返还的三种税种
  • 母公司为子公司担保需要股东会决议吗
  • 大型机械进退场费属于机械台班单价组成部分
  • 材料入库时实收什么意思
  • 当期应税销售收入是含税还是不含税
  • 2021印花税零申报怎么报
  • 企业所得税固定资产一次性扣除
  • 餐饮企业员工
  • 企业有哪些o
  • 未认证进项税额转出
  • 结转与结余
  • 进项税额大于销项税额怎么办
  • 固定资产报废账目
  • 进项税额能抵扣的几种情形
  • 对公账户长期不用怎么收费
  • 企业出租商铺交什么税费呢
  • 跨年的暂估成本怎么冲回
  • 应收冲预收是什么意思
  • linux如何查找命令
  • osx无法安装怎么办
  • 销售黄金的会计分录
  • php如何导入数据库
  • 建立无法轻易删除的数据
  • 全网最详细的破解卡密软件教程[2021首发]
  • 共用水电无法取水怎么办
  • 未开票收入怎么做账
  • 发票开烟酒
  • 免税和免征增值税是一个意思么
  • yarn的配置
  • framework怎么用
  • 亚伯拉罕湖中的树,加拿大艾伯塔 (© Coolbiere/Getty Images)
  • 两阶段鲁棒优化 多目标
  • 大前端最新
  • 结转财务费用时怎么做账
  • java一天速成
  • 文化传媒有限公司英文
  • 中华人民共和国企业所得税年度纳税申报表
  • 本期无销项税额,勾选抵扣的进项税填在哪里
  • 企业收到合同保险怎么办
  • 免税收入不征税收入计入收入总额吗
  • 金融资产主要包括
  • 上年度没有计提企业所得税,今年怎么做分录
  • 股份有限公司股东人数
  • 收到税务局退回的个税手续费怎么入账
  • 交所得税的分录
  • 进口货物的库存商品金额依据
  • 实发工资高于工资表
  • 自增字段必须是主键吗
  • MySQL5.6.31 winx64.zip 安装配置教程详解
  • windows防病毒
  • linux 使用
  • centos配置vps
  • win 7系统无法删除系统文件
  • linux中管道
  • windows 8.1 (multiple editions)
  • react-native-modal
  • JS写XSS cookie stealer来窃取密码的步骤详解
  • JQuery.Ajax()的data参数类型实例详解
  • ajax分页查询数据文档效果图
  • 不易引起无意注意的是
  • Node.js中的事件循环是什么
  • shell发送邮件
  • nodejs爬虫模拟浏览器
  • linux shutdown命令详解
  • shell定时删除指定目录下的文件夹
  • jQuery插件ajaxfileupload.js实现上传文件
  • jquery有自定义选择器吗
  • android 布局属性大全
  • 职称申报密码找回
  • 长沙税务局网上开票
  • 一般纳税人公司注销流程
  • 电子税务局申报截止日期
  • 江苏国税电子税务局怎么登录
  • 襄阳市疫情防控中心电话
  • 国际税务网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设