TAT.tennylv 移动 web 之滚动篇
In 未分类 on 2017年04月14日 by view: 28,246
5

知识点 1: 移动 web 滚动问题

在移动端,使用滚动来处理业务逻辑的情况有很多,例如列表的滚动加载数据,下拉刷新等等都需要利用滚动的相关知识,但是滚动事件在不同的移动端机型却又有不同的表现,下面就来一一总结一下。

  1. 滚动事件:即 onscroll 事件,形成原因通俗解释是当子元素的高度超过父元素的高度时且父元素的高度时定值 window 除外,就会形成滚动条,滚动分为两种:局部滚动和 body 滚动。
  2. onscroll 方法: 一般情况下当我们需要监听一个滚动事件时通常会用到 onscroll 方法来监听滚动事件的触发。
    如果在浏览器上调试这个方法在浏览器上很好用,但是如果跑在手机端就没有想象中的效果了。
  3. body 滚动:在移动端如果使用 body 滚动,意思就是页面的高度由内容自动撑大,body 自然形成滚动条,这时我们监听 window.onscroll,发现 onscroll 并没有实时触发,只在手指触摸的屏幕上一直滑动时和滚动停止的那一刻才触发, 采用了 wk 内核的 webview 除外。

    body 滚动
    局部滚动

  4. 局部滚动:在移动端如果使用局部滚动,意思就是我们的滚动在一个固定宽高的 div 内触发,将该 div 设置成 overflow:scroll/auto; 来形成 div 内部的滚动,这时我们监听 div 的 onscroll 发现触发的时机区分 android 和 ios 两种情况,具体可以看下面表格:
  5. 不同机型 onscroll 事件触发情况:

    body 滚动 局部滚动
    ios 不能实时触发 不能实时触发
    android 实时触发 实时触发
    ios wkwebview 内核 实时触发 实时触发
  6. wkwebview 内核: 这里说明一下关于 ios 的 wkwebview 内核是 ios 从 ios8 开始提供的新型 webview 内核,和之前的 uiwebview 相比,性能要好,具体大家可以自行查看关于 wkwebview 的相关概念。
  7. body 滚动和局部滚动 demo:这里我需要指出的是在采用 wkwebview 内核的页面中 scroll 是可以实时触发的,如果使用的是原本的 uiwebview 则不能够实时触发,手 q 目前使用的是 uiwebview 而新版微信使用的是 wkwebview,大家可以分别使用来尝试一下下面的 demo:
    局部滚动

    body 滚动

    分别用 ios 手 q 和微信和 android 手 q 体验会有不同的结果。

知识点 2: 关于模拟滚动

  1. 有了上面介绍的关于滚动的知识,理解的模拟滚动就不难了。
  2. 正常的滚动:我们平时使用的 scroll,包括上面讲的滚动都属于正常滚动,利用浏览器自身提供的滚动条来实现滚动,底层是由浏览器内核控制。
  3. 模拟滚动:最典型的例子就是 iscroll 了,原理一般有两种:

    1). 监听滚动元素的 touchmove 事件,当事件触发时修改元素的 transform 属性来实现元素的位移,让手指离开时触发 touchend 事件,然后采用 requestanimationframe 来在一个线型函数下不断的修改元素的 transform 来实现手指离开时的一段惯性滚动距离。

    2). 监听滚动元素的 touchmove 事件,当事件触发时修改元素的 transform 属性来实现元素的位移,让手指离开时触发 touchend 事件,然后给元素一个 css 的 animation,并设置好 duration 和 function 来实现手指离开时的一段惯性距离。
  4. 这两种方案对比起来各有好处,第一种方案由于惯性滚动的时机时由 js 自己控制所以可以拿到滚动触发阶段的 scrolltop 值,并且滚动的回调函数 onscroll 在滚动的阶段都会触发。
  5. 第二种方案相比第一种要劣势一些,区别在于手指离开时,采用的时 css 的 animation 来实现惯性滚动,所以无法直接触发惯性滚动过程中的 onscroll 事件,只有在 animation 结束时才可以借助 animationend 来获取到事件,当然也有一种方法可以实时获取滚动事件,也是借助于 requestanimationframe 来不断的去读取滚动元素的 transform 来拿到 scrolltop 同时触发 onscroll 回调。
  6. 关于模拟滚动和正常滚动,两者在性能上差别还是比较明显的,下面时两个 demo,可以扫描体验一下:
    正常滚动

    模拟滚动

    衡量滚动是否流畅的指标 fps,我这边也统计了一下正常滚动和模拟滚动的 fps 数据:

    正常滚动

    模拟滚动

    模拟滚动的 fps 值波动较大,这样滚动起来会有明显的卡顿感觉,各位体验的时候如果滚动超过 10 屏之后就可以明显感觉到两着的区别。

    在使用模拟滚动时,浏览器在 js 层面会消耗更多的性能去改变 dom 元素的位置,在 dom 复杂层级深的页面更为高,所以在长列表滚动时还要使用正常滚动更好。

知识点 3: 滚动和下拉刷新

  1. 下拉刷新的元素在页面顶部,正常浏览时不可见的。
  2. 当在页面顶部往下滚动时出现下拉刷新元素,当手指离开时收起。
  3. 以上两点时实现一个下拉刷新组件的基本步骤,结合我们上述关于滚动的描述,我们可以这样实现下拉刷新:

    方案 1:借助 iscroll 的原理,整个页面使用模拟滚动,将下拉刷新元素放在顶部,当页面滚动到顶部下拉时,下拉刷新元素随着页面的滚动出现,当手指离开时收回,此方案实现起来较为简单直接借助 iscoll 即可,但是使用了模拟滚动之后在正常的列表滚动时性能上不如正常滚动。
    方案 2:页面使用正常滚动,将下拉刷新元素放置在顶部 top 值为负值(正常情况下不可见),当页面处于顶部时下拉,这时监听 touchmove 事件,修改 scrollcontent 的 tranlateY 值,同时修改下拉刷新元素的 tranlateY 值,将两者同时位移来将下拉刷新元素显示出来,手指离开时(touchend)收回,这种方案满足了在正常列表滚动时使用原生的滚动节省性能,只在下拉刷新时使用模拟滚动来实现效果。
    方案 3:方案 2 的改良版,唯一不同是将下拉刷新元素和 scrollcontent 放在一个 div 里,将下拉刷新元素的 margintop 设为负值,在下拉刷新时,只需要修改 scrollcontent 一个元素的 tranlateY 值即可实现下拉,在性能上要比方案 2 好。
  4. 在采用了上述方案之后,还会有一个性能上的问题就是:当页面的列表过长,dom 元素过多时,在模拟滚动,下拉刷新这段时间内,页面也会有卡顿现象,这里采取了一个优化策略即:

    1) 列表较长时 dom 数量较多时,在触发下拉刷新的时机时将页面视窗之外的 dom 元素隐藏或者存放在 fragment 里面。
    2) 在刷新完成之后手指离开(touchend)时将隐藏的元素显示出来。
    3) 需要注意的是,隐藏和显示视窗外的元素这个操作在下拉刷新时只会执行一次,并且只有在下拉刷新时才会执行。

AlloyPullRefresh

  1. 基于上述知识点,我写了一个下拉刷新组件,各位可以参考使用,如有问题,请多多指出!

https://github.com/AlloyTeam/AlloyPullRefresh/

TAT.tennylv 线条之美,玩转 SVG 线条动画
In 未分类 on 2017年02月27日 by view: 25,521
5

通常来说 web 前端实现动画效果主要通过下面几种方案:

  • css 动画;利用 css3 的样式效果可以将 dom 元素做出动画的效果来。
  • canvas 动画;利用 canvas 提供的 API,然后利用清除-渲染这样一帧一帧的做出动画效果。
  • svg 动画;同样 svg 也提供了不少的 API 来实现动画效果,并且兼容性也不差,本文主要讲解一下如何制作 svg 线条动画。
TAT.tennylv HTTP2 Server Push 的研究
In 未分类 on 2017年01月04日 by view: 12,000
5

1,HTTP2 的新特性。

关于 HTTP2 的新特性,读着可以参看我之前的文章,这里就不在多说了,本篇文章主要讲一下 server push 这个特性。

HTTP,HTTP2.0,SPDY,HTTPS 你应该知道的一些事

 

2,Server Push 是什么。

简单来讲就是当用户的浏览器和服务器在建立链接后,服务器主动将一些资源推送给浏览器并缓存起来,这样当浏览器接下来请求这些资源时就直接从缓存中读取,不会在从服务器上拉了,提升了速率。举一个例子就是:

TAT.tennylv HTTP,HTTP2.0,SPDY,HTTPS 你应该知道的一些事
In 未分类 on 2016年07月23日 by view: 50,618
21

作为一个经常和 web 打交道的程序员,了解这些协议是必须的,本文就向大家介绍一下这些协议的区别和基本概念,文中可能不局限于前端知识,还包括一些运维,协议方面的知识,希望能给读者带来一些收获,如有不对之处还请指出。

 

1. web 始祖 HTTP

全称:超文本传输协议 (HyperText Transfer Protocol) 伴随着计算机网络和浏览器的诞生,HTTP1.0 也随之而来,处于计算机网络中的应用层,HTTP 是建立在 TCP 协议之上,所以 HTTP 协议的瓶颈及其优化技巧都是基于 TCP 协议本身的特性,例如 tcp 建立连接的 3 次握手和断开连接的 4 次挥手以及每次建立连接带来的 RTT 延迟时间。

TAT.tennylv H5 视频直播扫盲
In 未分类 on 2016年05月22日 by view: 33,768
15

视频直播这么火,再不学就 out 了。

为了紧跟潮流,本文将向大家介绍一下视频直播中的基本流程和主要的技术点,包括但不限于前端技术。

1 H5 到底能不能做视频直播?

当然可以, H5 火了这么久,涵盖了各个方面的技术。

对于视频录制,可以使用强大的 webRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音对话或视频对话的技术,缺点是只在 PC 的 chrome 上支持较好,移动端支持不太理想。

TAT.tennylv 移动 web 适配利器-rem
In 未分类 on 2016年03月27日 by view: 91,804
35

前言

提到 rem,大家首先会想到的是 em,px,pt 这类的词语,大多数人眼中这些单位是用于设置字体的大小的,没错这的确是用来设置字体大小的,但是对于 rem 来说它可以用来做移动端的响应式适配哦。

 

兼容性

TAT.tennylv React Native Android 踩坑之旅
In 未分类 on 2015年10月25日 by view: 32,140
39

前言

Facebook  在 2015.9.15 发布了 React Native for Android,把 JavaScript  开发技术扩展到了移动 Android 平台。基于 React 的 React Native  让前端开发者使用 JavaScript  和 React  编写应用,利用相同的核心代码就可以创建  基于 Web,iOS  和 Android  平台的原生应用。在 React Native for Android 出来之后,本人花了些时间从环境搭建到做出几个 demo,从体验来看都挺流畅,具体将此间遇到和问题和具体的新的体会,向大家分享一下。

TAT.tennylv AngularJs 依赖注入的研究
In 未分类 on 2015年09月01日 by view: 7,974
7

什么是依赖注入呢,我的理解,简单点就是说我的东西我自己并不像来拿着,我想要我依赖的那个人来帮我拿着,当我需要的时候,他给我就行了。当然这只是简单的理解,还是用代码解释比较清楚一些。

这里有一个 function,很简单。

TAT.tennylv HTML5 实现屏幕手势解锁
In 未分类 on 2015年07月17日 by view: 11,460
4

效果展示

TAT.tennylv 移动 web 问题小结
In 未分类 on 2015年06月14日 by view: 29,429
29

Meta 标签:

这个想必大家都知道,当页面在手机上显示时,增加这个 meta 可以让页面强制让文档的宽度与设备的宽度保持 1:1,并且文档最大的宽度比例是 1.0,且不允许用户点击屏幕放大浏览。