移动端H5开发技巧

曾经终败给现在 2023-03-04 11:22 87阅读 0赞

css篇

1、常用的meta设置

1、不缓存头部设置

  1. <meta charset="UTF-8">
  2. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  3. <meta http-equiv="pragma" content="no-cache">
  4. <meta http-equiv="Cache-Control" content="no-cache, must-revalidate">
  5. <meta http-equiv="expires" content="Wed, 26 Feb 1997 08:21:57 GMT">
  6. <meta http-equiv="expires" content="0">

2、常用设置

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

2、0.5px细线

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

  1. /* 底边框 */
  2. .b-border {
  3. position: relative;
  4. }
  5. .b-border:before {
  6. content: '';
  7. position: absolute;
  8. left: 0;
  9. bottom: 0;
  10. width: 100%;
  11. height: 1px;
  12. background: #d9d9d9;
  13. -webkit-transform: scaleY(0.5);
  14. transform: scaleY(0.5);
  15. -webkit-transform-origin: 0 0;
  16. transform-origin: 0 0;
  17. }
  18. /* 上边框 */
  19. .t-border {
  20. position: relative;
  21. }
  22. .t-border:before {
  23. content: '';
  24. position: absolute;
  25. left: 0;
  26. top: 0;
  27. width: 100%;
  28. height: 1px;
  29. background: #d9d9d9;
  30. -webkit-transform: scaleY(0.5);
  31. transform: scaleY(0.5);
  32. -webkit-transform-origin: 0 0;
  33. transform-origin: 0 0;
  34. }
  35. /* 右边框 */
  36. .r-border {
  37. position: relative;
  38. }
  39. .r-border:before {
  40. content: '';
  41. position: absolute;
  42. right: 0;
  43. bottom: 0;
  44. width: 1px;
  45. height: 100%;
  46. background: #d9d9d9;
  47. -webkit-transform: scaleX(0.5);
  48. transform: scaleX(0.5);
  49. -webkit-transform-origin: 0 0;
  50. transform-origin: 0 0;
  51. }
  52. /* 左边框 */
  53. .l-border {
  54. position: relative;
  55. }
  56. .l-border:before {
  57. content: '';
  58. position: absolute;
  59. left: 0;
  60. bottom: 0;
  61. width: 1px;
  62. height: 100%;
  63. background: #d9d9d9;
  64. -webkit-transform: scaleX(0.5);
  65. transform: scaleX(0.5);
  66. -webkit-transform-origin: 0 0;
  67. transform-origin: 0 0;
  68. }
  69. /* 四条边 */
  70. .setBorderAll {
  71. position: relative;
  72. &:after {
  73. content: ' ';
  74. position: absolute;
  75. top: 0;
  76. left: 0;
  77. width: 200%;
  78. height: 200%;
  79. transform: scale(0.5);
  80. transform-origin: left top;
  81. box-sizing: border-box;
  82. border: 1px solid #e5e5e5;
  83. border-radius: 4px;
  84. }
  85. }

3、屏蔽用户选择

  1. div {
  2. -webkit-touch-callout: none;
  3. -webkit-user-select: none;
  4. -khtml-user-select: none;
  5. -moz-user-select: none;
  6. -ms-user-select: none;
  7. user-select: none;
  8. }

4、禁止保存或拷贝图像

  1. img {
  2. -webkit-touch-callout: none;
  3. }

5、清除输入框内阴影

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

  1. div {
  2. -webkit-appearance: none;
  3. }

6、输入框默认字体颜色

  1. input::-webkit-input-placeholder,
  2. textarea::-webkit-input-placeholder {
  3. color: #c7c7c7;
  4. }
  5. input:-moz-placeholder,
  6. textarea:-moz-placeholder {
  7. color: #c7c7c7;
  8. }
  9. input:-ms-input-placeholder,
  10. textarea:-ms-input-placeholder {
  11. color: #c7c7c7;
  12. }

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

  1. body {
  2. -webkit-text-size-adjust: 100% !important;
  3. text-size-adjust: 100% !important;
  4. -moz-text-size-adjust: 100% !important;
  5. }

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

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

  1. a,button,input,textarea{
  2. -webkit-tap-highlight-color: rgba(0,0,0,0)
  3. -webkit-user-modify:read-write-plaintext-only;
  4. }

9、iOS 滑动不流畅

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

1、在滚动容器上增加滚动 touch 方法

  1. .wrapper {
  2. -webkit-overflow-scrolling: touch;
  3. }

2、设置 overflow 设置外部 overflow 为 hidden,设置内容元素 overflow 为 auto。内部元素超出 body 即产生滚动,超出的部分 body 隐藏。

  1. body {
  2. overflow-y: hidden;
  3. }
  4. .wrapper {
  5. overflow-y: auto;
  6. }

js 篇

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

移动设备上的web网页是有300ms延迟的,往往会造成按钮点击延迟甚至是点击失效。解决方案:
fastclick可以解决在手机上点击事件的300ms延迟
zepto的touch模块,tap事件也是为了解决在click的延迟问题

触摸事件的响应顺序
ontouchstart
ontouchmove
ontouchend
onclick

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

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

  1. $('html').one('touchstart', function() {
  2. audio.play()
  3. })

3、iOS 上拉边界下拉出现空白

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

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

解决方案:

  1. document.body.addEventListener(
  2. 'touchmove',
  3. function(e) {
  4. if (e._isScroller) return
  5. // 阻止默认事件
  6. e.preventDefault()
  7. },
  8. {
  9. passive: false
  10. }
  11. )

发表评论

表情:
评论列表 (有 0 条评论,87人围观)

还没有评论,来说两句吧...

相关阅读