前言:青训营第一日。原本只是当作复习罢了,没想到给我当头一棒。还有不少东西是之前自己学习的时候遗漏了的。还有,讨论区的都是大佬。Orz
授课老师:韩广军
HTML
定义 + DOM树 + 语法 + 标签 + 代码规范思想
定义
超文本标记语言:HyperText Markup Language
超文本:图片,链接,标题,表格
DOM树
一棵节点树中的所有节点彼此都是有关系的。 除文档节点(document对象)之外的每个节点都有父节点。节点间的关系可以用
graph TD
document --> html
html --> head
html --> body
head --> meta
head --> title
body --> h1
body --> p
HTML语法
- 标签和属性不区分大小写,推荐小写
- 空标签可以不闭合,比如input、 meta
- 属性值推荐用双引号包裹
- 某些属性值可忽略,如required,readonly
标签讲解
- 列表 list
- ol-li
- ul-li
- dl-dt-dd(定义列表,键值对)
- 链接 anchor
- 输入 input
- 快捷选项:list属性 以及 datalist标签。(这个确实不熟悉)
<input list = "countries" />
<datalist id="countries">
<option>Greece<option>
<option>United Kingdom<option>
<option>United States<option>
</datalist>
-
文本类标签
- 引用块:blockquote
- 预格式化文本:pre
- 代码块:code
-
页面划分的语义化标签:(最好只有一个main标签)
代码规范
HTML传达内容,不是样式。所以废弃了<center>标签这种纯样式的标签,新增那些语义化的标签。
比如下面的两个标签:
<input type = "button" />
<!--应改成-->
<button></button>
<div class = "header" ></div>
<!--应改成-->
<header></header>
问题: 谁在使用我们写的HTML?
- 开发者:修改、维护页面
- 浏览器:展示页面
- 搜索引擎:提取关键词、排序
- 屏幕阅读器:给盲人读页面内容(你现在是正常人,不代表你一直正常。)
So~ HTML的标签,属性不能随意写,需要符合一定的规范。
CSS
使用方法 + 工作流程 + 选择器 + 颜色体系 + 字体 + 特异度(优先级) + 初始值 + 求值过程 + 布局技术 + 边框 + 盒模型 + ...(韩老师讲得真的好多,好用心😍)
使用方法
- 外链link
<link rel="stylesheet" href="xxx.css">
- 嵌入style
<style>
li{margin:0;list-style:none;}
</style>
- 内联
<p style="margin:1em 0">Example Content</p>
CSS的加载过程
graph TD
加载HTML --> 解析HTML
解析HTML --> 加载CSS
解析HTML --> 创建DOM树
加载CSS --> 解析CSS
解析CSS --> 创建DOM树
创建DOM树 --> 展示页面
选择器 Selector
通配符,标签,id,类,伪类,属性...
常见的都会得七七八八了,就属性选择器不会😥。
属性选择器
CSS 2 引入了属性选择器。属性选择器可以根据元素的属性及属性值来选择元素。
注意: IE7和IE8需声明!DOCTYPE才支持属性选择器!IE6和更低的版本不支持属性选择器。
<p><a href="#top">回到顶部</a></p>
<p><a href="a.jpg">查看图片</a></p>
<style>
/* 所有包含title属性的元素,*号可以去掉 */
*[title]{}
/* 既有href属性,又有title属性的a标签元素 */
a[href][title]{}
/* input类型为text */
input[type="text"]{}
/* 指定的属性包含某个值均适用 |= ~= */
input[title~=en]{}
input[title|=en]{}
/* 还可以有
^= :以xx开头就会被选中
$= : 以xx结尾就会被选中
*/
a[href^="#"]
$[href$=".jpg"]
</style>
搬砖:属性选择器 ~=, |=, ^=, $=, *= 的区别
菜鸟教程下的那一篇笔记很赞:www.runoob.com/css/css-att…
伪类选择器
-
状态伪类:特定的状态下被选中
-
链接:link,visited,hover,active
-
输入框:active
-
-
结构伪类:节点结构关系有关
-
first-child
-
last-child
-
组合方式
- 直接组合:AB,满足A且B
- 后代组合:A B ,选中B,如果它是A的子孙
- 亲子组合:A>B ,选中B,如果它是A的子元素
- 兄弟选择器:A~B ,选中B,如果它在A后面且同级
- 相邻选择器:A+B,选中B,如果它紧跟在A后面
选择器组
将相同样式的选择器组在一起:其实就是逗号分隔啦...
h1,h2,h3,h4,h5{
color:blue;
}
颜色体系
#十六进制数,RGB,HSL,不透明度
-
不熟悉的HSL
- 色相:Hue,范围0-360;
- 饱和度:Saturation,范围0-100%;
- 亮度:Lightness,范围0-100%。
适用范围:当鼠标移向按钮,仅仅需要按钮的亮度降低来实现悬浮效果,就不需要重新设置RGB了。
- 简单粗暴的关键字
- alpha透明度
1为不透明,0为完全透明。
几种书写形式:
- #ff00006e
- rgba(255,0,0,0.43)
- hsla(0,100%,50%,0.43)
字体
- 字体复合属性:斜体 粗细 大小/行高 字体族
- font-size
- font-weight
- line-height
- 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:合并空格,保留换行
选择器的特异度--优先级
字典序比较: !important > id > class > tag
样式属性 来源|冲突
覆盖:样式属性相同的,高并低,后并前
继承:样式属性可继承自父级元素的,某些属性会自动继承父元素的计算值。
(像rem这种相对值就不继承了。)
初始值:浏览器的默认初始值。
CSS中,每一个属性都有一个初始值,比如margin-left的初始值为0,background-color的初始值为transparent。可以使用initial关键字显式重置为初始值。
div{ background-color:initial;}
问题: initial,unset的区别?
-
initial关键字用于设置 CSS 属性为它的默认值,可作用于任何 CSS 样式。(IE 不支持该关键字) -
unset关键字我们可以简单理解为不设置。其实,它是关键字initial和inherit的组合。- 如果该属性是默认继承属性,该值等同于
inherit - 如果该属性是非继承属性,该值等同于
initial
- 如果该属性是默认继承属性,该值等同于
CSS的属性计算过程
- 声明值:通过选择器匹配,属性有效,符合当前的media等规则进行筛选(filtering),得到一个元素的声明值,这时候这个元素的某个属性可能有0到多个声明值,如:
p{font-size:16px;}
p.text{font-size:1.2em;}
- 层叠值:通过来源,选择器的特异性,书写顺序等选出优先级最高的层叠值。
(比如上面例子1.2em的font-size)
-
指定值:当层叠值为空的时候,这时候就使用继承值或者默认值,确保属性有值啦。
-
计算值:将一些相对值或者关键字转成绝对值,比如em转成px,相对路径变成绝对路径。(注意继承的就是这个。)
-
使用值:进行实际布局时使用的值,不会再有相对值或者关键字。比如400.2px。
-
实际值:小数转整数。
布局 Layout
- 确定内容的大小和位置的算法
- 依据元素、容器、兄弟节点和内容等信息来计算
布局技术
常规流(我还是比较喜欢叫标准流),浮动,绝对定位
其中常规流包括 行级,块级,表格布局,FlexBox,Grid布局
盒模型
基础的盒模型属性:content,padding,border,margin
注意:padding和margin的百分数相对于容器宽度
边框 border
三种属性:border-width,border-style,border-color。
四个方向:border-top,border-right,border-bottom,border-left。
可以拼接属性,比如border-top-color。
边框原理图:并非四个矩形相连,而是截断的三角形。
神仙操作:利用border绘制 三角形(上三角,下三角...)。
思路:单独设置一条边框颜色(比如border-top),隐藏内容(content的宽高为0),隐藏其他边框颜色(但是也要等宽)。
举个例子:上面画个绿色倒三角,下面画个红色三角形。
HTML代码如下:
<div class="triangle1"></div>
<div class="triangle2"></div>
CSS代码如下:
.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;
}
效果如下:
CSS3 盒大小 box-sizing
box-sizing:content-box,border-box,inherit
什么时候使用border-box?设置宽100%,就可以不用额外考虑边框的大小撑开盒子了。
overflow 溢出
visible,hidden,scroll,auto
块级BFC和行级IFC
BFC: Block Formatting Context
IFC:Inline Formatting Context
-
IFC布局规则:在行内格式化上下文中,boxes一个接一个地水平排列,起点是包含块的顶部。
- 水平方向上的margin border padding在框之间得到保留
- 在垂直方向上可以以不同的方式对齐:顶部或底部对齐,或者根据文字的基线对齐
-
BFC布局规则:
- 内部的Box会在垂直方向,一个接一个地放置
- Box垂直方向上的距离由margin决定,同属一个BFC的两个相邻Box的margin会发生重叠
- 每个元素的左外边缘(margin-left),与包含块的左边(contain box left)相接触(对于从左到右的格式化)。即使存在浮动也是如此,除非这个元素自己形成一个新的BFC
- BFC的区域不会与float box重叠
- BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素
- 计算BFC的高度时,浮动元素也参与计算
图片和文字的基线对齐 vertical-align
对于图片而言,默认最下边对齐。
vertical-align:baseline;
vertical-align:middle;
vertical-align:top;
Flex Box
一种新的排版上下文
-
它可以控制子级盒子的:
- 摆放的流向(← → ↑ ↓)
- 摆放顺序
- 盒子宽度和高度
- 水平和垂直方向的对齐
- 是否允许折行
-
摆放的流向 flex-direction
- 横向:
row,row-reverse - 纵向:
column,column-reverse
- 横向:
-
内容的调整 justify-content
- 左侧开始:
flex-start - 右侧开始:
flex-end - 居中:
center - 两端对齐:
space-between - 两窄中宽:
space-around - 均等划分:
space-evenly
- 左侧开始:
直接放上韩老师的可视化例子啦:
- 元素间的对齐
align-items
- 单个元素自己的对齐:
align-self(内部设置)
- 元素顺序:
Order。给每一个指定不同的order,那么就会按照从小到大的order来进行布局:
Flexibility
设置子项的弹性,剩余空间就伸展,空间不足就压缩。
- flex-grow:值越大,能伸展的能力越强。
- flex-shrink:收缩的能力,当值为0时表示不收缩。
- flex-basis:没有伸展或收缩的基础长度。
Grid布局
步骤:
- 通过display:grid使得元素生成一个块级的Grid容器;
- 再利用grid-template相关属性将容器划分为网格;
- 设置每一个子项占据哪些行或者列。
内容深奥,去看文档更加细致:MDN Grid
CSS建议
- 充分利用 MDN 和 W3C HTML&CSS 规范。
- 保持好奇心,善用览器的开发者工具。
- 持续学习,CSS 新特性还在不断出现。
答疑&讨论(神仙打架,大开眼界)
-
tailwind 工具
-
优雅降级和渐进增强
-
伪类(hover,link,focus)和伪元素(before,after,first-letter)
-
组件化CSS : CSS-in-JS
-
CSS单位的区别: rem,em,px,vh,rpx,vw ...
-
less和Sass
-
CSS书写顺序:
- 布局定位属性:display / position / float / clear / visibility / overflow(建议 display 第一个写,毕竟关系到模式)
- 自身属性:width / height / margin / padding / border / background
- 文本属性:color / font / text-decoration / text-align / vertical-align / white- space / break-word
- 其他属性(CSS3):content / cursor / border-radius / box-shadow / text-shadow / background:linear-gradient …