LearnWeb10-CSS04-盒子模型

LearnWeb10-CSS04-盒子模型

[!summary]+
HTML 和 CSS 中,所有的元素都是基于一个个的 Box 去渲染的,理解盒子模型的设计,才能知道如何进行布局,从而使的页面按照希望的样子呈现,该定义实际上和 HTML 的块级元素和内联元素使完全相对应的。需要注意两者之间的关联性。

块级盒子(Block Box)和内联盒子(Inline Box)

块级盒子和 HTML 中的块级元素使相互对应的,例如 hp 有以下的特点:

  • 与其他元素之间会换行
  • 因为换行,在内联的方向上(也就是行)会占据所有可用空间,即绝大多数情况下和父容器一样宽。
  • width 和 height 属性均可发挥总用
  • 内边距(padding), 外边距(margin)和边框(border)会将其他元素从当前盒子周围“推开”

内联盒子和 HTML 中的内联元素相互对应,例如 span, em, strong 等,有以下的特点:

  • 不会换行
  • width 和 height 属性不起作用
  • 垂直方向的内边距、外边距以及边框会被应用但是不会把其他处于 inline 状态的盒子推开。
  • 水平方向的内边距、外边距以及边框会被应用且会把其他处于 inline 状态的盒子推开。

如果希望切换元素的内联或者块级属性,可以通过对盒子的 display 属性设置进行切换,对应的属性值为 inlineblock,而更有趣的,如果我们希望不换行,但是内联中的 widthheight 属性起到作用,可以使用 inline-box 属性。

Inline-box 属性在导航栏/链接元素中很常见,我们通过增大内容区域来使得链接存在更大的命中区域,同时不影响别的元素的呈现。

在这里还会看到片一个十分常见的盒子属性 flex 其通常会将外部的显示类型转换为 block,但是内部的显示类型设置为 flex,对其内部的各个子元素,都将转换为 flex 元素,并基于 flex 即弹性盒子的规则进行布局,可以生成更灵活的界面,这个后面在排版部分针对性的了解,这里简单介绍如下:

  • flex 会将内部的元素默认沿着行的方向均分切成几个 box,但是具体的切分可以根据后续的属性进行定义。
  • 如果希望 flex 的外部为内联的,则使用 inline-flex 属性。

LearnWeb09-CSS03-层叠层

LearnWeb09-CSS03-层叠层

[!summary]+
本章节是额外对于优先级的补充章节,在使用上可能会没有明显的感知,但是从概念上理解 CSS 的优先级和后续复杂项目的开发中还是起到了比较大的作用,该章节介绍层叠层的概念,在原先的优先级判定上添加了层的概念。

层叠概念回顾

该 Section 内容完全摘录自 MDN CSS 教程,也算是对于整体重要性和优先级的一个很好的总结。

  1. 相关声明:找到所有具有匹配每个元素的选择器的声明代码块。
  2. 重要性:根据规则是普通还是重要对规则进行排序。重要的样式是指设置了 !important (en-US) 标志的样式。
  3. 来源:在两个按重要性划分的分组内,按作者、用户或用户代理这几个来源对规则进行排序。
  4. :在六个按重要性和来源划分的分组内,按层叠层进行排序。普通声明的层顺序是从创建的第一个到最后一个,然后是未分层的普通样式。对于重要的样式,这个顺序是反转的,但保持未分层的重要样式优先权最低。
  5. 优先级:对于来源层中优先权相同的竞争样式,按优先级对声明进行排序。
  6. 出现顺序:当两个来源层的优先权相同的选择器具有相同的优先级时,最后声明的具有最高优先级的选择器的属性值获胜。

CSS 渲染过程中会逐步往下选择,如果在中间已经决出了胜负就不会继续往下,例如对一个元素在每个来源中只有一个定义,那么在来源层就可以决出胜负,无需往下了,而若获胜的来源中有多个层定义了同个属性,那么就会对比各个层的优先级,诸如此类。

其他的部分前文已经基本提到了,接下来补充来源和层的两个概念。

![note]+
三个来源中的:’用户代理’指的是浏览器,用户指的是网站访问者,作者指的是网站开发者,浏览器内部将来自这三个来源的样式表进行来源的排序。

来源的优先级排序

有三种层叠来源类型:用户代理样式表、用户样式表和作者样式表。浏览器根据来源和重要性将每个声明分为六个来源分组。有八个优先权级别:六个来源分组、正在过渡的属性和正在动画的属性。优先权的顺序是从具有最低优先权的普通用户代理样式,到当前应用的动画中的样式,到具有最高优先权的重要用户代理样式,再到正在过渡的样式:

  1. 用户代理普通样式
  2. 用户普通样式
  3. 作者普通样式
  4. 正在动画的样式
  5. 作者重要样式
  6. 用户重要样式
  7. 用户代理重要样式
  8. 正在过渡的样式

<style> 元素直接在元素上声明的样式是作者样式。不包括动画和过渡样式,用户代理普通样式具有最低优先权;用户代理重要样式具有最高优先权。


LearnWeb08-CSS02-CSS入门

LearnWeb08-CSS02-CSS入门

[!note]+

  1. 你永远无法记住所有的 CSS 属性,善用参考资料:MDN CSS reference 和 GPT
  2. 善用浏览器的开发者面板在页面上及时编辑 CSS。

CSS 运行逻辑

前面在 LearnWeb00-Web入门 中简单提及了浏览器以及 CSS 起了什么作用,这里则是对于 CSS 是如何具体参与进页面的渲染的讲解,包括早该知道的 DOM 的定义也会在这里介绍,是 CSS 是如何运行的读书笔记。

image.png

浏览器获取了 HTML 之后:

  1. 会拉取其所依赖的所有 CSS,JS 和静态资源(Parser HTML)
  2. 解析 HTML 代码,根据其中的 Tag、Class、ID 和相互之间的关系将 HTML 解析成 DOM ,每个元素作为其中的一个节点放进相对应的桶中。(元素桶、ID 桶之类)

紧接着,在拉取完 CSS 之后,浏览器开始解析 CSS,基于 CSS 中的选择器找到每个样式所属的 DOM 节点,并将其添加进去。

最后基于最终的 DOM(Document Object Model) 渲染出完整的页面,这里对 DOM 进行一个简单的解释:

一个 DOM 有一个树形结构,标记语言中的每一个元素、属性以及每一段文字都对应着结构树中的一个节点(Node/DOM 或 DOM node)。节点由节点本身和其他 DOM 节点的关系定义,有些节点有父节点,有些节点有兄弟节点(同级节点)。

此外浏览器在渲染过程中如果遇到了位置的 CSS 会直接跳过相应的 CSS ,然后渲染下一个规则。


LearnWeb07-HTML04-表格基础

LearnWeb07-HTML04-表格基础

[!summary]+
HTML 中需要使用 CSS 进行样式组合才能得到一个阅读体验较好的表格,目前还是先专注在 HTML 的部分,后面到 CSS 部分的时候再合起来一起看。

本文主要是参考 MDN 范例中的源码以及对应的文章 HTML 表格基础的一篇阅读笔记。

表格基础

从源码开始我们可以看到表格对应的 Tag 核心的一下几个:

  • <Table> 包裹整个表格
  • <caption> 设置表格的标题
  • <tr> 一行一行的包裹表格,全称应该是 table row

可以看到 HTML 中编写表格是使用 <tr> 进行逐行编写的,逐行的描述整个表格:

  • <td> 描述表格的内容语义,table data
  • <th> 描述表格的标题语义,即首行首列的标题元素 table header

主要的元素就是上面这些,但是复杂的表格包括:合并的单元格(纵向和横向)需要再 thtd 中使用额外的属性来定义:colspanrowspan

  • colspan="2" 属性定义占据两个单元格宽度(横向合并)
  • rowspan="3" 属性定义占据三个单元格的宽度(纵向合并)

然后每个 tr 中排除掉被合并的单元格还需要多少个 td 需要我们自己计算。

HTML 的表格基础样式

可以使用 colgroupcol 为整列设置同样的样式,每个 col 元素代表一列,如果需要一条元素定义多列的样式的时候可以使用 span 属性,下述代码会将第二列背景设置为黄色。

对单个单元格设置样式可以仿照使用 style 属性来嵌入对应的 css 样式,包括宽度什么的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<table>
<colgroup>
<col />
<col style="background-color: yellow" />
</colgroup>
<tr>
<th>Data 1</th>
<th>Data 2</th>
</tr>
<tr>
<td>Calcutta</td>
<td>Orange</td>
</tr>
<tr>
<td>Robots</td>
<td>Jazz</td>
</tr>
</table>

HTML 表格结构化

[!quota]+
由于表格在结构上有点复杂,如果把它们定义得更加结构化,那会帮助我们更能了解结构。一个明确的方法是使用 <thead><tfoot><tbody>,这些元素允许你把表格中的部分标记为表头、表尾、表体三部分。

这样的结构化实际上没有什么默认 style,主要是帮助我们后续定义各个部分的样式。

其他

  • 表格元素支持嵌套
  • 使用 scope 属性 来支持视障人士来理解这个表格

LearnWeb06-HTML03-多媒体元素

LearnWeb06-HTML03-多媒体元素

[!summary]+
接下来主要探讨 HTML 中的多媒体元素,图片、视频、音频以及 iframe 等等。

图片元素 Image

1
<img src="<img_url or location>" />

src:最基本的图片元素仅需一个 src 属性来指向图片资源,这样就可以将图片导入页面中,其中关于 Location 这里有一个 SEO Tips(Google Recommand):

  • 本地存储推荐存储于 images
  • 图片的命名更加具备描述性。
  • 不要将自己的 SRC 属性指向他人网页上的照片(这种行为为”盗链”)

如图像元素和视频元素这类嵌入的元素,有时候也被成为替换元素:元素的内容和原始尺寸由外部资源所定义,而非元素本身。(可以使用属性或者 CSS 进行控制)

alt:alt 为了视障,节省带宽,浏览器支持问题等原因设置的代替图片出现的描述性文本,推荐根据图片内容进行编写:

  • 装饰需求: 使用空的 alt="" 避免输出多余信息,同时推荐将装饰性图片在 CSS 文件中定义而非 html,下文会详细讲解 CSS 设置装饰图片
  • 内容需求:如果正文中没有描述,则 alt 对图片进行描述,否则设置为空。

widthheight :上文中提到图片的 size 由外部资源决定,单位了适应页面的大小,可以使用 img 标签中的 width 和 height 属性来实现对图片的缩放,同时也会在页面尚未加载完成时预留空间,避免页面结构混乱。(因此无需缩放也建议,获取图片的 size 写入属性。)

title:类似超链接中的 title 属性,可以给照片添加悬停提示,当空间不够时可以通过这种方式来添加部分信息,但不推荐。

figurefigcaption:创建一个容器(box),可以为图片在图片下方添加说明,像论文中的那种,对于无障碍用户来说起到和 alt 一样的作用。

1
2
3
4
<figure>
<img src= "https://the-network-photo" alt="" title="key img", width="400", height="200" />
<figcaption>通过为网络添加一个低纬嵌入来实现用最小的空间代价控制网路行为</figcaption>
</figure>

figure 中可以存放几张图片、一段代码、音视频、方程、或者任何其他的内容,而不只是单张照片,类似的补充说明的场景都可以使用 figure 元素呈现。


LearnWeb05-HTML02-要素察觉

LearnWeb05-HTML02-要素察觉

[!summary]+
本章节在 HTML01 的基础上加深对于一些基础概念,标签等的认知,还是以 HTML 编写的基础知识为主。

块级元素和内联元素

块级元素和内联元素就像 Markdown 的内联代码和代码块两种写法,一个需要另起一行且会占据行,下一个元素必须另起一行,如 <p> 段落等。而内联元素就是可以嵌入行内,内联元素前后都无需换行,一般如强调,高亮,超链接一类。

  • 正是由于这种结构,块级元素在使用的时候除了内容,往往还承担着网页的结构相关的工作,如页眉,页脚, 列表,导航栏等等;
  • 块级元素不会嵌套在内联元素中,但是可能嵌套在另一个块级元素中。
  • 内联元素则通常在块级元素中和文本一起使用。

需要注意的是这类元素分类是过时的,HTML 定义了更加详细具体的分类,为了便于理解暂时使用旧的定义来做简单的区分。

布尔属性

前文提到过,属性通常以 k-v 键值对的形式呈现,但是有部分属性是没有值的,其 key 通常与值有着相同的含义,如 disabled,该布尔属性本身就代表着禁用,例如输入框 <input> 禁用就会阻止用户的输入。

1
<input type="text" disabled />

这样就会创建一个无法输入的输入框,通常会以灰色呈现,type 则限制了输入框的输入类型。


LearnWeb04-JS01-基础webJS编写

LearnWeb04-JS01-基础webJS编写

[!summary]+
JS 除了 WEB 在现代还有很多 NodeJS 的应用也会使用 JS,这里只介绍 web 相关的 JS 代码编写的部分。

ref: mdn JS 快速入门 | 《数据结构与算法 JavaScript 描述》

Intro

JavaScript 是一门完备的动态编程语言,可以借由诸多开发者编写的大量工具,为网站提供动态交互的特性(结合浏览器应用程序接口 API)主要用到的包括:

  • 浏览器应用程序接口(API):浏览器内置的 API 提供了丰富的功能,比如:动态创建 HTML 和设置 CSS 样式、从用户的摄像头采集处理视频流、生成 3D 图像与音频样本等等。
  • 第三方 API:让开发者可以在自己的站点中整合其他内容提供者(Twitter、Facebook 等)提供的功能。
  • 第三方框架和库:用来快速构建网站和应用。

HTML 引入 JS 代码

为了使得代码更清晰且好组织,本文依然使用引入外部 JS 的办法进行代码结构组织,HTML 中引入相关 JS 的方法和 CSS 的方法类似但略有不同。具体代码如下:

1
<script src="scripts/main.js" defer></script>

这一段代码可以加在 Head 部分,其中的 defer 属性,及 deferred 延迟,是为了让元素都加载完成后再加载 JS 部分代码,否则最好将 JS 的引入放在 HTML 快要结束的部分</body> 的前一行)。避免 JS 元素对 HTML 提前进行修改导致 HTML 加载失效。

参考资料:async-defer | Medium


LearnWeb03-CSS01-基础CSS规则

LearnWeb03-CSS01-基础CSS规则

[!summary]+
在前文 web 入门中已经简单介绍了 CSS 是如何起作用,如何与 HTML 进行相互合作的,本篇主要简单介绍如何编写 CSS 文件中的各种样式。

ref: mdn css入门 | MDN css属性大全

在本文及后续的尝试中,都使用单独 CSS 文件外挂的格式,该种格式的结构会更清晰,即将下述代码放入 HTML 文件的 Head 部分。

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

href 部分需要替换为自己实际存放 css 文件的地址即可,此外也简单重复一下剩下的两种使用 CSS 的方式:内部样式表和内联样式表

  • 内部样式表即在 HTML 的 Head 部分添加 <style>your css code</style> 将 CSS 代码都包裹起来
  • 内联样式表即在特定元素中定义 style 属性,<p style="your css code"> 在 style 属性中填充需要的 CSS 代码。

接下来进入正文,讲解 css 部分的组成和编写规则。

Pattern 基础范式

The Principle to Write Css.

image.png

这是一个最基本的 CSS 结构,更为专业的名称是 CSS 规则集(简称为规则),其组成分成一下几个部分:

  • 选择器 Selector:类似表格中的筛选,筛选这个规则使用的范围,针对 Class、ID、Tag 等不同类型有不同的选择器写法
  • 属性 Property: 选择要修改的属性,如颜色,大小,位置灯多重类型。
  • 属性值 Property value: 各种对应属性的取值,如具体的哪个颜色,字体多大等。
  • 声明 Declaration:由属性和属性值组成的一条单独的规则,指定一种特定的样式。

上述结构称为规则,因为其可以同时包含多个规则(即声明),编写时有以下约定:

  • 每个规则使用 ; 作为结尾的分割
  • 同一个规则集的规则需要编写在 {} 之中
  • 属性和属性值为 K-V 对,声明时使用 : 作为分割符,且属性和值均不区分大小写

注释方法

1
2
3
/*
all between those two symbol is comment.
*/

LearnWeb02-HTML01-基础的标签

LearnWeb02-HTML01-基础的标签

[!Intro]+
在 Web 入门,How HTML Work 部分已经简单介绍过,HTML 是一种定义内容结构的标记语言,通过一系列标记(确定其表现形式)和对应内容组成的元素,嵌套,排列,构成完整的页面。本文主要是整理和熟悉一下基础的标记元素

image.png

REF: HTML 入门

从上述图像可以看到一个基本的 HTML 元素的构成,元素的 Tag 可以包含属性,多个属性之间用空格隔开,Class 属性可以为元素标识名称,进而为其指定 Style 等。

属性通常为 K-V 键值对,attr=”value” 的形式呈现,这里引号可以是单或者双,甚至可以没有,但是没有引号有时候会导致问题,所以建议保持使用引号的风格去编写。

Head/Overview 部分

参考网站中的范例如下,一个基本的 HTML 文件有以下这些可以注意的地方:

1
2
3
4
5
6
7
8
9
10
11
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>My test page</title>
</head>
<body>
<img src="images/firefox-icon.png" alt="My test image" />
</body>
</html>
  • <head> 就如 cpp 中的 head 文件,定义一些不用于向用户显示的内容,给浏览器的关键词,字符集声明,页面描述等内容
  • <meta charset="utf-8"> 定义文档使用的字符串编码类型,utf-8 支持世界上大部分语言的渲染,避免因为中文等出现乱码的情况。
  • <meta name="viewport" content="width=device-width"> 视口元素,可以确保页面以视口宽度进行渲染,避免移动端浏览器上因页面过宽导致缩放。
  • <title> 对当前网页的描述和注解,显示在标签栏中,以及收藏时显示的文字
  • <body> 部分则是包含网站的全部需要显示的内容。

LearnWeb01-DevPipeline

LearnWeb01-DevPipeline

[!summary]+
Familiar with the pipeline of how to build a website, how to organize the files, etc…

Start Design

开始设计一个网站的时候,可以从以下三个方面入手来启动整个开发设计过程:网站的主题->基础的一些内容->整体的外观设计(草稿)

image.png

更具体一些:确定完要制作的网页,可以绘制草图有一个粗浅的整体效果,然后指定文本、图像、色彩、字体等资源,就可以开始制作了。

File Structure

关于项目中的文件命名,需要注意的是以下的三点,建议养成这样的规范去建立网页文件夹。

  • 建议使用完全小写来命名文件,webserver 是大小写敏感的,所以复杂的大小写关系容易导致访问不到文件。
  • 尽量不要使用空格,空格可能会破坏链接被视为两个文件等,如果没有被区分很多服务器也需要使用 %20 对空格进行替换
  • 尽量使用连字符代替下划线进行文件命名,google 搜索引擎将连字符作为单词的分割符,而不会识别下划线

而文件存储结构部分,通常而言,有以下的关键文件和文件夹结构,在很多场景下也会将 image 等文件夹放到 static 文件夹中。

  • index.html
  • styles: 存放 css 文件
  • images: 存放图片等媒体资源文件
  • scripts: 存放 js 等脚本代码文件

资源的文件路径一般而言以 html 为 Basepath,然后根据上下级关系确认索引地址即可。