# 技术栈知识点巩固——Html
Posted 爱码代码的喵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了# 技术栈知识点巩固——Html相关的知识,希望对你有一定的参考价值。
技术栈知识点巩固——html
Src 和 href 的区别
src
- 表示对资源的应用,它指向的内容会嵌入到当前标签所在的位置。
href
- 超文本引用,它指向一些网络资源,建立和当前元素或本文档的链接关系。
Doctype(文档类型)的作用
DOCTYPE
是HTML5
中一种标准通用标记语言的文档类型声明,它的目的是告诉浏览器(解析器)应该以什么样(html
或xhtml
)的文档类型定义来解析文档。
行内元素
-
行级元素不能设置宽高
-
a b span img input select strong
块级元素
-
块级元素可以设置宽高
-
块级元素是独占一行
-
div ul ol li dl dt dd h1 h2 h3 h4 h5 h6 p
cookies、sessionStorage、localStorage
cookies
- 网站为了标示用户身份而储存在用户本地端上的数据
cookie
数据始终在同源的http
请求中携带,会在浏览器和服务器间来回传递- 数据大小不能超过
4K
- 设置过期时间之前一直有效
sessionStorage
- 不会自动把数据发送给服务器,只在本地保存
- 比
cookie
的容量大 - 当前浏览器窗口关闭后自动删除
localStorage
- 不会自动把数据发送给服务器,只在本地保存
- 比
cookie
的容量大 - 浏览器关闭数据不会主动丢失除非主动删除数据
crossorigin 属性
- 设置
crossorigin
属性后,script
标签去请求资源的时候,request
会带上origin
头,然后会要求服务器进行cors
校验,跨域的时候如果response header
没有Access-Control-Allow-Origin
是不会拿到资源的。cors
验证通过后,拿到的script
运行内部报错的话,window.onerror
捕获的时候,内部的error.message
可以看到完整的错误信息。
Html 事件冒泡
事件冒泡
- 如下面的
html
代码,在点击外面和里面的div
时都会触发OutFunction
方法,这个就是事件冒泡
<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>事件冒泡</h1>
<div class='Out' onclick='OutFunction(event)'>
<div class='Middle'>
<div class='Inner' onclick='InnerFunction(event)'></div>
</div>
</div>
<script type="text/javascript">
function InnerFunction(e)
debugger
function OutFunction(e)
debugger
</script>
<style>
.Out
border: 1px solid red;
height: 200px;
padding: 10px 10px 10px 10px;
.Middle
border: 1px solid black;
height: 100px;
</style>
</body>
</html>
阻止事件冒泡
- 在触发
InnerFunction
时,不让他冒泡触发OutFunction
。 - 使用
e.stopPropagation();
function InnerFunction(e)
// 业务逻辑
alert('InnerFunction()触发了')
//如果提供了事件对象,则这是一个非IE浏览器
if ( e && e.stopPropagation )
//因此它支持W3C的stopPropagation()方法
e.stopPropagation();
else
//否则,我们需要使用IE的方式来取消事件冒泡
window.event.cancelBubble = true;
function OutFunction(e)
alert('OutFunction()触发了')
script标签中defer和async的区别
-
defer
和async
属性都是去异步加载外部的JS
脚本文件,它们都不会阻塞页面的解析。 -
执行顺序:多个带
async
属性的标签,不能保证加载的顺序;多个带defer
属性的标签,按照加载顺序执行; -
脚本是否并行执行:
async
属性,表示后续文档的加载和执行与js
脚本的加载和执行是并行进行的,即异步执行;defer
属性,加载后续文档的过程和js
脚本的加载(此时仅加载不执行)是并行进行的(异步),js
脚本需要等到文档所有元素解析完成之后才执行,DOMContentLoaded
事件触发执行之前。
Html BOM
-
BOM
是一套操作浏览器的API
(接口/方法/属性) -
Bom
:Browser Object Model
,即浏览器对象模型,提供了独立于内容的、可以与浏览器窗口进行互动的对象结构。 -
Browser
对象:指BOM
提供的多个对象,包括:Window、Navigator、Screen、History、Location
等。其中
Window
对象为顶层对象,其他对象都为Window
对象的子对象。
Bom 对象
-
Window
对象:表示浏览器打开的窗口,包括获取焦点、改变滚动条、设置定时器等等。 -
Navigator
对象:包含浏览器信息。如:获取浏览器名称、版本信息、操作系统平台信息等等。 -
Screen
对象:包含屏幕信息。如:获取屏幕高度、宽度等等。 -
History
对象:可对当前页的浏览历史进行操作,如:前进、后退等。 -
Location
对象:可对当前页面的URL
进行操作,如:导航到新的页面、获取URL
信息等。
浏览器渲染的过程
页面加载过程
DNS
域名解析:拿到服务器IP
- 与服务器建立
TCP
连接 - 服务器建立了
TCP
连接后,向服务器发起请求 web
服务器解析用户请求,知道了需要调度哪些资源文件,再通过相应的这些资源文件处理用户请求和参数,并调用数据库信息,最后将结果通过web
服务器返回给浏览器客户端。- 返回响应结果
- 关闭
TCP
连接
浏览器渲染过程
- 解析
HTML
、生成DOM
树、解析CSS
、生成CSSOM
树 - 将
DOM
树和CSSOM
树结合,生成渲染树(Render Tree
) Layout
(回流):根据生成的渲染树,进行回流(Layout
),得到节点的几何信息(位置,大小)Painting
(重绘):根据渲染树以及回流得到的几何信息,得到节点的绝对像素Display
: 将像素发送给GPU
,最后通过调用操作系统Native GUI
的API
绘制,展示在页面上。
构建 DOM 流程
-
浏览器将
HTML
解析成树形的数据结构,简称DOM
。 -
字节数据——>字符串——>Token——>Node——>Dom
构建 CSSOM流程
- 解析
CSS
文件(如果是link的) - 将字节转换成字符。
- 确定
tokens
(标签) - 将
tokens
转换成节点 - 最后根据节点构建
CSSOM
树
构建渲染树
- 从
dom
树的根节点开始遍历每一个可见的节点 - 从
css
规则树 中找到对应的节点,然后根据节点信息和样式组合成渲染树
布局与绘制
- 当浏览器生成渲染树以后,就会根据渲染树来进行布局(也可以叫做回流)
- 这一阶段浏览器要做的事情是要弄清楚各个节点在页面中的确切位置和大小。
- 布局完成后,浏览器会立即发出
Paint Setup
和Paint
事件,将渲染树转换成屏幕上的像素。
懒加载
- 懒加载也叫延迟加载,指的是在长网页中延迟加载图像,是一种很好优化网页性能的方式。用户滚动到它们之前,可视区域外的图像不会加载。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>图片懒加载测试</title>
<style>
img
height: 450px;
display: block;
margin-bottom: 20px;
</style>
</head>
<body>
<!--图片地址暂时先保存在data-src这个自定义属性上面-->
<img data-src="./image/img-loop/1.jpg" alt="懒加载1" />
<img data-src="./image/img-loop/2.jpg" alt="懒加载2" />
<img data-src="./image/img-loop/3.jpg" alt="懒加载3" />
<img data-src="./image/img-loop/4.jpg" alt="懒加载4" />
<img data-src="./image/img-loop/5.jpg" alt="懒加载5" />
<script>
const imgs = document.getElementsByTagName('img');
function lazyLoad(imgs)
// 视口的高度;
const clientH = document.documentElement.clientHeight;
// 滚动的距离,这里的逻辑判断是为了做兼容性处理;
const clientT = document.documentElement.scrollTop || document.body.scrollTop;
for(let i = 0; i < imgs.length; i++)
// 逻辑判断,如果视口高度+滚动距离 > 图片到浏览器顶部的距离就去加载;
// !imgs[i].src 是避免重复请求,可以把该条件取消试试:可以看到不加该条件的话往回滚动就会重复请求;
if(clientH + clientT > imgs[i].offsetTop && !imgs[i].src)
// 使用data-xx的自定义属性可以通过dom元素的dataset.xx取得;
imgs[i].src = imgs[i].dataset.src;
;
// 一开始能够加载显示在视口中的图片;
lazyLoad(imgs);
// 监听滚动事件,加载后面的图片;
window.onscroll = () => lazyLoad(imgs);
</script>
</body>
</html>
Iframe
iframe
会阻塞主页面onload
事件;不利于搜索引擎识别;增加http
请求;- 展现嵌入的网页;加载速度较慢的内容,如广告;可以跨子域通信;
<iframe src="home.html"></iframe>
Dom 节点获取
getElementById // 按照 id 查询
getElementsByTagName // 按照标签名查询
getElementsByClassName // 按照类名查询
querySelectorAll // 按照 css 选择器查询
// 按照 id 查询
var imooc = document.getElementById('main') // 查询到 id 为 main 的元素
// 按照标签名查询
var pList = document.getElementsByTagName('p') // 查询到标签为 p 的集合
console.log(divList.length)
console.log(divList[0])
// 按照类名查询
var moocList = document.getElementsByClassName('main') // 查询到类名为 main 的集合
// 按照 css 选择器查询
var pList = document.querySelectorAll('.main') // 查询到类名为 main 的集合
选择器优先级
!important
>行内样式>id
选择器>类选择器>标签选择器>通配符>继承
从浏览器输入 Url 到显示页面的步骤
- 根据
Url
进行DNS
域名解析,找到真实IP
- 向服务器发送请求,服务器交给后端处理完成返回数据,浏览器接收后端返回的数据
- 浏览器加载到的资源进行语法解析,建立相应的内部数据结构。见上面浏览器渲染的过程。
- 载入解析到的资源文件、渲染页面、完成。
网站性能优化
Content 方面
- 减少
HTTP
请求 - 减少
DNS
查询:DNS
缓存 - 减少
DOM
元素数量
Server方面
- 使用
CDN
- 配置ETag
- 对组件使用压缩
Cookie方面
- 减小
cokkie
大小
Css 方面
- 样式放到页面顶部
- 不使用
CSS
表达式 - 使用
<link>
不适用@import
JS方面
- 脚本放到页面底部
- 压缩
JS
和Css
- 较少
DOM
访问
图片方面
- 优化图片:压缩
- 优化
css
精灵 - 不要在
Html
中拉伸图片
浏览器内核
渲染引擎
- 负责拿到网页的内容,将网页的内容进行整理、加工最终显示到电脑屏幕上。
Js 引擎
- 解析和执行
javascript
来实现网页的动态效果 - 在构建
DOM
时,Html
解析器若遇到了JavaScript
那么它会暂停文档的解析,将控制权交给JS
引擎,等JS
引擎执行完毕后,浏览器再从中端的地方恢复继续解析文档
一次完整的 HTTP 请求
- 建立TCP连接:三次握手
Web
浏览器向Web
服务器发送请求:一旦建立了TCP
连接,Web
浏览器就会向Web
服务器发送请求命令Web
浏览器发送请求头Web
服务器应答- 服务器发送响应头
- 服务器向浏览器发送数据
- 服务器关闭
TCP
连接
Http 和 Https
https
有ca
证书,http
一般没有http
是超文本传输协议,信息是明文传输https
具有安全性的ssl
加密传输协议http
默认端口80
,https
默认端口443
Html 语义化
- 指对文本内容的结构化(内容语义化),选择合乎语义的标签(代码语义化),便于开发者阅读,维护和写出更优雅的代码的同时,让浏览器的爬虫和辅助技术更好的解析。
Http 请求方法
方法 | 描述 |
---|---|
HEAD | 与 GET 相同,但只返回 HTTP 报头,不返回文档主体。 |
PUT | 上传指定的 URI 表示。 |
DELETE | 删除指定资源。 |
OPTIONS | 返回服务器支持的 HTTP 方法。 |
CONNECT | 把请求连接转换到透明的 TCP/IP 通道。 |
如何减少回流?(浏览器绘制过程)
-
使用
transform
替代top
-
不要把节点的属性值放在一个循环里当成循环里的变量
-
不要使用
table
布局,可能很小的一个小改动会造成整个table
的重新布局 -
把
DOM
离线后修改。如:使用documentFragment
对象在内存里操作DOM
-
不要一条一条地修改
DOM
的样式。与其这样,还不如预先定义好css
的class
,然后修改DOM
的className
。
前端优化方式
- 尽量减少
HTTP
请求次数 - 减少
DNS
查找次数 - 避免跳转
- 可缓存的
AJAX
- 推迟加载内容
- 预加载
- 减少
DOM
元素数量 - 根据域名划分页面内容
- 使
iframe
的数量最小 - 不要出现
404
错误 - 使用内容分发网络
- 为文件头指定
Expires
或Cache-Control 13
、Gzip
压缩文件内容 - 配置
ETag
- 尽早刷新输出缓冲
- 使用
GET
来完成AJAX
请求 - 把样式表置于顶部
- 避免使用
CSS
表达式(Expression
) - 使用外部
JavaScript
和CSS
- 削减
JavaScript
和CSS
- 用
<link>
代替@import
- 避免使用滤镜
- 把脚本置于页面底部
- 剔除重复脚本
浏览器乱码
产生原因
- 网页源代码是
gbk
编码,内容中的文字是utf-8
html
网页编码是gbk
,而程序从数据库中调出呈现是utf-8
编码的内容也会造成编码乱码;- 浏览器不能自动检测网页编码,造成网页乱码。
HTML5 drag API
-
dragstart
:事件主体是被拖放元素,在开始拖放被拖放元素时触发。 -
darg
:事件主体是被拖放元素,在正在拖放被拖放元素时触发。 -
dragenter
:事件主体是目标元素,在被拖放元素进入某元素时触发。 -
dragover
:事件主体是目标元素,在被拖放在某元素内移动时触发。 -
dragleave
:事件主体是目标元素,在被拖放元素移出目标元素是触发。 -
drop
:事件主体是目标元素,在目标元素完全接受被拖放元素时触发。 -
dragend
:事件主体是被拖放元素,在整个拖放操作结束时触发。
严格模式和混杂模式
- 严格模式:以浏览器支持的最高标准运行
- 混杂模式:页面以宽松向下兼容的方式显示
以上是关于# 技术栈知识点巩固——Html的主要内容,如果未能解决你的问题,请参考以下文章