快好知 kuaihz

腾讯TID:环球妙旅程活动分享

从下半年开始,我尝试在活动页面中添加css3动画,让标准浏览器的用户能够看到更加炫的效果。一直小打小闹的试验着各种效果~前不久,鬼哥跟我说有个活动要大量使用css3动画,各种动!内心一阵狂喜~~

这是与南航公司合作的活动,用户通过选择航线(欧洲线或北美线),每个航线4个城市,完成航线后转发微博即可参与抽奖。城市间通过css3动画转场切换,对于IE浏览器通过JS做切换。每个城市还会使用css3让小元素动起来。

经过三周的努力,活动终于上线了,但是过程并非想象那么顺利。

环球妙旅程活动体验:http://cxh.tenpay.com/2013/hqmlc/,欢迎猛击~

过程中遇到的问题下面跟大家分享一下:

分享内容:

活动HTML剖析

动画实现

遇到的问题及解决方法

按需加载

图片裁剪

图片文字

自适应

fixed定位问题

经验总结

【活动HTML剖析】

由于航程的8个城市需要随着地球转动进行切换,8个城市的内容需要对底部的地球相对定位,这样控制地球转动就能实现城市转场。

【动画实现】

1.地球是由CSS3绘制出来的一个大圆,把各个城市的图片定位在大圆上面,滚动大圆达到切换城市转场的效果。

view sourceprint?

01 /*大球的定位设置*/

02 .ball{

03 position:fixed;z-index:19;

04 left:50%;top:81%;margin-left:-1113px;

05 width:2226px;height:2226px;border-radius:2226px;

06 }

07   

08 /*动画关键帧*/

09 @-webkit-keyframes ball{

10 0%{opacity:0.8;-webkit-transform:rotate(0deg);}

11 50%{opacity:0;-webkit-transform:rotate(-45deg);}

12 100%{-webkit-transform:rotate(-90deg);opacity:1;}

13 }

2. 城市内的元素漂浮

都是使用的以下这个动画,对元素位移的变化以及旋转。只是播放时间的长短不同~这样可以简化代码的同时又能实现需要的效果。

view sourceprint?

1 @-webkit-keyframes swing{

2 20%, 40%, 60%, 80%, 100% { -webkit-transform-origin:bottom center; }

3 20% { -webkit-transform:translate(3px,0) rotate(25deg); }

4 40% { -webkit-transform:translate(5px,2px) rotate(-20deg); }

5 60% { -webkit-transform:translate(-1px,-11px) rotate(15deg); }

6 80% { -webkit-transform:translate(-11px,-1px) rotate(-15deg); }

7 100% { -webkit-transform:translate(0,0) rotate(0deg); }

8 }

【遇到问题以及解决】

1. 按需加载

【过程尝试】

最初前端同学以为是使用主站那种img标签不进入屏幕的图片就不进行加载。

沟通后,前端同学提出把图片加在HTML,由ID控制载入,如下图结构:

但是很快认识到,图片最先已经在样式中加载了,JS无法控制。前端同学提出样式按需加载。

需要重构把大样式分离成以下部分,由JS动态加载。

但是JS只能用Link的形式把样式插入页面,不方便重构更新样式时间戳。

【目前方案】

经沟通,Wynn提出了更好的方法:

样式名写在节点的自定义属性,需要加载时使用JS给节点的class属性赋上自定义熟悉的值,此时,客户端才会请求相应的图片。

这个方案的优点:

保持样式完整,方便更改时间戳以及后期维护。

请求缩减为一个,比之前分成7个样式相应需要发送7个请求节省了发送时间和等待时间(1ms+4ms)*(7-1)=30ms,而实际上,拆分后的样式字节数请求会比整个样式大,节省的时间是>30ms的。

2. 图片裁剪

活动的图片太多,除了通过按需加载控制,还要在裁剪的时候控制输出大小。以求最优。例如:飞机正着切是95.4k,而按设计稿斜着切是114.4k,相差19K。但是对于不支持旋转的IE需要使用滤镜,这个相对又减慢速度了。

那尝试对斜切的飞机进行无损压缩:

除了通过无损压缩还可以在裁切的时候,多注意细节。例如,当背景图大于100K,我会把它拆分成几个图片再合成,此时根据元素高度进行裁切就可以省下字节数。

3. 图片文字

每个城市的右侧文字视觉使用了手写体,所以都是使用的图片,这给维护带来麻烦。

至此更换了两次,每次更换8个城市需要一天,因为其中还包括链接按钮图片定位。

【过程尝试】

方案1,为了更好的替换,尝试在说明文字使用微软雅黑字体,但是设计师认为没有达到活动的设计效果,只有放弃了。

方案2,有童鞋提出了可以使用@font-face,我试验了一下,它的优点是适合SEO,特别适合用于英文字体。但对于中文字体,动辄几M,目前还没有工具可以实现把需要使用的特殊字体抽离;而且在网页上引用字体需要获取引用版权。鉴于此,使用@font-face的想法,在有限的时间内,只能放弃了。

附上@font-face的使用

获取要使用字体的三种文件格式,确保能在主流浏览器中都能正常显示该字体。

.TTF或.OTF,适用于Firefox 3.5、Safari、Opera

.EOT,适用于Internet Explorer 4.0+

.SVG,适用于Chrome、AndRoid、IPhone

获取字体格式的网站有以下几个:

1. http://onlinefontconverter.com/

Online Font Converter是一个可以帮你把字体在eot otf pfb pfm suit svg ttf pfa bin pt3 ps t42 cff afm ttc woff等格式中互相转换的网站。

2. http://ttf2eot.sebastiankippe.com/

可以将ttf字体转换为eot字体,且最大支持10M的文件

3. http://www.fontsquirrel.com/fontface/generator

兼容格式较多(eot svg ttf woff),但目前只支持英文字母,不支持中文。

方案3,保留拼合文件的文字PSD,后续有修改邀请视觉直接修改拼合PSD。

【目前方案】

最后使用了方案3,希望以后能有更好的方案。

3. 自适应

活动的主要元素都使用了绝对定位,脱离了文本流,所以只能识别body内的高度,那如何做到自适应成了个问题。

【过程尝试】

地球的圆的直径是2226px,多余的部分是对body使用了overflow:hidden;

但是这个设置会导致窗口缩小后无法出现滚动条,如果要出现滚动条就会把下方要隐藏的球暴露出来~~

方案1,对每个城市里面的内容加个固定高度的容器,那就能把多余的地球部分隐去,但是这样做需要对每个城市里的元素都重新定位,因为每个城市高度不一样,还需要统一高度,不够便利,否决。

方案2,使用一个木有元素但属于文档流中的div,包裹住地球。针对该活动把div的最小宽高分别设为755px,1250px。即使div内没有元素,但是当窗口小于这个值就会触发body产生滚动条。

view sourceprint?

1 .container{position:relative;height:100%;width:100%;margin:0 auto;min-height:755x;min-width:1250px;overflow:hidden;}

但是,由于页面内的内容都不在正常文档流中,在chrome等标准浏览器就只能识别到容器的最小高度为755px,无法使城市的CSS3渐变背景随着高度自适应。尝试了padding:9999px;margin:-9999px的方法也没有作用。尝试通过JS给body动态更新min-height的值,但是前端同学没有实现。

【目前方案】

最后使用了方案2实现自适应的问题,渐变的实现只有舍弃了,希望以后有更好的解决方法。

4. fixed定位问题

由于界面元素太多。当窗口变窄的话,元素会重叠在一起。

主要原因是下面的圆使用了fixed,定位在页面最下方。

解决办法就是当页面高度小于临界值的时候,把地球的定位改为绝对定位,使得上面元素不被遮住。这个在chrome等标准浏览器可以通过下面媒体查询的方法实现:

view sourceprint?

1 @media only screen and (max-height:755px){

2 .container{position:relative;height:100%;width:100%;margin:0 auto;min-height:755px;min-width:1024px;overflow:hidden;}

3 .ball{top:550px;position:absolute;}

4 }

5   

6 @media only screen and (min-height:755px){

7 .container{position:relative;height:100%;width:100%;margin:0 auto;overflow:hidden;}

8 }

对于IE类浏览器只有通过JS判断可视区域的高度,对body节点增加.min-heigh的样式,对该样式下的元素进行自定义。

本站资源来自互联网,仅供学习,如有侵权,请通知删除,敬请谅解!
搜索建议:腾讯  腾讯词条  环球  环球词条  旅程  旅程词条  活动  活动词条  分享  分享词条