HTML知识点(三)
HTML知识点(三)
1、Canvas和SVG的区别
Canvas
使用是基于像素(位图)的绘图方式。当调用绘图API时,实际是在对一个固定分辨率的像素矩阵进行修改,绘制完成后,这个矩阵的状态就保存在Canvas中。后续的每一次绘制都是在当前画布进行重新绘制。
1
2
3
4
5
6
7<canvas id="myCanvas" width="300" height="50" style="border:2px aqua solid;"></canvas>
<script>
const canvas = document.querySelector('#myCanvas')
const ctx = canvas.getContext('2d')
ctx.fillStyle = 'green'
ctx.fillRect(10,10,210,20)
</script>SVG
使用的是矢量图形,所有的图形都是由数学公式描述的。图形是无分辨率的,可以无限放大缩小而不会失真。
1
2
3<svg width="300" height="50" style="border:2px aqua solid;">
<circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" />
</svg>它们的区别
1、渲染模式:
canvas:即时渲染。绘图指令会立即影响画布像素,所有元素成为一个整体的像素图,若改变图形,往往需要清空画布然后重新绘制所有元素。
svg:保留模式。每个图形元素是一个DOM节点,浏览器维护节点信息。需要修改图形只需要更新对应的DOM节点,不必重新绘制整个画面。
2、交互性:
canvas:无法对单个图形元素绑定事件,需要手动进行坐标计算,给整个canvas元素绑定事件,然后在事件处理函数中根据鼠标点击、移动的坐标等判断交互,决定操作。
svg:每个元素是DOM节点,可以直接操作和绑定事件。内置的命中测试使得 SVG 在处理交互时更为便捷和直观。开发者只需将事件直接绑定到具体的 SVG 元素上,而无需手动判断鼠标位置与图形区域的关系。
3、适用场景:
Canvas:更适合需要高性能、频繁更新和复杂动画效果的场景,但在交互性和分辨率适应方面需要开发者额外处理。
SVG:适用于静态图形、矢量图形和需要良好交互体验的场景,但当图形数量巨大时可能会导致性能瓶颈。
2、head标签的作用?
head标签主要用于包含那些不会直接显示在网页内容区域中的信息(元数据),帮助浏览器、搜索引擎、其他外部工具了解页面信息,如何处理页面资源。
定义文档标题(必不可少)
1
<title>Document</title>
声明字符编码(必不可少)
1
<meta charset="UTF-8">
描述网页信息
1
<meta name="description" content="这是一个示例网页,展示 head 标签的基本用法。">
引用外部资源
1
<link rel="stylesheet" href="styles.css">
其他用途
<style>内嵌css样式、<base>基础链接等。
3、Doctype的作用?
文档声明:告诉浏览器当前页面使用的HTML版本,决定浏览器使用标准模式还是混杂模式进行渲染。
1 |
|
标准模式/严格模式
只要以
!Doctype
或其他正确的完整的文档声明开始,浏览器一般是标准模式渲染。怪异模式/混杂模式/兼容模式
Doctype
声明不完整或者书写错误,就自动切换到混杂模式兼容旧版页面。
?DTD是什么?
DTD 是文档类型定义(Document Type Definition)的缩写,用于定义 XML 或早期 HTML 文档的结构和合法内容。早期 HTML 文件可能会包含如下的 DTD 声明:
1
2
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
4、浏览器乱码问题
编码和解码
编码:人类文字转换为二进制数据的过程。不同的字符编码(UTF-8、GBK、ISO-8859-1)规定了不同字符与二进制数据之间的对应关系。
解码:当浏览器或者其他程序打开一个文件时,将文件中的二进制数据转换回人类文字的过程。
乱码
声明的编码(或者没有声明)与文件实际保存时候的编码不一致,浏览器就可能错误地将二进制解析成其他字符,从而乱码。多因字符编码不匹配,包括文件实际编码、HTML 声明和服务器响应头中指定的编码不一致或错误导致乱码。
解决乱码
1、使用统一合适的编码(推荐UTF-8)
2、在head部分添加字符集声明
3、配置服务器返回正确的
Content-Type
响应头4、检查引用的外部资源编码是否一致
浏览器解析文档时参考优先级
1、服务器响应头中的编码信息;
2、HTML 文件内
<meta charset="...">
的声明;
5、渐进增强和优雅降级
它们是两种核心策略,目标是兼容性,确保网站能够在不同浏览器、设备、网络环境下提供最佳的用户体验。
渐进增强(基础到高级)
1、核心理念:先确保网站的核心内容和功能在所有环境下(包括老旧浏览器或低性能设备)都能正常工作,再逐步为支持新特性的现代浏览器添加增强效果(如动画、复杂布局、交互功能等)。优先保障内容的可访问性,再考虑视觉和交互的增强。
2、实现步骤:
- 基础层:使用语义化的 HTML 实现内容和基本功能(如链接、表单提交)。
- 表现层:通过 CSS 增强布局和视觉效果(如响应式设计、动画)。
- 行为层:通过 JavaScript 添加交互功能(如动态加载数据、复杂交互)
优雅降级(高级到基础)
1、核心理念:先为现代浏览器开发完整的功能和视觉效果,再为老旧浏览器提供“降级”方案,确保基本功能可用。优先实现最新技术,再处理兼容性问题。
2、实现步骤:
- 完整功能层:使用最新的 HTML5/CSS3/JavaScript 实现所有功能。
- 降级处理:通过浏览器检测或特性检测(如 CSS Hack、Polyfill),为老旧浏览器提供简化版的功能或界面。
?什么是浏览器检测
识别用户的浏览器类型(Chrome、Firefox、Safari等)和版本号,来决定如何呈现内容或者加载特定代码。
1、User-Agent 检测:每个浏览器在发送请求时都会包含
User-Agent
字符串,这个字符串描述了浏览器的名称、版本号和运行环境(如操作系统)。前端可以通过 JavaScript 获取并分析navigator.userAgent
,从而判断用户的浏览器类型。
1
2
const isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
console.log(isChrome ? "这是 Chrome 浏览器" : "不是 Chrome 浏览器");2、使用特定 API:有些浏览器支持特定的 API,检测这些 API 的存在可以帮助判断浏览器类型。例如,通过检测
window.chrome
对象可以判断是否为 Chrome 浏览器。
1
2
3
4
5
if (window.chrome) {
console.log("这是 Chrome 浏览器 ");
} else {
console.log("这不是 Chrome 浏览器");
}
?什么是特性检测
检测浏览器是否支持某项特性(例如某种 CSS 属性、HTML 元素或 JavaScript API),从而决定是否启用该特性或使用替代方案。
1、CSS 特性检测:
CSS.supports
方法
1
2
3
if (CSS.supports("display","grid")){
console.log("支持CSS Grid")
}2、JavaScript 特性检测:
1
2
3
4
5
if(window.fetch){
console.log("支持fetch API")
}else{
console.log("不支持fetch API,使用 XMLHttpRequest 替代")
}3、使用Polyfill:Polyfill可以实现一些现代Web特性,如Promise、fetch API等,即使老旧浏览器不支持这些特性。选择合适的Polyfill库,如polyfill.io、babel-polyfill等。在代码中引入Polyfill库。根据需要,在代码中调用Polyfill库提供的特定函数或API。