一、通用问题
input 的 placeholder 垂直方向不居中问题
解决方案:
input的placeholder会出现文本位置偏上的情况:PC端设置line-height等于height能够对齐,而移动端仍然是偏上,解决方案时是设置css line-height:normal;
.input{
line-height:normal;
}
二、IOS问题
postion:fixed 定位抖动跳屏问题
分析原因:
整个流程就是,当视图容器向上滑动的时候,商品卡片容器需要缓慢移动,首先需要将商品卡片需要脱离标准流,使用scroll-view,设置定位position:fixed 固定定位。然后控制top值来控制滑块的缓慢移动。但是在容器向上滑动的过程中,滑块会出现抖动,闪动的效果。
解决方案:
使用 fixed 定位,因为我们这里需要通过定位,抖动不是单纯fixed定位的原因。和频繁改变top值也有很大关系。放弃改变top值 ,运用transform: translateY来使视图上下移动。
<view class="scroll_box" style={{ transform:`translateY(${ top }px)` }}>
<!-- do something... -->
</view>
.scroll_box{ position:fixed;}
最后子元素ios底部设置margin-bottom无效
解决方案:
将margin-bottom改成padding-bottom就能根本的解决问题
屏幕上拉下滑出现空白
手指按住屏幕下拉,屏幕顶部会多出一块空白区域。手指按住屏幕上拉,底部多出一块空白区域。空白区域的颜色,在不同app平台打开,颜色会有差别,嵌入京东app h5中的空白背景色为白色,但是在微信中为灰色。
分析原因:
手指按住屏幕上下拖动,会触发 touchmove 事件。这个事件触发的对象是整个 webview 容器,容器自然会被拖动,剩下的部分会成空白。
解决问题:
- 方案一:障眼法,套娃模式
完全可以用整个顶端容器,定位填充整个容器来解决这个问题。这样视图不会跟随上拉下滑而移动。如果空白颜色和背景颜色一致,视觉上就会抵消滑动效果。根本上解决出现空白的问题。
<div id="root" >
<!-- 此处省略很多内容 -->
</div>
#root{
position: fixed;
left:0;
top:0;
bottom: 0;
right: 0;
}
- 方案二:监听事件,禁止上滑下滑
这个问题根本原因是 touchmove 引起的,那么从根本上解决问题,还是要从touchmove这个事件入手。我们需要监听移动端document 的 touchmove然后通过 preventDefault 方法,阻止同一触点上所有默认行为,比如滚动事件。这里要注意的是什么时候,不让滑动,什么时候让滑动。
<div ref="root" ></div>
const box = this.$refs.root
box.addEventListener('touchmove',function(e){
/* 让视图容器正常滚动 */
e._isScroller = true
})
/* 禁止上滑,下滑 */
document.body.addEventListener('touchmove', function (e) {
if (e._isScroller) return
/* 阻止默认事件 */
e.preventDefault()
}, {
passive: false
})
滑动问题 -webkit-overflow-scrolling : touch 卡顿,不流畅的问题
分析问题:
理解-webkit-overflow-scrolling的两个属性
- auto: 使用普通滚动, 当手指从触摸屏上移开,滚动会立即停止。
- touch: 使用具有回弹效果的滚动,当手指从触摸屏上移开,内容会继续保持一段时间的滚动效果。继续滚动的速度和持续的时间和滚动手势的强烈程度成正比。同时也会创建一个新的堆栈上下文。
解决问题:
- 方案一
<div id="app" style="-webkit-overflow-scrolling: touch; ">
<div style="min-height:101%"></div>
</div>
- 方案二
在webkit-overflow-scrolling:touch属性的下一层子元素上, 将height加1%或1px。从而主动触发scrollbar
三、Android 问题
border-radius:50% 圆角被拉伸问题
分析问题:
- 在移动端通常会适配不同的手机,所以使用rem布局,,rem 在换算为px时,会是一个带小数点的值,安卓对小于1px的做了处理(不同浏览器对小于1px的处理方式不同,有的采用四舍五入,有的大于某个值展示1px否则就舍去),从而导致圆角不圆;
- 有的时候我们在给元素设置高度非常小的时候也会出现这个问题,转换成rem的时候,也会出现四舍五入的情况,结果将1px弄没了,变成了0px,于是乎就造成了1px元素无法显示的bug。
解决方案:
把已知视图宽高变成2倍 ,然后用 transform: scale(.5) 让视图缩小50% ,就可以在 android得到很圆的效果。
.round{
border-radius:50%;
width:20px;
heigth:20px;
transform: scale(.5);
}
.box{
width:100px;
height:2px;
transform: scaleY(.5);
}