HTML & CSS | 青训营笔记

150 阅读10分钟

HTML & CSS | 青训营笔记

这是我参与「第四届青训营 」笔记创作活动的的第1天。

MDN 和 W3C HTML&CSS 规范。

一、什么是前端

  • 解决(图形界面)GUI下的人机交互问题
  • 跨终端(eg:PC/移动浏览器,客户端/小程序,VR/AR...)
  • 使用Web技术栈

前端技术栈:

HTML、CSS、JavaScript:运行在浏览器里面。

浏览器利用HTTP协议,和服务器端通信,把前面前端的这些代码,通过HTTP协议从服务器上拿到,并渲染成我们看到的页面。

浏览器,也可以把用户填写的内容或者用户的一些行为,通过HTTP协议提交到服务器端,所以我们说三件套和网络协议(eg:http、socket协议)构成前端最基础的技术栈

二、HTML

2.1 定义

超文本标记语言:HyperText Markup Language

HyperText(超文本):图片,链接,标题,表格

2.2 DOM树

  • 文档:一个页面就是一个文档,DOM中使用document表示
  • 元素:页面中的所有标签都是元素, DOM中使用element表示
  • 节点:网页中的所有内容都是节点(标签、属性、文本、注释等),如文档节点(document对象)

DOM把以上内容都看做是对象

一棵节点树中的所有节点彼此都是有关系的。  

image.png

2.3 HTML语法

  • 标签和属性不区分大小写,推荐小写
  • 空标签可以不闭合,比如input、 meta
  • 属性值推荐用双引号包裹
  • 某些属性值可忽略,如required,readonly

2.4 一些标签

  • 列表list
    • ul - li 无序
    • ol - li 有序
    • dl - dt dd z自定义标签
<dl>
    <dt>名词1</dt>
    <dd>名词1解释1</dd>
    <dd>名词1解释2</dd>
</dl>
  • 链接(anchor)
    • target="_blank" -> 新窗口打开链接
<a href="https:www.baidu.com" target="_blank">
百度
</a>
  • 多媒体:img、audio、video标签

    • src="地址"
  • 表单类控件:input、textarea、select(下拉菜单)

    • placeholder
    • type (range拖动条/number/date/text/password/radio单选/checkbox多选/button/reset/submit/)
    • 快捷选项:list属性 以及 datalist标签。(文本框输入,list里面自动配对)
<input type="range">
<input type="number" min="1" max="10">
<input type="date" min="2019-05-05">
<select>
    <option>选项1</option>
    <option>选项2</option>
    <option selected>选项3</option>
</select>

<input list = "countries" />
<datalist id="countries">
    <option>Greece</option>
    <option>United Kingdom</option>
    <option>United States</option>
</datalist>

image.png

  • 文本类标签
    • 块级引用:blockquote
    • 短引用:cite,作品名字/章节、q(前面提到过的)
    • 代码块:code
    • 预格式化文本:pre

2.5 页面划分的语义化标签

最好只有一个main标签

image.png

什么是语义化

1. 每一个HTML元素都有具体的含义

  • a元素:超链接
  • p元素:段落
  • h1元素:一级标题

2.传达内容,而不是样式

  • 所有元素与展示效果无关
  • 元素展示到页面中的效果,应该由CSS决定。
  • 因为浏览器带有默认的CSS样式,所以每个元素有一些默认样式。

重要:选择什么元素,取决于内容的含义,而不是显示出的效果

语义化的好处:

  • 代码可读性
  • 可维护性
  • 搜索引擎优化(SEO)
  • 提升无障碍性

如何做到语义化:

  • 了解每个标签和属性的含义(MDN文档、W3C规范)
  • 思考什么标签最适合描述这个内容
  • 不使用可视化工具生成代码

2.6 谁在使用我们写的HTML

  • 开发者:修改、维护页面
  • 浏览器:展示页面
  • 搜索引擎:提取关键词、排序
  • 屏幕阅读器:给盲人读页面内容

三、CSS

作用:用来定义页面元素的样式。

3.1 语法规范

CSS 规则由两个主要的部分构成:选择器 以及 一条或多条声明

选择器 {
    属性: 属性值;   // 声明
}
h1 {
    color: blue;
}

3.2 引入方式

  • 内联式(不推荐) 直接写在标签里面
  • 嵌入式 写在style里面
  • 外链式 引入

3.3 CSS加载过程

image.png

对DOM树的每个节点的CSS属性解析出来,加到DOM树,形成渲染树

3.4 选择器 Selector

  • 通配选择器*
  • 按照标签名、类名、id(id唯一)
  • 属性选择器
  • 按照DOM树中的位置
  • 伪类选择器

属性选择器

根据元素的属性及属性值来选择元素

<body>
    <label>用户名:</label>
    <input type="zhao" disabled />

    <label>密码:</label>
    <input type="password" value="123456">

    <style>
        [disabled] {
            background: #eee;
            color: #999;
        }
        input[type="password"] {
            border-color: red;
            color: red;
        }
    </style>
</body>

image.png

<body>
    <p><a href="#top" title="aa">回到顶部</a></p>
    <p><a href="a.jpg">查看图片</a></p>
    <style>
        /* 所有包含title属性的元素,*号可以去掉 */
        *[title] {
            font-size: 20px;
        }

        /* 既有href属性,又有title属性的a标签元素 */
        a[href][title] {
            font-size: 10px;
        }

        /* 
        ^= :以xx开头就会被选中
        $= : 以xx结尾就会被选中
        */
        a[href^="#"] {
            color: red;
        }
        a[href$=".jpg"] {
            color: green;
        }
    </style>
</body>

image.png

伪类选择器

不基于标签和属性定位元素

  • 状态伪类:特定的状态下被选中
    • 链接
      • link 没有点击过的(访问过的)链接
      • visited 点击过的(访问过的)链接
      • hover 鼠标经过(停留)的那个链接
      • active 鼠标正在按下还没有弹起鼠标的那个链接
    • 输入框:active
  • 结构伪类:和节点结构关系有关
    • first-child
    • last-child

选择器组合方式

名称语法说明示例
直接组合AB满足A且Binput:focus
后代组合A B选中B,如果它是A的子孙nav a
亲子组合A>B选中B,如果它是A的直接的子元素(孙辈的不行section>p
兄弟选择器A~B选中B,如果它在A后面且同级h2~p(h2后面出现的且同级的p)
相邻选择器A+B选中B,如果它紧跟在A后面h2+p(h2紧跟着的p)

选择器组

将相同样式的选择器组在一起

h1,h2,h3,h4,h5{
    color:blue;
}

3.5 颜色、字体

颜色

直接颜色名字,#十六进制,RGB,HSL,不透明度alpha(0完全透明)(rgba,hsla)

  • HSL
    • 色相:Hue,范围0-360;
    • 饱和度:Saturation,范围0-100%;
    • 亮度:Lightness,范围0-100%。

适用范围:当鼠标移向按钮,仅仅需要按钮的亮度降低来实现悬浮效果,就不需要重新设置RGB了。

字体

  • 字体复合属性:斜体 粗细 大小/行高 字体族
    • font-style 样式:normal/italic
    • font-size 字体大小
      • 关键字:small、medium、large
      • 长度:px、em
      • 百分数:相对于父元素字体大小80%
    • font-weight 字重
      • normal、bold
      • 100-900(400 等同于 normal,而 700 等同于 bold)(不一定有用,有的字体没有设置那么多字重)
    • line-height
      • 16px
      • 1.5 -> 1.5倍行距
    • font-family

字体族 font-family

本地有字体就用,没有就用下一个指定的,但是最后还是要指定一个通用字体族,防止本地没有或者下载不到。

通用字体族:

  • 衬线体Serif——Georgia,宋体
  • 无衬线体Sans-Serif——Arial,Helvetica,黑体,微软雅黑
  • 手写体Cursive——Caflisch Script,楷体
  • Fantasy——Comic Sans MS,Papyrus
  • 等宽字体Monospace——Consolas,Courier,中文字体

字体使用建议:

  • 字体列表最后写上通用字体族;
  • 英文字体放在中文字体的前面;
  • 衬线体兜底,防止差异过大。
  • 字体名称带空格的要加引号。(这个应该算要求)

Web Font 远程字体,中文字体文件比较大,通常为几兆。

@font-face{
    font-family:f1;
    src:url("//s2.ssl.qhimg.com/static/ff00cb8151eeecd2.woff2") format("woff2");
}
  • 对齐 text-align
    • left,right,center,justify(两端对齐)
  • 间距 spacing
    • letter-spacing:字符间距
    • word-spacing:单词间距
  • 首行缩进 text-indent
  • 装饰 text-decoration
    • none
    • underline: 下划线
    • line-through:中(像删除线)
    • overline:上划线
  • white-space 空白符 合并
    • normal:合并一个格子
    • nowrap:永不换行
    • pre:保留空格和行
    • pre-wrap:一行显示不下才自动换行
    • pre-line:合并空格,保留换行

3.6 CSS三大特性

层叠性、继承性、优先级

层叠性

给同一个选择器设置相同的样式,此时一个样式就会覆盖(层叠)另一个冲突的样式,层叠性主要解决样式冲突的问题

层叠性原则:

  • 样式冲突,遵循的原则是 就近原则,哪个样式距离结构近,就执行哪个样式
  • 样式不冲突,不会层叠

注:就近的标准是:后 > 前

选择器优先级

!important >>>>> id > (伪)类 > 标签

继承性

子标签会继承父标签的某些样式(计算值)(像rem这种相对值就继承不了。)

继承一些不可继承的东西:boxsizing: inherit;

初始值:浏览器的默认初始值。

  • CSS中,每一个属性都有一个初始值,比如
    • margin-left的初始值为0
    • background-color的初始值为transparent
  • 可以使用initial关键字显式重置为初始值。
    • background-color: initial

3.7 CSS的属性计算过程

image.png

image.png

四、CSS布局

  • 确定内容的大小和位置的算法
  • 依据元素、容器、兄弟节点和内容等信息来计算

4.1 布局技术

  • 常规流(标准流)
    • 包括:行级,块级,表格布局,FlexBox,Grid布局
  • 浮动
  • 绝对定位

盒模型

基础的盒模型属性:

  • paddingbordermargin(长度,百分数(相对于容器宽度),auto
    • margin:auto —— 水平居中
    • 两个相邻的盒子的margin不叠加,取最大的
  • heightwidth(长度,百分数(相对于容器宽度),auto
  • 边框border(是四个梯形,不是四个矩形)
    • 可以把宽高设置为0,border-width值一样,就能得到一个四个彩色三角形拼成的正方形
    • 如果只设置一边的border,就能得到三角形
<body>
    <div class="triangle1"></div>
    <div class="triangle2"></div>
    <style>
        .triangle1 {
            width: 0;
            height: 0;
            border-top: 50px solid green;
            border-left: 50px solid transparent;
            border-right: 50px solid transparent;
        }

        .triangle2 {
            width: 0;
            height: 0;
            border-bottom: 50px solid red;
            border-left: 50px solid transparent;
            border-right: 50px solid transparent;
        }
    </style>
</body>

image.png

  • box-sizing

    • content-box,border-box,inherit
    • 什么时候使用border-box?设置width:100%,就可以不用额外考虑边框的大小撑开盒子了。
  • overflow 溢出

    • visible,hidden,scroll,auto

4.2 块级 & 行级

块级盒子行级盒子
Block Level BoxInline Level Box
不和其它盒子并列摆放和其它行级盒子一起放在一行或拆开成多行
适用所有的盒模型属性盒模型中的width、height不适用
块级元素行级元素
生成块级盒子生成行级盒子,内容分散在多个行盒(line box)中
body、article、div、main、section、h1-6、p、ul、li等span、em、strong、 cite 、code等
display: blockdisplay: inline

display属性

  • block、inline
  • inline-block:本身是行级,可以放在行盒中;可以设置宽高;作为一个整体不会被拆散成多行
  • none:排版时完全被忽略

行级排版上下文

  • Inline Formatting Context (IFC)
  • 只包含行级盒子的容器会创建一个IFC
  • IFC内的排版规则
    • 盒子在一行内水平摆放
    • 一行放不下时,换行显示
    • text-align决定一行内盒子的水平对齐
    • vertical-align 决定一个盒子在行内的垂直对齐
    • 避开浮动(float)元素*
<div>
  This is a paragraph of text with long word Honorificabilitudinitatibus. Here is an image
  <img src="https://assets.codepen.io/59477/cat.png" alt="cat">
  And <em>Inline Block</em>
</div>

<style>
  html {
    background: #111;
    color: #fff;
  }

  div {
    font-size: 20px;
  }

  div {
    width: 10em;
    //overflow-wrap: break-word;
    background: #411;
  }

  em {
    display: inline-block;
    width: 3em;
    background: #33c;
  }
</style>

image.png

块级排版上下文

  • Block Formatting Context (BFC)
  • 某些容器会创建个BFC
    • 根元素
    • 浮动、绝对定位、inline block
    • Flex子项和Grid子项
    • "overflow值不是visible 的块盒
    • "display: flow-root;
  • BFC内的排版规则
    • 盒子从上到下摆放
    • 垂直margin合并
    • BFC内盒子的margin不会与外面的合并
    • BFC不会和浮动元素重叠

4.3 Flex Box

一种新的排版上下文

  • 它可以控制子级盒子的:

    • 摆放的流向(← → ↑ ↓)
    • 摆放顺序
    • 盒子宽度和高度
    • 水平和垂直方向的对齐
    • 是否允许折行
  • 摆放的流向 flex-direction

    • 横向(中心线为主轴对齐):row,row-reverse
    • 纵向:column,column-reverse
  • 内容的调整 justify-content

    • 左侧开始:flex-start
    • 右侧开始:flex-end
    • 居中:center
    • 两端对齐:space-between
    • 两窄中宽:space-around
    • 均等划分:space-evenly image.png
  • 元素间的对齐 align-items

image.png

  • 单个元素自己的对齐:align-self(内部设置)

image.png

  • 元素顺序: Order 。给每一个指定不同的order,那么就会按照从小到大的order来进行布局:

Flexibility

设置子项的弹性,剩余空间就伸展,空间不足就压缩。

  • flex-grow:值越大,能伸展的能力越强。
  • flex-shrink:收缩的能力,当值为0时表示不收缩。
  • flex-basis:没有伸展或收缩的基础长度。
  • (缩写和具体属性见文档

4.4 Grid布局

  1. 通过display:grid使得元素生成一个块级的Grid容器;
  2. 再利用grid-template相关属性将容器划分为网格;
  3. 设置每一个子项占据哪些行或者列。

内容很多,功能很强,具体看MDN Grid

4.5 float浮动

类似word文字环绕图片

清除浮动balabala

现在的必要性不大:因为现在有flex box和grid

4.6 position属性

  • static——默认值,定位元素
  • relative——相对自身原本位置偏移
    • 不脱离常规流
    • 使用top、left 、bottom 、right 设置偏移长度
    • 流内其它元素当它没有偏移一样布局
  • absolute——绝对定位(子绝父相)
    • 相对非 static祖先元素定位
    • 脱离常规流
    • 不会对流内元素布局造成影响
  • fixed——相对于视口绝对定位
    • 脱离常规流
  • sticky(粘性定位)