那些H5用到的技术(3)——屏幕场景滑动
Swiper.js
一些需要我们手动设置的参数
排版元素需要设置position:absolute绝对元素定位
swiperAnimate方法的使用
动画播放完成之后的监听
上滑提示
屏幕适配的问题
Animate.css
stylie
velocity.js
总结
前言
现在已经有许多公司开发了各种在线H5制作工具平台,可以快速制作简单的移动端H5页面,主要还是展示营销,我随便百度了一个,效果看起来如下所示:
瞬间高大上的感觉有没有,但是这类的的工具一般交互都比较简单,大多都只是基本的滑动特效,好处就是可以快速的将设计稿转化,虽然也需要切图上传排版,但总比代码手动调整的好,而且全程可视化操作,缺点是很难做到深度互动,而源码基本都是加密的,导出使用还挺麻烦,所以要嘛付费高级版,要嘛定制,这样沟通和制作成本都会变高,考虑到公司内部以后会经常用到一些H5,索性自己研究一番,后面可以考虑弄成通用模板。
查了许多资料,目前绝大多数H5都是基于swiper.js!!!
Swiper.js
官方地址:https://github.com/nolimits4web/Swiper
国内地址:http://www.swiper.com.cn/
当然swiper不仅仅可以用户移动网站,目前很多PC端企业官网动态效果也都可以基于此插件实现,类似的还有FullPage.js
官网网站里面已经有很详细的教程了,参考示例使用即可,下面我主要讲一些开发过程中遇到的坑。
一些需要我们手动设置的参数
1、swiper-container的width
和height
一开始用的时候会发现代码按照教程设置好了,但是滑动的时候怎么会漂移,而且样式怪怪的。
这个时候需要我们主动设置width
和height
.swiper-container {
width: 100%;
height: 100%;
left: 0%;
top: 0%;
margin: 0;
border-radius: 0px;
position: relative;
/*background-color: rgba(0, 0, 0, 0.5);*/
}
2、direction: 'vertical'
默认情况是横向滑动的,而我们手机一般是竖着滑动的
排版元素需要设置position:absolute绝对元素定位
默认swiper的css中.swiper-slide样式已经设置成了position:relative
,每个页面的元素当然是需要以父级为基准显示,所以每个页内元素都要设置成position:absolute
,这样就可以通过绝对定位来按照设计稿排版了。
在CSS中关于定位的内容是:
static(静态) 没有特别的设定,遵循基本的定位规定,不能通过z-index进行层次分级。
relative(相对定位) 对象不可层叠、不脱离文档流,参考自身静态位置通过 top,bottom,left,right 定位,并且可以通过z-index进行层次分级。
absolute(绝对定位) 脱离文档流,通过 top,bottom,left,right 定位。选取其最近一个最有定位设置的父级对象进行绝对定位,如果对象的父级没有设置定位属性,absolute元素将以body坐标原点进行定位,可以通过z-index进行层次分级。
fixed(固定定位) 这里所固定的参照对像是可视窗口而并非是body或是父级元素。可通过z-index进行层次分级。
swiperAnimate方法的使用
默认情况下,swiper是不会自动播放动画的,当设置好动画效果attribute之后
swiper-animate-effect="fadeInUp" swiper-animate-duration="0.5s" swiper-animate-delay="0.3s"
还需要调用swiperAnimate
才会读取执行,所以需要在onSlideChangeEnd
事件里主动调用此函数。
或者你需要重新执行动画效果,都可以调用此函数。
动画播放完成之后的监听
有时候我们需要连贯的动画效果,比如,淡入之后,播放另外一个动画,首要任务就是监听动画完成事件
代码如下:
//one仅执行一次,on永久绑定
$('.swiper-slide:eq(0) img').on('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function() {
$(this).removeClass('animated fadeInUp bounceInRight');
$('.swiper-slide:eq(0) img').addClass('animated tada');
});
其实类似的这样连贯的动效可以不用代码做什么监听,我这么做的主要原因是,动画效果直接用animate.css的即可,否则自己写效果也很麻烦,好在已经有开源在线工具可以编辑动画导出css了,见下文
上滑提示
默认情况只有pagination
分页器,就是下面的小圆圈,swiper还自带了几个样式。
所以这个提示是需要我们自己敲代码的,见demo,样式如下
屏幕适配的问题
这是一个比较棘手的问题,根据我经验来说,解决方案有3种,各有利弊,当然也可以混合使用。
1、百分比响应式
这是我经常采用的方案,可以实现动态自适应,让浏览器自己计算,比较适合全都是图片的情况。理论上只要高宽比正确,元素就不会跑偏或拉伸。
如果高宽比不一致,我会在js里计算好比例,先设置body的max-width
和max-height
,然后按比例通过高度计算设置body的height
和width
(因为一般都是屏幕过宽),除非有横竖屏切换
2、rem
通过@media only screen and (max-width)
来指定机型,自行计算设置相应的rem即可实现自适应,而且字体也可以根据rem值设置大小,理论上只要花够时间做适配,可以100%适配所有机型。
3、transform
和viewport的原理一样,而viewport进行缩放是对整个可视区的缩放,所以高宽比是不能变的。
而transform是针对内部每个元素,进行缩放,会根据原始比例自动拉伸高宽,其中还包括文字。
参考代码如下(摘自swiper官方示例):
scaleW=window.innerWidth/320;
scaleH=window.innerHeight/480;
var resizes = document.querySelectorAll('.resize');
for (var j=0; j<resizes.length; j++) {
resizes[j].style.width=parseInt(resizes[j].style.width)*scaleW+'px';
resizes[j].style.height=parseInt(resizes[j].style.height)*scaleH+'px';
resizes[j].style.top=parseInt(resizes[j].style.top)*scaleH+'px';
resizes[j].style.left=parseInt(resizes[j].style.left)*scaleW+'px';
}
var scales = document.querySelectorAll('.txt');
for (var i=0; i<scales.length; i++) {
ss=scales[i].style;
ss.webkitTransform = ss.MsTransform = ss.msTransform = ss.MozTransform = ss.OTransform =ss.transform='translateX('+scales[i].offsetWidth*(scaleW-1)/2+'px) translateY('+scales[i].offsetHeight*(scaleH-1)/2+'px)scaleX('+scaleW+') scaleY('+scaleH+') ';
}
Animate.css
官方地址:https://daneden.github.io/animate.css/
swiper的默认动画就是用的Animate.css,里面的效果非常多,但仅仅是一些简单的特效而已,那如何快速根据需求制作出自己的动画效果呢?它就是stylie!
stylie
官方地址:http://jeremyckahn.github.io/stylie/
可视化的动画编辑器,添加关键帧即可,但是这也仅仅是单一动画的制作。
有时候为了达到更好的效果,确实需要在H5上播放动画(视频和gif都不考虑),用上面的工具+切图+写代码要搞死前端开发!
好在已经有同学分享了经验,参考《H5动画开发快车道》
原理就是通过Animate CC导出html,然后我们再引用,这样就可以由设计人员直接导出给前端接入即可,方便你我他。
velocity.js
官方地址:http://velocityjs.org/
有时候我们还有这样的需求,动态计算设置动画,stylie是预先生成好的,直接设置CSS工作量又非常的,jquery本身自带animate方法,但是效率实在太低,手机上卡顿情况严重,velocity.js就派上用场了,当然,通也可以使用它通过简单的代码快速实现动画特效。
velocity.js 是一个简单易用、高性能、功能丰富的轻量级JS动画库。它能和 jQuery 完美协作,并和$.animate()
有相同的 API, 但它不依赖 jQuery,可单独使用。 Velocity 不仅包含了$.animate()
的全部功能, 还拥有:颜色动画、转换动画(transforms)、循环、 缓动、SVG 动画、和 滚动动画 等特色功能。
它比$.animate()
更快更流畅,性能甚至高于 CSS3 animation, 是 jQuery 和 CSS3 transition 的最佳组合,它支持所有现代浏览器,最低可兼容到 IE8 和 Android 2.3。
原理简单来说,就是velocity.js没有使用到css的 transition,而是用requestAnimationFrame通过js代码来控制动画
总结
通过swiper.js再加上前面的代码结合在一起,我们基本就实现了一个完整的H5展示页面,包括素材加载,背景音乐播放,页面滑动。到目前为止,其实我们大多数时间都在写业务逻辑的代码,轮子什么的早都已经有现成的了,真感谢开源的世界,人人为我,我为人人,极大促进了科技的进步呐,正所谓站在巨人的肩膀上,后面有空也许我会基于此框架写一个本地的H5编辑器,也开源贡献出来。
demo地址:
https://github.com/leestar54/h5-demo/blob/master/swiper.html
那些H5用到的技术(3)——屏幕场景滑动的更多相关文章
- 那些H5用到的技术(1)——素材加载
编码环境前言什么时候用到素材加载?loading提示,让用户等待图片的加载音频的加载利用神器PreloadJS总结 编码环境 Sublime Text 3 插件包括: Autoprefixer 自动补 ...
- H5的本地存储技术及其与Cookie的比较
第一部分: H5的本地存储技术 HTML5 提供了两种在客户端存储数据的新方法.先看下面的例子: 例1:var mySelection = {name:"car", amount: ...
- Docker技术这些应用场景【转】
场景一:节省项目环境部署时间 1.单项目打包 每次部署项目到测试.生产等环境,都要部署一大堆依赖的软件.工具,而且部署期间出现问题几率很大,不经意就花费了很长时间. Docker主要理念就是环境打包部 ...
- Android 实现两屏幕互相滑动
Android 实现两屏幕互相滑动 下文来自: http://blog.csdn.net/song_shi_chao/article/details/7081664 ----------------- ...
- 那些H5用到的技术(6)——屏幕适配
前言长屏适配单页适配参考 前言 曾经屏幕适配一直是个头疼的问题,各种坑,各种浏览器&设备兼容问题,好在的是,随着技术&标准的不断发展,这个问题得到了极大程度的解决,这篇文章主要对之前开 ...
- 那些H5用到的技术(2)——音频和视频播放
前言audio标签Web Audio API自动播放的问题背景音乐的实现立即播放的问题SoundJSvideo标签播放样式的问题格式的问题总结 前言 正常情况,除了非常简陋的小功能H5,音乐播放是必不 ...
- [SAP ABAP开发技术总结]屏幕跳转
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- H5 视频直播相关技术
一.移动视频直播发展 大家首先来看下面这张图: 可以看到,直播从 PC 到一直发展到移动端,越来越多的直播类 App 上线,同时移动直播进入了前所未有的爆发阶段,但是对于大多数移动直播来说,还是要以 ...
- H5传奇世界服务器架设技术及源码
以前是传奇迷,虽然现在不玩,但当作兴趣,研究了一下H5传奇世界的架设,架设成功并分享给大家.注意,此技术只可用于个人娱乐,不可用于商业用途. 首先下载 传奇世界H5源码 450M的样子. H5传奇 ...
随机推荐
- pig配置
下载Apache Pig 首先,从以下网站下载最新版本的Apache Pig:https://pig.apache.org/ 步骤1 打开Apache Pig网站的主页.在News部分下,点击链接re ...
- python中用ElementTree.iterparse()读取xml文件中的多层节点
我在使用Python解析比较大型的xml文件时,为了提高效率,决定使用iterparse()方法,但是发现根据网上的例子:每次if event == 'end':之后elem.clear()或者是每次 ...
- Android-广播发送与接收(Java代码中订阅)
Android四大组件之一广播,使用的也比较多,广播可大致分为两种,一种是Android系统区域的广播,是由系统指令发出,例如:点亮屏幕广播,开机过程中的一些广播 省略…, 然而还有一种广播就是我们自 ...
- 利用html5 postMessage接口跨域设置iframe大小
<!doctype html> <html> <head> <title>Document A</title> <meta chars ...
- layui后台框架的搭建
layui(谐音:类UI) 是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用.其外在极简,却又不失饱满的内在,体积轻盈,组件丰盈,从 ...
- 纸壳CMS(ZKEACMS)体验升级,快速创建页面,直接在页面中修改内容
关于纸壳CMS 纸壳CMS又名 ZKEACMS Core 是ZKEACMS的 .net core 版本,可运行在 .net core 1.1 平台上.是一个开源的CMS. 纸壳CMS对于 ZKEACM ...
- 二十一、Node.js-EJS 模块引擎
初识 EJS 模块引擎 我们学的 EJS 是后台模板,可以把我们数据库和文件读取的数据显示到 Html 页面上面.它是一个第三方模块,需要通过 npm 安装https://www.npmjs.com/ ...
- DAY31、socket套接字
一.复习1.网络编程 软件开发架构 b/s架构 c/s架构 本质都是c/s架构2.互联网协议 OSI七层协议 应用层 表示层 会话层 传输层 网络层 数据链路层 物理连接层3. 物理连接层:建立物理连 ...
- NetEaseGame/ATX 的MD
# ATX(AutomatorX) (中文版)[![Build Status](https://travis-ci.org/NetEaseGame/ATX.svg?branch=master)](ht ...
- 蛋疼的Action.c (141): undeclared identifier `LAST'异常
之前这个脚本运行了很久都没有问题,今天突然在场景运行不了: Action.c (141): undeclared identifier `LAST' 害的老子一直在纠结,这个关联函数没有问题啊,怎么一 ...