「第五届青训营 」伴学笔记创作活动的第 1 天
本文章主要介绍前端入门的CSS与JS部分,通过本文章相信你会更快入门前端
课程链接:
深入css(上)
重复选择问题
HTML负责进行前端结构的搭建,而CSS负责对结构的样式进行渲染。比如颜色、大小、字体。这些都是由css来进行控制。只需要通过CSS的选择器进行选择即可。但是如果选择出现冲突,多个CSS样式都指向同一个HTML标签,到底应该是哪个生效?
例如:
<article>
<h1 class="title">AAAAA</h1>
</article>
<style>
.title{
color: blue;
}
article h1{
color: red;
}
</style>
样式之间发生冲突是article h1 生效还是title生效,他们都是指向 <h1 class="title">AAAAA</h1>
他们生效的方式按照特异度
的逻辑来实现,特异度就是指在css的表示中的特异性,根据特异性来确定最终生效的css
在图中就可以看出id选择器的特异度为1,所以id选择器优先生效,特异度越高优先级越高
样式的继承关系
在样式关系中,此样式会继承父样式的部分属性。只要是无需书写相关样式也会继承父类样式。 一般在css中和文字相关的都是可以继承的,比如颜色、大小都是可以继承的。和盒子模型相关的是不能继承的,例如宽度、高度都是无法继承的。 如果我们想要从父类中继承默认不可继承的属性。我们需要进行显式声明,使用
*{
box-sizing:inherit;
}
来实现对父类计算值的继承。所有的元素都会继承*
中的属性,使用inherit
会使原本不可继承的变成可继承的。
如果样式可继承但是往上寻找,但是没有找到相关的会有初始值。例如字体颜色默认黑色背景颜色默认透明。也可以使用background-color:inital;
来重置初始值。每个属性都可以使用初始值。
css的求值过程
- 把所有的规则都拿到,对应用到该界面的规则进行筛选匹配。筛选出能够匹配到的选择器,符合当前media。
- 得到一组可以匹配到的css规则叫做CSS声明值
Declared Values
,可以是多个css声明值。 - 从匹配到的一组中css规则按照特异性、书写顺序、来源、
!important
选择出优先级最高的属性值 - 通过多个选择器叠加获取到的值叫做层叠值。
- 如果在全部的过程中都没有使用某些属性,则会使用默认值
- 对em或者其他单位进行计算获取到px,计算出计算值
- 百分比数据等数据进行进一步转化的得到使用值
- 将得到的使用值进行进一步转化得到整数值
- 最后得到的整数值就是最后的渲染值
布局相关技术
在CSS当中通常用到的布局有:常规流、浮动、绝对定位。
在常规流中又包括行级、块级、表格布局、FlexBox、grid布局。
盒子模型
CSS中一切的基础是盒模型。布局的时候,把所有的元素理解成一个个盒子。一个盒子,包括长宽高、边距、内边距和边框。
content box
- width
- 指定content Box宽度。
- 取值为长度、百分数、auto
- auto 由浏览器根据其他属性确定
- 百分数相对于容器的content box宽度
- height
- 指定context box高度
- 取值为长度、百分数、auto
- auto取值由内容计算得来
- 百分数相对于容器的context box高度
- 容器有指定的高度时、百分数才生效
- padding
- 指定元素四个方向的内边距
- 百分数相对于容器
宽度
- border
- 指定容器边框样式、粗细和颜色
- margin
- 指定元素四个方向的外边距
- 取值可以是长度、百分数、auto
- 百分数相对于容器宽度
margin:auto
水平居中。在上面元素使用margin-bottom:100px
下面元素使用margin-top:100px
两个元素怒实际会间隔100px这是css的margin collapse
边距合并折叠,或者取边距最大的
border box
使用box-sizing:borer-box
来指定盒子模型
border-box模型的width和height是包括,pading和border的。所指定的width和height就是实际的。在开发中长用到这种布局方式。
深入css (下)
常规流
块级 vs 行级
块级
Block Level Box
不和其他盒子并列摆放,适用所有盒子模型。
行级
lnline Level Box
和其他盒子一起放在一行,或拆开多行。盒子模型中的width、height不适用,行级的width和height是由其中的内容来决定的。
默认的块级元素包括:
body
div
article
main
section
h1-6
p
ul
li
等都是display:block
。默认行级元素包括:
span
em
strong
cite
code
等都是display:inline
。
display属性
属性 | 作用 |
---|---|
block | 块级盒子 |
line | 行级盒子 |
inline-block | 本身是行级,可以放在盒子中,可以设置宽高;作为一个整体不会被拆散成多行。 |
none | 排版时完全忽略 |
行级排版上下文
- Inline Formatting Context(IFC)
- 只包含行级盒子的容器会创建一个IFC
IFC
内部的排版规则- 盒子在一行内水平摆放
- 一行放不下时水平摆放
- text-align 决定一行内盒子的水平对齐
- vertical-align 决定一个盒子在行内的垂直对齐方式
- 避开浮动(float)元素
在inline-block
行内元素中,内部作为一个整体不会换行,例如单词超出长度并不会换行,使用overflow-wrap:break-word
可以进行强制换行。
块级排版上下文
- Block Formatting Contetx (BFC)
- 某些容器会创建一个
BFC
- 根元素
- 浮动、绝对定位、inline-block
- Flex子项和Grid子项
- overflow值不是visible的块盒
- display:flow-root
BFC
内的排版规则
- 盒子从上到下摆放
- 垂直margin合并
- BFC内盒子的margin不会与外面的合并
- BFC不会和浮动元素重叠
Flex布局
但是这些布局方式还不能满足我们的布局需求,我们可以使用弹性盒子实现更多的效果。
Flex Box
是什么?
- 一种新的排版上下文
- 它可以控制盒子的:
- 摆放的流向
- 摆放顺序
- 盒子的宽度和高度
- 水平和垂直方向的对齐
- 是否允许拆行
flex的布局流向有主轴与侧轴属性。可以横向和纵向。
调整
justify-content
的不同属性可以实现不同的布局分布。
通过
align-items
实现基线对齐可以实现不同的对齐效果,这些效果都是设置在容器上的,也可以给某个容器设置特殊的对齐效果。
Flexibility弹性设置
- 可以设置子项的弹性:当容器有剩余空间时,会伸展;容器空间不够时会收缩。
flex-grow
有剩余空间不在时收缩的能力flex-shrink
容器空间不足时收缩的能力flex-basis
没有伸展或收缩时的基础长度
在flex中存在缩写情况,下面是缩写和属性的对应关系 flex:1 | flex-grow:1
flex:100px | flex-basis:100px flex:2 1 | flex-grow:2;flex-shrink:1 flex:1 100px | flex-grow:1;flex-basis:100px flex:2 0 100px | flex-grow:2;flex-shrink:0;flex-basis:100px flex:auto | flex:1 1 auto flex:none | flex:0 0 auto
Grid布局
flex布局是一维单向的布局,grid是二维的网格布局
display:grid
- display:grid 使元素生成一个块级的grid容器
- 使用grid-template相关属性将容器划分为网格
- 设置每一个子项占哪些行列
如何划分网格?
通过
grid-template-columns:100px 100px 200px;
设置有三列,宽度分别为100px、100px、200px。通过grid-template-rows:100px 100px;
。设置高度有两行高度为100px、100px.
通过
grid-template-columns:100px 1fr 1fr;
设置有三列,宽度分别为100px、分一份、分一份。通过grid-template-rows:100px 1fr;
。设置高度有两行高度为100px、分一份。
grid line 网格线
表明黄色的线可以通过编号来实现。实际上就是坐标的方法。
使用grid-area:1/1/3/3;
来确定区域,从1,1到3,3的区域。