2,<div style="height: 200pxwidth: 200pxborder: 1px solid #ccc">
<div class="slider" id="slider">这里是内容</div>
</div>
<button onclick="document.getElementById('slider').classList.toggle('closed')">点击看看</button>
CSS代码
CSS Code复制内容到剪贴板
.slider {
overflow-y: hidden
max-height: 500px
/* 最大高度 */
background: pink
height: 200px
width: 200px
/* Webkit内核浏览器:Safari and Chrome*/
-webkit-transition-property: all
-webkit-transition-duration: .5s
-webkit-transition-timing-function: cubic-bezier(0, 1, 0.5, 1)
/* Mozilla内核浏览器:firefox3.5+*/
-moz-transition-property: all
-moz-transition-duration: .5s
-moz-transition-timing-function: cubic-bezier(0, 1, 0.5, 1)
/* Opera*/
-o-transition-property: all
-o-transition-duration: .5s
-o-transition-timing-function: cubic-bezier(0, 1, 0.5, 1)
/* IE9*/
-ms-transition-property: all
-ms-transition-duration: .5s
-ms-transition-timing-function: cubic-bezier(0, 1, 0.5, 1)
}
.slider.closed {
max-height: 0
}
不光是css3,gif动画也是,不信你打开一个gif 滚动的时候看它还动不动。iOS最先响应屏幕反应。响应顺序依次为Touch——Media——Service——Core架构,当用户只要触摸接触了屏幕之后,系统就会最优先去处理屏幕显示也就是Touch这个层级,然后才是媒体(Media),服务(Service)以及Core架构。
所以说,当系统接收到Touch事件之后会优先响应,此时会暂停屏幕上包括js、css的渲染。这个时候不光是css动画不动了,哪怕页面没有加载完如果你手指头还停留在屏幕上那么页面也不会继续加载,直到你的手松开。
解决办法有两个,各有瑕疵:
不要使用 scroll 事件(此事件会被暂停),而是采用 touchmove(此事件会在用户触屏滚动的时候不断触发)。瑕疵是,在结束触屏后惯性滚动的时间里,touchmove 无法被触发了(scroll 当然也不行);
基于上一种方法,在所有的 touchmove 事件中,强行 preventDefault 阻止掉事件,然后根据 event.pageY 来手工设置所滑动元素的 scrollTop 值。当然,这样一来就没有了惯性滚动。
你也可以在 touchend 之后,手工模拟惯性滚动,计算速度以及速度衰减,可以参考各种各样的滚动插件。