请问为什么要监听DOMContentLoaded事件,然后设置 html 的font-size呢?

来源:6-5 动态 rem 基准+修正 tailwind,完善移动端navigationBar

吕士杰

2022-06-16

export const useREM = () => {
  // 定义最大的fontSize
  const MAX_FONT_SIZE = 40
  // 监听 html 文档被解析完成的事件
  document.addEventListener('DOMContentLoaded', () => {
    // 拿到 html 标签
    const html = document.querySelector('html')
    // 计算 fontSize,根据屏幕宽度 / 10
    let fontSize = window.innerWidth / 10 // 包含滚动条的宽度
    fontSize = fontSize > MAX_FONT_SIZE ? MAX_FONT_SIZE : fontSize

    html.style.fontSize = fontSize + 'px'
  })
}

当一个 HTML 文档被加载和解析完成后,DOMContentLoaded 事件便会被触发。我查了DOMContentLoaded的触发具体时间,主要解释是:
1、当文档中没有脚本时,浏览器解析完文档便能触发 DOMContentLoaded 事件
2、如果文档中包含脚本(async或defer脚本除外),则脚本会阻塞文档的解析
3、脚本需要等 CSSOM 构建完成才能执行

这样看,DOMContentLoaded 至少要等到cssom构建完毕后再能触发,然后在触发的回调函数里设置font-size大小。如果存在非一部的js脚本,还需要等待更长时间。

综上,useREM是不是不放在DOMContentLoaded事件的回调函数里更妥当呢?
是否直接放在head 标签里更加好?

写回答

1回答

Sunday

2022-06-16

你好

很多时候业务代码的逻辑处理并非越靠前越好,更多的时候我们需要考虑代码可维护性。

在 大型项目中,并不建议把复杂逻辑直接通过 script 进行引入。

0
3
Sunday
回复
村头王师傅觉得你老土
你好,因为我们要监听 DOM 内容解析完成。一般有两种: 1. window.onload : 这个是 window下所有资源解析完成的回调 2. DOMContentLoaded: 这个是 widnow 下所有的 dom 解析完成的回调 咱们这里不需要等待所有资源,只需要等待 dom 完成,所以使用 DOMContentLoaded
2022-12-25
共3条回复

基于 Vue3 ,打造前台+中台通用开发提效解决方案

42 种前台常见业务模型, 15 种中台通用组件,成为前端提效高手

788 学习 · 517 问题

查看课程