位置: 编程技术 - 正文

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

  • 小规模纳税人普票交税吗
  • 外来原始凭证包括哪些入库单
  • 公司支付宝收款二维码怎么弄
  • 小规模纳税人资产负债表和利润表
  • 固定资产与累计折旧有对应关系吗
  • 财务软件计提所得税分录
  • 盈余公积未分配利润
  • 增值税专用发票抵扣税额是什么意思
  • 查增应纳税所得额怎么算
  • 技术转让费怎么定价
  • 未及时支付工资时间界限
  • 怎么把原材料转为成本
  • 银行承兑汇票向谁追索
  • 公司购买短期理财现金流量表怎么填
  • 营改增后纳税人可以使用的发票种类
  • 未付款的增值税怎么做账
  • 营改增行业注释
  • 对子公司进行增资
  • 高速公路通行费发票怎么开
  • 个人所得税起征点什么时候调整的
  • 董事费监事费高管薪酬标准
  • 防伪开票系统税票如何抵扣
  • 开专票需要备注吗
  • 购买方申请的红字信息表编号如何查询
  • 企业可以用当月的进项票抵扣上月的销项吗?
  • 服务类的公司有哪些
  • 集体福利是否可以抵税
  • 一年内到期的应付债券计入
  • 简易征收税务处理
  • 分配结转制造费用时借方科目
  • 税收返还需要缴纳什么税
  • PHP:JulianToJD()的用法_日历函数
  • php安装及使用教程
  • 浅谈php中变量的使用情况
  • 一行简单的代码
  • linux rc.d init.d
  • 固定资产清理销售的收入
  • ps换脸后怎样修理痕迹
  • python 数据采集卡
  • 开票是否享受优惠
  • 应收账款借方余额需要交税吗
  • 分公司是独立的诉讼主体吗
  • sql聚合语句
  • 新租赁准则承租人租金用什么科目
  • 增值税专用发票丢了怎么补救
  • 收据盖发票专用章会被处罚吗
  • 生产经营个人所得税税率表
  • 新政府会计制度下,属于资产类科目的是
  • 差额征税的账务处理教学视频
  • 多交税款账务怎么处理
  • 代扣税款手续费是什么意思
  • 存货毁损损失应计入的科目是
  • 用友无法填制凭证
  • 处置固定资产和报废固定资产区别
  • 监控系统文件
  • windowsxp网络ip设置
  • ubuntu 安装zsh
  • 安全组件异常,请重新下载并安装
  • linux安装有哪几种方式
  • windows7能玩地下城吗
  • windowxp音量图标没了
  • Netlib.exe - Netlib是什么进程 有什么用
  • win7能玩的老游戏
  • react native community
  • javascript的用法
  • Python判断字符串结尾并输出yes或no
  • ipc漏洞入侵的基本步骤
  • node中的ejs
  • js实现返回顶部
  • Javascript 字符串拼接
  • 深入理解新发展理念
  • jquery datatable服务端分页
  • dom4j解析xml字符串步骤
  • scroll-view组件用于实现
  • android 获取时区
  • 广东省电子税务局官网登录入口
  • 粮仓计算公式
  • 纳税申报逾期怎样补报?
  • 一般纳税人申请流程
  • 增值税普通发票和电子普通发票的区别
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设