IOS

滑动不流畅

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

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

上拉边界下拉出现空白

  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. );

在点击输入框,出现键盘后,弹出层被顶上去,而光标还停留在原处,即出现错位情况

Input/textarea

  1. $("input.van-field__control, textarea.van-field__control").blur(function () {
  2. setTimeout(function () {
  3. var currentPosition =
  4. document.documentElement.scrollTop || document.body.scrollTop;
  5. window.scrollTo(0, currentPosition); //页面向上滚动
  6. }, 200);
  7. });

多个Input/textarea

  1. $(function () {
  2. var setTimerTop = 0;
  3. $(document)
  4. .on(
  5. "blur",
  6. "input.van-field__control, textarea.van-field__control",
  7. function () {
  8. event.preventDefault();
  9. setTimerTop = setTimeout(function () {
  10. window.scrollBy(0, 5); // 页面向上滚动
  11. window.scrollBy(0, -5);
  12. }, 500);
  13. }
  14. )
  15. .on(
  16. "focus",
  17. "input.van-field__control, textarea.van-field__control",
  18. function () {
  19. clearTimeout(setTimerTop);
  20. }
  21. );
  22. });

iframe情况

  1. $(function () {
  2. var setTimerTop = 0;
  3. $(document)
  4. .on(
  5. "blur",
  6. "input.van-field__control, textarea.van-field__control",
  7. function () {
  8. event.preventDefault();
  9. setTimerTop = setTimeout(function () {
  10. parent.scrollBy(0, 5); // 页面向上滚动
  11. parent.scrollBy(0, -5);
  12. $("#hide-area-cb").focus();
  13. }, 500);
  14. }
  15. )
  16. .on(
  17. "focus",
  18. "input.van-field__control, textarea.van-field__control",
  19. function () {
  20. clearTimeout(setTimerTop);
  21. }
  22. )
  23. .on("focus", "input.van-field__control[disabled]", function () {
  24. setTimerTop = setTimeout(function () {
  25. parent.scrollBy(0, 5); // 页面向上滚动
  26. parent.scrollBy(0, -5);
  27. }, 500);
  28. });
  29. });

日期转换 NAN 的问题

iOS 解析 YYYY-MM-DD HH:mm:ss 这种日期格式会报错 Invalid Date,Android 无问题
查看开发手册发现可用:YYYY/MM/DD HH:mm:ss,那么需替换其中的 - 为 /

  1. const date = "2021-02-05 10:39:00";
  2. console.log(new Date(date.replace(/\-/g, "/")));

fixed 失效的原因

软键盘唤起后,页面的 fixed 元素将失效,变成了 absolute,所以当页面超过一屏且滚动时,失效的 fixed 元素就会跟随滚动了。不仅限于 type=text 的输入框,凡是软键盘(比如时间日期选择、select 选择等等)被唤起,都会遇到同样地问题。
解决方法:不让页面滚动,而是让主体部分自己滚动,主体部分高度设为 100%,overflow: scroll;

  1. <div class='warper'>
  2. <div class='main'></div>
  3. <div>
  4. <div class="bottom"></div>
  1. .warper {
  2. position: absolute;
  3. width: 100%;
  4. top: 0;
  5. right: 0;
  6. bottom: 0;
  7. left: 0;
  8. overflow-y: scroll;
  9. -webkit-overflow-scrolling: touch;
  10. }
  11. .bottom {
  12. position: fixed;
  13. bottom: 0;
  14. width: 100%;
  15. }

移动端fixed布局

  • ios6下,不固定,滑动会突然跳动
  • 输入框在弹出键盘后,不吸附在键盘上方
  • fixed的元素宽度不能自适应,在ios6下横竖屏切换的过程中
  • iframe下,fixed元素高度超大

    iOS 闪屏问题

    ``` 如果保留height:100% 那么就添加 overflow:auto

去掉当前页面的height:100%

body{ -webkit-tap-highlight-color:rgba(0,0,0,0); }

  1. <a name="qJLSO"></a>
  2. # Android
  3. <a name="7Znom"></a>
  4. ## 如果视频没有播放的情况,双击进度条快进会吧整个video播放不了的情况出现,导致出现该问题的原因暂时不知什么原因引起
  5. 解决方法:添加一个蒙层,点击蒙层就播放视频,短暂的处理方案<br />vue 完整代码如下:
  6. ```vue
  7. <template>
  8. <div class="video_box">
  9. <div class="cover" @click.stop.prevent="play" v-if="!played"></div>
  10. <video
  11. :src="src"
  12. :poster="poster"
  13. :id="`videoElement${index}`"
  14. controls
  15. playsinline
  16. webkit-playsinline
  17. webkit-inline
  18. x5-video-player-type="h5-page"
  19. x5-video-player-fullscreen="true"
  20. x-webkit-airplay="allow"
  21. x5-video-orientation="portraint"
  22. />
  23. </div>
  24. </template>
  25. <script>
  26. export default {
  27. props: {
  28. src: {
  29. type: String,
  30. default: "",
  31. },
  32. poster: {
  33. type: String,
  34. default: "",
  35. },
  36. index: {
  37. type: Number,
  38. default: 0,
  39. },
  40. },
  41. data() {
  42. return {
  43. played: false,
  44. };
  45. },
  46. methods: {
  47. play() {
  48. document.getElementById(`videoElement${this.index}`).play();
  49. this.played = true;
  50. },
  51. },
  52. };
  53. </script>
  54. <style lang="scss" scoped>
  55. .video_box {
  56. position: relative;
  57. width: 100%;
  58. height: 194px;
  59. .cover {
  60. position: absolute;
  61. left: 0;
  62. top: 0;
  63. width: 100%;
  64. height: 100%;
  65. z-index: 1000;
  66. }
  67. video {
  68. position: absolute;
  69. left: 0;
  70. top: 0;
  71. width: 100%;
  72. height: 100%;
  73. }
  74. }
  75. </style>

video 属性返回 Infinity

解决参考:https://stackoverflow.com/questions/38443084/how-can-i-add-predefined-length-to-audio-recorded-from-mediarecorder-in-chrome

  1. <video
  2. controlslist="nodownload"
  3. playsinline=""
  4. webkit-playsinline=""
  5. x5-video-player-type="h5-page"
  6. x-webkit-airplay="true"
  7. autoplay="autoplay"
  8. controls="controls"
  9. preload="auto"
  10. style="width: 100%;height: auto;"
  11. src=""
  12. ></video>
  13. var player = document.querySelector("video");
  14. window.onload = function () {
  15. // 获取总时长
  16. player.addEventListener("durationchange", (event) => {
  17. console.log(player.duration);
  18. // Infinity
  19. })
  20. // 监听缓存进度
  21. player.addEventListener("progress", (event) => {
  22. let bufvalue = player.buffered.end(player.buffered.length - 1);
  23. console.log(parseInt(bufvalue));
  24. // Infinity
  25. })
  26. }

前端 video 直播场景时,对延迟比较高要求(电商秒杀等场景)的可以通过监控 progress 来达到效果

注意:设置currentTime为最新的播放时长要控制好频率与快进时长,要不然会导致一直loading加载新的TS片段

  1. var player = document.querySelector("video");
  2. var videoCanskip = 0;
  3. player.addEventListener("progress", function (event) {
  4. // 返回表示音频/视频已缓冲部分的 TimeRanges 对象。
  5. var startBuffered = player.buffered.start(0);
  6. var endBuffered = player.buffered.end(0);
  7. videoCanskip = parseInt(endBuffered - startBuffered);
  8. console.log("video_可快进时长" + Math.ceil(videoCanskip));
  9. }
  10. // 设置currentTime 值 来播放最新内容
  11. player.currentTime = videoCanskip;

QuotaExceededError异常

sentry 平台收集到一个意外的error,错误信息为 QuotaExceededError。 错误分析才知道,原来当超过可用配额时,IndexedDB 和缓存 API 都会抛出名为 QuotaExceededErrorDOMErrorlocalStorage 预留5MB左右的储存空间(这个是大概固定的值) IndexedDB 的配额是动态计算的,可能浏览器实现各不相同,但可用存储量通常取决于设备上可用的存储量(随着手机内存的不断减少,webview 的配额也会减少,具体多少可以导致 IndexedDB 是不可用,没有大量的测试数据来验证。但是测试出现问题的时候,手机内存在700以下就会出现这个问题,但是在其他的安卓设备这个值又是500以下,所以这个复现存储值不可靠)

我们可以规避掉这个风险,先检查有多少可用存储,如下:

  1. if (navigator.storage && navigator.storage.estimate) {
  2. const quota = await navigator.storage.estimate();
  3. // quota.usage -> 已用字节数。
  4. // quota.quota -> 最大可用字节数。
  5. const percentageUsed = (quota.usage / quota.quota) * 100;
  6. console.log(`您已使用可用存储的 ${percentageUsed}%。`);
  7. const remaining = quota.quota - quota.usage;
  8. console.log(`您最多可以再写入 ${remaining} 个字节。`);
  9. }

https://web.dev/storage-for-the-web/#indexeddb-2
StorageManager:https://developer.mozilla.org/zh-CN/docs/Web/API/StorageManager

writing….