位置: 编程技术 - 正文

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实现)

  • 房产税从价计征如何算
  • 小规模纳税人工程发票几个点
  • 带息负债融资成本
  • 非盈利组织是两套账吗?
  • 工商年报实缴出资额是实收资本吗
  • 纳税人经营所得预缴申报表怎么填
  • 房地产开发企业会计科目
  • 在途物资的运费放在哪个科目
  • 事假扣薪
  • 增值税补交还有没有责任
  • 售后人员出差计入哪个科目
  • 委托加工的加工费要交增值税吗
  • 公司开发票就会报税吗?
  • 内帐怎么做增值税处理
  • 出口企业增值税怎么算
  • 零售通收银
  • 安全教育经费计算方法
  • 工程税金计入哪个账户
  • 季报的利润表是填本期金额还是本年
  • 电子发票可以开专票吗
  • 工会经费税收
  • 海运费付款方式
  • 购买树苗计入会计科目吗
  • linux版笔记本什么意思
  • 销售折扣收货方法有哪些
  • RPDFLchr.exe - RPDFLchr是什么进程 有什么用
  • 政策性搬迁补偿收入如何财税处理
  • 补充医疗保险是六险吗
  • vue项目页面写在哪里
  • mysql事务执行流程
  • 无形资产使用寿命不确定需要摊销吗
  • php+mysql+ajax实现单表多字段多关键词查询的方法
  • 新会计准则开办费如何做账务处理
  • php验证表单方法有哪些
  • 无法偿还的应付账款计入什么科目
  • 城建税5%的是什么情况
  • 赊购材料尚未支付的款项属于什么科目
  • 发票勾选了还能冲红吗
  • 计提增值税怎么计提
  • 增值税普通发票需要交税吗
  • RabbitMQ个人实践
  • 发票没拿回来可以报销吗
  • 材料采购账户的借方登记什么
  • 会计为什么不能有0
  • 小规模发票跨月冲红怎么纳税申报
  • 公司车辆交强险怎么网上买
  • 账本还用贴印花税票吗
  • 长期挂账的其他应付款税务风险
  • 残保减免金政策
  • 记账联是哪一联
  • 存货期末计量按什么分类
  • 零售商品购进的核算需要设置什么科目
  • MSSQL 数据库同步教程
  • win7更改win10系统要怎么更改
  • u盘运行win10系统
  • xp电脑开机自检怎么取消
  • macbookpro移到废纸篓快捷键
  • win8.1使用教程
  • win7系统进不了桌面
  • 在linux系统中,用来存放各种配置文件的目录
  • 教你一行代码
  • linux中crontab的用法
  • jquery的实现原理
  • 在Android EditText中实现日期时间选择器(DatePicker和TimePicker)
  • 物理引擎演示
  • unity-chan
  • javascriptwhile
  • 深入理解javascript特性
  • html js怎么调用
  • Android 4.4 Dialog 被状态栏遮挡的解决方法
  • jquery写网页
  • python快速排序最简单写法
  • 国家税务稽查局举报中心
  • 湖北税务局2021新通知
  • 内蒙古物业费收取标准2020
  • 深圳国家税务局赵雨婷处长
  • 青岛市税务局长魏
  • 资本结构不合理的公司有哪些
  • 车辆整备质量怎么填
  • 东莞办理房产证在哪里预约
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设