Skip to main content

CSS

初识 css

css 全称 Cascading Style Sheets,层叠样式表

修饰网页样式并不是只有 css,当时有个强力竞争对手 svg,但是css层叠性让它脱颖而出

目前 css3 只是某些模块升级到3不是全部,有些模块已经升级到4

官方文档

https://www.w3.org/TR/CSS22/propidx.html

中文文档

https://developer.mozilla.org/zh-CN/docs/Web/CSS

查看 css 属性可用性

https://caniuse.com/

css 属性变成标准 standard需要经过草稿 drafts备选推荐推荐这几个步骤;

谷歌一般会在草稿里看看哪些属性好不好用,好用就支持,而别的浏览器可能不怎么做;

所以有时 css 有些属性出现兼容性问题

css 引入

html 三种引入 css:

  • 内联样式
  • 文档样式表
  • 外部样式表

现代开发网页要结构与样式分离

外部样式表引入

  • link 元素
  • style 元素里@import
<style>
@import url();
</style>

link 效率高一点

css 引入 css

@import url();

css 文件编码

指定单个 css 文件编码

@charset "utf-8";

选择器

  • 通配选择器
  • 元素选择器
  • 类选择器
  • id 选择器
  • 属性选择器
  • 组合
  • 伪类
  • 伪元素

通配选择器

通用属性的设置,比如

 {
margin: 0;
padding: 0;
}

通配符 * ,但是一般列出需要使用这些通用属性的元素,因为*内部原理是在网页元素中做个遍历,给每个元素加上这些样式,这样可能影响网页运行效率,因为有些元素不需要这些属性的

id 选择器

id 名一个页面只能有一个(规范)

类选择器

  • 一个元素可以多个类选择器空格分开
<h2 class="title">123</h2>
.title {
}

伪类选择器

动态伪类

  • :link (a:link 未访问的链接)
  • :visited (a:visited 已访问的链接)
  • :focus (获取焦点时)
  • :hover (a:hover 鼠标移动到)
  • :active (a:active 点击未松手)

同时存在以上属性时,推荐这个顺序,不然会有很多问题

(女朋友看到lv包包后,haha 大笑)

:hover:active 也可以应用到其它元素

应用

去掉 a 元素的焦点状态

a:focus {
outline: none;
}

或者

<a tabindex="-1"></a>

tabindex 可以调整 tab 选中元素的顺序

结构伪类

  • :nth-child() 正着数
  • :nth-last-child() 倒着数
  • :nth-of-type() (例子:p:nth-of-type(2) 只数 p 元素,且是第 2 个子元素
  • :nth-last-of-type()
  • :first-child
  • :last-child
  • :first-of-type
  • :last-of-type
  • :root 代表 html
  • :only-child(父元素中唯一子元素)
  • :only-of-type
  • :empty

否定伪类

  • :not()

除了()

目标伪类

  • :target 用于锚点链接

属性选择器

<style>
[title] {
color: red;
}
</style>
<div title="div">123</div>
<p title="p">111</p>

div 和 p都有title 属性,其它属性同理

元素选择器

<h2>123</h2>
h2 {
}

伪元素选择器

常用伪元素

  • ::before
  • ::after
  • ::first-line
  • ::first-letter

::first-line

第一行

::first-letter

第一个字母

::before

在一个元素的内容之前插入内容

span::before {
content: "123";
color: red;
}
<span>hhh</span>

hhh 前面多出123并且是红色

除了文字,还可以加图片

span::before {
content: url();
color: red;
}
<span>hhh</span>

::after

在一个元素的内容之后插入其它内容

注意

  • 伪元素可以看成是行内元素
  • content属性不能少

组合选择器

后代选择器

div sapn {
}

间接后代和直接后代

子选择器

直接子代

div > span {
}

兄弟选择器

div + span {
}

交集选择器

1.同时符合两个条件的元素:div 元素class="one"

div.one {
}

2.同时符合 3 个条件的元素:div 元素class="one"属性值 title="test"

div.one[title="test"] {
}

并集选择器

只要符合任一条件即可:div 元素class="one"

div,
.one {
}

常用的 css 属性

  • color,文字颜色,前景色更严谨
  • font-size,文字大小
  • background-color,背景颜色
  • width/height,宽高

颜色

rgb 颜色空间

red: 0-255

green: 0-255

blue: 0-255

rgba

red: 0-255

green: 0-255

blue: 0-255

alpha: 0-1 透明度,0 完全透明

16 进制

两个一样写一个,缩小 css 体积

div 的 outline 属性

调试技巧

开发者工具加上这段样式

div {
outline: 2px solid red !important;
}

可以清晰地看出网页的结构,并且可以知道哪一块用的div

line-height

文本的最小行高

行高:两行文字基线baseline之间的间距

image-20220227153104485

行距会等分

应用:

块级元素垂直居中

display

元素类型浏览器赋予的,并且可以更改

display 常见 4 个属性可以更改

  • block 变成块级
  • inline 变成行内级
  • inline-block 变成行内块(同时具备块级和行内级特点)
  • none 隐藏

巩固练习:

  • 邮箱下拉菜单
  • 模拟百度分页列表

visibility

控制元素可见性,有 2 个常用值,

  • visible
  • hidden

区别display: none;,它还占据空间display 不占据

overflow

控制内容溢出的行为

  • visible
  • hidden
  • scroll

cursor

鼠标样式

auto

default 跟随操作系统

pointer 小手

text 竖线

文字省略

三条件:

  • 内容超出不换行(white-space)
  • 内容超出不显示(overflow)
  • 内容溢出结尾省略号(text-overflow)

white-sapce

内容超出是否换行

  • normal 换
  • wrap 不换

text-overflow

设置文字溢出部分行为

  • clip 溢出裁剪
  • ellipsis 溢出那行的结尾省略号表示

前提是 overflow 不为 visible

white-space: wrap;
overflow: hidden;
text-overflow: ellipsis;

文本属性

text-align

元素内容元素中水平对齐方式

  • left
  • right
  • center

text-decoration

装饰文字的装饰线

  • none 去除 a 元素默认下划线
  • underline 下划线
  • overline 上划线
  • line-through 中划线(删除线)

letter-spacing

字母间距

word-spacing

单词间距

text-transform

大小写转化

  • capitalize 首字母大写
  • uppercase 全部大写
  • lowercase 全部小写

text-indent

缩进

列表属性

  • list-style-type 设置li 元素前面标记的样式(none 值用的多)
  • list-style-image
  • list-style-position

表格属性

  • border-collapse

细线表格

<table>
<tr>
<td>单元格1</td>
<td>单元格2</td>
<td>单元格3</td>
<td>单元格4</td>
<td>单元格5</td>
</tr>
<tr>
<td>单元格1</td>
<td>单元格2</td>
<td>单元格3</td>
<td>单元格4</td>
<td>单元格5</td>
</tr>
<tr>
<td>单元格1</td>
<td>单元格2</td>
<td>单元格3</td>
<td>单元格4</td>
<td>单元格5</td>
</tr>
</table>
table {
/* 单元格合并 */
border-collapse: collapse;
}
td {
border: 1px solid #000;
padding: 20px;
}

为什么要进行单元格边框合并?

单元格设置边框时,单元格是紧挨着的,两个单元格会有重叠的部分,本来1px的重叠成2px,因此做出细线表格

border-collapse: collapse;这个属性很重要

表单属性

去除 input 的 tab 键选中效果

input {
outline: none;
}

textarea 禁止缩放

textarea {
resize: none;
}

字体

font-size

字体大小

font-family

字体类型;

与操作系统有关系;

为了防止设置的字体操作系统不存在,一般设置多个,从左往右,找到为止;

font-weight

字体粗细

normal:400

bold:700

font-style

斜体

  • normal
  • italic 用字体的斜体显示(前提是这种字体支持斜体
  • oblique 文本倾斜

网络字体

要想使用 os 没有字体,怎么做?

<div class="box">我是是</div>
@font-face {
/* 命名 */
font-family: "zsf";
/* 路径 */
src: url();
}
.box {
font-family: "zsf";
}

常见字体种类

  • ttf
  • otf
  • eof
  • svg
  • woff

字体图标

阿里巴巴字体图标库

在 font 文件夹里放需要字体

<span>对应字符串</span>
@font-face {
/* 命名 */
font-family: "zsf";
/* 路径,可多个,为了兼容 */
src: url();
}
span {
font-family: "zsf";
}

或者使用附带的css文件(下载字体图标时有),link进来,就可以省去@font-face了,或者

<span class="iconfont icon-arrow"></span>

(可以去掉那对应字符串了,因为那 css 文件设置了伪元素::after,会自动加上图标对应的字符串编码)

使用图片方式比较

img 元素网站重要组成部分
background-image先加载 css 再解析 url;可以使用精灵图减少请求次数
iconfont 字体图标字体图标放大时不会失真;也可以减少请求次数

CSS 特性

  • 继承
  • 层叠

继承性

何为继承?

一个元素要是没有设置某属性值,就继承父元素的值,的话就用自己

可继承的属性

不用死记硬背用多了就熟练了,直接查文档

https://developer.mozilla.org/zh-CN/docs/Web/CSS

那有些不支持继承的属性要是想继承呢?

  • 100%
  • inherit

注意

继承过来的是计算值,而不是字面值,在使用em 为单位就会区别出来了

层叠性

  • css 允许多个相同名字的 css 属性层叠在一个元素上

基本层叠

后面覆盖前面前提同类型选择器)

带权重的层叠

选择器的权重

方便比较,数值不重要

权重高的生效

  • !important 10000
  • 内联样式 1000
  • id 100
  • 类、属性、伪类 10
  • 元素、伪元素 1
  • 通配符 0

比较的话也是从权重大开始比较,有一样权重的就比数量

元素类型

根据元素能不能在同一行显示,html 元素主要分 2 类

  • 块级元素
  • 行内级元素

块级元素

  • 独占父元素一行

常见:div、p、h1-h6、table、form、列表等等

行内级元素

  • 多个行内级元素可以在父元素的同一行中显示

常见:a、img、span、input、button 等等

元素之间的空格

只要是行内级元素之间都会有空格,产生的原因是代码的换行符

较好的解决方法:

给元素加 float

另一种分法

根据内容(是否浏览器会替换掉元素)类型,html 元素可以主要分 2 大类元素

  • 替换元素
  • 非替换元素

替换元素

元素本身没有实际内容浏览器根据元素类型和属性,来决定元素的具体显示内容

常见:img、input、video 等等

非替换元素

与替换元素相反

宽高由内容决定

注意

"行内级元素不能设置宽高"这种说法是不准确

比如常见的img 和 input,可以设置宽高

image-20220228162130204

行内级非替换元素不能生效的属性:

  • width
  • height
  • margin-top
  • margin-buttom

行内级非替换元素特殊的属性

padding的上下(上下多出区域,但不占据空间

border的上下(上下多出区域,但不占据空间

盒子模型

一个元素就是一个盒子

内容 content

min-width 最小宽度,确保内容能正常显示(尽管出现滚动条)

内边距 padding

内边距会撑开盒子

外边距 margin

margin 上下传递

如果块级元素的顶部线父元素的顶部线重叠,那么这个块级元素的margin-top值会传递给父元素

<div class="box1"></div>
<div class="box">
<div class="inner"></div>
</div>
.box1 {
width: 100px;
height: 100px;
background-color: red;
}
.box {
width: 200px;
height: 200px;
background-color: orange;
}
.inner {
height: 100px;
width: 100px;
background-color: purple;
margin-top: 20px;
}

防止 margin 上下出现传递

  • 父元素设置padding-top/padding-bottom
  • 父元素设置border
  • 触发 BFC(最有效)

BFC:block format context,类似于结界

如何触发 BFC?

  • float
  • 设置一个元素overflow为非 visible

建议

  • margin 一般用来设置兄弟元素间
  • padding 一般用来设置父子元素间

margin 上下折叠

垂直方向相邻的 2 个 margin有可能会合并为 1 个 margin,这种现象叫collapse

防止 margin 上下折叠

  • 只设置其中一个元素的 margin

段落之间设置 margin 折叠有妙用

边框 border

边框主要有三种属性:

  • 宽度 width
  • 样式 style
  • 颜色 color

当边框远大于内容大小时,会出现一些有趣的形状

圆角 border-radius

image-20220228204324024

值为50%(这里的**%当前元素(padding+border+width))时,就是圆**

盒子相关属性

box-shadow

盒子阴影

shadow= inset?&&<length>{2,4}&&<color>?
  • <>:表示要具体的值
  • {2,4}:2 到 4 位
  • &&:且,对顺序没要求
  • \?:有或没有

第一个 length:水平方向

第二个 length:垂直方向

第三个 length:模糊半径

第四个 length:延伸距离

阴影练习

text-shadow

文字阴影

类似盒子阴影

box-sizing

盒子尺寸

  • content-box内容盒子(设置宽高时只是指定内容的宽高
  • border-box(设置宽高时是内容+内边距+边框的高度)

背景

background-image

设置元素背景图片

会盖在(不是覆盖)background-color 上面

可以设置多张,默认显示前面一张(其它图片按顺序层叠在下面

img 和 background-image 都可满足需求,开发如何选择?

image-20220301094353346

网页重要组成部分用 img

background-repeat

平铺

  • repeat-x

  • repeat-y

  • no-repeat

  • repeat

background-size

背景图片大小

  • cover 覆盖整个盒子(拉伸图片),不保持宽高比
  • contain 拉伸到较短一边为止,保持图片宽高比
  • 1 个%只是水平方向,2 个%才有垂直

background-position

  • 第 1 个值是水平方向
  • 第 2 个值是垂直方向
  • 如果只有 1 个值,另一个默认 center

css-sprite 精灵图(雪碧图)

是一种 css图像合成技术,将各种小图片合并一张图片上,然后利用 css 的背景图定位来显示对应图片部分

好处

  • 减少向服务器请求数量加快网页的响应速度,并减少服务器压力
  • 减少图片总大小

雪碧图制作:

练习:

京东案例-多快好省

背景居中(无论屏幕大小多少,都能看到中间的主要内容,并且居中显示)

background-attachment

  • local 背景随着 box 内容滚动而滚动
  • scroll 滚动浏览器时全部内容会随着浏览器滚动
  • fixed 背景固定的,不会随着 box 内容滚动而滚动

background 简写

image position/size repeat attachment color

定位

标准流 normal-flow

标准流中,可以使用margin、padding对元素定位

缺点:

  • 设置一个元素margin或者padding,通常会影响标准中其他元素的定位效果
  • 不便于实现元素的层叠效果

可以使用定位实现元素间层叠

position

static

标准流(设置 4 方位的值没意义 )

relative

相对(相对原来的位置,也就是标准流时的定位)

absolute

绝对

原理

检查最近父元素的是不是非 position: static,如果,那就相对于该父元素定位;

如果该父元素没设置 position(也就是static),那就继续往上检查;

如果一直没找到,那就相对浏览器视口定位

子绝父相

希望子元素(absolute)相对于父元素进行定位,又不希望父元素脱标(relative)

绝对定位技巧

绝对定位元素

position 值为absolute 或 fixed的元素

对于绝对定位元素来说:

水平方向:

$$ 定位参照对象的宽度 = left + right + margin-left + margin-right + 绝对定位元素的实际占用宽度 $$

垂直方向:

$$ 定位参考对象的高度 = top + bottom + margin-top + margin-bottom + 绝对定位元素实际占用高度 $$

应用

1.完全占据父元素

out {
position: relative;
width: 600px;
height: 600px;
}
inner {
position: absolute;
left: 0;
right: 0;
}

2.让内容水平居中

out {
position: relative;
width: 600px;
height: 600px;
}
inner {
position: absolute;
width: 200px;
height: 200px;
margin: 0 auto;
left: 0;
right: 0;
}

3.内容垂直居中

out {
position: relative;
width: 600px;
height: 600px;
}
inner {
position: absolute;
width: 200px;
height: 200px;
margin: auto;
top: 0;
bottom: 0;
}

绝对定位练习

考拉练习

fixed

固定(相对浏览器视口,当画布滚动时,固定不动)

固定定位练习

考拉侧栏

元素之间的层叠关系

  • 父子关系
  • 定位元素非定位元素
  • 都是定位元素时,后面的元素会前面的元素

都是定位元素的情况下,要是希望前面的元素盖上后面的怎么做?

z-index

只对定位元素有效

浮动

  • 浮动也会让元素脱标
  • 浮动元素与行内级元素重叠,行内级元素会被浮动元素推出、处于块级的内容也会被浮动元素推出(图文环绕)
  • 行内级元素、inline-block 元素浮动后,其顶部所在行顶部对齐

层叠关系:

标准流元素 < 浮动元素 < 定位元素

inline-block 水平布局的缺陷

  • 垂直有些属性会影响水平布局

  • 父元素空格产生空隙(空隙大小由父元素字体大小决定)

浮动可以解决这个问题

高度坍塌

真实开发父元素高度不确定的(auto),但是浮动会使子元素脱标不再向父元素汇报高度,这时父元素计算总高度时,就不会计算浮动子元素的高度,导致了高度坍塌问题

解决父元素高度坍塌问题的过程,叫清除浮动

清除浮动

空元素加入空白块

<div class="topDiv">
<div class="textDiv">...</div>
<div class="floatDiv">float left</div>
<div class="blankDiv"></div>
</div>
<div class="bottomDiv">...</div>
.topDiv {
width: 500px;
border: 2px solid black;
}

.floatDiv {
width: 100px;
height: 100px;
border: 2px dotted red;
color: red;
margin: 4px;
float: left;
clear: both;
}

.bottomDiv {
width: 500px;
height: 100px;
margin: 5px 0;
border: 2px dotted black;
}

.textDiv {
color: blue;
border: 2px solid blue;
}

.blankDiv {
clear: both;
}

.blankDiv告诉浏览器,左右不允许有浮动的元素存在;

然而,因为浮动元素(.floatDiv位置已经确定,浏览器在计算.blankDiv的位置时,将.blankDiv渲染在浮动元素下方,保证了.blankDiv左右没有浮动元素;

同时可以看出,父元素的高度也被撑起来了,其兄弟元素的渲染也不再受到浮动的影响,这是因为.blankDiv仍然在文档流中,它必须在父元素的边界内,父元素只有增加其高度才能达到此目的;

伪元素加入空白块

.clear-fix::after {
content: "";
clear: both;
display: block;
}

同理

topDiv加上clear-fix 类即可

<div class="topDiv clear-fix">
<div class="textDiv">...</div>
<div class="floatDiv">float left</div>
<div class="blankDiv"></div>
</div>
<div class="bottomDiv">...</div>

浮动布局练习

京东案例

脱标后元素的特点

  • 可以设置宽高
  • 宽高默认由内容决定
  • 不在受标准流束缚
  • 不再给父元素汇报宽高数据

脱标后的元素和 inline-block 有什么区别?

脱标后的元素不是inline-block,而是block,虽然脱标后有时和块级元素在一行,但这是因为脱标后,很难知道父元素是谁(没有父元素了),宽高都是 auto,这时的现象是包裹内容(宽高由内容决定)

形变

transform

  • 旋转 rotate(deg)
  • 倾斜 skew(deg,deg)
  • 平移 tanslate(x,y)
  • 缩放 scale(x,y)

形变原点

transform-origin

过渡动画

transition

给形变加上首帧和尾帧

  • property指定过渡属性(有 transform、width、height、all)
  • duration指定过渡时间
  • timing-function指定动画的变化曲线
  • delay 延迟动画时间

关键帧动画

transition可以进行过渡动画,但是过渡动画只能控制首尾两个值:第一帧最后一帧

要是希望有更多状态(帧)可以使用关键帧动画

<div class="box"></div>
.box {
height: 150px;
width: 150px;
background-color: red;
}
.box:hover {
animation: zsf 2s linear;
}
@keyframes zsf {
0% {
transform: translate(0, 0);
}
25% {
transform: translate(200px, 0);
}
50% {
transform: translate(200px, 200px);
}
75% {
transform: translate(0, 200px);
}
100% {
transform: translate(0, 0);
}
}
  • @keyframes创建规则

  • 百分比设置各阶段动画(形变)from相当于0%to相当于100%

  • 通过animation将动画添加到属性上一般只用三个值(值 1,值 2,值 3):

    值 1:动画名字(@keyframes 创建的规则

    值 2:执行时间

    值 3:动画速率

3D 动画

css 实现 3D 有两个属性:

  • transform-style: perserve-3d
  • perspective

但是 css 实现 3d 有很多兼容性问题

推荐一个 js 实现 3d 的库

three.js

稳定兼容

flex 布局

除了图文环绕flex 完全可以替代 float

两个重要的概念

  • 开启了 flex布局的元素flex container
  • flex container 里面的直接子元素flex items

开启

  • flex 块级
  • inline-flex 行内级
outer {
display: flex;
display: inline-flex;
}

布局模型

flex container 上的 css 属性

应用在 flex container 上的 css 属性

  • flex-flow
  • flex-direction
  • flex-wrap
  • justify-content
  • align-items
  • align-content

flex-direction

默认 flex items 是沿着main axis(主轴)从main start->main end方向排布的

决定主轴方向

有 4 个值:

  • row 默认
  • row-reverse
  • column
  • column-reverse

justify-content

决定了flex itemsmain axis上的对齐方式

flex-start默认,与main start对齐
flex-end
center居中对齐
space-betweenflex items 间距离相等,与 main start 和 main end两端对齐
space-evenlyflex items 间距离相等,且该距离等于flex items到两端距离
space-aroundflex items 间距离相等,且该距离等于flex items到两端距离2 倍

align-content

决定了多行 flex itemscross axis上的对齐方式,用法与justify-content类似

stretch与 align-items 的 stretch 类似
flex-start与 cross start 对齐
flex-end
center居中
space-betweenflex items 间距离相等,与 cross start 和 cross end两端对齐
space-evenlyflex items 间距离相等,且该距离等于flex items到两端距离
space-aroundflex items 间距离相等,且该距离等于flex items到两端距离2 倍

align-items

决定了flex itemscross axis上的对齐方式

normal默认,效果和 stretch 一样
stretchflex itemscross axis方向的sizeauto时,会自动拉伸填充 flex contain
flex-startcross start对齐
flex-endcross end对齐
center居中
baseline基线对齐(第一行作为基线)

flex-wrap

默认情况,所有flex items都会放在一行显示

no-wrap默认
wrap换行
wrap-reverse在交叉轴反转

flex-flow

flex-direction || flex-wrap简写

顺序任意

flex items 上的 css 属性

  • flex
  • flex-grow
  • flex-basis
  • flex-shrink
  • order
  • align

order

决定 flex items 的排布顺序,值越,排越

  • 默认是 0

align-self

通过 align-self覆盖 flex container设置的align-items

  • auto 默认,遵从 flex container 的 align-items
  • stretch、flex-start、flex-end、center、baseline 效果跟 align-items 一样

flex-grow

决定了 flex items 如何拓展

  • 默认值 0
  • flex containermain axis方向上有剩余 size时,flex-grow属性才会有效
  • flex-grow 总和大于等于 1时,等比拓展(加上乘以 size 的值,用完剩余 size);小于 1时,各自乘以小数(有剩余 size)

flex-shrink

决定了 flex items 如何收缩

  • 默认 1
  • 当 flex items 在main axis方向上超过了flex containersize时(oversize),flex-grow属性才会有效
  • 当 flex items 的**flex-shrink 总和大于 1 时,**等比收缩(减去乘以 oversize 的值);小于 1 时就用得少,因为还是溢出

flex-basis

决定flex itemsmain axis主轴上的base size

  • auto 自身宽/高
  • 具体值

决定 flex items 在 main axis 主轴上的 base size 的优先级

  • max-size...
  • flex-base
  • size
  • 内容本身的 size

flex

是 flex-grow || flex-shrink || flex-basis 的简写

网格布局

容器

元素上声明 display:griddisplay:inline-grid 来创建一个网格容器

这个元素的所有直系子元素将成为网格项目

网格轨道

网格上任意两条相邻线之间的空间;

可以使用 grid-template-rowsgrid-template-columns 属性定义网格上的行和列,这些属性定义了网格轨道

基本示例

<div class="wrapper">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>
.wrapper {
display: grid;
grid-template-columns: 200px 200px 200px;
}

image-20240924150641745

三个200px的轨道

fr单位

代表网格容器中可用空间的x等分;

比如三等分可以这样写:

.wrapper {
display: grid;
grid-template-columns: 1fr 1fr 1fr;// 也可以写成 repeat(3, 1fr);
}

image-20240924151041114

repeat表示重复模式,上面表示以一个轨道1fr的模式,重复3次;

它还支持传入轨道列表;

grid-template-columns: repeat(5, 1fr 2fr);

这个则表示,共10个轨道,一个1fr轨道后面跟一个2fr轨道的模式,重复5次;

轨道高度

默认情况下,轨道会自动调整大小,取决于轨道内的内容;

grid-auto-rows 可以指定轨道高度

.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 200px;
}

image-20240925085745293

弹性和绝对宽度

.wrapper {
display: grid;
grid-template-columns: 500px 1fr 2fr;
}

minmax

创建的行高度最小为 100 像素,最大为 auto,将取决于内容的大小;

<div class="wrapper">
<div></div>
<div>

<p>这里有更多内容。</p>
<p>使得这里高于 100 像素。</p>
</div>
<div></div>
<div></div>
<div></div>
</div>
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: minmax(100px, auto);
}

image-20240925091405544

网格间距

.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
column-gap: 10px;
row-gap: 1em;
}

以上列与列之间创建了 10 像素的间隙,在行与行之间创建了 1em 的间隙

现代浏览基本支持无前缀,如果不生效,可以加上grid前缀,如grid-row-gap

移动端适配

视口

meta

  • name
  • content
<meta name="viewport" content="width=device-width, initial-scale=1.0" />

rem 适配

root em,rem 总是相对于html 的 font-size

原理

如何做移动端适配的?

  1. 根据不同手机屏幕,设置不同 html 的 font-size大小
  2. 将所有需要适配的图片、元素、字体大小的单位,统一用 rem

如何根据不同手机屏幕,设置不同 html 的 font-size 大小?

2 种做法:

  • 媒体查询
  • js 动态计算(用的最多)
动态计算 rem 值

如何直接根据html 的 font-size大小动态的计算出对应的rem值?

  • vscode 插件 px to rem(快捷键 Alt+Z)(不推荐)
  • postcss-pxtorem 插件(响应式项目,移动端用了 px 包转 rem,pc 端样式用 /*no*/ 声明该样式不转 rem)
  • 利用 less 的计算能力(可以定义变量计算

less需要转化成 css才能生效,而转化成 less 有 2 种方案:

  • easy less 插件(写完保存)
  • node 安装(npm)

媒体查询

/* ipone5 320px*/
@media screen and (min-width: 320px) {
html {
font-size: 9px;
}
}
/* ipone6 375px*/
@media screen and (min-width: 375px) {
html {
font-size: 10px;
}
}
/* ipone6 plus 414px */
@media screen and (min-width: 414px) {
html {
font-size: 11px;
}
}

js 动态计算

学会引入即可

文字大小单位

px像素
em相对于父元素字体的大小,2em 就是2 倍父元素字体大小
%相对于父元素的字体

宽度

px像素
em自己设置 font-size,那就相对于自己的 font-size;没有相对父元素的 font-size
%父元素宽度

常见技巧

水平居中

<div class="box">...</div>

普通文本、行内级元素

.box {
text-align: "center";
}

行内块级元素

.box {
text-align: "center";
}
选择器 {
display: inline-block;
}

块级元素没有宽高时

他占据了父元素整个宽

.box {
text-align: "center";
}
选择器 {
没有宽高
}

父元素一样宽高的元素,给他父元素设置 text-align: "center";没有意义,但是由于继承了父元素属性,也可以使其内容居中

块级元素即使有宽高

也占据了父元素整个宽(独占一行)

.box {
text-align: "center";
}
该盒子选择器 {
宽高
}

父元素一样宽高的元素,给他父元素设置 text-align: "center";没有意义,但是由于继承了父元素属性,也可以使其内容居中,但该盒子不会相对父元素居中,只是该盒子的内容在该盒子里居中

怎么让该盒子在父盒子里水平居中呢?

该盒子选择器 {
margin: 0 auto;
}

原理

垂直方向可以用auto居中吗?

不可以,垂直意味着父元素高度auto,而父元素高度 auto 的话,那父元素高度是内容撑起来的,也就没有垂直居中之说;

为什么水平方向可以呢?

因为不给父元素设置宽度,它的值是auto,这样子元素的margin 左右设置auto就可以等分

注意margin-top的**%参照的是宽度不是高度**

margin 负值

进行布局时,同一行多个元素摆放后,设置margin-right让他们之间产生间距,那么最后一个元素设置的 margin-right 总是多余

解决方法

  • 每一行的最后一个元素,总是加一个 class,去除 margin-right
  • 伪类选择器(会有兼容性问题)
  • .outer 固定宽度=.inner+负 margin(最优)

补充

浏览器的私有前缀

为什么要加浏览器前缀?

为了兼容。。。

如何加上浏览器前缀?

打包工具会帮我们添加上去,无需手动

css 属性使用经验

设置的 css 属性不生效

  • 选择器优先级低
  • 选择器没选中
  • 使用形式不对
  • 浏览器不支持该属性

多使用开发者工具调试

好看的颜色网站:

https://flatuicolors.com/

爬取数据技巧

斗鱼 f12 切换成移动到 刷新 network

fetch/xhr 复制链接地址在别的窗口打开,会有 json 格式的数据

预处理器

less

&&

类似于&,父选择器

属性

gap

gap 是 CSS 中 Flexbox 和 Grid 布局中的属性,用于设置子元素之间的间距。它是 row-gapcolumn-gap 的缩写,用于定义 Flexbox 容器或 Grid 容器中行和列之间的间距。

flex

.flex-container {
display: flex;
gap: 10px; /* 设置子元素之间的间隔为10像素 */
}

grid

.grid-container {
display: grid;
gap: 10px; /* 设置子元素之间的间隔为10像素 */
}

inset

用于设置元素偏移的新属性,它是 toprightbottomleft 属性的集合。

element {
inset: top right bottom left;
}

样式积累

子元素写>与不写的区别

li>a

表示 li 的直接子元素 a

li a

表示 li 的间距子元素(有可能是子孙)

flex 控制顺序

order,数字越小越靠前;

遮罩层

<div class="container">
<!-- 其他内容 -->
<div class="overlay"></div>
</div>
/* 初始时,遮罩层不可见 */
.overlay {
display: none;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5); /* 半透明黑色背景 */
}

/* 当包含遮罩层的容器被悬停时,显示遮罩层 */
.container:hover .overlay {
display: block;
}

/* 假设要悬停的元素位于一个包含遮罩层的容器中 */
.container {
position: relative;
width: 300px;
height: 200px;
background-color: #ccc;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>

</style>
</head>
<body>



</body>
</html>

hint 效果

.hint {
background-color: #f5f7f9;
border-radius: 4px;
border: 1px solid #dcdcdc;
border-left: 4px solid #346ddb;
padding: 20px;
margin: 10px 0;
}

使用

<div class="hint" markdown="1"></div>

白天/黑夜模式切换,匹配内容不同样式

方案一

两种文件,监听切换事件,切换 link 的 href

假设是 react

import React, { useState } from "react";

const ExamplePage = () => {
const [isDarkMode, setIsDarkMode] = useState(false);

const handleModeChange = () => {
setIsDarkMode(!isDarkMode);
const themeLink = document.getElementById("theme-link");
themeLink.href = isDarkMode ? "/path/to/light.css" : "/path/to/dark.css";
};

return (
<div>
<h1>Example Page</h1>
<button onClick={handleModeChange}>
{isDarkMode ? "Switch to Light Mode" : "Switch to Dark Mode"}
</button>
</div>
);
};

export default ExamplePage;

使用了 React 的 useState 钩子来管理当前的模式状态,初始状态为白天模式(isDarkModefalse);

handleModeChange 函数会在按钮点击时触发,它会根据当前模式状态切换到相应的模式,并更新样式文件的链接。

接下来,你需要在你的项目中的某个布局文件(比如说是 src/theme/Layout.js)中添加以下代码,以引入样式文件:

import React from "react";

const Layout = () => {
return (
<div>
<head>
<link id="theme-link" rel="stylesheet" href="/path/to/light.css" />
</head>
{/* 布局的其他内容 */}
</div>
);
};

export default Layout;

在上述代码中,我们在 <head> 元素中添加了一个带有 id"theme-link" 的链接标签,初始时它的 href 属性指向白天模式的样式文件。

现在,当你在浏览器中打开该示例页面时,你会看到一个标题和一个切换模式的按钮。点击按钮时,样式文件的链接将会根据当前模式状态切换。

需要将 /path/to/light.css/path/to/dark.css 替换为实际的样式文件路径。

方案二

使用 html 的属性切换(data-theme)

这是 light 模式下

.hint {
background-color: #f5f7f9;
border-radius: 4px;
border: 1px solid #dcdcdc;
border-left: 4px solid #346ddb;
padding: 20px;
margin: 10px 0;
}

这是 dark 模式

html[data-theme='dark'] .hint {
background-color: #a1bba8;
border-radius: 4px;
border: 1px solid #dcdcdc;
border-left: 4px solid #346ddb;
padding: 20px;
margin: 10px 0;
}

修改滚动条背景

::-webkit-scrollbar-track: transparent;

样式文件

  • 如果在元素里找不到应该出现的类,那很有可能没有导入样式文件;

背景图

  1. JPEG(.jpg):
    • 适用于照片和图像,特别是具有丰富颜色和渐变的图像。
    • 支持压缩,可以减小文件大小,但可能会降低图像质量。
    • 不支持透明度。适用于不需要透明背景的情况。
  2. PNG(.png):
    • 适用于具有透明度(透明背景)需求的图像,如图标和图形。
    • 支持无损压缩,图像质量不会受损。
    • 文件大小通常较大,对于复杂的图像可能不是最佳选择。
  3. GIF(.gif):
    • 适用于简单的动画和图像,如小图标和动画徽标。
    • 支持透明度和动画。
    • 文件大小相对较小,但色彩深度有限。
  4. WebP(.webp):
    • 一种现代的图像格式,支持无损和有损压缩。
    • 通常提供较小的文件大小和较好的图像质量。
    • 适用于网页性能优化。
  5. SVG(.svg):
    • 适用于矢量图形,如图标和简单的图形,而不是照片。
    • 可无限缩放而不失真,因为它们是基于矢量的。
    • 通常是文本文件,因此文件大小较小。

当选择背景图像格式时,考虑图像的内容、质量需求和性能要求。对于照片背景,JPEG 通常是一个不错的选择。对于需要透明度的图像,PNG 可能更合适。对于图标和图形,SVG 或 WebP 可能是更好的选择,以提供较小的文件大小和高质量。根据您的具体需求,您还可以选择其他格式。

超出内容省略号

display: -webkit-box;
overflow: hidden;
text-overflow: ellipsis;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
word-wrap: break-word; /* 兼容性设置,用于处理长单词或URL的换行 */

动画

使用 json 渲染动画(react 项目)

1.安装 lottie 库

npm install lottie-react

2.使用

import React from "react";
import Lottie from "lottie-react";

function MyLottieAnimation() {
return (
<div>
<Lottie
options={{
animationData: yourAnimationData, // JSON动画数据
loop: true, // 是否循环播放
autoplay: true, // 是否自动播放
}}
/>
</div>
);
}

export default MyLottieAnimation;

疑难杂症

背景图片展示部分区域

修改某个库的动画效果

比如修改 antd 消息弹出框的动画细节(入场时间、退场时间等等)

固定宽度文本换行

max-width 属性

如何覆盖掉第三方模块中样式里的变量值?

在 index.css 中使用:root 伪类选择器(匹配 html 元素),重新设置该变量的值。

img 不受盒子高度拉伸?

 {
object-fit: contain;
}

保持图像的纵横比,确保整个图像都可见,图像将被缩放以适应容器。

而 cover,保持图像的纵横比,尽量填充整个容器,图像将在垂直或水平方向上被裁剪

如何覆盖掉用户代理样式表中输入框自动填充后的样式

@rjsf 中的 form 组件

有个注意点

https://rjsf-team.github.io/react-jsonschema-form/docs/api-reference/form-props#children

当有这样的样式:

position: relative;
&:after {
content: "";
top: 0;
left: 0;
right: 0;
bottom: 0;
position: absolute;
}

触发 form 提交事件时,校验不会触发(去掉这段样式则可以)。 这是为何?

原图片很小,盒子宽高很大导致图片很模糊