理解CSS | 青训营笔记

68 阅读8分钟

本节课将学习以下知识:

CSS基础

布局和定位

层叠上下文

变形,过渡,动画

响应式设计

一.css基础

优先级程度判断

首先看样式表的来源,然后判断选择器优先级,如果优先级相同,就判断源码位置,对于@import的样式,就是根据@import的顺序,对应link和style便签的样式,则根据在document中的顺序决定。

伪类函数选择器(逻辑选择器)::is(), :has(), :where(), :not()

CSS选择器优先级:内联 > id > 类=属性 > 便签选择器

内联样式不属于选择器,:is(),:not()本身不计入优先级,以参数中最高的优先级为准,:where()优先级为0

层叠优先级

由层叠概念引申出的css代码:

首先选择器尽量少用id写样式,id不利于css的复用,并且id选择器的优先级较高,不利于后续的覆盖。

尽量不用!important,他的级别是最高的,后续如果要扩展或者灵活性的变化也会被压缩。

自己的样式加载在引用库样式的后面。保证自己的样式生效。

CSS选择器构成:

属性+冒号(:)+值+单位。

值:

文字类:比如initial这种关键字,颜色,位置等

数值类:比如z-index:1,或者带有单位的数值,百分比

函数生成:比如calc(),min(), max()等

单位:长度分为绝对长度(px,pt,cm,in)和相对长度(em,rem,ex,rex,vw,vh...)

角度:deg,grad,turn,rad

时间:s,ms

分辨率:dpi, dpcm,dppx

盒模型:

实现三角形:

//html 
<div class="triangle-bottom"></div>

//css
.triangle-bottom {
    width:0;
    height:0;
    border-left:50px solid transparent;
    border-right:50px solid transparent;
    border-bottom:50px solid transparent;
}

实现固定比例矩形:

//html
<div class="ratio-box"><div>
//css
.ratio-box {
    background-color:cadetblue:
    //width:100%;
    height:0;
    padding:0;
    //padding-bottom:75%;
}

实现水平居中:

//html
<div class="wrap">
    <div class="h-center"></div>
</div>

//css
.wrap {
    width:100%;
    height:80px;
    border:1px dashed grey;
}

.h-center {
    width:100px;
    height:50px;
    backgrofund-color: navajowhite;
    margin:10px auto;
}

实现渐变框:

//html
<div class="awesome-border"></div>

//css
.awesome-border {
    width:150px;
    height:100px;
    border:8px solid transparent;
    border-radius: 12px;
    background-clip: padding-box, border-box;
    background-origin:padding-box,border-box;
    background-image:
        linear-grandine(to right, #fff, #fff),
        linear-gradient(135deg,#e941ab,#a557ef);
}

在padding,border,margin中只有margin可以设置负值,设置左边或顶部的负外边距,元素就会相应地向左或向上移动,导致元素与它前面的元素重叠,如果设置右边或者底部的负外边距,并不会移动元素,而是将它后面的元素拉过来;

二.布局和定位

常规流布局:

image.png

块级格式化上下文:

格式化上下文的布局规范为

“在一个块格式区域中,盒子会从包含块的顶部开始,按序垂直排列。同级盒子间的垂直距离会由"margin"属性决定。相邻两个块级盒子之间的垂直间距会遵循外边距折叠原则被折叠。

在一个块格式区域中,每个盒子的左外边缘会与包含块左边缘重合(如果是从右到左的排版顺序,则盒子的右外边缘与包含块右边缘重合)。"

我们平时说的BFC是什么呢?

BFC本身是block formatting context的缩写,是一种格式规范。如果说一个盒子是BFC或者有BFC特性,那么BFC表示的是block formatting context root。不管它外部显示类型是什么,但是它的内部显示类型是flow-root,其实就是这个盒子内部形成了一个新的块级格式化上下文。

如何触发一个盒子的BFC特性?

以下条件满足任何一个即可

display: flow-root l inline-block;

position: absolute | fixed;float:

不为none;

overflow:不为visible

外边距塌陷问题

哪些情况会出现外边距塌陷问题:

1.两个兄弟元素之间相邻的上下外边距

2.父子元素之间相邻的上下外边距

3.内容为空元素自己上下外边距相邻

清除外边距的办法

在两个相邻的上下边距之间增加border、padding或者内联元素,使之不相邻;

在父子元素重叠时,除了上述方法,还可以设置父元素为BFC,使得父子不在同级BFC中

image.png

内联级格式化上下文:

“在内联格式区域中,盒子会从包含块的顶部开始,按序水平排列。只有水平外边距、边框和内边距会被保留。这些盒子可以以不同的方式在垂直方向上对齐:可以底部对齐或顶部对其,或者按文字底部进行对齐。我们把包含一串盒子的矩形区域称为一个线条框。

image.png

弹性盒子模型

Flexible Box Layout是为了提供更加高效灵活的布局方式,在即便是宽高未知的情况下,也能排列和分割一个盒子内部的布局。而且在不同布局方向(横向/纵向)的调整更为灵活。

image.png

flex和grid的区别:

flex是一维布局,grid是二维布局

flex是基于内容写的,grid是基于布局写的

flex兼容性好,grid兼容性略差

大面积或整体布局推荐使用grid,小面积或组件可以使用flex灵活使用。

三.层叠上下文

层叠上下文是对HTML元素的三维构想,将元素沿着垂直屏幕的虚构的Z轴排开

形成层叠上下文的条件:

position: relative 或absolute;并且z-index不是auto

position: fixed或 sticky

flex或 grid的子元素;并且 z-index不是auto

opacity 的值小于1

transform的值不为none

will-change的值不为通用值

image.png

编写z-index 的建议: 1,使用css变量或者预处理语言的变量,管理z-index的值 2.将预设间隔设置10或者100,方便后续的插入。

四.变形,过渡,动画

  • transform变形:

2D相关属性:

transform: translate(移动)、rotate(旋转)、scale(放缩)、matrix(变形矩阵)等

transform-origin: right top、center等表示变形时依据的原点

3D相关属性:

transform: translate3d . rotate3d、scale3d、matrix3d等

transform-origin: right top、50px 30px等表示变形时依据的原点

transform-style: flat 或 preserve-3d看子元素的3d表现

perspective:观看点距离z=O这个平面的距离,

可以在transform中用perspective()使用作用为当前元素,也可以直接使用,给后代元素一个统一值 perspective-origin:观看者的位置,如top、bottom等

backface-visibility︰元素正面只有朝向观察者的时候可见

  • transition过渡

通过指定某些元素属性从一种起始状态,在一段时间内以某种变化节奏,过渡到终止状态

  • animation动画

@keyframes 关键帧用来定义动画过程中出现的关键样式 image.png

animation-*相关属性用来为元素添加动画

image.png

如何写动画性能更好?

1.尽量不用触发reflow的属性 2.在遇到性能问题时可以触发硬件加速,比如设置will-change属性、设置transform3d等 3.尽量使用transform和opacity 去写动画

五.响应式设计

媒体查询是CSS3新语法

使用@media查询,可以针对不同的媒体类型定义不同的样式 @media可以针对不同的屏幕尺寸设置不同的样式 当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面 目前针对很多苹果手机、Android手机,平板等设备都用得到媒体查询

@media mediatype and|not|only (media feature){
      css-code;
}

媒体查询允许某些样式只在页面满足特定条件时才生效。我们可以将媒体类型(如 screen、print)以及媒体特性〈如视口宽度、屏幕比例、设备方向:横向或纵向)做为约束条件。

媒体查询同样遵循cascading层叠覆盖原则,min-和max- 选择一个由于设备的多样化逐渐不可枚举,断点的选择尽量根据内容选择 由于断点的增加会增加样式处理的复杂度,所以尽量减少断点

设备像素

设备像素(物理像素)︰显示器上绘制的最小单位,显示屏通过控制每个像素点的颜色,使屏幕显示出不同的图像。

设备像素和设备相关,屏幕从工厂出来那天起,它上面的物理像素点就固定不变了。

image.png

移动端的viewport

布局视口(viewport)是页面中html元素(根元素)的包含块,默认情况window.document.documentElement.clientWidth 就是viewport的宽度。

在移动设备中,默认的布局视口由于历史兼容pc屏幕的原因,并不符合需求,我们经常需要用标签对viewport进行设定,来完成移动端设备的适配。

默认iPhone的viewport可以认为是:

<meta name="viewport" content="width=980">

其中initial-scale,在未设定时,如果width设定了,那么它会自动设置放缩值: initial-scale =屏幕宽度(例子中是390) / 980~ 0.398相比scale=1的时候,缩小了0.398倍

image.png

css预处理器

image.png

scss,less,stylus简单对比:

image.png

postcss机制浅析:

image.png

课程总结:

image.png