从事移动端开发后,总结一下遇到的问题,持续更新中……

移动端通用

低版本的问题:

  • 不支持es6中的api方法,如startWith,padStart等等

    解决:用babel-polyfill

// 安装 
npm install --save babel-polyfill

// js中引入 
import 'babel-polyfill';
  • 不支持css原生变量

解决:如果有less环境就写成less变量

@c_primary: #2283E2;
 …… 
[type=radio]:checked + label {
 color: @c_primary;
 }
  • 不支持flex布局部分属性

  1. 放弃flex布局

  2. 使用postcss-preset-env(待研究)

  • 低版本安卓调试环境
  1. 卸载当前高版本浏览器,安装包中的56版本
  2. 把C:\Program Files (x86)\Google\Update下面的GoogleUpdate.exe重命名以不让自动升级
  3. 把包中的3个文件夹拷贝到C:\Users\86180\AppData\Local\Google\Chrome\User Data\Default下面,覆盖
  4. 手机上安装chrome浏览器56版本(不知起作用了没)
  5. 打开inspect,按正常步骤调试即可

其他问题

  1. react脚手架+antd-mobile移动端环境搭建 https://blog.csdn.net/daoke_li/article/details/106255031
  2. 一个元素设置背景色及高度后,和一个元素的某条边框设置同样的背景色和高度,在手机上表现不一样,后者颜色看起来要深一些。解决:全部使用背景色或边框
  3. antd-mobile中引入antd-mobile-upload后,上传点击事件要连续点2次才生效,解决方案是模拟单击事件连续触发两次,注意不是双击。

    <span className={'replaceBtn'} onClick={()=>{
        $('.rc-upload').click().click()
    }}>
        {this.state.mainImg.slice(-3) === 'mp4' ? '更换视频' : '更换图片'}
    </span>

     

  4. 禁止移动端双指或双击缩放,但meta中的user-scalable=no等不起作用时,可以用如下方法:
    //禁止双指放大
            document.documentElement.addEventListener('touchstart', function (event) {
                if (event.touches.length > 1) {
                    event.preventDefault();
                }
            }, {passive:false});
            // 禁止双击放大
            let lastTouchEnd = 0;
            document.documentElement.addEventListener('touchend', function (event) {
                var now = Date.now();
                if (now - lastTouchEnd <= 300) {
                    event.preventDefault();
                }
                lastTouchEnd = now;
            }, {passive:false});

     

  5. react中antd-mobile的组件如Switch阻止冒泡的方法
    解决:在Switch外面包一层div,在这个div上使用react事件的阻止方法:onClick={e=>e.stopPropagation()}

  6. 圆形按钮旋转动画时被切掉一块
    解决:装按钮的盒子宽度减去1像素 https://blog.csdn.net/daoke_li/article/details/111686464
  7.  
  8. .

 

ios

  • 判断是否ISO以及iphoneX

const {screen} = window;
const u = navigator.userAgent;
const isIOS = Boolean(u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/));
if (isIOS) {
    window.mobileModel = 'iphone';
    $body.addClass('iphone');
    if ((screen.height === 812 && screen.width === 375)||(screen.height === 896 && screen.width === 414)) { // iphoneX
         window.mobileModel = 'iphoneX';
         $body.addClass('iphoneX');
    }
}
  • 长按后抬起手指会触发点击事件

解决:在长按回调中阻止默认的点击事件(尝试中)

onTouchStart(e) {
     timeOutEvent = setTimeout(() => {
         this.setState({ showDelete: true });
         timeOutEvent = 0;
     }, 500);
 } 
onTouchEnd(e) { 
    // 在触屏操作后,手指提起的一刹那(即发生ontouchend后),系统会判断接收到事件的element的内容是    否被改变。
    // 如果内容被改变,接下来的事件都不会触发,如果没有改变,会按照mousedown,mouseup,click的顺序触发事件。 
    if(timeOutEvent===0){
         e.preventDefault(); // 阻止ios默认触发的点击事件
     }
     clearTimeout(timeOutEvent);
}
  • 页面最后一个div的下外边距自动为0.

在最后写个空div,判断是否ISO来显示或设置高度。

  • 不支持固定背景图片的属性

写个div绝对定位到最下层

  • <img>元素的css属性content为空('')时,此元素在IOS上不显示,但安卓上正常显示。

那就不要这样写了。

  • IOS滑动滚动不能实时触发事件

参见《使用better-scroll解决IOS上滑动事件不能实时触发的问题》:

https://blog.csdn.net/daoke_li/article/details/106101803

  • IOS上input的type为search时,软键盘不出现搜索按钮

{/* 用Form包裹起来是为了兼容IOS,软键盘上出现搜索按钮 */}
<form action='' onSubmit={e => e.preventDefault()}>
    <input
        className={val ? 'hasVal' : ''}
        type='search'
        value={val}
        onChange={e => setVal(e.target.value)}
        placeholder={!focused ? placeholder || '通过菜谱名称搜索菜谱' : ''}
        onFocus={() => setFocused(true)}
       onBlur={() => setFocused(false)}
       ref={el => input.current = el}
    />
    <i className={'iconfont i-search ' + (!focused ? ' noCancel' : '')} />
    {showCancelBtn && <span className={'cancel'} onClick={cancel}>取消</span>}
</form>
  • 输入框和旁边的文本没对齐

input不要设置高度,而是用行高撑开,这样安卓和IOS就基本一致了。

  • 使用了-webkit-line-clamp来限制行数后,三个点有时和行末的最后一个字重叠

文本设置为左对齐即可,两端对齐会出现这个问题,据说此现象是ios的bug。

  • iOS中软键盘弹出堵住了输入框

让滚动条重新定位到当前获取的滚动条高度处。

注意这个动作不能写在获得焦点事件中,否则连续得焦、失焦又会出现其他异常,如下写在表单首次加载后即可。

参考代码:

useEffect(() => {
        formOpen && textArea.current.focus()
        const {scrollHeight} = document.body
        setTimeout(() => {
            isIOS && window.scrollTo(0, scrollHeight)
        }, 300)
    }, [formOpen])
  • IOS上传图片/照片时的格式判断

const type = path.slice(path.lastIndexOf('.') + 1)
if (!['jpg', 'jpeg', 'png', 'heic', 'plist'].includes(type.toLowerCase())) {
    Toast.info('图片只支持jpg、jpeg、png')
    return
}
  •  

  •  

  •  

 

安卓

 

其他

  • vivo x7 顶部导航fixed定位问题
  1. 现象:vivo x7上一个顶端定位的元素位置不对,而且还显示了2个。
    测试截屏
  2. 期望:实际上这个顶部导航,在页面上滑时通过css将背景颜色渐入变白。
  3. 尝试:由于这个现象是平台测试反馈回来的,我们这边没有对应的手机,无法重现。试了一个比这个安卓版本(5.1)更低的手机(5.0)是正常的。最后经过查看元素,发现导航栏所在的父元素也用了position:fixed定位,去掉好像也没什么影响,于是去掉发版。
  4. 结果:测试那边人反馈正常了!
  5. 结论:除了fixed嵌套,也有可能是当时手机卡住了吧!

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值