热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我所遇过的挪动端兼容性问题

事情一年多了,置信在坐的列位前端也都跟我一样,对在手机上,特别是iphone上涌现的种种兼容性以为异常头疼。这篇文章仅作为一份记录供人人参考。怎样画出1px的线?起首问人人一个题目

事情一年多了,置信在坐的列位前端也都跟我一样,对在手机上,特别是
iphone上涌现的种种兼容性以为异常头疼。这篇文章仅作为一份记录供人人参考。

怎样画出 1px 的线?

起首问人人一个题目,怎样在iphone上画出1px的线?
萌新能够就以为,这不是很简朴吗,看我一把梭:

.line {
border-top: 1px solid #000
}

固然,假如没有不测的话,设想走查的时刻就会过来跟你说,你这线太粗了,跟设想稿上的不一致!

因为每部差别型号的手机的DPR都不尽相同,所以同样是1px在一些手机上很细,在一些手机上却看起来很粗

一个简朴的处理方案

.line {
position: relative;
&::after {
position: absolute;
bottom: 0;
content: "";
width: 100%;
border-top: 1px solid #000;
transform: scaleY(.5)
}
}

固然了,假如不加以处置惩罚,在 DPR1 的屏幕上这条线反而会很细。我们能够在这个代码的基础上加上媒体查询来完美它👇

.line {
position: relative;
&::after {
position: absolute;
bottom: 0;
content: "";
width: 100%;
border-top: 1px solid #000
}
@media screen and (-webkit-min-device-pixel-ratio: 2) {
&::after {
transform: scaleY(.5)
}
}
}

闻一知十

看完上面的代码,我们能够再想一个题目,怎样画出一个带圆角border呢?
说难也不难,这个要领是之前一个同砚供应给我的,非常好用👇

.line {
position: relative;
&::after {
position: absolute;
top: 0;
left: 0;
content: "";
width: 100%;
height: 100%;
border: 1px solid #000;
border-radius: 2px
}
@media screen and (-webkit-min-device-pixel-ratio: 2) {
&::after {
width: 200%;
height: 200%;
transform: scale(.5);
border-radius: 4px;
transform-origin: 0 0
}
}
}

键盘弹出后页面规划错位

征象

ios 12体系在挪动端存在如许的 BUG,复现步骤

  • 点击涌现弹框
  • 点击输入框唤起键盘
  • 输入终了后发明弹框上的按钮点击不了了

固然,这个 BUG 只需你悄悄滑动页面就发明题目被轻松处理了。实在处理的道理就是触发页面重绘,让被顶起来的页面节点回到原位。

处理方案

click () {
if (/os 12/ig.test(navigator.userAgent)) {
window.scrollTo(0, 0)
}
}

假如你用 Vue,也能够把点击事宜封装为一个指令,然后把这段代码加进去。

点击返回上一页页面不革新

征象

这也是我在项目中碰到的一个奇异的 BUG,点击「返回」按钮返回到上一页,然则页面却没有革新。

缘由

实在这是 ios 微信的缓存机制形成的,跳转到下一页时仍然会缓存当前页。

处理方案

window.addEventListener('pageshow', function(e) {
if (e.persisted) {
location.reload();
}
});

页面加载后返回上一页

征象

ios9 微信在页面加载后自动返回上一页

缘由

ios9 微信会自动触发 popstate 事宜,从而自动返回了上一页

处理方案

setTimeout(() => {
window.addEventListener('popstate', () => {
//
})
}, 1000)

扫描下方的二维码或搜刮「tony先生的前端补习班」关注我的微信民众号,那末就能够第一时间收到我的最新文章。
《我所遇过的挪动端兼容性问题》


推荐阅读
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本地存储组件实现对IE低版本浏览器的兼容性支持 ... [详细]
  • 利用REM实现移动端布局的高效适配技巧
    在移动设备上实现高效布局适配时,使用rem单位已成为一种流行且有效的技术。本文将分享过去一年中使用rem进行布局适配的经验和心得。rem作为一种相对单位,能够根据根元素的字体大小动态调整,从而确保不同屏幕尺寸下的布局一致性。通过合理设置根元素的字体大小,开发者可以轻松实现响应式设计,提高用户体验。此外,文章还将探讨一些常见的问题和解决方案,帮助开发者更好地掌握这一技术。 ... [详细]
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 随着CRM版本的更新,某些功能可能不再可用。本文探讨了一种高效的替代方案,通过编写 `function loadFrom()` 来识别和区分不同的编辑窗口。该方法利用了Xrm.Page对象的特性,确保在不同版本的CRM中都能稳定运行。此外,文章还详细介绍了如何通过检测页面类型和上下文信息来优化用户体验。 ... [详细]
  • 深入解析 Vue3 中的响应式 API:shallowReactive、shallowRef、triggerRef 和 customRef 的使用与原理
    深入解析 Vue3 中的响应式 API:shallowReactive、shallowRef、triggerRef 和 customRef 的使用与原理 ... [详细]
  • 我在使用 AngularJS 的路由功能开发单页应用 (SPA),但需要支持 IE7(包括 IE8 的 IE7 兼容模式)。我希望浏览器的历史记录功能能够正常工作,即使需要使用 jQuery 插件。 ... [详细]
  • 本文详细介绍了在编写jQuery插件时需要注意的关键要点,包括模块化支持、命名规范和性能优化等内容,旨在帮助开发者提高插件的质量和可维护性。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 在深入研究 UniApp 封装请求时,发现其请求 API 方法中使用了 `then` 和 `catch` 函数。通过详细分析,了解到这些函数是 Promise 对象的核心组成部分。Promise 是一种用于处理异步操作的结果的标准化方式,它提供了一种更清晰、更可控的方法来管理复杂的异步流程。本文将详细介绍 Promise 的基本概念、结构和常见应用场景,帮助开发者更好地理解和使用这一强大的工具。 ... [详细]
  • 资源管理器的基础架构包括三个核心组件:1)资源池,用于将CPU和内存等资源分配给不同的容器;2)负载组,负责承载任务并将其分配到相应的资源池;3)分类函数,用于将不同的会话映射到合适的负载组。该系统提供了两种主要的资源管理策略。 ... [详细]
author-avatar
我没资格我不配
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有