HTML知识体系
html所有的知识,只有一条根逻辑,也就是html是浏览器用来构建页面的结构化信息
一切的知识点,都围绕这四件事
- 【解析层】:浏览器怎么读HTML
- 【资源层】:HTML怎么加载到外部资源
- 【结构层】:页面怎么写才合理
- 【能力层】:HTML自带哪些功能
所有的八股题,都是从这里长出来的,所以我们只需理解流程,就不用去刻意背八股
解析层
浏览器读HTMl的第一步,所有规则的根
-
第一步:看DOCTYPE ----> 决定用 标准模式 / 怪异模式
-
第二步:看字符编码 ----> 靠
<metacharset = "UTF - 8">解决浏览器乱码 -
第三步:按标签规则构建DOM ----> 所有有块级 / 行内 / 空(void)元素的分类,有标签嵌套规范
从这里可以推出来的八股:
- DOCTYPE作用、严格模式 vs 混杂模式
- 浏览器乱码原因 & 解决
- 行内 / 块级 / void元素 有哪些
- head标签的作用
资源层
HTML引入资源只有两种意图,这决定了加载行为
- 引入资源只有两种方式:src / href
- 遇到 < script src > : 默认阻塞HTML解析、优化defer / async ----> 再现代:type = "module"
- 遇到 < link href > : 不阻塞解析,但阻塞渲染
- 遇到图片:srcset做响应式、loading = "lazy"懒加载
从这里可以推出来的八股:
- src vs href
- defer vs async
- script 加载策略
- 渲染阻塞 / 解析阻塞
- img的srcset
- preload / prefetch
结构层
HTML不是样式标签,是内容语义标签
- 不是用div堆,而是表达内容含义
语义化标签 : header / nav / main / article / section / footer
- 同样是加粗 / 斜体
b vs strong 、 i vs em :一个是视觉、一个是语义
- title是页面标题, h1是内容标题
从这里可以推出来的八股:
- 语义化理解
- title vs h1
- b / strong 、 i / em
- 无障碍A11y基础
能力层
HTMl5给HTML新增了原生交互、媒体、存储能力,减少对JS的依赖
- 表单
< lable > 扩大点击、可访问性
- 图形
SVG矢量(DOM结构)、 Canvas位图(像素图)
- 交互 ----> Drag API 拖放
- 嵌入
iframe隔离、安全、sandbox
- 存储
html5离线缓存(已废弃)、现代:service wroker
从这里可以推出来的八股:
- lable作用
- Canvas vs SVG
- drag API
- iframe 优缺点
- 离线存储原理
顶层设计思想
怎么写更健壮
- 渐进式增强:先能用 -----> 再好使
- 优雅降级: 先完整 ----> 再兼容
八股部分
解析层
文档声明(DOCTYPE)和 < ! Doctype html> 有何作用 ? 严格模式与混杂模式如何区分 ? 它们有什么意义
本质:文档类型声明,不是HTML标签,是给浏览器的版本说明书,
< ! Doctype html> 作用:
- 声明当前文档是HTML5标准
- 强制浏览器进入标准模式(严格模式),按照W3C最新规范渲染页面
- 避免浏览器进入怪异模式,保证页面在不同浏览器中渲染一致
严格模式 vs 混杂模式区分及意义:
- 触发条件不同:
严格模式:正确写 < ! Doctype html>
混杂模式:省略 DOCTYPE / 写旧版声明
- 渲染规则不同:
严格模式:严格遵循W3C HTML / CSS 规范,盒模型、布局、标签嵌套全按标准
混杂模式:兼容IE5/6旧逻辑,盒模型】、布局行为非标准
- 实际意义:
严格模式:保证浏览器渲染一致,现代开发基础
混杂模式:仅兼容20年前旧网页,会导致现代网页布局错乱
浏览器乱码的原因是什么 ? 如何解决 ?
- 原因
浏览器在解析HTML的编码环节,未正确识别文件字符编码,用错误编码解码导致乱码
- 解决
在 < head > 第一行 < meta charset = "UTF-8">声明编码,同时保证文件保存为UTF-8 格式、 服务器返回正确编码头
行内元素有哪些 ?块级元素有哪些 ?空(void)元素有哪些
- 块级元素
核心原理:默认独占一行,宽度默认撑满父容器,可嵌套块级 / 行内元素(< p >不能嵌套块级)
常见块级元素:
<div> <p> <h1>~<h6> <ul> <ol> <li> <header> <nav> <main> <section> <article> <footer>
<form> <table>
- 行内元素
核心原理:默认不换行,宽度由内容决定,不能嵌套块级元素
常见行内元素:
<span> <a> <strong> <em> <b> <i> <u> <label> <span> <img>(img是行内替换元素,表现类似行内)
- 空(void)元素
核心原理:单标签闭合,不能嵌套任何元素
常见空元素
<img> <input> <br> <hr> <meta> <link> <area> <base> <col> <embed> <param>
<source> <track>
head标签有什么作用,其中什么标签必不可少
- 作用
存放页面的配置信息、内容不显示在页面上、给浏览器、搜索引擎看的
- 必不可少的标签
<meta charset= "UTF-8"> 解决乱码
<title>页面标题<title/>
资源层
src和href区别
- src:source,资源引入,将外部资源嵌入到当前文档中,是内容的一部分,src会阻塞页面解析渲染
浏览器遇到 < srcipt src >会暂停解析,加载并执行完脚本才继续(除非加 async / defer)
常见标签:<script> <img> <video> <iframe>
- href:hypertext reference,超文本引用,建立当前文档与目标资源的关联关系,不嵌入内容,href不会阻塞页面解析
浏览器并行加载,不阻塞HTML解析
常见标签:<base> <link> <a>
srcipt标签中的defer和async的区别
- 共同点
都是 < script >的布尔属性,只对外部脚本有效(src)
都不会阻塞HTML解析
都让JS异步加载
- 区别
aync:加载完立即执行,谁先加载完谁先执行,执行顺序不确定(乱序),执行时机可能在DOM解析完之前,也可能在之后
可能阻塞渲染
defer:加载完不执行,等整个HTML解析完毕再执行,按脚本在页面中的顺序执行(有序),执行时机在
DOMContentLoaded之前,不会阻塞渲染
常用的meta标签有哪些
// 告诉浏览器这个网页用的是UTF-8编码,不写会乱码,必须写在最前面
<meta charset= "UTF-8">
// width=device-width:页面宽度 = 手机屏幕宽度 initial-scale=1.0:初始缩放比例1:1 , 不放大也不缩小
// 也就是让网页在手机上正常显示,不被缩小成模糊小网页
<meta name= "viewport" content="width=device-width, initial-scale=1.0">
// 给搜索引擎看的关键词,现在SEO权重很低
<meta name= "keywords" content= "学习">
// 网页描述,搜索引擎结果下面那行小字就是它,影响点击率,不影响排名
<meta name= "description" content= "学习">
// 告诉IE浏览器:用你最新的内核渲染,别用老旧模式,用来解决IE浏览器兼容性问题
<meta http-equiv= "X-UA-Compatible" content= "IE=edge">
// 给搜索引擎爬虫用,noindex:不收录此页面,nofollow:不追踪页面内链接,all:允许收录 + 追踪(默认)
<meta name= "robots" content= "noindex, nofollow">
// n秒后自动跳转或者刷新,现在很少用
<meta http-equiv= "refresh" content= "3"; url= https://xxx>
// 添加到桌面后,全屏启动,无地址栏
<meta name= "apple-mobile-web-app-capable" content= "yes">
// 给国产双核浏览器(360、QQ、UC),强制使用webkit极速模式,不使用IE兼容模式
<meta name= "renderer" content= "webkit">
结构层
对HTML语义化的理解
- 什么是HTML语义化
在没有css的情况下,页面依然能清晰地展示内容结构,让人和机器都能看懂
标题用: <h1> ~ <h6>
段落用:<p>
导航用:<nav>
侧边栏用:<aside>
文章用:<article>
头部底部用:<header>, <footer>
区块用:<section>
- 为什么要语义化
代码可读性高(开发者一眼能看懂结构,便于维护、协作)
利于SEO(搜索引擎优化,爬虫能更好的识别标题、导航、正文,提高页面权重)
更好的阅读性(a11y, 屏幕阅读器、盲人设备能正确朗读内容结构)
浏览器兼容性 & 退化友好(即使css加载失败,页面结构依然清晰)
团队维护成本低(结构自然解释,减少命名冲突和混乱)
title与h1的区别、b与strong的区别、i与em的区别、img标签alt和title的区别
- title和h1的区别
title:页面标题,显示在浏览器标签栏,给搜索引擎和用户看页面主题,一个页面只有一个,SEO权重最高,写在< head >里面
h1:页面正文标题,显示在页面内容里,建议一个页面一个,多个也不报错,但不利于SEO,SEO权重仅次于title,写在< body >里
- b和strong的区别
b:单纯加粗,只有样式,无语义,不提升权重
strong:强调重要性,有语义,代表内容重要,会被搜索引擎、屏幕阅读器识别为重点内容
- i和em区别
和上面几乎一模一样,一个斜体,一个强调
- img标签alt和title的区别
alt:必须有,图片加载失败、不存在时候显示的文字,SEO识别内容、屏幕阅读器的内容,
title:可选,鼠标悬停在图片上弹出的提示文字,对SEO没有用
label的作用是什么?如何使用?
- label是干嘛的
绑定表单元素(input、textarea、select等)
扩大点击区域:点击文字也能选中单选框 / 复选框;点击文字能让输入框自动聚焦
提升可访问性:屏幕阅读器会把文字和输入框关联起来朗读
纯语义化:没有样式,只做功能绑定
- 使用方式
// 显式绑定,意思是label要绑定id=“xxx”的那个input,建议这么写,结构清晰
<input type= "checkbox" id="agree">
<label for="agree">已阅读协议</label>
// 隐式绑定,意思是里面包起来的是绑定的,结构简单但是结构耦合在一起
<label>
<input type="radio" name="gender"> 男
</label>
能力层
HTML5有哪些更新
新增语义化标签、多媒体支持、Canvas、本地存储、新表单、新API、去除废弃标签,更语义、更强交互、更少依赖插件
Canvas和SVG的区别
canvas:基于像素,是一张位图,放大会模糊、失真,无DOM、性能高适合大量绘制
svg:基于XML矢量描述,是矢量图,放大不失真、清晰度不变、可操作DOM、支持事件,适合图标和简单图形
说一下HTML5 drag API
核心三步:被拖拽元素、放置目标区域、数据传递
- 被拖拽元素触发的事件:dragstart:开始拖拽、drag:拖拽中、dragend:拖拽结束
- 放置目标区域上触发:dragenter:进入目标、dragover:在目标上移动、dragleave:离开目标、drop:松开位置(最关键)
关键点:draggable="true" 想要元素能拖,必须加上这个属性; dragover 必须阻止默认行为e.prventDefault()否则不会触发drop
,drop也要阻止默认行为,防止浏览器跳页 / 打开文件 ; 数据考dataTransfer传递
// 存数据
e.dataTransfer.setData('key', 'value')
// 取数据
e.dataTransfer.getData('key')
可拖拽文件通过 dataTransfer.files 获取文件列表
总的来说:HTML5拖拽API通过给元素设置 draggable,配合dargstart、datagover、drop等事件实现拖拽,用dataTransfer传递
数据,dragover必须阻止默认行为才能正常放置
渐进式增强和优雅降级的区别
优雅降级:从现代浏览器开始构建,再向下兼容旧llq,保证基本可用
渐进式增强:从基础核心内容开始,逐步增加高级特性,新浏览器获得更好的体验
共同点:都是为了兼容不同浏览器,保证可用性
现在主流思想:渐进式增强
iframe有哪些优点和缺点
iframe就是在一个网页里,再嵌套一个独立的小网页,也就是在当前页面展示另一个页面
- 优点:
安全隔离(iframe是独立文档,与父页面不同源时完全隔离,不会污染父页面的js、dom)
简单易用(可以直接嵌入第三方页面、广告、编辑器、地图、视频等)
并行加载(旧浏览器对同一域名有并发请求限制,iframe可以多开一个请求通道)
无刷新上传 / 跨域(早期AJAX未普及时,常用ifrme实现无刷新提交表单)
- 缺点
阻塞主页面onload(iframe加载完,主页面 window.onload才触发,会拖慢页面加载)
资源无法共享(独立window、独立渲染进程,占用内存、资源消耗大)
SEO不友好(搜索引擎对iframe内容抓取困难,容易被判定为低质页面)
弹窗、遮罩层问题(iframe内部的alert、遮罩层只在框内生效,体验割裂)
通信麻烦(父子页面通信只能用 postMessage,跨域时限制多)
移动端兼容性差(滚动、高度自适应、缩放问题多,体验差)
说一下web worker
web worker 是HTML5提供的多线程方案,让JS可以在独立线程运行耗时计算,不阻塞主线程渲染;不能操作DOM,通过postMessage通信,适合大量计算任务
HTML5的离线存储怎么使用,它的工作原理是什么
HTML5离线存储即Application Cache原理是通过manifest清单文件声明需要缓存的资源,浏览器首次访问时下载并缓存,断网时直接加载本地缓存,实现离线访问;使用时只需在HTML标签引入manifest文件,并配置缓存、网络、降级规则;目前已经被废弃,由
Service Worker替代
浏览器是如何对HTML5的离线存储资源进行管理和加载的
后续补充。。。。