兼容性问题

  • 列表滚动定位的Element.scrollIntoView()方法,为了滚动的平滑以及设置定位元素的位置,需要设置scrollIntoViewOptions,在开发时Chrome中测试一切正常,但是移动端测试发现在IOS中不支持。
  • 在比较旧的设备中,flex布局下的子元素中,不可以设置position: absolute;否则会使flex中设置的居中这类布局效果失效。
    • 解决方案为:不同时使用两种布局,或在absolute中也增加居中定位。
  • 在部分华为设备中,video标签,仅在点击播放视频的第一次缓冲时(暂停以及后续网速问题导致缓冲时不出现)会出现一个很大的三角形播放按钮,而video标签中并没有设置control属性,设置查询到的一些CSS伪类display:none;并没有生效。

    • 解决方案为:默认情况下隐藏video,并监听OnCanPlay方法,在可以开始播放的时候设置该videodisplay:block;

      某些需求解决方案

  • 该移动端项目左上角会有一个返回按钮,点击该按钮会按照逻辑返回到上一个页面,但是某些手机支持在屏幕上从左向右滑动返回(与点击浏览器到后退按钮相同),之前的跳转逻辑是在每次跳转时都调用history.push(),这样会造成两种返回方式返回的页面不同,为了支持该需求,将部分跳转改为了history.replace(),具体跳转如下图:事件流.jpg

    某些简单优化记录

  • 测试时发现在iPad设备中,overflow的滚动会有些卡。

    • 经过查询,在需要滚动的div中增加css属性:-webkit-overflow-scrolling: touch;可以解决卡顿问题
  • 该项目的使用rem,根据设备自动调整font-size来做到自适应,之前项目中自适应font-size的方法觉得写的蛮好,因此记录下来:

    1. export function initFontSize() {
    2. let base = 375; // UI稿宽度
    3. const { documentElement } = document;
    4. const mediaQuery = window.matchMedia('(orientation: portrait)'); // 检测是否为竖屏
    5. let timer;
    6. let standardRatio = 667 / 375; // 设计稿宽高比
    7. if (isPad()) {
    8. standardRatio = 1024 / 768; // iPad设计稿宽高比
    9. base = 768;
    10. }
    11. function setFontSize() {
    12. const isLandscape = !mediaQuery.matches;
    13. let screenWidth = window.screen.width;
    14. let screenHeight = window.screen.height;
    15. if (screenWidth < screenHeight) {
    16. [ screenWidth, screenHeight ] = [ screenHeight, screenWidth ];
    17. }
    18. let width = documentElement.clientWidth;
    19. let height = screenHeight;
    20. const realRatio = width / height;
    21. // 根据相对设计稿更小的宽或者高来计算fontSize
    22. if (realRatio >= standardRatio) {
    23. width = height * standardRatio;
    24. documentElement.classList.remove('adjustHeight');
    25. documentElement.classList.add('adjustWidth');
    26. } else {
    27. height = width / standardRatio;
    28. documentElement.classList.remove('adjustWidth');
    29. documentElement.classList.add('adjustHeight');
    30. }
    31. window.adjustWidth = width;
    32. window.adjustHeight = height;
    33. // fontSize = 自适应宽与原来宽度比 * 初始fontSize
    34. let target = width / base * 16;
    35. if (isLandscape) {
    36. target /= standardRatio;
    37. }
    38. documentElement.style.fontSize = `${target}px`;
    39. const currentSize = window.getComputedStyle(documentElement).fontSize.replace('px', '');
    40. if (target !== currentSize) {
    41. documentElement.style.fontSize = `${target / currentSize * target}px`;
    42. }
    43. }
    44. window.addEventListener('resize', function() {
    45. clearTimeout(timer);
    46. timer = setTimeout(setFontSize, 300);
    47. }, !1);
    48. window.addEventListener('pageshow', function(e) {
    49. e.persisted && (clearTimeout(timer), timer = setTimeout(setFontSize, 300));
    50. }, !1);
    51. window.addEventListener('orientationchange', function() {
    52. console.log('改变了手机方向');
    53. setFontSize();
    54. }, false);
    55. setFontSize();
    56. }