文章

Web基础

AUTOGEN 025d02dfe77f4a3d948753ab6328f24a

HTML 历史

HTML全称为超文本标记语言(HyperText Markup Language),是用来创建网页的标准标记语言。它定义了网页内容的结构和语义。以下是HTML的来源和发展历史:

  1. 1989年: 蒂姆·伯纳斯-李在欧洲核子研究中心(CERN)提出了万维网(World Wide Web)的概念,用来方便科学家之间共享信息。
  2. 1990年: 伯纳斯-李开发了第一个网页浏览器和服务器,并创建了HTML的原型。当时的HTML非常简单,只有几个基本的标签。
  3. 1993年: NCSA的马克·安德森和埃里克·比纳开发了Mosaic浏览器,推动了万维网的普及。HTML开始快速发展,增加了更多标签和功能。
  4. 1994年: 伯纳斯-李成立了万维网联盟(W3C),负责制定Web相关标准,包括HTML。
  5. 1995年: HTML 2.0发布,增加了表格、表单等功能。同年,HTML 3.0草案提出,但未正式采用。
  6. 1997年: HTML 4.0发布,增强了样式、多媒体支持等功能。它后来被细分为HTML 4.01。
  7. 1999年: HTML 4.01成为W3C推荐标准,广泛应用于网页开发。
  8. 2000年: XHTML 1.0发布,将HTML重新定义为XML的应用,强调了结构和语义的分离。
  9. 2004年: Web应用日益复杂,W3C开始制定HTML 5标准。
  10. 2008年: HTML 5草案发布,引入了许多新特性,如视频、音频、画布等。
  11. 2014年: HTML 5正式成为W3C推荐标准,成为当前Web开发的主流技术。

HTML的发展反映了Web技术的进步,从简单的文本页面到丰富的多媒体应用。它与CSS、JavaScript等技术配合,构成了现代网页的基础。HTML不断吸收新特性,以满足日益增长的Web需求,同时也在向更加语义化、模块化的方向发展。 关于W3C W3C全称为万维网联盟(World Wide Web Consortium),是一个国际组织,致力于制定Web相关的技术标准。它由蒂姆·伯纳斯-李于1994年10月创立,目前拥有400多个成员组织,包括各大IT公司、研究机构、政府部门等。以下是W3C的主要职责和工作:

制定Web标准: W3C的核心任务是制定和维护各种Web技术标准,如HTML、CSS、XML、SVG等,确保不同平台和设备上的Web应用能够互操作。 推动Web发展: W3C通过引入新技术和特性,不断推动Web向更加智能、开放、易用的方向发展。例如,HTML 5、语义Web、无障碍性等都是W3C重点关注的领域。 提供技术指南: W3C发布各种技术规范、指南和最佳实践,帮助开发者正确地使用Web技术,提高网页的质量和性能。 开发Web工具: W3C开发了一系列工具和软件,如验证器、检查器等,用来测试网页是否符合标准,帮助开发者发现和修复问题。 促进社区交流: W3C举办各种会议、研讨会和在线讨论,为Web社区提供交流和合作的平台,共同探讨Web技术的发展方向。 教育和推广: W3C提供教程、课程和认证等教育资源,帮助人们学习和掌握Web技术。同时,W3C也积极宣传Web标准的重要性,提高公众的认识。 W3C通过一个标准的制定流程来开发Web标准:首先由成员提交提案,经过讨论和修改后形成工作草案,然后公开征求意见,最终发布为W3C推荐标准。这个过程是开放、透明的,鼓励所有相关方参与。

基本结构

HTML文档由一系列嵌套的元素构成,这些元素通过标签来定义。以下是一个典型的HTML文档的基本结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document Title</title>

</head>

<body>
    <h1>Main Heading</h1>

    <p>Paragraph text goes here.</p>

</body>

</html>

让我们逐步解析这个结构:

  1. <!DOCTYPE html>: 文档类型声明,告诉浏览器这是一个HTML5文档。
  2. <html>: 根元素,包含整个HTML文档。lang属性指定文档的语言。
  3. <head>: 包含元数据(metadata)的容器,如页面标题、样式表链接、字符编码等。
  4. <meta charset="UTF-8">: 指定文档使用UTF-8字符编码。
  5. <meta name="viewport" ...>: 设置视口(viewport),优化移动设备上的显示。
  6. <title>: 定义文档的标题,显示在浏览器标签页上。
  7. <body>: 包含页面可见内容的容器,如标题、段落、图片、链接等。
  8. <h1>: 一级标题元素。
  9. <p>: 段落元素。

<body>中,你可以使用各种HTML元素来构建页面内容,如:

  • 标题: <h1><h6>
  • 段落: <p>
  • 图片: <img>
  • 链接: <a>
  • 列表: <ul>, <ol>, <li>
  • 表格: <table>, <tr>, <td>
  • 表单: <form>, <input>, <button>

等等。 这些元素可以嵌套在一起,形成层次结构。通过CSS可以进一步设置元素的样式,通过JavaScript可以添加交互功能。 理解HTML的基本结构是创建网页的第一步。在实践中,你会使用更多的元素和属性来构建丰富、语义化的Web内容。

DOCTYPE

DOCTYPE是”document type”(文档类型)的简写,它是HTML文档中的一个声明,用来告诉浏览器该文档使用哪一个HTML或XHTML规范。DOCTYPE声明必须是HTML文档的第一行,位于<html>标签之前。 DOCTYPE的主要目的是启动浏览器的标准模式(standards mode),以标准的方式渲染文档。如果省略DOCTYPE声明,大多数浏览器会使用怪异模式(quirks mode)来渲染页面,这可能导致页面在不同浏览器下出现不一致的布局和样式问题。 以下是一些常见的DOCTYPE声明:

  1. HTML5

<!DOCTYPE html> 这是当前推荐的DOCTYPE声明,适用于HTML5文档。它简洁明了,易于记忆。

  1. HTML 4.01 Strict

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01//EN” “https://www.w3.org/TR/html4/strict.dtd”> 这个DOCTYPE声明指定了使用HTML 4.01的严格版本,要求文档遵守严格的HTML语法规则。

  1. HTML 4.01 Transitional

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “https://www.w3.org/TR/html4/loose.dtd”> 这个DOCTYPE声明指定了使用HTML 4.01的过渡版本,允许使用一些在严格版本中被废弃的元素和属性。

  1. XHTML 1.0 Strict

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “https://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”> 这个DOCTYPE声明指定了使用XHTML 1.0的严格版本,要求文档遵守更加严格的XML语法规则。

<head>标签是HTML文档的一部分,它包含了一些元数据(metadata)和其他与文档相关但不会直接显示在页面上的信息。以下是一些常见的可以放在<head>标签里面的内容:

  1. <title>: 定义文档的标题,显示在浏览器的标题栏或标签页上。
  2. <meta>: 提供有关页面的元信息,如字符编码、视口设置、关键字、描述等。
1
2
3
4
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="keywords" content="HTML, CSS, JavaScript">
<meta name="description" content="This is a web development tutorial.">
  1. <link>: 定义文档与外部资源的关系,最常用于链接样式表(CSS文件)。
1
<link rel="stylesheet" href="style.css">
  1. <style>: 包含文档的内部CSS样式规则。
1
2
3
4
5
6
7
<style>
  body {
    background-color: #f0f0f0;
    font-family: Arial, sans-serif;
  }
</style>

  1. <script>: 包含JavaScript代码或链接到外部JavaScript文件。
1
2
<script src="script.js"></script>

  1. <base>: 指定文档中所有相对URL的基础URL。
1
<base href="https://www.example.com/">
  1. <noscript>: 为不支持JavaScript或禁用JavaScript的浏览器提供替代内容。
1
2
3
4
5
<noscript>
  <p>This website requires JavaScript to be enabled.</p>

</noscript>

  1. <iconify-icon>: 定义文档的图标(如网站的favicon)。
1
<iconify-icon rel="icon" href="favicon.ico" type="image/x-icon">
  1. 其他元数据标签,如<meta name="author">(文档作者)、<meta name="generator">(生成文档的软件)等。

Open Graph

Open Graph(OG)是一种由Facebook提出的网页元数据协议,用于在社交网络上分享网页时提供更丰富、更准确的信息。当你在Facebook、Twitter等社交平台上分享一个链接时,Open Graph元数据可以控制显示的标题、描述、图片等内容。 Open Graph元数据以<meta>标签的形式放在HTML文档的<head>部分。以下是一些常用的Open Graph属性:

  1. og:title: 分享的标题。
1
<meta property="og:title" content="My Web Page">
  1. og:type: 分享的内容类型,如article、website、video等。
1
<meta property="og:type" content="website">
  1. og:url: 分享的网页的标准URL。
1
<meta property="og:url" content="https://www.example.com/my-page">
  1. og:image: 分享时显示的图片URL。
1
<meta property="og:image" content="https://www.example.com/image.jpg">
  1. og:description: 分享的内容的简短描述。
1
<meta property="og:description" content="This is my awesome web page.">
  1. og:site_name: 网站的名称。
1
<meta property="og:site_name" content="My Website">
  1. og:locale: 内容的地区语言,默认为en_US。
1
<meta property="og:locale" content="en_US">

除了以上基本属性,Open Graph还提供了一些特定内容类型(如article、video)的附加属性,以提供更详细的信息。 这里是一个完整的例子:

1
2
3
4
5
6
7
8
9
10
<head>
  <meta property="og:title" content="My Amazing Article">
  <meta property="og:type" content="article">
  <meta property="og:url" content="https://www.example.com/articles/123">
  <meta property="og:image" content="https://www.example.com/preview.jpg">
  <meta property="og:description" content="Read this fascinating article about Web development.">
  <meta property="og:site_name" content="My Blog">
  <meta property="og:locale" content="en_US">
</head>

通过设置合适的Open Graph元数据,你可以控制你的网页在社交网络上的分享预览,提高用户的点击率和参与度。此外,一些搜索引擎也会利用Open Graph元数据来丰富搜索结果的显示。

JavaScript

JavaScript是一种广泛使用的脚本语言,主要用于Web开发,让网页可以实现交互性和动态效果。下面我来为你详细介绍一下JavaScript的历史、基本概念和语法特点: 历史:

  • 1995年由Netscape公司的Brendan Eich发明,最初命名为LiveScript,后改名为JavaScript。
  • 1996年11月,JavaScript作为提案被提交给欧洲计算机制造商协会(ECMA),标准化为ECMAScript。
  • 此后不断发展,目前最新版本为ECMAScript 2022(ES13),于2022年6月发布。

简介:

  • JavaScript是一种解释型的、面向对象的、动态类型的编程语言。
  • 主要用于浏览器端,通过与HTML和CSS结合使用,让网页具有交互性。
  • 现在也可以用于服务器端(Node.js)、移动应用(React Native)、桌面应用(Electron)等领域。
  • 支持函数式编程、闭包等特性,语法灵活多变。
  • 有非常丰富和活跃的生态系统,大量第三方库和框架如jQuery、React、Vue等。

基本语法:

  • 语句结尾使用分号;
  • 注释使用//或/**/
  • 变量使用var、let或const声明
  • 数据类型:数值、字符串、布尔值、null、undefined、对象、数组等
  • 条件语句:if…else、switch等
  • 循环语句:for、while等
  • 函数定义使用function关键字
  • 面向对象:通过function和new关键字来模拟类和实例

下面是一些基本语法的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// 这是单行注释
/*
  这是
  多行注释
*/

// 变量声明
var a = 1;
let b = "hello";  
const c = true;

// 条件语句
if (a > 0) {
  console.log("a是正数");
} else {
  console.log("a是负数");  
}

// 循环语句
for (let i=0; i<5; i++) {
  console.log(i);
}

// 函数定义
function greet(name) {
  console.log("Hello, " + name + "!");
}

// 函数调用
greet("Alice");

// 面向对象
function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.sayHi = function() {
  console.log("我是" + this.name + ",今年" + this.age + "");
};

let p = new Person("小明", 20);
p.sayHi();

JS常见用法

好的,我来举例说明JavaScript的一些常见用法。

  1. 匿名函数 匿名函数就是没有名字的函数,通常作为参数传递给其他函数使用。例如:
1
2
3
setTimeout(function() {
  console.log("这是一个匿名函数");
}, 1000);
  1. 箭头函数 箭头函数是ES6引入的一种更简洁的函数写法,适用于需要匿名函数的地方:
1
2
3
let numbers = [1, 2, 3, 4, 5];
let squares = numbers.map(x => x * x);
console.log(squares); // [1, 4, 9, 16, 25]
  1. 继承和对象 JavaScript使用基于原型的继承。可以使用Object.create()方法来实现继承:
1
2
3
4
5
6
7
8
9
let animal = {
  eats: true
};

let rabbit = Object.create(animal);
rabbit.jumps = true;

console.log(rabbit.eats); // true 
console.log(rabbit.jumps); // true
  1. 数据结构 JavaScript内置了一些基本的数据结构,如数组和对象。

数组例子:

1
2
3
let fruits = ["Apple", "Orange", "Plum"];
fruits.push("Pear"); 
console.log(fruits.length); // 4

对象例子:

1
2
3
4
5
6
7
8
9
let user = {
  name: "John",
  age: 30,
  isAdmin: true
};

console.log(user.name); // "John"
user.age = 31;
console.log(user.age); // 31
  1. 解构赋值 解构赋值可以方便地从数组或对象中提取值:
1
2
3
4
5
6
7
// 数组解构
let [a, b, c] = [1, 2, 3];
console.log(a); // 1

// 对象解构  
let { name, age } = { name: "Alice", age: 20 };
console.log(name); // "Alice"
  1. Promise和async/await Promise用于处理异步操作,让代码更易读。async/await是基于Promise的更高层的语法糖。

Promise例子:

1
2
3
4
5
6
7
8
let promise = new Promise(function(resolve, reject) {
  setTimeout(() => resolve("done!"), 1000);
});

promise.then(
  result => console.log(result), // "done!"
  error => console.log(error) // 不会被调用
);  

async/await例子:

1
2
3
4
5
6
7
8
9
10
11
async function f() {
  let promise = new Promise((resolve, reject) => {
    setTimeout(() => resolve("done!"), 1000)
  });

  let result = await promise; // 等待直到promise解决 

  console.log(result); // "done!"
}

f();

ECMAScript

ES是”ECMAScript”的缩写,它是JavaScript语言的标准化规范。而ES6指的是ECMAScript的第6个版本,也称为ECMAScript 2015。 简单来说,JavaScript是ECMAScript标准的一种实现。ECMAScript定义了JavaScript的语法、类型、语句、关键字、保留字、运算符、对象等。各个浏览器厂商和Node.js等JavaScript运行环境,都致力于实现ECMAScript标准。 自1997年首版发布以来,ECMAScript标准多次更新,如下:

  • ES1 (1997)
  • ES2 (1998)
  • ES3 (1999)
  • ES4 (未发布)
  • ES5 (2009)
  • ES6/ES2015 (2015)
  • ES2016
  • ES2017
  • ES2018
  • ES2019
  • ES2020
  • ES2021
  • ES2022

其中,ES6是一个里程碑版本,引入了许多重要的新特性,显著改变了JavaScript的编写方式,如:

  1. let和const关键字
  2. 箭头函数
  3. 类(class)
  4. 模块化(import/export)
  5. Promise
  6. 解构赋值
  7. 模板字符串
  8. 参数默认值、剩余参数、扩展运算符
  9. Symbol类型
  10. Set和Map数据结构
  11. 等等

这些新特性让JavaScript的表达能力大大增强,代码更简洁、更易读,也更适合大规模的应用开发。 举个ES6的代码例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 使用let定义块级变量
let a = 1;

// 使用const定义常量
const PI = 3.14;

// 箭头函数
let square = x => x * x;

// 类
class Person {
  constructor(name) {
    this.name = name;
  }
  
  sayHi() {
    console.log(`Hi, I'm ${this.name}`);
  }
}

let john = new Person("John");
john.sayHi();

// 模板字符串
let name = "Alice";
console.log(`Hello, ${name}!`);

// 解构赋值
let [x, y] = [1, 2];
console.log(x); // 1
console.log(y); // 2

// Promise
fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error));

虽然ES6已经问世多年,但由于浏览器兼容性等原因,在实际开发中,通常还需要使用Babel等工具将ES6代码”转译”为旧版本的JavaScript代码。 从ES6开始,ECMAScript标准改为每年发布一次,以小版本形式逐步引入新特性。理解和学习好ES6,可以让你更高效地使用现代JavaScript进行开发。

CSS

CSS全称为”Cascading Style Sheets”,即层叠样式表。它是一种用于描述HTML或XML文档呈现的样式表语言。CSS允许你将样式(如布局、颜色、字体等)应用于网页,使内容与表现分离。下面我来详细介绍一下CSS的历史、基本概念和使用方法: CSS的历史:

  • 1994年,哈肯·维姆·莱和伯特·波斯提出了CSS的最初构想
  • 1996年12月,CSS 1规范成为W3C推荐标准
  • 1998年5月,CSS 2规范发布
  • 1999年,IE5率先支持CSS的部分特性
  • 2007年,CSS 2.1规范发布
  • 2011年,CSS 3分成独立的模块并陆续定稿
  • 如今,CSS已发展到第4版,CSS的大部分特性已得到主流浏览器的广泛支持

CSS基本概念:

  • 选择器:用来选取需要添加样式的HTML元素,常见选择器有元素选择器、类选择器、ID选择器等
  • 属性:用来指定所选元素的样式,如color、font-size、width、height等
  • 值:指定属性的设定值,如red、16px、100%等
  • 声明:属性和值用冒号(:)连接,如color: red
  • 规则:选择器+声明块构成一条CSS规则
  • 注释:使用//添加注释说明

使用CSS的三种方式:

  1. 内联样式:在HTML元素的style属性中直接写CSS规则
  2. 内部样式表:在HTML文件
  3. 外部样式表:将CSS规则单独写在以.css为扩展名的样式表文件中,并在HTML中用标签引用

举个例子,下面的HTML文档演示了这三种使用CSS的方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!DOCTYPE html>
<html>
<head>
  <title>CSS使用示例</title>

  <style>
    h1 {
      color: blue;
      text-align: center;
    }
    .highlight {
      background-color: yellow;  
    } 
  </style>

  <link rel="stylesheet" href="style.css">
</head>

<body>
  <h1>CSS入门</h1>

  <p style="color: red;">这是一段内联样式的文本。</p>

  <p class="highlight">这是一段内部样式表设置的文本。</p>

  <p id="special">这是一段外部样式表设置的文本。</p>

</body>

</html>

假设style.css的内容为:

1
2
3
4
#special {
  font-style: italic;
  font-size: 20px;
}

SCSS、SASS

SCSS (Sassy CSS)和Sass (Syntactically Awesome Style Sheets)都是CSS预处理器,它们扩展了CSS的功能,增加了变量、嵌套、混合、函数等特性,使得CSS更加强大和易维护。SCSS是Sass 3引入的新语法,它完全兼容CSS3的语法。 Sass最初采用缩进语法,没有花括号和分号。而SCSS的语法和CSS相同,使用花括号和分号。下面是Sass和SCSS语法的对比: Sass语法:

1
2
3
4
5
6
7
8
9
10
11
$primary-color: #3bbfce
$margin: 16px

.content-navigation
  border-color: $primary-color
  color: darken($primary-color, 10%)

.border
  padding: $margin / 2
  margin: $margin / 2
  border-color: $primary-color

SCSS语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
$primary-color: #3bbfce;
$margin: 16px;

.content-navigation {
  border-color: $primary-color;
  color: darken($primary-color, 10%);
}

.border {
  padding: $margin / 2;
  margin: $margin / 2;
  border-color: $primary-color;
}

Sass和SCSS都提供了以下主要特性:

  1. 变量:可以使用$符号定义变量,存储常用的值如颜色、尺寸等。
  2. 嵌套:可以按照HTML的层级关系嵌套CSS选择器,使代码更简洁。
  3. 混合(Mixin):可以定义可重用的CSS代码块,并通过@include引入。
  4. 继承:可以使用@extend让一个选择器继承另一个选择器的样式。
  5. 运算:支持数值的加减乘除等数学运算。
  6. 函数:Sass提供了很多内置函数如darken()、lighten()等,也可以自定义函数。
  7. 导入:可以使用@import导入其他Sass或CSS文件。

使用Sass/SCSS的好处包括:

  • 代码更简洁,可读性更好
  • 可以复用代码,便于维护
  • 可以使用变量和运算,更灵活
  • 可以提供更好的代码组织方式

使用Sass/SCSS需要将其编译成CSS才能在浏览器中使用。可以使用命令行工具如sass,或集成到构建工具如Webpack、Gulp中进行自动编译。很多前端框架如Bootstrap、Foundation都提供了Sass版本,可见其影响之大。

CSS响应式

CSS的响应式布局(Responsive Web Design,RWD)是一种让网页在不同设备上都能很好展示的布局方式。它可以让网页根据屏幕大小、分辨率等参数自动调整布局和内容,以提供更好的用户体验。 响应式布局的核心思想是:

  1. 流式网格(Fluid Grid):使用相对单位如百分比来定义元素的宽度,而不是固定的像素值。这样可以让布局自适应不同的屏幕宽度。
  2. 弹性图片/媒体(Flexible Images/Media):让图片和其他媒体也能随着布局自适应调整大小,避免溢出或失真。
  3. 媒体查询(Media Queries):根据设备的特性如屏幕宽度应用不同的CSS样式。

下面是一个简单的响应式布局例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div class="container">
  <div class="header">Header</div>

  <div class="main">
    <div class="article">Article</div>

    <div class="sidebar">Sidebar</div>

  </div>

  <div class="footer">Footer</div>

</div>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
.container {
  display: flex;
  flex-wrap: wrap;
}

.header, .footer {
  width: 100%;
  background-color: #f1f1f1;
  padding: 20px;
}

.main {
  display: flex;
  flex-wrap: wrap;
  width: 100%;
}

.article {
  flex: 3;
  background-color: white;
  padding: 20px;
}

.sidebar {
  flex: 1;
  background-color: #f1f1f1;  
  padding: 20px;
}

@media screen and (max-width: 600px) {
  .main {
    flex-direction: column;
  }
}

在这个例子中:

  • 使用flex布局让主要区域(.main)中的文章(.article)和侧边栏(.sidebar)并排显示,并可以自动调整宽度。
  • 使用相对单位flex来分配.article和.sidebar的宽度比例。
  • 在屏幕宽度小于600px时应用不同的样式,让.article和.sidebar垂直堆叠显示。

响应式布局的实现除了CSS的flex、grid布局外,还常用到以下技术:

  • 视口(Viewport)标签:通过设置视口,控制页面的缩放和初始宽度。
  • rem、vw/vh等相对单位:相对于根元素字体大小或视口宽高的单位,可以实现更灵活的尺寸设置。
  • 响应式断点:根据常见设备宽度设置媒体查询的断点,在断点处应用不同的样式。
  • 移动优先(Mobile First):先设计移动设备的布局和样式,再通过媒体查询扩展到大屏幕,可以让CSS更简洁。

响应式布局已经成为现代网页设计的标配,特别是在移动互联网时代,它可以让网页在手机、平板、PC等不同设备上都能提供良好的体验,减少开发和维护成本。建议在开发网页时始终考虑响应式,并在不同设备上进行测试。

本文由作者按照 CC BY 4.0 进行授权