1、DOM和BOM
-
DOM是表示HTML或者XML文档的标准的对象模型,将文档中每个组件(元素、属性等)都作为一个对象,使用JS来操作这个对象,从而动态改变页面内容,结合等。
DOM是以树型结构组织文档内容,树的根节点的document,代表整个文档,document对象有许多属性和方法
-
BOM是表示浏览器窗口或各个组件的对象模型,用于访问和控制浏览器窗口及其各个部分,如历史记录、地址栏
BOM的核心对象是window对象,表示浏览器的窗口,也是JS的全局对象,用于控制浏览器的各个方面,同时还提供了其他的一些对象,如navigator(提供浏览器相关信息)、location(url)、history(历史记录)
总的来讲,DOM的用于访问和操作网页文档的对象模型、BOM是控制浏览器窗口及其各个组件的模型
2、输入网址到页面显示的过程
整的来讲,这个过程可以分为6个阶段
- DNS解析,网站于IP地址的转换,DNS解析是一个递归的过程,涉及到DNS的优化:DNS缓存、DNS负载均衡
- 发起TCP连接:三次握手、四次挥手
- 发送HTTP请求:构建HTTP请求报文通过TCP协议,发送至服务器指定端口;请求行、请求报头、请求正文
- 服务器处理并返回HTTP报文:解析,并封装成HTTP Request对象,一般由Web服务器进行:Nginx、Tomcat。状态码、响应报头、响应报文
- 浏览器解析并渲染
- 连接结束
3、前端中的图片格式
- 图片类型:
分为位图和矢量图(向量图);位图:像素点拼起来的,矢量图:记录元素形状和颜色算法,不会出现失真
- 压缩类型
- 无压缩:不对图片数据进行压缩处理:BMP
- 有损压缩:进行部分处理、将相邻的像素合并或者不重要重复内容忽略,压缩图片体积,压缩算法不会对图片的所有数据进行编码压缩,jpg
- 无损压缩:使用压缩算法对图片的所有数据进行编码压缩,图片质量没有损耗、可以完整恢复成所有的信息
- 图片的位数:8,16,24,32
位数越大、表示的颜色越多、颜色过度更细腻
- 图片格式
-
GIF
:lzw压缩算法、采用8位压缩、支持256种颜色、适用于色彩较少的图片,最大的特性:帧动画 -
JPC/JPEG
:有损压缩格式、24位压缩,容易造成图像数据损失,支持渐进式加载、不支持透明、半透明渐进式:jpg文件包含多次扫描、顺寻的存在在jpg文件,先显示模糊,随着扫描次数增加,逐渐清晰
-
PNG
:使用LZ77派生的无损数据压缩算法、替代GIF格式,压缩比高、生成文件体积小支持8、24、32位,支持透明、半透明、能够彻底消除锯齿边缘、不支持动画
-
Webp
:目标是减少文件大小,同时支持无损压缩和有损压缩,缺点在于现在浏览器的支持率不够理想 -
svg
:用XML定义的语言、描述二维矢量及矢量2/栅格图形,提供了三种类型的图形对象:矢量图形、图像、文本。是可交互和动态的,可以在SVG文件中嵌入动画元素或通过脚本定义动画,武无论怎么放大都不会失真,文件大小也比较小比JPENG和PNG。缺点渲染成本高些
4、前端跨页面通信
localStorage和sessionStorage
:一个页面将数据存在在本地存储中,另一个页面通过监听storage事件实现数据的读取及其实时更新Cookies
:通过设置和读取Cookies,实现在同一个域名下的不同页面之间的信息交互postmessage
:window.postmessage()
方法允许从一个窗口向另一个窗口发送消息,并且在目标窗口上触发mesage事件,可以指定目标窗口的origin-特定窗口接收处理消息Broadcast Channel
:该API允许同一个浏览器的不同上下文之间进行双向通信,提供了一个类似发布-订阅模式的机制,创建广播频道,并在不同的上下文中加入频道,实现消息的广播与接收SharedWorker
:是一个可以由多个窗口或标签共享的WebWorker,在不同页面之间进行跨页面通信,通过postmessage进行双向通信IndexedDB
:客户端数据库,一个页面写入数据,另一个页面读取数据webSocket
:建立一个全双工连接,在客户端和服务端进行实时通信,在不同的页面通过服务器传递数据并进行实时更新
5、DOM树理解
-
什么是DOM
DOM就是将HTML文件字节流转为渲染引擎能够理解的内部结构,以树型结构对HTML文档进行表述
-
作用:
- 页面的视角来看:DOM是生成页面的基础数据结构
- 从JS脚本来看,DOM提供给JS脚本操作的接口,通过接口,JS进行访问以及操作DOM节点,改变其样式、内容
- 从安全角度来看:不安去的内容在DON解析阶段就拒绝在外了
总而言之,DOM是表述HTML文件的内部数据结构,将JS和web页面连接起来,并过滤一些不安去的内容
-
DOM树如何生成:
网络进程和渲染进程之间有一个共享数据通道,网络进程加载多少,就将数据数据传给HTML解析器进行解析接收到数据后,就将其转为DOM,具体来讲主要经过以下几个阶段,字节流通过分词器被分成token(片段),Token解析位DOM节点,再讲DOM节点添加到DOM树
-
JS对DOM的影响,解析到script标签,会暂停DOM的解析,下载这段JS代码并执行,执行完成后,HTML恢复解析过程,直至生成最终的DOM
6、行内元素、块级元素、空元素
-
行内元素:-斜体强调的文本,
-
块级元素:
-
- 无序和有序列表
- :列表项
-
空元素:没有闭合标签的元素
-水平分割线
7、title和h1、b和strong、i和em区别
-
title和h1
- 用途不同:title定以HTML文档的标题,通常显示在浏览器的标签上或者窗口的标题栏,对于SEO也很重要,h1表示文档的主标题,通常显示在页面内容的顶部
- 所在位置不同:title位于html文档的内,而h1位于内部
- 格式和样式不同:title通常比较短,不需要进行格式化排版,而h1标签中的文档就不一样了
-
b和strog
b标签用于指定文本加粗的外观效果,通常只是为了强调关键词,没有较强的语义化含义。而strong表示文本的强调重点,具有更强的语义化含义,并且可以改变文本的语调和读音
-
i和em
i标签用于指定文本斜体的外观效果,通常只是为了强调关键词,没有较强的语义化含义。而em表示文本的强调重点,具有更强的语义化含义,并且可以改变文本的语调和读音
HTML5中,i和b已经废弃
8、什么是HTML语义化
通俗讲就是从代码层面展示页面的结构而不是从最终视觉上展示结构,让机器可以读懂内容
优点:
- 开发者友好:使用语义类标签增强了可读性,开发者也能够清晰地看出网页的结构,也更为便于团队的开发和维护。
- 搜索引擎友好: 有利于SEO,有利于搜索引擎 爬虫 更好的理解我们的网页,从而获取更多的有效信息,提升网页的权重。
- 机器友好:语义类还可以支持读屏软件,根据文章可以自动生成目录。方便特殊群体阅读信息,比如屏幕阅读器/盲人阅读器对 strong 会有一个加重的读音
9、script
标签为什么放在body标签的底部
因为浏览器再渲染html时候是从上至下执行的,当遇到js时会停止当前页面的渲染,转而去下载js文件,如果放在头部,在文件很大的情况下会造成页面首屏加载时间很长。
解决:
-
将script标签放在body底部
-
通过defer、async将js转为异步加载
defer
属性的作用是让脚本在文档解析完成之后再执行,而且会按照脚本在文档中的先后顺序执行。async
属性会使脚本在下载完成后立即执行,不会等待文档解析完成,脚本的执行顺序也不一定和它们在文档中的顺序相同<script src="script1.js" defer></script> <script src="script2.js" async></script>
-
通过 JavaScript 动态创建
script
标签来实现异步加载。<script>// 创建script元素const script = document.createElement('script');script.src = 'script.js';// 设置async属性(默认是true)script.async = true;// 将script添加到文档中document.head.appendChild(script); </script>
这种方式可以完全控制脚本加载的时机
10、SSG
静态网站生成-在构建时预先生成静态页面并部署到CDN或其他存储服务中。
相比于传统的动态网页好处:
- 加载速度快,提升用户体验和搜索引擎排名
- 安全性高:没有后台代码和数据库,不易受SQL注入攻击等
- 成本低:不需要动态服务器等国设备,降低运维成本
11、HTML5
HTML5是HTML的新标准,主要目标就是不需要额外的插件如flash等就可以传输所有内容,动画、视频、丰富的图像用户页面
与4.,0相比,文当声明类型上简单<!DOCTYPE html>
,语义结构也有优势,如
- 新特性
- 首先HTML5为了更好的实践Web语义化,增加了header、footer、nav、aside、article、section等语义化标签。
- 在表单方面,为了增强表单,为input增加color、email、date、range、url等类型,
- 在存储方面提供了sessionStorage、localStorage和离线存储,通过这些存储方式方便数据在客户端的存储和获取,
- 在多媒体方面规定了音频和视频元素audio和video;
- 另外还有地理定位、canvas画布、拖放、多线程编程的web workers和websocket协议
12、导致白屏加载时间长的原因及解决方案
结合输入url到页面的画面显示过程看,JavaScript会阻塞DOM的生成,而CSS样式文件会阻塞JS的执行,因此要重点关注JS文件和样式文件
- 解决
- DNS解析优化
- DNS缓存优化
- DNS预加载策略
- 稳定可靠的DNS服务器
- TCP网络链路优化
- 服务端优化
- 数据库存储优化
- Redis缓存
- 中间件
- Gzip压缩
- 浏览器下载,解析、渲染页面优化
- 精简HTML的代码和结构
- 优化CSS文件和结构
- 合理放置JS代码,避免内联
- 将关键的CSS代码内联在HTML中,使得CSS快速的下载,提前渲染时间
- 延迟首屏不需要的图片加载
- DNS解析优化
13、如何控制input输入框的输入字数
maxlength
属性进行限制,还可以监听input事件,对输入值处理,如截断等
14、上传图片,怎么在选择图片后,通过浏览器预览?
- 方法1:使用window.URL.createObjectURL
方法为对象生成一个blob对象路径
直接为文件创建内存中的临时 URL(Blob URL),无需读取文件内容,浏览器可直接访问该 URL 显示图片。
- BlobURL本质是浏览器内存中二进制数据(Blob 对象)的临时引用,无需编码转换。由
URL.createObjectURL(blob)
生成,格式为blob:<origin>/<uuid>
。注意:需要手动调用URL.revokeObjectURL()
释放内存,否则会持续占用。
<!-- 选择文件的输入框 -->
<input type="file" onchange="imgChange(this)" />
<!-- 预览用的 img 标签 -->
<img id="previewImg" style="max-width: 300px;" /> <script>
// 任选上面一种 imgChange 函数即可
// 比如用 createObjectURL 的版本:
function imgChange(img) { document.querySelector("#previewImg").src = window.URL.createObjectURL(img.files[0]);
}
</script>
浏览器把文件 “临时映射” 成一个可访问的 URL,直接给 img
当 src,无需等文件读完(因为是 “引用”)。
- 使用fileReader读取器
- 创建FileReader对象
- 调用readerAsDataURL方法读取文件
- 调用onload监听事件
- 通过FileReader的result属性拿到结果
function imgChange(img) { // 1. 新建 FileReader 实例:JS 里专门读文件内容的工具const reader = new FileReader(); // 2. 监听“读取完成”事件:文件读完后自动触发reader.onload = function (ev) { // ev.target.result 就是读取结果(dataURL 格式,类似 base64)document.querySelector("img").src = ev.target.result; }// 3. 发起“读文件”操作:把文件转成 dataURL(base64 字符串)reader.readAsDataURL(img.files[0]);
}
需要将二进制数据编码为 Base64 字符串,因此面对体积较大的图像,这个操作比较慢,内存随着DOM元素自动释放
15、怎么实现“点击返回顶部”的功能
- 锚点
在页面顶部放置一个指定名称的锚点连接,然后再页面下方放置一个返回该锚点的连接,点击连接既可以返回
<body style="">
<div id="top"></div><a href="top" style="position: fixed; right:0; bottom:0">回到顶部</a>
- scrollTop
这个属性表示被隐藏在内容区域上方的像素数
为滚动时:scrollTop:0,垂直滚动>0,且表示元素上方不可见内容的像素宽度
- scrollTo
scrollTo(x,y)方法滚动当前window中显示的文档,因此设置scrollTo(0,0)位于显示区域的左上角
- scrollBy()
滚动当前window中显示的文档,x和y指定滚动的相对量,通过 “往上滚等同于当前滚动距离” 的逆向操作,实现了 “回到顶部” 的效果
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body style="height: 2000px;"><button id="test" style="position: fixed; bottom: 0; right: 0;">回到顶部</button><script>// 获取按钮元素const test = document.getElementById('test');test.onclick = function () {// 方法1:通过scrollTop = 0 实现// document.body.scrollTop = document.documentElement.scrollTop = 0;// 方法2: scrollTo(x,y)// scrollTo(0,0)// 方法3:scrollBy()// 获取当前滚动的距离var top = document.body.scrollTop || document.documentElement.scrollTop;// 调用scrollByscrollBy(0, -top)}</script>
</body>
</html>
16、SEO
Search Engine Optimization: 搜索引擎优化
利用搜索引擎的搜索规则来提高目前网站在有关搜索引擎内的自然排名的方式,为了获取更多的免费流量,从网站结构、内容、页面等角度进行合理规划,使其更符合搜索引擎的索引规则。
- 原理
一、爬行和抓取
搜索引擎靠 “蜘蛛 / 机器人” 程序,从已知网页出发,像用户浏览一样访问页面、抓取内容,还会跟踪页面链接(爬行),发现新网址就存入数据库(抓取)。反向链接(页面被其他站点链接)超重要,没它,搜索引擎可能都找不到页面,更没法参与排名,抓取的文件会和用户浏览器看到的内容一致,存入数据库待后续处理。
二、索引
抓取到的网页文件,会被拆解、分析,把文字内容、关键词位置 / 格式(字体、颜色等)等信息,以类似 “大表格” 的结构化形式存进索引数据库,主流搜索引擎的索引库能存几十亿级网页,为后续检索做准备。
三、搜索词处理
用户输入关键词后,搜索引擎会快速做 “中文分词、停用词过滤(像‘的’‘了’这类无意义词)、拼写纠错、判断是否需整合搜索” 等处理,确保理解用户真实搜索意图,为精准匹配网页打基础。
四、排序
基于处理后的搜索词,从索引库找含该词的网页,再用 复杂排名算法(要实时计算网页与关键词相关性、结合过滤规则,涉及几十上百个影响因子 ),筛选出最相关、权威、优质的网页,按规则排序后返回搜索结果。
简单说,SEO 就是通过优化内容、链接、代码等,让网页在 “爬行抓取→索引→词处理→排序” 全流程里,更被搜索引擎认可,从而提升自然排名,让用户搜关键词时,咱们的网页能靠前展现,获得更多流量 。
- 优化SEO
主要分为内部和外部
0 内部优化
- Meta标签优化:title、keywords、description(tdk)
- 内部链接的优化:相关性链接(Tag标签)、各导航链接、图片链接
- 网站内容更新:保证站内的更新
- 服务端渲染
1 外部优化
- 外部链接类别:相关、博客、贴吧、新闻等保持链接的多样性
- 外链运营:每天添加一定量的外部链接,使得关键词排名上升
- 外链选择:与自己网站相关性好的网站交互友情链接
17、浏览器乱码的原因
- 网页源码的gbk的编码,内容的中文文字是utf-8/程序从数据库中调出呈现是utf-8编码的内容也会,浏览器不能自动检测网页编码
- 程序查询数据库数据显示前进行程序转码
- 浏览器浏览时出现网页乱码,在浏览器中找到转换编码的菜单进行转换
18、Canvas
和SVG
的区别
-
Canvas
:画布通过JS来绘制2D图形,是逐像素进行渲染的,位置发生改变就会重新渲染
特点:依赖分辨率、不支持事件处理器、能以.jpg或者.png格式保存图像,适合游戏应用
-
svg
可缩放矢量图形,基于可扩展标记语言XML描述的2d图形的语义,基于XML,就说明SVG DOM中每一个元素都是可用的,可以为其添加JS事件处理器
特点:不依赖分辨率,支持事件处理器、适合带有大型渲染区域的应用程序(谷歌地图)、复杂度高会减慢渲染速度、不适合游戏应用
19、img的secret
属性作用
在响应式设计中,经常用到根据屏幕密度设置不同的图片,secret属性就用于设置不同密度下,ing会自动加载不同的图片
- 基础:
srcset="图片地址 密度描述"
,如srcset="image-256.png 2x"
,适配不同屏幕密度,目前屏幕密度1x,2x,3x,4x - 进阶:结合
sizes
用来设置图片的尺寸零界点 ,srcset
带w
单位(如128w
)指定图片质量,sizes
设尺寸临界点(如(max-width: 360px) 340px, 128px
),这个表示默认128px,若是视区宽度大于360px则显示340px
避免因屏幕差异加载不合适图片,提升页面加载效率与显示效果 ,适配不同设备场景
20、label标签
定义表单控件间关联,点击 label
时,浏览器自动聚焦关联表单控件(如 input
)
-
方式 1:
label
的for
属性与表单控件id
匹配,如<label for="Name">
对应<input id="Name">
应用:点击文字聚焦输入框 -
方式 2:
label
直接包裹表单控件,如<label>Date:<input></label>
复选框<!-- 场景:注册/登录页的“同意协议” --> <label><input type="checkbox" name="agree"> 我已阅读并同意 <a href="/agreement">《用户协议》</a> </label>
-
提升交互体验:扩大可点击区域,用户点文字就能操作表单控件(输入框、单选 / 复选框等 )。
-
语义化清晰:让表单结构更易读(对开发者、屏幕阅读器都友好,辅助无障碍访问 )。
21、页面生命周期事件
DOMContentLoaded
— 浏览器已经完全解析HTML,并构建DOM树,但是像和样式表并没有加载完成load
:不仅加载完成HTML,也加载完成了所有外部资源:图片、样式beforeunload/unload
:用户正离开页面
总结:
DOMContentLoaded
:DOM 准备就绪时,document
上触发,可在此将 JavaScript 应用于元素;脚本(如<script>...</script>
、<script src="..."></script>
)会阻塞它,图片等资源可继续加载load
:页面和所有资源加载完成时,window
上触发,因通常无需等太久,很少使用beforeunload
:用户想离开页面时,window
上触发,取消的话浏览器会询问是否真离开(如存在未保存更改时)unload
:用户最终离开时,window
上触发,处理程序仅能执行简单操作,很少使用,可用navigator.sendBeacon
发网络请求
22、如何input上传多张图片
<input type="file" name="files" multiple />
-
禁止展示输入的历史记录
规定输入字段是否启用自动完成的功能
<input type="text" autocomplete="off" />
23、能否使用自闭合标签引入脚本
不可以,因为自闭和标签的XML语法,不是HTML,只有不需要结束的空元素( )或者外部元素
24、meta标签中的viewport的作用
用户网页的可视区域,视区
作用:控制网页在移动设备等终端上的可视区域显示,让网页适配不同设备屏幕,优化移动端浏览体验,避免因虚拟视口与设备屏幕差异导致布局错乱,可设置宽度、缩放等规则
viewport meta标签大致如下
<meta name="viewport" content="width=device-width", initial-scale=1.0>
width=device-width
使视口宽度适配设备宽度;initial-scale=1.0
设初始缩放比例为 1 ;还有 height
(设高度 )、maximum-scale
(最大缩放 )、minimum-scale
(最小缩放 )、user-scalable
(是否允许用户手动缩放 )等属性
25、Web Socket怎么兼容低版本浏览器
- Adobe Flash Socket:借助 Flash 实现类似 Socket 通信,利用 Flash 对旧浏览器的支持来模拟 WebSocket 功能
- ActiveX HTMLFile (IE) :针对 IE 浏览器,通过 ActiveX 控件的
HTMLFile
来实现特定通信逻辑,适配旧版 IE - 基于 multipart 编码发送 XHR:用 XMLHttpRequest(XHR),以 multipart 编码方式发送请求,模拟 WebSocket 双向通信,让不支持 WebSocket 的浏览器能实现类似长连接效果
- 基于长轮询的 XHR:通过 XHR 定时发起请求(长轮询),服务端有数据变化就响应,模拟 WebSocket 实时通信,适配不支持 WebSocket 的浏览器 ,这些都是在浏览器原生不支持 WebSocket 时的替代手段 。
26、ifram是什么
在一个网站中嵌入另一个网站的内容
优点:
- ifram能够原封不动的吧嵌入的网页显示出来
- 多个网页引用ifram,只需要修改一个ifram的内容
- 针对加载缓慢的第三方内容(广告等)使用ifram
缺点:
- 产生很多页面,管理困难
- 不利于SEO,代码复杂、框架太多的情况下
- 很多的移动端设备无法完全显示框架,兼容性差
- ifram里面的样式、脚本资源会增加请求次数、对于大型网站不可取
- ifram会阻碍页面中的onload事件,给用户加载很慢的感觉
27、常用的meta元素
-
meta标签是head部的一个辅助性标签,提供关于 HTML 文档的元数据。它并不会显示在页面上,但对于机器是可读的。可用于浏览器(如何显示内容或重新加载页面),搜索引擎(SEO),或其他 web 服务。
-
meta标签里的数据是供机器解读的,其主要作用有:搜索引擎优化(SEO),定义页面使用语言,自动刷新并指向新的页面,实现网页转换时的动态效果,控制页面缓冲,网页定级评价,控制网页显示的窗口等等。
http-equiv属性
- charset 用以说明网页制作所使用的文字以及语言
- cache-control、Pragma、Expires 设置网页的过期时间,一旦过期则必须到服务器上重新获取。
- refresh 定时让网页在指定的时间n内,跳转到页面
- set-cookie Cookie设定,如果网页过期,存盘的cookie将被删除。
-
name属性
<!-- 页面关键词 keywords --> <meta name="keywords" content="your keywords"><!-- 页面描述内容 description --> <meta name="description" content="your description"><!-- 定义网页作者 author --> <meta name="author" content="author,email address"> <!-- 定义网页搜索引擎索引方式,robotterms 是一组使用英文逗号「,」分割的值,通常有如下几种取值:none,noindex,nofollow,all,index和follow。 --> <meta name="robots" content="index,follow"><!-- 优先使用最新的chrome版本 --> <meta http-equiv="X-UA-Compatible" content="chrome=1" /><!-- 禁止自动翻译 --> <meta name="google" value="notranslate"><!-- 禁止转码 --> <meta http-equiv="Cache-Control" content="no-transform"><!-- 选择使用的浏览器解析内核 --> <meta name="renderer" content="webkit|ie-comp|ie-stand">
-
viewport – 对页面视图相关进行定义
-
property&content
可以让网页变成富媒体对象,同意网页杯其他网站引用,不会只是一个链接,会提取相关信息展示
-
Cache-Control 作用:定义请求和响应遵循的缓存机制,能声明缓存内容、修改过期时间,可多次声明
no-transform:指令,要求不得对资源进行转换或转变
no-siteapp:指令,用于禁止百度进行转码
通过
<meta http-equiv="Cache-Control" content="no-transform">
和<meta http-equiv="Cache-Control" content="no-siteapp">
这两个meta
标签,分别设置对应Cache-Control
指令,控制浏览器缓存及百度转码相关行为 。 -
theme-color
28、defer和async区别
二者都为解决脚本加载执行阻塞 DOM 渲染问题,让脚本异步加载,不阻碍页面渲染
- 执行时机
defer
:脚本按 HTML 中出现顺序执行,在文档解析完成(DOM 渲染完)、DOMContentLoaded
事件前执行async
:脚本加载完就执行,不保证顺序,谁先加载好谁先执行
- 场景适配
defer
适合依赖 DOM 或需按顺序执行的脚本(如页面初始化逻辑 )async
适合独立无依赖脚本(如统计代码 )