H5适配以及兼容问题---转存自掘金--lzg9527

news/2024/9/19 11:33:19/文章来源:https://www.cnblogs.com/77yf/p/18420258

 

vue 知识体系之基础入门篇
JS基础总结(1)——数据类型
JS基础总结(2)——原型与原型链
JS基础总结(3)——作用域和闭包
JS基础总结(4)——this指向及call/apply/bind
JS基础总结(5)—— JS执行机制与EventLoopd

html 篇

常用的meta属性设置

meta对于移动端的一些特殊属性,可根据需要自行设置

 
HTML
代码解读
复制代码

<meta name="screen-orientation" content="portrait"> //Android 禁止屏幕旋转
<meta name="full-screen" content="yes">             //全屏显示
<meta name="browsermode" content="application">     //UC应用模式,使用了application这种应用模式后,页面讲默认全屏,禁止长按菜单,禁止收拾,标准排版,以及强制图片显示。
<meta name="x5-orientation" content="portrait">     //QQ强制竖屏
<meta name="x5-fullscreen" content="true">          //QQ强制全屏
<meta name="x5-page-mode" content="app">            //QQ应用模式

电话号码识别

在 iOS Safari (其他浏览器和 Android 均不会)上会对那些看起来像是电话号码的数字处理为电话链接,比如:

  • 7 位数字,形如:1234567
  • 带括号及加号的数字,形如:(+86)123456789
  • 双连接线的数字,形如:00-00-00111
  • 11 位数字,形如:13800138000

关闭识别

 
html
代码解读
复制代码
<meta name="format-detection" content="telephone=no" />

开启识别

 
html
代码解读
复制代码
<a href="tel:123456">123456</a>

邮箱识别(Android)

安卓上会对符合邮箱格式的字符串进行识别,我们可以通过如下的 meta 来管别邮箱的自动识别:

 
html
代码解读
复制代码
<meta content="email=no" name="format-detection" />

同样地,我们也可以通过标签属性来开启长按邮箱地址弹出邮件发送的功能:

 
html
代码解读
复制代码
<a mailto:dooyoe@gmail.com">dooyoe@gmail.com</a>

css 篇

0.5px细线

移动端 H5 项目越来越多,设计师对于 UI 的要求也越来越高,比如 1px 的边框。在高清屏下,移动端的 1px 会很粗。

那么为什么会产生这个问题呢?主要是跟一个东西有关,DPR(devicePixelRatio) 设备像素比,它是默认缩放为 100%的情况下,设备像素和 CSS 像素的比值。目前主流的屏幕 DPR=2(iPhone 8),或者 3(iPhone 8 Plus)。拿 2 倍屏来说,设备的物理像素要实现 1 像素,而 DPR=2,所以 css 像素只能是 0.5。

下面介绍最常用的方法

 
css
代码解读
复制代码
/* 底边框 */
.b-border {
  position: relative;
}
.b-border:before {
  content: '';
  position: absolute;
  left: 0;
  bottom: 0;
  width: 100%;
  height: 1px;
  background: #d9d9d9;
  -webkit-transform: scaleY(0.5);
  transform: scaleY(0.5);
  -webkit-transform-origin: 0 0;
  transform-origin: 0 0;
}
/* 上边框 */
.t-border {
  position: relative;
}
.t-border:before {
  content: '';
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 1px;
  background: #d9d9d9;
  -webkit-transform: scaleY(0.5);
  transform: scaleY(0.5);
  -webkit-transform-origin: 0 0;
  transform-origin: 0 0;
}
/* 右边框 */
.r-border {
  position: relative;
}
.r-border:before {
  content: '';
  position: absolute;
  right: 0;
  bottom: 0;
  width: 1px;
  height: 100%;
  background: #d9d9d9;
  -webkit-transform: scaleX(0.5);
  transform: scaleX(0.5);
  -webkit-transform-origin: 0 0;
  transform-origin: 0 0;
}
/* 左边框 */
.l-border {
  position: relative;
}
.l-border:before {
  content: '';
  position: absolute;
  left: 0;
  bottom: 0;
  width: 1px;
  height: 100%;
  background: #d9d9d9;
  -webkit-transform: scaleX(0.5);
  transform: scaleX(0.5);
  -webkit-transform-origin: 0 0;
  transform-origin: 0 0;
}

/* 四条边 */
.setBorderAll {
  position: relative;
  &:after {
    content: ' ';
    position: absolute;
    top: 0;
    left: 0;
    width: 200%;
    height: 200%;
    transform: scale(0.5);
    transform-origin: left top;
    box-sizing: border-box;
    border: 1px solid #e5e5e5;
    border-radius: 4px;
  }
}

屏蔽用户选择

禁止用户选择页面中的文字或者图片

 
css
代码解读
复制代码
div {
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

清除输入框内阴影

在 iOS 上,输入框默认有内部阴影,以这样关闭:

 
css
代码解读
复制代码
div {
  -webkit-appearance: none;
}

如何禁止保存或拷贝图像

代码如下

 
css
代码解读
复制代码
img {
  -webkit-touch-callout: none;
}

输入框默认字体颜色

设置 input 里面 placeholder 字体的颜色

 
css
代码解读
复制代码
input::-webkit-input-placeholder,
textarea::-webkit-input-placeholder {
  color: #c7c7c7;
}
input:-moz-placeholder,
textarea:-moz-placeholder {
  color: #c7c7c7;
}
input:-ms-input-placeholder,
textarea:-ms-input-placeholder {
  color: #c7c7c7;
}

用户设置字号放大或者缩小导致页面布局错误

设置字体禁止缩放

 
css
代码解读
复制代码
body {
  -webkit-text-size-adjust: 100% !important;
  text-size-adjust: 100% !important;
  -moz-text-size-adjust: 100% !important;
}

android系统中元素被点击时产生边框

部分android系统点击一个链接,会出现一个边框或者半透明灰色遮罩, 不同生产商定义出来额效果不一样。去除代码如下

 
css
代码解读
复制代码
a,button,input,textarea{
  -webkit-tap-highlight-color: rgba(0,0,0,0)
  -webkit-user-modify:read-write-plaintext-only; 
}

iOS 滑动不流畅

ios 手机上下滑动页面会产生卡顿,手指离开页面,页面立即停止运动。整体表现就是滑动不流畅,没有滑动惯性。 iOS 5.0 以及之后的版本,滑动有定义有两个值 auto 和 touch,默认值为 auto。

解决方案

  1. 在滚动容器上增加滚动 touch 方法
 
css
代码解读
复制代码
.wrapper {
  -webkit-overflow-scrolling: touch;
}
  1. 设置 overflow 设置外部 overflow 为 hidden,设置内容元素 overflow 为 auto。内部元素超出 body 即产生滚动,超出的部分 body 隐藏。
 
css
代码解读
复制代码
body {
  overflow-y: hidden;
}
.wrapper {
  overflow-y: auto;
}

js 篇

移动端click屏幕产生200-300 ms的延迟响应

移动设备上的web网页是有300ms延迟的,往往会造成按钮点击延迟甚至是点击失效。解决方案:

  • fastclick可以解决在手机上点击事件的300ms延迟
  • zepto的touch模块,tap事件也是为了解决在click的延迟问题

触摸事件的响应顺序

  1. ontouchstart
  2. ontouchmove
  3. ontouchend
  4. onclick

audio 和 video 在 ios 和 andriod 中自动播放

这个不是bug,由于自动播放网页中的音频或视频,会给用户带来一些困扰或者不必要的流量消耗,所以苹果系统和安卓系统通常都会禁止自动播放和使用 JS 的触发播放,必须由用户来触发才可以播放。加入自动触发播放的代码

 
js
代码解读
复制代码
$('html').one('touchstart', function() {
  audio.play()
})

iOS 上拉边界下拉出现空白

手指按住屏幕下拉,屏幕顶部会多出一块白色区域。手指按住屏幕上拉,底部多出一块白色区域。

在 iOS 中,手指按住屏幕上下拖动,会触发 touchmove 事件。这个事件触发的对象是整个 webview 容器,容器自然会被拖动,剩下的部分会成空白。

解决方案

 
js
代码解读
复制代码
document.body.addEventListener(
  'touchmove',
  function(e) {
    if (e._isScroller) return
    // 阻止默认事件
    e.preventDefault()
  },
  {
    passive: false
  }
)

ios 日期转换 NAN 的问题

将日期字符串的格式符号替换成'/'

 
js
代码解读
复制代码
'yyyy-MM-dd'.replace(/-/g, '/')

软键盘问题

IOS 键盘弹起挡住原来的视图

  • 可以通过监听移动端软键盘弹起 Element.scrollIntoViewIfNeeded(Boolean)方法用来将不在浏览器窗口的可见区域内的元素滚动到浏览器窗口的可见区域。 如果该元素已经在浏览器窗口的可见区域内,则不会发生滚动。
  • true,则元素将在其所在滚动区的可视区域中居中对齐。
  • false,则元素将与其所在滚动区的可视区域最近的边缘对齐。 根据可见区域最靠近元素的哪个边缘,元素的顶部将与可见区域的顶部边缘对准,或者元素的底部边缘将与可见区域的底部边缘对准。
 
javascript
代码解读
复制代码
window.addEventListener('resize', function() {
  if (
    document.activeElement.tagName === 'INPUT' ||
    document.activeElement.tagName === 'TEXTAREA'
  ) {
    window.setTimeout(function() {
      if ('scrollIntoView' in document.activeElement) {
        document.activeElement.scrollIntoView(false)
      } else {
        document.activeElement.scrollIntoViewIfNeeded(false)
      }
    }, 0)
  }
})

onkeyUp 和 onKeydown 兼容性问题

IOS 中 input 键盘事件 keyup、keydown、等支持不是很好, 用 input 监听键盘 keyup 事件,在安卓手机浏览器中没有问题,但是在 ios 手机浏览器中用输入法输入之后,并未立刻相应 keyup 事件

IOS12 输入框难以点击获取焦点,弹不出软键盘

定位找到问题是 fastclick.js 对 IOS12 的兼容性,可在 fastclick.js 源码或者 main.js 做以下修改

 
javascript
代码解读
复制代码
FastClick.prototype.focus = function(targetElement) {
  var length
  if (
    deviceIsIOS &&
    targetElement.setSelectionRange &&
    targetElement.type.indexOf('date') !== 0 &&
    targetElement.type !== 'time' &&
    targetElement.type !== 'month'
  ) {
    length = targetElement.value.length
    targetElement.setSelectionRange(length, length)
    targetElement.focus()
  } else {
    targetElement.focus()
  }
}

IOS 键盘收起时页面没用回落,底部会留白

通过监听键盘回落时间滚动到原来的位置

 
javascript
代码解读
复制代码
window.addEventListener('focusout', function() {
  window.scrollTo(0, 0)
})

//input输入框弹起软键盘的解决方案。
var bfscrolltop = document.body.scrollTop
$('input')
  .focus(function() {
    document.body.scrollTop = document.body.scrollHeight
    //console.log(document.body.scrollTop);
  })
  .blur(function() {
    document.body.scrollTop = bfscrolltop
    //console.log(document.body.scrollTop);
  })

IOS 下 fixed 失效的原因

软键盘唤起后,页面的 fixed 元素将失效,变成了 absolute,所以当页面超过一屏且滚动时,失效的 fixed 元素就会跟随滚动了。不仅限于 type=text 的输入框,凡是软键盘(比如时间日期选择、select 选择等等)被唤起,都会遇到同样地问题。

解决方法: 不让页面滚动,而是让主体部分自己滚动,主体部分高度设为 100%,overflow:scroll

 
html
代码解读
复制代码
<body>
  <div class='warper'>
    <div class='main'></div>
  <div>
  <div class="fix-bottom"></div>
</body>
 
css
代码解读
复制代码
.warper {
  position: absolute;
  width: 100%;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  overflow-y: scroll;
  -webkit-overflow-scrolling: touch; /* 解决ios滑动不流畅问题 */
}
.fix-bottom {
  position: fixed;
  bottom: 0;
  width: 100%;
}

推荐文章

从零开始构建一个webpack项目
总结几个webpack打包优化的方法
总结前端性能优化的方法
几种常见的JS递归算法
搭建一个vue-cli的移动端H5开发模板
封装一个toast和dialog组件并发布到npm
一文读尽前端路由、后端路由、单页面应用、多页面应用
关于几个移动端软键盘的坑及其解决方案
浅谈JavaScript的防抖与节流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/799767.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos7.9安装部署Gitlab

环境准备系统 IP 配置centos7.9(图形化) 192.168.8.180 2c4g--300GGitlab介绍GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。GitLab由乌克兰程序员DmitriyZaporozhets和ValerySizov开发,它由Ruby写成。后来,一些部分用…

.Net Mvc中JS如何让获取Session

参考来源:C#MVC中JS如何获取Session-百度经验 (baidu.com) 1)将session信息隐藏到界面上,再通过JS找到这个隐藏字段获取值2)页面初始化的时候,直接将session的值赋值给JS变量 3)JS发起一次Ajax请求,从服务器获取session值

【运维自动化-配置平台】如何查看运营数据和审计

操作审计记录了主机、业务等资源纬度的操作记录,也可以根据操作动作来查询操作审计 查看某主机操作历史 包括主机的模块转移、属性修改等查看某业务的操作历史 包括业务、模块、集群、服务模板等资源的变更记录查看资源类型的操作历史查看其他类型的操作历史,如模型分组运营统…

易优eyoucms网站安装时出现“数据库连接失败,请重新设定”的错误

遇到易优CMS在安装时出现“数据库连接失败,请重新设定”的错误,通常是因为数据库连接信息不正确或环境配置问题。以下是一些详细的解决步骤: 解决步骤检查数据库连接信息 检查数据库状态 检查防火墙和安全组设置 检查数据库用户权限 清理安装锁文件 手动导入数据库1. 检查数…

uniapp打包解决模拟器没法安装问题

打开项目的manifest.json文件,在 “App常用其它设置” -> “Android设置” -> “支持CPU类型” 项中勾选需要支持的CPU类型: 参考新文档地址:https://uniapp.dcloud.io/tutorial/app-android-abifilters

易优eyoucms网站本地测试正常,放到虚拟主机出错

遇到在本地测试正常但在虚拟主机上安装时出现问题的情况,通常与环境配置有关。根据您提供的错误信息,问题可能在于文件路径或环境配置不一致。以下是详细的解决步骤: 解决步骤检查文件路径 调整PHP版本 检查文件权限 检查虚拟主机配置1. 检查文件路径 确保文件路径正确无误。…

易优eyoucms网站安装报错 SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prep

遇到“SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared”这类错误,通常是由于数据库连接参数配置不当导致的。具体来说,这通常是因为PDO驱动在处理预编译语句时出现了问题。 解决方法 按照以下步骤修改数据库配置文件,可以解决这个问题:…

易优eyoucms网站后台账号密码忘记了,怎么办

如果您忘记了易优CMS (EyouCMS) 后台的账号密码,可以通过直接修改数据库的方式来重置密码。以下是具体的步骤: 1. 准备工作 确保您有数据库的访问权限,通常可以通过Navicat或其他数据库管理工具来连接数据库。 2. 连接数据库 使用Navicat或其他数据库管理工具连接到您的数据…

便捷数据检索与下载,拟合曲线预测趋势 轻松管理多个项目,实现在线监测

便捷数据检索与下载,拟合曲线预测趋势 轻松管理多个项目,实现在线监测在线监测管理系统,采用了基于BS架构。该系统可以在浏览器中实现项目管理、数据查看与下载、曲线查看等操作。系统界面简约、布局统一、逻辑清晰,用户操控体验良好。采用了三层监测要素架构,实现了多项目…

C++中share_ptr中循环引用的问题

背景: share_ptr已经很好用了,但是有一点share_ptr智能指针还是有内存泄露的情况,当两个对象相互使用一个shared_ptr成员变量指向对方,会造成循环引用,使引用计数失效,从而导致内存泄漏。weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象…

易优eyoucms网站怎么关闭后台登录验证码呢

在易优CMS (EyouCMS) 中关闭后台登录验证码的操作相对简单。以下是详细的步骤: 1. 登录后台 首先需要登录到后台管理系统。 登录后台访问后台登录页面:访问/admin.php或相应的后台登录地址。输入用户名和密码:输入管理员账号和密码登录后台。2. 进入系统设置 进入后台后,找…

易优eyoucms网站后台登录验证码是否不用,也可以登录?

在易优CMS (EyouCMS) 中,后台登录验证码是否必须取决于您的配置。如果您不需要验证码,可以通过以下几种方法来关闭它,从而实现无需验证码即可登录后台。 方法一:通过后台设置关闭登录后台:访问后台登录页面,并登录。进入系统设置:在后台左侧菜单栏中找到“系统设置”或“…