随着CSS3动画的普及,应用CSS3动画的活动页、宣传页、专题页,如雨后春笋般破土而出,达到了很好的传播与品牌宣传的效果。
H5几乎成为了移动端宣传的主流方式,不管是商业活动还是品牌推广宣传,大多都会选择制作H5页面来进行相应的宣传工作,因此在移动端,特别是微信上,几乎每天都能发现H5页面的踪影。
2015年的QQ空间5.0预约页
相关技术点
- CSS Transiton & Animation 动画
- SVG 动画
- 图片高清屏适配
- 图片预加载
- 竖屏提示
- 感应视差
- 分享
- 多媒体播放
- 整屏滚动
- PC适配
素材定位
容器
.center-obj
固定大小的盒子通过 absolute 绝对定位 垂直水平居中
.center-obj { |
元素
容器内的元素绝对定位,并且使用背景图片
- 使用背景图片结合
CSS3 Media query
方便做高清屏的图片适配,同时也能很好的去过CSS Sprite
雪碧图,提升图片加载效率。 - 方便动画渲染,绝对定位可以触发独立的
Composited Layer
复合层,也就是独立的渲染层,在执行动画时只会自身重绘repaint
,不会引起界面重排reflow/relayout
动画分析
第一屏
- 循环 星星闪烁动画 m1start ( scale )
- 循环 火焰闪烁动画 m1fly ( background-position + steps )
- 入场 Button弹性动画 rubberBand ( scale )
- 循环 Loading 加载动画 progress-bar-stripes ( background-position )
出场顺序:星星+火焰+Loading > Button
当页面素材加载时执行更新 Loading,加载完成时,删除 Loading 元素,显示 Button
Keframes
@keyframes m1start { |
动画说明
星星闪烁
animation: m1start 2s .5s linear infinite backwards; |
运用 m1start
序列帧,动画执行2s,延迟0.5s,使用 linear 匀速动画函数,循环执行,每个循环停留在最后一帧。
火焰闪烁
animation: m1fly .2s .5s steps(3, start) infinite |
运用 m1fly
序列帧,动画执行 0.2s,延迟 0.5s,使用 steps 动画,循环执行,每个循环停留在最后一帧。
steps
火焰动画不需要平滑的线性渐变动画,而需要一帧一帧显示的帧动画,steps(
3,start) ,把动画 分为三个关键帧执行,从起点开始跃阶变化。
第二屏
这一屏动画形式比较简单,主要是位移与缩放
- 入场 火箭&人从上掉落 m2fall1
- 入场 手机从上掉落 m2fall2
- 入场 陆地弹性跳动 m2fall3
- 循环 热气球上下位移 m2ball
- 循环 黄色星球&星星闪烁 m2yball
- 感应视差 背景 parallax.js
出场顺序:
热气球&黄色星球&星星&背景&标题 > 火箭&人&手机
通过关键帧控制动画的快慢
关键帧与关键帧之间的间隔长短,可以决定动画的快慢
@keyframes m2fall3 { |
模拟陆地落地有缓冲的效果,0-35,没有动画,35-38,快速掉落,38-50,向上弹起,50-85再落下,85-100回到原点。
第三屏
入场 手机&文字 fall
入场 按钮 bounce
入场 线条 dash
入场 星球 m3wave
循环 星星与点 m3star
出场顺序:手机&文字&按钮 > SVG线条动画+星球
SVG线条动画
svg线条动画主要由两个样式控制
stroke-dasharray
:一组数组,没数量上限,每个数字交替表示划线与间隔的宽度 (线宽 间隔 线宽 间隔 … )stroke-dashoffset
: 虚线的偏移量
这两个属性任意一个都可以实现svg线条填充动画,如 svg 路径长度为1000:
如果使用
stroke-dasharray
, 则动画可以 从stroke-dasharray: 0, 1000;
变化至strok-dasharry: 1000, 1000;
即虚线的长度从0
到1000
如果使用
stroke-dashoffset
偏移来实现,则动画可以从初始状态
stroke-dasharry: 1000, 1000; |
变化至
stroke-dashoffset: 0; |
即先向左偏移100px,显示空白间隔,现减少偏移量,显示出线段来
推荐阅读 SVG 线条动画入门
第四屏
入场 手机&文字 fall
入场 按钮 bounce
入场 线条 dash
入场 猴 m4monkey
入场 蜜蜂 m4bee
入场 猫 m4cat
循环 星星与点 m4star
循环 蓝色纸人 m4paste
第五屏
入场 手机&文字 fall
入场 按钮 bounce
入场 汽泡 m5pop1 m5pop2 m5pop3
入场 热气球 m5ball
第四屏与第五屏动画效果与上面基本相同(略)
第六屏
入场 手机&文字 fall
入场 按钮 bounce
入场 云向右漂浮
入场+循环 人向右走动
入场 汽泡淡出
利用元素嵌套运用连续的动画效果
animation
允许设置多个动画效果,但是如果多个动画效果有相同的动画属性时,动画则不能达到预期效果。
可以正常执行.element {
animation: fadeIn 2s, float 1.2s 2s ease-in infinite both;
}
@keyframes fadeIn {
from { opacity:0; }
to{ opacity: 1}
}
@keyframes float {
25%{ transform: translateY(10px)}
50%{ transform: translateY(0px)}
75%{ transform: translateY(-10px)}
}
后面相同的动画属性会覆盖掉前面的动画.element2 {
animation: left-in 2s, zoomIn 1.2s 2s ease-in infinite both;
}
@keyframes left-in {
from { transform: translateX(0) }
to{ transform: translateX(40px) }
}
@keyframes zoomIn {
from { transform: scale(.8) }
to{ transform: scale(1.2) }
}
走路的人walk
元素从透明度 1
变成 0.5
,同时从向右移动 60px
,并停留在 60px
的位置ele-runner
则应用 steps
帧动画,表现为走路的状态
将两个动画应用在不同的元素上,避免相同的动画属性被覆盖掉
<div class="walk"> |
整屏滚动
jQuery的一款插件fullpage.js,可以实现全屏滚动,非常流行的效果,兼容性IE8+
因为考虑到兼容性,使用了jQuery的fullpage插件,使用方法
页面结构<div class="main" id="fullPage">
<section style="height: 100%" class="page page2"></section>
<section style="height: 100%" class="page page3"></section>
<section style="height: 100%" class="page page4"></section>
<section style="height: 100%" class="page page5"></section>
<section style="height: 100%" class="page page6"></section>
</div>
Fullpage初始化
$("#fullPage").fullpage({ |
图片适配与加载
图片的高清适配
一般情况下使用 @1x
一倍图缩写样式
利用 media query 检测如果高清屏,则使用 @2x
两倍图
#loading .ele-man { |
图片预加载
通过将一些大图预先加载出来,再展示页面动画
在加载的过程中,更新进度信息给予用户一定的反馈效果
var img_list = [ |
图片预加载的原理
通过创建一个 Image 对象,给对象的src属性赋值为图片URL,来达到加载图片目的
图片预加载要考虑到的问题:
- 如果图片被浏览器缓存,在ie和oprea中,则不会触发 onload 事件
- 如果是动态图片如gif,则会多次触发 onload 事件
function loadImage(url, callback) { |
竖屏提示
通过监听 window 的 onorientationchange
事件,再判断用户是否是横屏,如果是横屏,则提示用户竖屏操作
window.onorientationchange = function() { |
感应视差
Parallax.js是一款功能非常强大的javascript视觉差特效引擎插件。通过这个视觉差插件可以制作出非常炫酷的视觉差特效。并可以检测智能设备的方向。
<div class="parallax-obj"> |
多媒体播放
H5支持 audio 多媒体标签,直接播放多媒体内容<audio id="audio" src="audio.mp3" loop preload="auto" autoplay="true"></audio>
在IOS中,多媒体的插放不能通过JS来触发播放,需要用户手动触发
通过给 html 绑定 touchstart
事件,来触发音乐播放
var a = document.getElementById("audio"); |
可以通过 audio.play()
与 audio.pause()
方法来控制 播放 与 暂停
$('.J_musicIcon').on('touchend click', function(e){ |
PC适配
让主要内容固定大小剧中显示,背景全屏平铺显示,以达到PC的适配效果
分享
微信分享分为两种,一种是普通的网页分享,一种是利用微信的JS-SDK分享页面。
一般分享
普通分享,只能分享页面的标题、缩略图、URL地址
- 标题取页面
head
中title
的内容 - URL为当前页面的地址
- 缩略图为当前页面第一张图片
如何在分享中显示指定的图片?
在body之后添加一张隐藏的缩略图,大小大于 200 x 200
<h1 class="thumbnails" style="display:none"> |
微信JS-SDK分享
微信JS-SDK分享需要公众号授权,并有很多的限制规则
微信分享可以分享到 朋友圈、微信好友、QQ、腾讯微博、QQ空间wx.onMenuShareAppMessage({
title: '', // 分享标题
desc: '', // 分享描述
link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: '', // 分享图标
type: '', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});