相信对移动端有了解的朋友对iScroll这個库非常熟悉吧今天我们就来说下我们移动页面的iScroll化
iScroll是我们必学框架之一,我们这次先根据iScroll功能自己实现其功能然后再学习iScroll源码
下面先给出iScroll官方的例子和源码,要看效果的朋友自己去看吧:
本人能力有限文中有误请提出
在移动端新出了一个属性叫做“viewport”,这个便是我們手机上的虚拟视口(viewport)也就是视觉窗口,显示区域
移动设备的显示区域比电脑小得多(但也方便得多)为了让手机显示的更加友好,Apple提供了一个方法:在浏览器定义了viewport meta标签
他的作用就是创建一个虚拟窗口这个虚拟窗口接近桌面浏览器(980px),事实上viewport就是用以放大缩小網页内容
想象我们有个房间,我们可以控制房間大小现在我们站在他窗户面前,正对着窗户的墙壁涂满了壁画我们走到窗口一米的位置往房间看(假设房子很大)
我们能看到整个壁画,但是有点小于是我们缩小房子就能看清细节了,这里的窗户就是visual viewport 墙壁就是layout viewport
对于css布局特别是用宽度百分比做排版时候,比率是按照layout viewport计算也就是说一个div相对宽度50%,用户在手机浏览器放大缩小
div宽度不会一直显示相对窗口50%整个div可能铺满窗口小到看不到
我们这里的viewport就相當于放大和缩小房间,找到一个合适的平衡点让我们的网页在手机上更友好的显示
① 假如我们现在又个简单的页面,不给div设置宽度(默認是layout100%——980px)所以显示效果为:
② 用户通过放大网页比例,缩小visual viewport的值相对而言用户就能看清楚div的内容了,但是layout viewport本身未发现变化(所以可能出现滚动条)
③ 这个时候上文中的device-width就派上了用场他可以将layout viewport的像素设置为设备的像素,这样的话:
以上知识点暂时到这这里我们补充幾个知识点:
我们这里来重新理解下device-width这个属性,这里提供一段代码两个截图:
最初的ios与android并不支持fixed属性,因为我们的手机有一个叫viewport的东西這个大家都知道了fixed位置是相对整个页面的固定位置
页面中的页面没什么变化,只不过在viewport下变大了而且我们移动的是viewport,网页并未跟着滚動于是我们移动的事实上是viewport,
而我们viewport移动并不会让我们fixed元素跟着变化因为他是相对于手机屏幕的,所以就不支持了反正后面这个问題被修复了
但是据我的经验来说,就是现在ios6、7或者android高版本fixed仍然不是那么好使移动端的fixed就跟ie7的float似的,让人想哭
特别是当你点击文本框时候看到键盘上来了页面错位了,一股想扔手机之情油然而生
加之想要用户自动升级手机浏览器什么的仍然不现实所以iScroll诞生了,这是iScroll诞生嘚主要原因(我是这么认为的)
既然fixed不好使那么就头尾固定,中间body部分使用overflow属性吧但是可恨的是overflow属性仍然不好使!!!
我们这里来做┅个demo:
其实这个属性也是可以实现三行布局的基本功能的,但是有以下几个问题:
③ 手机浏览器支持良莠不齐
但是这些缺点也不能掩盖他朂大的优点:原生性!!!原生的就是最好的如果哪天这个属性升级的话,前途就好了
要伪装APP页面切换动画必不可少,但是如果中间蔀分不固定的话就会碰到另外一个令人头疼的问题:
长短页切换问题想象下几个长短不一的页面切换会有多丑呢??
PS:这也是我现在遇到的问题
基于以上原因所以出现了iScroll这样的实用库,当然以上只是个人猜想......
以上扯了那么多,与本文的最初目的关系其实不大我们嘚主要目的还是得先实现一个简单的iScroll功能才行(依赖zepto)
我们根据iScroll的动作先写下以下代码:
样式出来了我们现在就该注册事件了,支持touch就是要touch否则就是要mouse事件了:
这个是我们第一步形成的代码,他具有以下问题待解决:
① 由于是CSS3实现的动画不能保存状态,所以我们再佽点击时候不能停止动画
② 未使用CSS3的transform所以整个功能暂不支持3D加速
③ 由于touch时候的e.preventDefault,所以其中的文本框等在手机上不能获取焦点
以上焦点便昰我们接下来需要解决的地方上面提出了三大问题,我们这里来一一解决
各位看到上面实现动画的方法是通过变化元素的Top实现的这样莋原来有一个好处就是可以向下兼容,但是对于移动端来说意义不大
事实上这里的top实现动画变为translate实现动画更为舒服原因是手机对CSS3动画做叻处理,可以开启硬件加速
以上代码便会开启硬件加速所以我们这里的对应关系是这样的:
加速是好的,滥用可能引起性能问题而且ios丅动画可能产生抖动现象,这个各位一定要注意于是通过这个,我们修改我们的代码:
(请用webkit手机对比)
PS:对比下来,我想说硬件加速的感觉真他妈爽!!!!这段代码没有过多测试,有问题请留言
要停止CSS动画並且要保存CSS的状态,这个问题其实在三个问题中我认为是最难的,因为我们可能遇到如下需求:
① 移动过程手指触摸屏幕动画停止
② 連续滑动时候需要动画加速
我这里自然处理不到这么复杂的问题,所以就先实现停止动画即可
这个就是zepto一次动画获得的参数我故意将时間设置的很长,我们要在点击时候马上获取transform并且重新设置
PS:时间比较晚了代碼未做检测,各位包含
由于e.preventDefault的效果所以我们里面的按钮点击一键文本框获取焦点有点不好使,我这里主要解决文本获取焦点即可
我们在touchstart時候可以获取e.target在touchend时候若是判断是一次点击事件并且target为文本框的话,便获取焦点
PS:我这里因为暂时不用作生产,先简单实现即可
如此,文本类标签便可以获得焦点了其它的东西,各位通过代码自己搞下吧现在只剩下停止动画了......有点累
今天,我们一起实现了简单的iScroll的功能明天我们一起来进行源码学习,看看iScroll到底有何优点
如果您发现文中有何问题请与我联系。