0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

移动端设备上稀奇古怪的前端问题收集(一)

京东云 来源:jf_75140285 2025-01-24 15:41 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者:京东物流 陈雨

作为一名开发者,bug 往往是我们最怕遇见的东西;而比遇到 bug 更可怕的事情,是定位不到 bug。作为一名前端开发者,与业务逻辑相关的 bug 还相对好定位、好解决一些;而一些与语法特性、平台与设备差异相关的 bug 则更令人头疼一些。这里记录下我在工作中遇到过的稀奇古怪的前端问题,作为给自己的记录和提醒。

用 vh 定义全屏显示的问题

很多页面因为设计效果的需要,要求正好铺满一整个显示界面、也不允许上下滑动。做类似的需求时,往往直觉会使用这样的代码解决问题:

{
 height: 100vh;
}

这样的代码看似很优雅,但是往往会有兼容性问题——不同浏览器定义的视口高度的定义不一致,导致 100vh 并不能真正覆盖全视口高度;还有不少浏览器视口高度数值不变但实际视口大小可变,比如移动端 Chrome 浏览器的导航栏时不时隐藏但网页获取的视口高度不变,这都会导致最终显示效果不符合预期。

如果要实现全屏幕覆盖不可滑动,更为稳妥和保险的方法是使用绝对定位:

{
 position: fixed;
 top: 0;
 bottom: 0;
 left: 0;
 right: 0;
}

带 alpha 通道的 hex 颜色值失效的问题

在较新的 web 标准中,hex 格式的颜色代码也可以表示透明度了,只需要在常见的六位 hex 颜色代码后加两位表示透明度的 hex 值,例如 #66ccff 表示一种蓝色,而 #66ccff80 表示透明度 50% 的这种蓝色(80 是 16 进制的 128,是 256 的一半,即 50% 透明度)。虽然直接这样写代码的行为在前端开发中不普遍,但是设计师交付的视觉稿给出的参考值有不少是这种格式。如果直接把这样的颜色代码用于生产中,可能会出现以下两种问题:

◦如果你编写的项目引入了 less 或者 sass,在进行打包构建的操作时,部分预处理器无法正确识别带 alpha 通道的 hex 颜色值,因此这部分代码无法被正确转译,最终构建出的生产环境代码中这部分颜色可能丢失。

◦部分移动端浏览器并未适配带 alpha 通道的 hex 颜色值,因此即使是使用原生 css 完成的代码,也有可能出现在部分手机或部分浏览器颜色不正常的问题。

生命周期函数不执行的问题

在页面刚打开或准备关闭时,我们往往需要进行一些诸如数据初始化、登入登出、数据上报等行为,而这些往往是借助 Vue 或 React 的生命周期函数完成的。不过,生命周期函数不执行也是常被忽略的 bug,详细来说,又可以分为两类原因——

组件被 keep alive 导致未被卸载或重新加载

如果是 Vue 中使用 keep-alive 包裹的组件,或在 React 中使用类似的第三方库 keep alive 的组件,只会在第一次加载时执行生命周期初始化函数,且不会执行生命周期卸载函数。这导致的不符合预期的行为很好解决,只需要使用 onActivated 代替 onMounted ,用 onDeactivated 代替 onUnmounted 即可。

页面被直接关闭导致框架生命周期函数无法执行

不管是 Vue 还是 React,生命周期函数的正确执行都依赖于 Vue 或 React 实例的存在。而当用户直接关闭浏览器页面的时候,Vue 或 React 实例已经被销毁了,生命周期卸载函数当然就无法执行了。处理这种情况也并不麻烦,只需要在生命周期初始化函数中添加对 window 卸载事件的监听,然后把想要进行的操作放到 window 卸载事件函数里就好了。

onMonted(() => {  
  window.addEventListener('beforeunload', () => {    
    // 需要执行的代码 
  });
});

文本中的 emoji 上下被裁剪

UGC 内容中经常出现文本和 emoji 混排的场景,而有时可能遇到 emoji 上下边缘被裁剪的问题。这往往是由于开发页面时为了限定文本高度和间距或其他排版方面的要求,将 line-height 和 font-size 设置为同样的值,且 overflow 属性被设置为 hidden 。如果出现类似情况,建议去除 line-height 的限制,而通过 margin 等方式控制行距,从而避免 emoji 被裁减。

输入框被弹起的软键盘覆盖的问题

如果移动端页面中有输入框,那么很可能面临输入框被弹起的软键盘覆盖的问题。一般来讲,对于需要弹起软键盘的场景,较新的浏览器或者移动端 app 的 webview 会自动聚焦到输入框中并滚动到相应位置,来保证输入框的正常显示;但是,对于如下两种情况,弹起的软键盘会将输入框覆盖,影响用户输入。

浏览器未能主动聚焦到输入框

软键盘弹起时,一般会从底部将页面顶起、压缩视口;视口高度变低了,原先处于显示区域的输入框可能就被挤到输入框外了。如果用户使用的浏览器版本较早或 app 内置 webview 较为特殊,有可能在软键盘弹出后浏览器未能主动聚焦到输入框上。这时,开发者必须主动聚焦到输入框并使输入框滚动到视口内。

const inputEle = document.querySelector('#target-input');inputEle.focus();inputEle.scrollIntoView();

软键盘采用覆盖在视口上层而非压缩视口的方式弹出

如果浏览器或 webview 版本较为特殊,且输入框处于页面靠下的位置或者针对视口绝对定位于底部,那么可能会面临更加复杂的情况。刚才已经提到,正常情况下,软键盘弹起的标准做法是从底部将页面顶起、压缩视口高度;但是某些情况下,软键盘并不改变视口尺寸,而是直接盖在视口上方。这就导致页面逻辑上是展示完整的、输入框也正常显示在视口中;但软键盘遮挡了半个页面,也就真正意义上“覆盖”在输入框上。目前主流移动端浏览器较新的版本都不会出现这个问题,但是部分 app 内置 webview 会设置为“软键盘覆盖在 webview 上方”;因此要解决这个问题,必须由客户端更改 webview 的软键盘设置。如果是很旧的浏览器版本或者无法推动客户端开发解决问题,那就只能放弃治疗了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 前端
    +关注

    关注

    1

    文章

    241

    浏览量

    18672
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73151
  • 移动端
    +关注

    关注

    0

    文章

    43

    浏览量

    4698
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    初学者如何向高手请教问题?

    为什么自学单片机,有的初学者却能学会,有的初学者却学了好久都没学会;连个数字时钟的程序都写不出来;每次看到坛友们做出各种稀奇古怪的DIY,我都感到心里酸溜溜,请问高手该该怎。。。。。。总是被学会单片机的嘲笑,看的我们初学者很不是滋味,你们不也就是这么过来的吗?有什么好自傲的
    发表于 05-21 22:53

    如何正确掌握程序语言

    学习程序语言是每个程序员的必经之路。可是这个世界上有太多的程序语言,每种都号称具有最新的“特性”。所以程序员的苦恼就在于总是需要学习各种稀奇古怪的语言,而且必须紧跟“潮流”,否则就怕被时代所淘汰。
    发表于 08-15 23:47

    zz:通过烤火来给iphone充电的小设备

    `iphone总是如此的火爆,连外设都是如此的火爆,也总是能有如此稀奇古怪设备涌现出来,娱乐大众!这个叫做campstove的小设备可以为任何u***充电设备充电,如智能手机、led
    发表于 11-12 10:23

    AD 软件 图纸转码到Cadence

    请问各位道友,AD Summer 09 格式下的图纸 如何操作才能转码到Cadence 下 ,且能够被正确识别,因为我在转码过程中 碰到稀奇古怪的问题,e.gAD 导不出,提示错误;或者 Cadence 导入不了,软件卡在那里过不去。看看有没有人 能解决下,谢谢!
    发表于 06-22 17:22

    为什么说射频前端体化设计决定下移动设备

    随着移动行业向下代网络迈进,整个行业将面临射频组件匹配,模块架构和电路设计的挑战。射频前端体化设计对下
    发表于 08-01 07:23

    关于单片机的些容易被忽视问题相关资料分享

    “最近直在单片机项目打转,也碰到了很多稀奇古怪的问题,在这里做个记录。”01—变量很多刚接触单片机嵌入式编程没有太多程序风格可言的程序员来说,变量的滥用以及命名的随意,导致在后期代码...
    发表于 01-24 06:05

    申请开发板

    我是个喜欢自己倒腾稀奇古怪的玩意儿的,我很希望用全志的开发板开发种可以用作测量的工具,就像万用表或者示波器亦或是信号源之类的测试仪器。
    发表于 07-02 13:12

    求助,CH573的SPI使用DMA发送有例程吗?

    官方的CH573EVT演示包里面只有最普通的SPI直接发送接收,我自己不用DMA发送接收也调通了但是DMA发送搞了两三天也没弄明白,经常出稀奇古怪的问题请问官方有SPI的DMA发送例程吗?或者其他筒子们谁用过,是否方便发来看看
    发表于 09-01 06:40

    稀奇古怪动作的“ Disney USB”产品

    稀奇古怪动作的“ Disney USB”产品 Disney USB产品  市场上有很多 USB 产品,厂商要出奇制胜,除了价格外,产品有没有特色也很重要。这次在香港推出的
    发表于 01-22 09:32 1216次阅读

    可穿戴机器人听说过吗?

    现在机器人对于我们来说早已不是稀奇古怪之物了,机器人还有哪些无限的可能呢?歪果仁也是在这上面下了不少功夫,像什么机器机甲啦。
    发表于 01-09 15:43 3080次阅读

    LG高管:为加强智能家居,所有家电都将内置WiFi

    过去的几年中,CES展示的产品越来越专注互联网,不管产品本身多么“其貌不扬”,于是我们有了智能牙刷、智能电扇、智能空气清新剂等稀奇古怪的东西,而其中最匪夷所思的要数100美元只的宠物食盆,它竟然可以自己从Amazon买东西。
    发表于 01-09 16:05 1406次阅读

    不走寻常路 带你见识下这些造型稀奇古怪的电脑!

    现在为大家总结了份真正稀奇古怪,个性十足的电脑清单展示,看看你见过几个?
    发表于 06-02 11:22 1122次阅读

    艺术机器人简史!各种稀奇古怪的机械化设备

    当然,把自动机器人称为雕塑完全提高了其地位。由此说来,布谷鸟自鸣钟或许也算得上是雕塑。不过事实,动力雕塑——比如让·丁格利用其他机械组合出来的极其疯狂丑陋的机械,发出呼哧呼哧、哐当哐当的声音,喷吐
    的头像 发表于 08-14 14:16 4899次阅读

    谷歌推出款新的AR应用,任何支持AR Core的设备均可用

    谷歌经常用新技术做稀奇古怪的实验应用。“Just a Line” 是款新推出的 AR 应用,建立在谷歌的 ARCore 技术之上。这个应用的设计想法非常简单,但它的成效实际非常
    发表于 09-04 15:04 6197次阅读

    关于单片机的些容易被忽视问题

    “最近直在单片机项目打转,也碰到了很多稀奇古怪的问题,在这里做个记录。”01—变量很多刚接触单片机嵌入式编程没有太多程序风格可言的程序员来说,变量的滥用以及命名的随意,导致在后期代码...
    发表于 11-29 13:06 18次下载
    关于单片机的<b class='flag-5'>一</b>些容易被忽视问题