记录HTML中频八股
此处记录个人笔记,一些AI拓展阅读可以到网站笔记上进行阅读 飞书文档思维导图
八股链接 MDN-重排 MDN-重绘 Minimizing browser reflow Understanding Reflow and Repaint in the browser
重排(reflow),也叫回流
是浏览器重新计算DOM位置或形状的行为
重绘(repaint)
是浏览器重新计算DOM的外观,比如背景色,可见性(visibility)等不影响位置布局的操作
频繁的重排重绘会增大开销,造成浏览器卡顿等影响
重排一个元素,可能还会影响到其父子元素等所有相关的在dom树上的node节点
重绘一般发生在重排之后,重绘的开销一般比重排小
重排一定重绘,重绘不会导致重排
div和span都是无语义的用于布局或添加样式的HTML标签
<div> 多用于划分页面结构、布局模块
<span> 多用于包裹文本内容,进行局部样式控制
不同点在于div是块级元素,span是行内元素
区分他们就是区分block和inline的区别
八股链接 MDN-渲染 Critical Rendering Path-关键路径渲染
阅读上方的文档后,从TCP握手+建立https连接,到发送第一个http请求后返回HTMl页面开始
整个HTML渲染流程还是很清晰的
首先区分两个对象模型,DOM和CSSOM,一个是文档对象模型,一个是CSS对象模型
DOM构建是增量的、CSSOM则不是
增量构建大概就是,从HTML响应(服务器最初返回的)->HTML标记(Toekn)->节点(node)->DOM树,其中每个节点都是由开始标记,结束标记组成,中间会有描述信息,如果一组开始和结束标签中间还有另一组开始结束标签,就出现了层级结构
CSSOM构建是阻塞渲染的,只有执行完获取到完整的css规则后才会构建完成(这是由于css具有覆盖性,前面的样式会被后面的覆盖决定的)
因此最初的顺序就是
专业一些
到此为止,一次完整的HTML渲染就结束了
DOM的构建之所以是增量的,可以形象地理解为“边吃边消化”的过程。想象一下你在吃一条长长的意大利面条,而不是等到整条面条都塞进嘴里才开始咀嚼。你是一边吸食一边咀嚼,这样就能更快地享受美食并且不会噎到。 类似地,当浏览器从服务器接收HTML文档时,它并不是等待整个文档下载完成之后才开始解析和处理的。相反,浏览器会一边接收数据(HTML代码),一边进行解析,将接收到的部分即时转化为标记(token)、节点(node),并逐步构建DOM树。每当遇到一个新的标签(比如
<div>、<p>等)或闭合标签时,浏览器就会更新DOM树,添加相应的节点,并建立这些节点之间的层次关系。 这种“边接收边处理”的方式有几个优点: 提高效率:不必等待整个文件下载完毕就可以开始处理已接收的数据,从而加快了页面加载速度。 早期发现错误:如果文档中有语法错误,浏览器可以更早地发现问题,而不需要等到全部内容都被下载下来才发现。 预加载资源:在构建DOM的过程中,一旦遇到外部资源引用(如图片、样式表或脚本文件),浏览器可以立即开始预加载这些资源,进一步加速整体页面加载过程。 因此,通过这种方式,浏览器能够更加高效地处理网页内容,给用户带来更快的响应时间和更好的浏览体验。就像你吃意大利面时,既不会因为吃得太多而噎住,也不会浪费时间等待,而是以最舒适的速度享受美食。
MDN文档比较多,所以这里不放了
一道题目让我重新学习了整个flex
阮一峰老师的文档很详细,我这里就不多自我描述了
flex是flex-grow flex-shrink flex-basis的简写
flex:1 是相当于 flex-grow=1 flex-shrink=1 flex-basis=0
这里的flex包括flex-grow flex-shrink flex-basis都是应用在元素上的样式
所以这里就要区分flex的这些属性,哪些是应用在容器上,哪些是应用在元素上
在使用Flexbox(弹性盒子布局)时,属性可以分为应用于容器(即父元素,通常称为flex container)和应用于项目(即子元素,通常称为flex items)的两类。下面是详细的分类:
应用于容器上的属性
display
flex或inline-flex来定义一个弹性盒子容器。flex-direction
row(默认值,从左到右)、row-reverse、column(从上到下)、column-reverse。flex-wrap
nowrap(默认值,不换行)、wrap、wrap-reverse。flex-flow
flex-direction和flex-wrap的简写,默认值是row nowrap。justify-content
flex-start、flex-end、center、space-between、space-around、space-evenly。align-items
stretch(默认值)、flex-start、flex-end、center、baseline。align-content
stretch(默认值)、flex-start、flex-end、center、space-between、space-around。应用于项目上的属性
order
flex-grow
flex-shrink
flex-basis
auto,即项目本身的大小。flex
flex-grow, flex-shrink 和 flex-basis 的简写,默认值是 0 1 auto。align-self
align-items的值。默认为auto,表示继承父元素的align-items值,如果没有父元素,则等同于stretch。src和href的区别。src和href的核心区别就是
src用于引入外部资源,这个资源要被嵌入到页面中
href用于指定链接的目的地,引用外部资源,但不直接嵌入内容
src一般用于比如图片音视频以及脚本
href一般用于锚点、超链接以及样式表
解析HTML过程中如果加载到src会阻塞解析直到资源被加载,可以按需使用async和defer来解决
但是加载到href则不会,比如加载一个样式表会在后台进行,但是构建CSSOM的时候仍会阻塞渲染
这个问题我本来想把它放到重复区域的部分
因为这个内容和前面涉及到的问题重合部分也是挺多的,但是要链接的话要对应好多题,也是从一种角度做一个汇总吧
八股链接 简述 sessionStorage和 localStorage的区别?- B站 MDN-sessionStorage MDN-localStorage
二者都是H5新增的WebStorage API
都是用于在客户端存储一些键值对数据
但是在存储有效时间、作用域上有不同
存储时间上:
作用于上:
在解析HTML的过程中,遇到link的href指向外部样式表时,由于构建CSSOM树,浏览器会阻塞DOM渲染,只有当构建完成时,才能与DOM树一起构建渲染树
但是也存在特殊情况,在link标签设置media属性,当媒体查询不满足时,浏览器会在后台异步加载这个样式,所以不会阻塞当前DOM渲染,当媒体查询满足时,才会使用这个样式。
这里有一个有意思的概念FOUC(Flash Of Unstyled Content),就是样式变化时引起的页面闪烁
这个问题是否有漏洞,应该是说阻塞渲染树的渲染,因为DOM渲染和CSSOM渲染是两个不同的事,因为渲染树被CSSOM阻塞了,所以宏观上来看DOM树也被阻塞了,可实际上是CSSOM阻塞了合成渲染树,与阻塞DOM树无关。
上面的问题可参考AI回答记录
八股链接 MDN-源 MDN-浏览器的同源策略 MDN-跨域资源共享CORS JSONP 跨域原理及实现
八股链接 MDN-cookie 二者都是浏览器存储技术,localStorage是H5中新增的webStorage API
八股链接 多屏适配是一个很宽泛的概念,媒体查询、自适应布局、响应式布局都是实现多屏适配的方式。然后区别三种方式,媒体查询是CSS3引出的,通过@media实现一些不同尺寸下(如width)应用不同样式的方法;自适应布局是提前设计好几种布局,通过媒体查询实现不同布局的切换;响应式布局是综合利用媒体查询、相对单位、弹性盒子等方法实现任何设备的布局适配,更全面。
页面渲染就像一场舞台剧,HTML 是剧本,CSS 是布景,JS 是演员。浏览器按顺序加载资源,同步资源必须立刻上场,异步资源可以后台准备,当 DOM 构建完成时触发
DOMContentLoaded,所有资源加载完毕后触发load,演出正式开始。
参考[[HTML高频八股]]题3
参考[[HTML高频八股]]题3
参考[[HTML中频八股]] 题1
参考[[HTML高频八股]]题3
参考[[HTML中频八股]]题1
参考[[HTML中频八股]]题4
参考[[HTML高频八股]]题2
参考[[HTML中频八股]]题1
参考[[HTML中频八股]]题1
八股链接 用flex:1使其占据剩余空间即可 或者用grid的 200px 1fr
Copied
Postman请求不会存在跨域问题。
跨域问题本质上是浏览器的同源策略导致的安全限制。
同源策略要求浏览器在访问资源时,协议、域名和端口都必须相同,若不同则会受到限制,以防止某些恶意的脚本访问其他源的敏感数据。
而Postman是一款独立的HTTP请求工具,它并不依赖于浏览器环境,没有遵循浏览器的同源策略。所以在使用Postman发送请求时,不会因为请求的目标地址与某个默认源不同而受到跨域限制,可以自由地向不同源的服务器发送各种类型的HTTP请求,如GET、POST等,并获取响应结果