位置: 编程技术 - 正文

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系统怎么查看mac地址
  • Win11 Build 10.0.22000.51 预览版ISO镜像下载汇总(苹果M1也可用)
  • 存出投资款是什么凭证
  • 民办非企业年底额度不能低于多少
  • 预收账款什么时候确认增值税
  • 协调费用应该怎么表述才合理
  • 电脑方案表格
  • php ftp上传文件
  • 天竺葵的养殖方法和繁殖方法
  • 年度一次性计税
  • 房地产企业土地增值税清算
  • linux编译安装php扩展命令
  • vite搭建项目
  • 公司交纳社会保险多少钱
  • php获取当前时间提交数据库
  • 怎么配置opencv
  • golang char
  • Java多线程(6):锁与AQS(中)
  • mysql常用表
  • 工伤保险如何认定
  • 支付水费委托收款
  • 两个公司发工资公司会发现吗
  • 补缴税款计入什么科目
  • 累计带薪缺勤账务怎么处理
  • 收到费用发票没有付款的会计分录
  • 公账上的钱怎么提出来
  • 净资产收益率与什么指标有关
  • 不动产计提折旧时间
  • 房地产储备土地排名
  • 上家失控发票补税补不起
  • 机票的电子发票可以报销吗
  • 商场代收款合法吗
  • 应付职工薪酬为负数什么意思
  • 资产负债表和利润表的利润不一致
  • 半个固定资产如何折旧
  • 房地产开发企业成本核算方法
  • sql server 2008教程
  • vista ui
  • windows server 2008 r2最大支持内存
  • cvi linux
  • 安装最新的Google应用
  • 安装ubuntu 20.10
  • avgserv9.exe是什么进程 avgserv9进程的详细介绍
  • win7开机提示重启怎么办
  • newsupd.exe - newsupd是什么进程 有什么用
  • linux dhcpv6
  • linux进程的环境变量
  • cocos2dx4.0入门
  • 模型图怎么画
  • canvas画心形
  • 置顶聊天折叠怎么开启
  • linux的安装
  • ping命令的基本使用方法
  • css中的auto
  • unity如何操作
  • ubuntu nodejs
  • java.基础
  • javascript脚本怎么用
  • javascript简述
  • 重庆市网上税务局官网
  • 外省车险保单,有何不利的事
  • 国家税务总局河北地税局
  • 蜀山区税务局工资待遇
  • 北京第六税务所电话号码
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设