由浅入深CSS | 青训营笔记

89 阅读7分钟

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

由浅入深CSS | 青训营笔记

CSS=>Cascading Style Sheets,用来定义页面元素的样式,例如字体颜色、位置大小、动画效果

基础

语法

一个简单的CSS结构:

h1{
    color: white;
    font-size: 14px;
}
  • 这里h1代表选择器(Selector),选择页面中的h1标签
  • color和font-size代表属性(Property),表示希望改变的样式
  • white和14px表示属性值(Value),表示对应样式属性的值
  • color: white;和font-size: 14px;分别在两行,分别表示两个属性的定义,中间以分号隔开,一个键值对便称为一个声明(Declaration)

引用

CSS有三种使用方式:

<!--html文件中-->
<!--方式一:外链-->
<link rel="stylesheet" href="/assets/style.css"><!--方式二:嵌入-->
<style>
    li{
        margin: 0;
        list-style: none;
    }
    p{
        margin: 1em 0;
    }
</style><!--方式三:内联-->
<p style="margin:1em 0">
    Example Content
</p>

传统开发中我们常使用外链来进行html与css文件分离,以方便开发与维护,但在组件化开发中,我们也常常使用嵌入的方式,将组件的所有内容封装到一起,故二者都常使用,而内联中css与html耦合度太高,最不推荐使用!

css如何工作

how2work.jpg

选择器

选择器(Selector)负责找出页面中的元素,以便给他们设置样式,我们有多种方式可以选择元素:

  • 标签名、类名或id
  • 按照属性
  • 按照其在DOM树中的位置

通配选择器

一个 ***** 可以代表匹配所有内容

*{
    margin: 10px;
}

这样margin: 10px;的样式就会加到所有节点上

id选择器

若一个节点的id被设为logo,则可以通过#logo来匹配该节点

#logo{
    margin: 10px;
}

类选择器

若有一个或若干个节点的class属性被设为logo,则可以通过.logo来匹配这些节点

.logo{
    margin: 10px;
}

属性选择器

可以根据标签内的属性来进行选择,例如一个input标签中有disabled属性,我们要通过属性选择器对其进行选择,就可以使用如下方式:

[disabled] {
    margin: 10px;
}

如果要选中type属性为password的input标签,就可以用如下方式:

input[type="password"]{
    border-color: red;
    color: red;
}

特殊的匹配规则:

a[href^="#"]{
    border-color: red;
    color: red;
}

👆匹配href属性以井号开头的a元素

a[href$=".jpg"]{
    border-color: red;
    color: red;
}

👆匹配href属性以.jpg结尾的a元素

伪类选择器

状态伪类

状态伪类选择器用于设置元素在特定情况下的样式,例如链接被激活后、鼠标在元素上方悬浮等

例:

//默认样式
a:link {
    color: black;
}
//访问过的样式
a:visited {
    color: gray;
}
//鼠标悬停样式
a:hover {
    color: orange;
}
//点击时样式
a:active {
    color: red;
}

不同的元素会有不同的状态,例如输入框点击出现光标后的状态为focus状态

结构伪类

结构伪类选择器用于为指定位置的元素添加样式

例:

//为第一个li元素添加样式
li:first-child {
    color: coral;
}
//为最后一个li元素添加样式
li:last-child {
    color: red;
}
选择器组合

不同的选择器可以组合来进行使用

例如:

input.error {
    padding: 10px;
}

👆选择类名为error的input标签

Selectors.jpg

深入

选择器特异度

当一个元素设置了多个css样式,哪个会起效果呢?我们根据其特异度来计算👇

Specificity.jpg

122大于022,所以第一条选择器定义的样式生效

继承

而继承表示子元素如果没有单独定义样式,则会自动继承父元素的样式。

以上自动继承的方式为隐式继承,我们还可以进行显示继承,让原本不能被继承的属性变为可继承属性:

*{
    box-sizing: inherit;
}
​
html {
    box-sizing: border-box;
}
​
.some-wiget{
    box-sizing: content-box;
}

当一个属性既没有继承也没有定义样式,就会自动使用其初始值

CSS计算

浏览器根据DOM树和样式规则,会进行如下转换:

Compile.jpg

而我们在继承时,部分属性会继承自父元素的计算值,而非实际值

布局

  • 常规流

    • 行级
    • 块级
    • 表格布局
    • FlexBox
    • Grid布局
  • 浮动

  • 绝对定位

盒模型

标准计算方式:

Box.jpg

设置box-sizing: border-box后的计算方式:

borderBox.jpg

块级与行级

块级:

  • 不和其他盒子并列摆放
  • 适用于所有的盒模型属性
  • body、article、div、main、section、h1-6、ul、li等
  • display:block

行级:

  • 会和其他盒子放在一行或者拆分为多行
  • 盒模型中的width、height并不适用
  • span、em、strong、cite、code等
  • display:inline

二合一:

  • 本身是行级、可以放在行盒中,可以设置宽高,但作为一个整体不会被拆分成多行。
  • display:inline-block

常规流

  • 根元素、浮动和绝对定位的元素会脱离常规流
  • 其它元素都会在常规流之内(in-flow)
  • 常规流中的盒子,在某种排版上下文中参与布局
行级排版上下文(IFC)

只包含行级盒子的容器会创建一个行级排版上下文

IFC内的排版规则:

  • 盒子在一行内水平摆放
  • 一行放不下时,换行表示
  • text-align决定一行内盒子的水平对齐
  • vertical-align决定一个盒子在行内的垂直对齐
  • 会避开浮动元素
块级排版上下文(BFC)

会创建BFC的容器:

  • 根元素
  • 浮动、绝对定位、inline-block
  • Flex子项和Grid子项
  • overflow的值不是visible的块盒
  • display:flow-root;

排版规则:

  • 盒子从上到下摆放
  • 垂直margin合并
  • BFC内盒子的margin不会与外面的合并
  • BFC不会和浮动元素重叠
Flex Box

Flex Box是一种新的排版上下文,它可以控制子级盒子的:

  • 摆放的流向(上下左右)
  • 摆放顺序
  • 盒子的宽度和高度
  • 水平和垂直方向对齐
  • 是否允许折行

在其中可以通过justify-content来控制排版:

justify-content.jpg

通过align-items属性可以控制其对齐基线:

align-items.jpg

Flexbility

  • 可以设置子项的弹性:当容器有剩余空间时,会伸展;容器空间不够时,会收缩。
  • flex-grow有剩余空间时的伸展能力
  • flex-shrink容器空间不足时收缩的能力
  • flex-basis没有伸展或收缩时的基础长度

flex属性为上述属性的综合,具体对应关系如下:

flex.jpg

Grid布局

whyGrid.jpg

一般的布局往往不只是流式排列,所以我们引申出Grid布局

通过display:grid使元素生成一个块级的Grid容器,使用grid-template相关属性将容器划分为网格,再设置每一个子项占那些行/列

网格划分举例:

gridEx1.jpg

gridEx3.jpg

表示网格中的位置:

gridline.jpg

通过(1,1)和(3,3)两个点可以确定被黄线包围的左侧网格

代码表示:

.a{
    grid-area: 2/2/4/4;
}

grid布局是一种很强大的布局方式,细节内容也很多,具体可以参考文档

position属性
  • static——默认值,非定位元素
  • relative——相对自身原本位置偏移,不脱离文档流,流内其他元素当它没有偏移一样布局
  • absolute——绝对定位,相对非static祖先元素定位,流内元素会当其不存在,正常布局
  • fixed——相对视口绝对定位

总结

CSS内容杂而多,新特性不断涌现,今天的课程只是介绍了一小部分常用内容,仍需保持持续学习的心态不断探索! 本节课中我第一次了解了css的计算过程,对底层的原理了解更进一步,在布局方面练习欠缺,以前用flex与定位进行布局较多,完全忽略了好用的grid布局,而且对盒模型与排版上下文理解不够深刻,这节课解决了我不少疑问!