Doctype作用? 严格模式与混杂模式如何区分? 它们有何意义?

一、Doctype 是干啥的?------ "浏览器的代码说明书"

想象一下,你买了一个乐高set,盒子第一页通常会有一张图,告诉你:

  • "本标准套装包含:新版乐高积木(2023年版)"

这个说明就是 <!DOCTYPE html> 的作用!

它写在HTML文档的最前面,就是为了大声告诉浏览器:
"喂!哥们儿!请用最新的、标准化的HTML5规范来解析我这份文档!别用那些老掉牙的旧模式!"

如果没有这个说明,或者写错了,浏览器就会犯迷糊:"呃...我该用哪种方式来理解这些代码呢?" 然后它很可能就会进入一种"猜"的模式,也就是我们下面要说的"混杂模式"。


二、严格模式 vs. 混杂模式 ------ "好学生模式 vs. 和稀泥模式"

浏览器解析HTML/CSS有两种截然不同的"心态":

1. 严格模式 (Standards Mode) - "好学生模式"

  • 怎么触发: 就是在你的HTML开头写了正确的 <!DOCTYPE html>
  • 行为: 浏览器会变成一个"严格的好学生",严格按照W3C等标准组织制定的最新规则去解析和渲染你的网页。你说盒子宽度是100px,那渲染出来就是100px,绝不给你多加一点。
  • 意义: 保证一致性! 你的网站在Chrome、Firefox、Safari等现代浏览器里看起来和运行起来都几乎一模一样。这是我们现在开发网站追求的目标。

2. 混杂模式 (Quirks Mode) - "和稀泥模式" 或 "兼容老油条模式"

  • 怎么触发: 忘记写 <!DOCTYPE>,或者写了但格式不正确、用的是非常古老的声明(如HTML4)。
  • 行为: 浏览器会进入一种"和稀泥"的怀旧状态。它会模仿上世纪IE5、IE6那些老浏览器的怪异行为去解析代码。这是因为以前的浏览器有很多自己的一套"土规矩",和现在的标准不一样。
  • 意义: 为了兼容性! 是为了让那些十几年前写的、没有写DOCTYPE或者按老规矩写的破旧网站,在今天的新浏览器上还能"将就着看",不至于完全崩掉。但这绝不是我们现在应该用的模式!

举个栗子🌰:

假设你写了个盒子,宽度是100px,但包含了10px的内边距(padding)。

  • 在严格模式(好学生)下:
    浏览器会严格按照标准CSS盒子模型计算:这个盒子的总宽度 = 宽度(100px) + 内边距(10px x 2) + 边框... 。它最终会占用超过100px的空间。
    (这就是我们现在正常使用的模式)
  • 在混杂模式(和稀泥)下:
    浏览器会学IE5那样的老古董:总宽度就是你说的100px,然后它会把你的内容区域挤小,把内边距和边框都塞进这100px里。这会导致布局一团糟!

所以,简单粗暴地区分:你的页面开头有 <!DOCTYPE html> 就是严格模式,没有就是混杂模式。


三、关于 <link>@import 的补充

你贴的这段备注也非常对,咱们再形象化一下:

把加载网页想象成点一份外卖

  • <link> 标签:

    "老板,我的主餐(HTML)和可乐(CSS)必须一起给我送过来 !我等着喝呢!"
    结果: 页面(主餐)和样式(可乐)同时加载,用户能更快地看到带样式的页面。

  • @import 方式:

    "老板,你先送主餐(HTML)过来。等我吃上饭了,我再给你打电话:'哎,现在可以把我的可乐(CSS)送来了'。"
    结果: 页面先加载出来(可能光秃秃的很难看),等页面加载完了,浏览器才慢悠悠地去下载CSS,可能会导致页面闪烁(先没样式,后有样式)。

所以,现在基本都用 <link>,不用 @import,原因就是你总结的:

  1. 性能更好(同时加载,页面展示快)。
  2. 无兼容问题@import 是老古董IE5的东西)。
  3. 权重更高 (在CSS样式冲突时,<link> 引入的样式通常说话更算数一点)。

总结一下:

  1. <!DOCTYPE html> :就是给你的网页贴个标签,命令浏览器开启"好学生模式"(严格模式) ,按最新标准来解析。
  2. 严格模式 :按规矩办事,保证网页在所有现代浏览器里表现一致。 (我们想要的)
  3. 混杂模式 :浏览器和稀泥,模仿老浏览器的怪异行为来显示那些老掉牙的网站。 (我们要避免的)
  4. <link> 引入CSS :又快又好又靠谱,别用 @import
相关推荐
成熟的API调用专家6 分钟前
cesium 获取鼠标点击位置的经度纬度海拔高度
前端
前端无冕之王10 分钟前
分享 HTML 邮件开发的 15 个踩坑实录
前端·html
dreams_dream12 分钟前
vue2实现背景颜色渐变
前端·javascript·css
jokr_14 分钟前
C++ 指针与引用面试深度解析
java·c++·面试
怪可爱的地球人17 分钟前
TypeScript 函数function
前端
猿java38 分钟前
Java String.replace()原理,你真的了解吗?
java·面试·架构
Delroy40 分钟前
CSS Grid布局:从魔方拼图到网页设计大师 🎯
前端·css
拜晨1 小时前
类型体操的实践与总结: 从useInfiniteScroll 到 InfiniteList
前端·typescript
月弦笙音1 小时前
【XSS】后端服务已经加了放xss攻击,前端还需要加么?
前端·javascript·xss
code_Bo1 小时前
基于vueflow实现动态添加标记的装置图
前端·javascript·vue.js