黑马程序员技术交流社区

标题: 前端遇到的那些技术难点及解决方案总结~ [打印本页]

作者: 逆风TO    时间: 2020-4-14 11:05
标题: 前端遇到的那些技术难点及解决方案总结~
本帖最后由 逆风TO 于 2020-4-14 11:08 编辑

移动端兼容css篇0.5px细线问题描述:1px 的边框。在高清屏下,移动端的 1px 会很粗。产生原因:首先先要了解一个概念:DPR(devicePixelRatio) 设备像素比,它是默认缩放为 100%的情况下,设备像素和 CSS 像素的比值。目前主流的屏幕 DPR=2(iPhone 8),或者 3(iPhone 8 Plus)。拿 2 倍屏来说,设备的物理像素要实现 1 像素,而 DPR=2,所以 css 像素只能是 0.5。
下面介绍最常用的方法
通过CSS :before 选择器设置height:1px,同时缩放0.5倍实现。

[JavaScript] 纯文本查看 复制代码
/* 底边框 */
.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;
  }
}

屏蔽用户选择
禁止用户选择页面中的文字或者图片
[JavaScript] 纯文本查看 复制代码
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 上,输入框默认有内部阴影,以这样关闭:
[JavaScript] 纯文本查看 复制代码
div {
  -webkit-appearance: none;
}
如何禁止保存或拷贝图像
[JavaScript] 纯文本查看 复制代码
img {
  -webkit-touch-callout: none;
}

输入框默认字体颜色
设置 input 里面 placeholder 字体的颜色
[JavaScript] 纯文本查看 复制代码
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;
}
用户设置字号放大或者缩小导致页面布局错误
设置字体禁止缩放
[JavaScript] 纯文本查看 复制代码
body {
  -webkit-text-size-adjust: 100% !important;
  text-size-adjust: 100% !important;
  -moz-text-size-adjust: 100% !important;
}
android系统中元素被点击时产生边框
部分android系统点击一个链接,会出现一个边框或者半透明灰色遮罩, 不同生产商定义出来额效果不一样。去除代码如下
[JavaScript] 纯文本查看 复制代码
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。

[JavaScript] 纯文本查看 复制代码
.wrapper {
  -webkit-overflow-scrolling: touch;
}


2.设置 overflow 设置外部 overflow 为 hidden,设置内容元素 overflow 为 auto。内部元素超出 body 即产生滚动,超出的部分 body 隐藏。
[JavaScript] 纯文本查看 复制代码
body {
  overflow-y: hidden;
}
.wrapper {
  overflow-y: auto;
}

html 篇常用的meta属性设置
meta对于移动端的一些特殊属性,可根据需要自行设置
[JavaScript] 纯文本查看 复制代码
<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 均不会)上会对那些看起来像是电话号码的数字处理为电话链接,比如:
关闭识别


<meta name="format-detection" content="telephone=no" />复制代码开启识别
<a href="tel:123456">123456</a>复制代码邮箱识别(Android)安卓上会对符合邮箱格式的字符串进行识别,我们可以通过如下的 meta 来管别邮箱的自动识别:
<meta content="email=no" name="format-detection" />复制代码同样地,我们也可以通过标签属性来开启长按邮箱地址弹出邮件发送的功能:
<a mailto:dooyoe@gmail.com">dooyoe@gmail.com</a>复制代码js篇移动端click屏幕产生200-300 ms的延迟响应移动设备上的web网页是有300ms延迟的,往往会造成按钮点击延迟甚至是点击失效。解决方案:
触摸事件的响应顺序
1.ontouchstart2.ontouchmove3.ontouchend4.onclick
audio 和 video 在 ios 和 andriod 中自动播放这个不是bug,由于自动播放网页中的音频或视频,会给用户带来一些困扰或者不必要的流量消耗,所以苹果系统和安卓系统通常都会禁止自动播放和使用 JS 的触发播放,必须由用户来触发才可以播放。加入自动触发播放的代码
$('html').one('touchstart', function() {  audio.play()})复制代码iOS 上拉边界下拉出现空白问题描述:手指按住屏幕下拉,屏幕顶部会多出一块白色区域。手指按住屏幕上拉,底部多出一块白色区域。
产生原因:在 iOS 中,手指按住屏幕上下拖动,会触发 touchmove 事件。这个事件触发的对象是整个 webview 容器,容器自然会被拖动,剩下的部分会成空白。
解决方案:
[JavaScript] 纯文本查看 复制代码
document.body.addEventListener(
  'touchmove',
  function(e) {
    if (e._isScroller) return
    // 阻止默认事件
    e.preventDefault()
  },
  {
    passive: false
  }
)
ios 日期转换 NAN 的问题将日期字符串的格式符号替换成'/'
'yyyy-MM-dd'.replace(/-/g, '/')复制代码软键盘问题问题描述:IOS 键盘弹起挡住原来的视图解决方式:

[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

[JavaScript] 纯文本查看 复制代码
<body>
  <div class='warper'>
    <div class='main'></div>
  <div>
  <div class="fix-bottom"></div>
</body>

[JavaScript] 纯文本查看 复制代码
.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%;
}


性能优化性能测试工具推荐
欢迎参考 性能测试工具调研
React性能优化
欢迎参考 React性能优化
ReactNative性能优化
欢迎参考 ReactNative性能优化
vue首屏加载优化
欢迎参考 vue首屏加载优化
DOM操作造成的页面卡顿问题及解决
欢迎参考 DOM操作造成的页面卡顿问题及解决
webpack性能优化
欢迎参考 webpack性能优化


转自掘金
链接:https://juejin.im/post/5e93c863e51d4546d635829d







作者: 你不爱我    时间: 2020-4-20 09:58
厉害了               
作者: 逆风TO    时间: 2020-4-20 09:59
感谢分享哦~
作者: zhaosongzhi    时间: 2020-4-20 10:00
感谢分享
作者: zhaosongzhi    时间: 2020-4-20 10:09
感谢分享
作者: zhaosongzhi    时间: 2020-4-20 10:18
感谢分享
作者: jsnoob    时间: 2020-4-20 10:24
加油加油!!!
作者: zhaosongzhi    时间: 2020-4-20 10:27
感谢分享
作者: zhaosongzhi    时间: 2020-4-20 10:37
感谢分享
作者: zhaosongzhi    时间: 2020-4-20 10:46
感谢分享
作者: duanshaobo    时间: 2020-4-20 10:49
https://juejin.im/post/5e93c863e51d4546d635829d
作者: 半个程序员    时间: 2020-4-20 10:49
666666666666666666
作者: 半个程序员    时间: 2020-4-20 10:52
666666666666666666
作者: sdjadyhm    时间: 2020-4-20 10:54
66666666666666666
作者: 大安    时间: 2020-4-20 11:08
棒棒哒  坚持更新哦
作者: Emmmmm~    时间: 2020-4-20 11:24

感谢分享哦~
作者: hongping    时间: 2020-4-20 11:47

感谢分享哦~
作者: 123木头人555    时间: 2020-4-20 11:58
6666666666666666
作者: 孙丽    时间: 2020-4-20 12:58
66666666666666666666666666666
作者: 举个栗子    时间: 2020-4-20 14:22
6666666666666666666666
作者: daoqin    时间: 2020-4-20 14:58
感谢分享哦~
作者: 竹竹竹竹    时间: 2020-4-22 10:44
6666666666666666666666
作者: 霍尔    时间: 2020-4-23 09:17
666666666666
作者: 王微    时间: 2020-4-23 09:29
66666666666666666666
作者: 大智叔叔    时间: 2020-4-23 09:42

666666666666666666
作者: 哦嗨呦    时间: 2020-4-23 10:47
好人一生平安
作者: 章鱼顶呱呱    时间: 2020-4-23 11:39
6666666666666666666
作者: lzq123    时间: 2020-4-23 11:43
666666666666
作者: hello!!!    时间: 2020-4-23 11:44

作者: 咨询部王丹    时间: 2020-4-23 11:49
努力加油
作者: 马洁    时间: 2020-4-23 14:02
又见代码贴
作者: 小公举    时间: 2020-4-23 17:56
厉害了,加油
作者: 我爱我1022    时间: 2020-4-23 18:02

作者: zplxwl    时间: 2020-4-23 20:05
感谢分享哦~
作者: json0314    时间: 2020-4-23 20:25
感谢分享
作者: manyihang    时间: 2020-4-23 21:35
66666666666666
作者: 素问    时间: 2020-4-23 22:28
谢谢分享,加油!~!!!~
作者: 殷凯老师    时间: 2020-4-23 22:41
6666666666666666
作者: 1467584    时间: 2020-4-23 22:44
66666666666666666666666666666666666666
作者: 耙丫丫    时间: 2020-4-23 23:42
66666666666666666666666666
作者: kdhdjdj    时间: 2020-4-24 09:49
感谢分享哦~
作者: 雨落轻舟    时间: 2020-4-24 10:47
条理清晰,非常不错
作者: lvxinvip    时间: 2020-4-24 10:55

作者: 零度☆黎明    时间: 2020-4-24 12:17
不错, 不错 .................. ..................
作者: yujq    时间: 2020-4-24 12:35
66666666666666666666666
作者: mydorling11    时间: 2020-4-24 14:00
21333333333333333所得到的
作者: 黑马程序员啊    时间: 2020-4-24 14:28
66666666666666666666666
作者: json0314    时间: 2020-5-8 11:16
6666666666666666




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2