CSS
CSS
层叠样式表,用于控制所有显示的表现。网页事实上是多层的结构,CSS可以控制每一层的样式,显示给用户的是最上层的样式。
样式表
CSS基本语法包括选择器和声明块。选择器可以选择页面中的指定元素,如p{}
选中全部<p>
标签。声明块指定选择器元素的样式,由多条声明组成,每个声明是一个名值对,使用name: value;
。
可以使用内联样式,在style的属性值修改样式,这是CSS的语法。内联样式不统一,不便于维护。
1 | <p style="color: green;font-size: 50px;"> |
绿色50像素
可以在<head>
里将样式写到<style>
中作为内部样式表,对整个网页起作用,<style>
标签内的区域属于CSS语法,不与HTML混合。CSS选择器可以选择相应的元素。
1 | <style> |
外部样式表允许在多个网页里使用样式,将CSS样式编写到外部CSS文件中,然后通过<link>
引入到网页中。CSS文件可以使用浏览器的缓存机制,加快网页的加载速度。
1 | <link rel="stylesheet" href="style.css"> |
像素
物理像素由显示器决定,但在CSS像素中的使用的都是CSS像素,浏览器会将CSS像素转换为物理像素,PC端默认情况下两者等大。移动端的视口宽度一般为980px,使得其可以完整浏览PC端网站。不过最好还是实现移动端网站。
视口是显示的范围,是网页的窗口,放大网页时视口变小。在<head>
中设定视口的大小,不同设备的最佳视口大小不同,下面表示将视口调整到完美视口。
1 | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
由于不同设备最佳视口大小不同,不能使用px作为单位了,可以使用vw,100vw相当于视口宽度。可以考虑使用rem进行适配:将设计图中的1px的vw设为rem,随后使用rem作为单位,直接使用设计图中的px单位即可。注意某些浏览器可能会限制rem最小为12px,可以将rem的数值乘以10或100等。
选择器
常用选择器
- 元素选择器
- 根据标签名选择元素,如
p{}
- id选择器
- 根据id选择一个元素,如
#id{}
- 类选择器
- 根据class选择元素,class可以重复,也允许一个元素使用多个class,多个class间使用空格隔开,如
.class{}
- 通配选择器
- 选择全部元素,使用
*{}
集合选择
1 | .blue{ |
关系选择
- 子元素选择器
- 父元素 > 子元素
- 后代元素选择器
- 祖先元素 后代元素
- 下一个兄弟选择
- 前一个 + 后一个
- 后边所有兄弟选择
- 兄 ~ 弟
属性选择器
[属性]{}
表示包含某属性的元素[属性=值]
表示某属性为某值的元素[属性^=值]
表示某属性以某值开头的元素[属性$=值]
表示某属性以某值结束的元素[属性*=值]
表示某属性包含某值的元素
伪类选择器
某些特殊状态的元素可以被划分在一类中,相当于有了类标签,被称为伪类,伪类以一个’:’开头表示。
-child系列和-of-type系列用于表示和位置相关的元素。
1 | /* 第一个子元素 */ |
以下两个伪类常用于超链接。
:link
一般的链接:visited
访问过的链接,只能修改颜色
以下是两个和鼠标相关的伪类。
:hover
鼠标移入的:active
鼠标点击的
伪元素选择器
和伪类类似,相当于给特殊位置的文本增加了标签。伪元素使用’::’开头。
::first-letter
首字母::first-line
首行::selection
鼠标选中的::before
元素的开始位置(首元素之前)::after
元素的结束位置(伪元素之后)
::before和::after设置的是content增加的内容,这是CSS的语法。1
2
3
4div::before{
content: '「';
color: red
}
继承
父元素的样式会继承到后代元素中,背景、布局等相关的样式不会继承,text-
,font-
,line-
,list-
和color
可以继承。
选择器权重
不同选择器选择相同的元素时,样式发生冲突时,选择器存在优先级,选择器越具体优先级越高。优先级相同的使用靠后的。
- 内联样式 1,0,0,0
- id选择器 0,1,0,0
- 类和伪类选择器 0,0,1,0
- 元素选择器 0,0,0,1
- 通配选择器 0,0,0,0
- 继承 没有优先级
在某一样式后加!important
可以设置为最高的优先级,慎用。
文档流
文档流是最底层,是网页的基础,创建的元素默认都是在文档流中排列。元素主要由两个状态主要有两个状态,就是在文档流中和脱离文档流。
元素在文档流中的特点
- 块元素
- 块元素在页面中独占一行
- 默认宽度等于父元素宽度
- 默认高度等于子元素高度
- 行内元素
- 行内元素不会独占一行
- 行内元素在页面中自左向右水平排列,自动换行
- 行内元素的默认宽度和高度由子元素确定
盒子模型
CSS将页面中的所有元素都设置为矩形的盒子。盒子包括内容(content)、边框(border)、内边距(padding)和外边距(margin)。
边框
1 | .box1{ |
边框属性主要有
- border-width
- 边框宽度
- border-color
- 边框颜色,默认使用
color
值 - border-style
- 边框样式,包括
solid
实线、dashed
虚线、dotted
点线、double
双线,默认值为none
可以为四边分别设置属性,如border-width=10px 20px 30px 40px
,顺序为上、右、下、左。左侧缺少时使用右侧,下侧和左侧缺少是使用上侧。
可以直接使用border: 5px gray solid
。
可以分别使用border-top
或border-top-width
。
内外边距
内边距使用padding
,其可以影响盒子的大小,默认使用内容的背景颜色。
1 | .box1{ |
padding
可也以使用padding-top
等标签。盒子的可见框大小由边框、内边距和内容区确定。
外边距使用margin
,使用方法与内边距类似。
margin
允许负值。垂直方向的外边距可以重叠,兄弟元素的边距取两个外边距的最大值,如果边距存在负值,则边距取两者之和,两个均为负值取绝对值较大者。
父子元素的相邻外边距,子元素的外边距会传递给父元素。如果出现布局问题,可以考虑clearfix。
盒子的其它属性
box-sizing
属性确定width
和height
属性控制的是内容区content-box
(默认值)还是可见区border-box
。
outline
是轮廓,和border
类似,但不影响盒子的布局。
box-shadow
设置阴影,不影响盒子的布局。用例box-shadow: 20px 20px 20px rgba(0,0,0,.3)
,指定右偏移、下偏移、边缘虚化和阴影颜色。
border-radius
设置圆角,顺序为左上开始的顺时针。可以使用border-top-left-radius
等。可以设置椭圆角,如border-top-left-radius: 20px 40px
或border-radius: 20px / 40px
,前者为水平半径,后者为垂直半径。
1 | .box1{ |
無限
星にもまた始まりはあるが自らの力を持って滅び行く
有限
叡智を持つ者こそ最も愚かであるのが歴史からも読み取れる
海に生ける魚は陸の世界を知らない
彼らが叡智を持てばそれもまた滅び行く
人間が光の速さを超えるのは
魚たちが陸で生活を始めるよりも滑稽
これは
そんな神からの最後通告に抗った者たちによる
執念のエピグラフ
布局
子元素在父元素中的水平布局,必须保证子元素范围撑满父元素内容区的宽度,浏览器会将不足者默认调整margin-right
。可以设置margin-left
、margin-right
、width
为auto
,其会充当被调整项。如果有多个auto
,width
优先调整。而margin-left
和margin-right
默认平分。width
的默认值是auto
。
1 | .inner{ |
在垂直布局上,可能出现子元素溢出父元素,可以在父元素中设置overflow
属性,处理这种溢出。默认为visible
,hidden
将溢出部分裁剪,scroll
生成滚动条,auto
根据需求生成滚动条。
overflow-x
和overflow-y
分别处理水平方向和垂直方向的溢出属性。
玩家拉下拉杆在两个边沿都是同步的;而中继器激活在两个边沿都是 非同步的。
玩家按下按钮是玩家的动作,在上升沿是同步的;而按钮弹回是自行弹回,在下降沿是非同步的。拌线钩也是同样的道理。
玩家放置和破坏一个红石块在两个边沿都是同步的;而放置中继器时,中继器并不会立刻被激活,稍后中继器激活给出的是一个非同步的上升沿信号,破坏一个激活的中继器则会给出同步的下降沿信号。
这一点甚至表现在:玩家输入指令给出的信号是同步的,命令方块给出的信号是非同步的。
行内元素的盒子模型
行内元素不支持width
和height
,宽度和高度由内容确定。垂直方向的padding
和margin
不会影响布局,水平方向不会重叠。
可以设置元素的显示类型,使用display
属性。
inline
行内元素block
块元素inline-block
行内块元素,可以设置宽度和高度,又不会独占一行,类似图片。table
表格none
不显示
visibility
控制元素的可视程度,默认为visible
,hidden
为不可见,但占据位置。
1 | a{ |
重置样式表
浏览器有着默认样式,默认样式的存在有可能影响页面的布局,一般将默认样式去除。
1 | *{ |
浮动&clearfix
float
可以用float
设置浮动(left
或right
),浮动元素脱离文档流。浮动元素不会盖住文字,文字会环绕浮动元素。浮动元素会遮住非浮动元素,但不遮住其他浮动元素,且不会脱离父元素。
脱离文档流的元素不再占用文档流的位置,不再自动修改外边距以占满父元素宽度。行内元素脱离文档流后变为块元素,元素不再区分行内元素和块元素。
浮动诞生的本意是引入文字环绕,后来更普遍用于布局。
1 |
|
1 | .header, .footer { |
header
middle
middle-content
left
left-content
right
right-content
高度塌陷
浮动元素可能出现高度塌陷的问题,当父元素高度为auto时,浮动子元素无法将其撑开。
1 | .outer{ |
BFC
合理的高度塌陷解决方案是BFC(块级格式化环境)。BFC是CSS的一个隐含属性,开启BFC后该元素会变为一个独立的布局区域。开启BFC后,元素不会被浮动元素覆盖,子元素和父元素的外边距不会重叠,可以包含浮动的子元素,从而解决高度塌陷。
开启BFC的方式有:
- 开启浮动(不推荐)
- 设置为行内块元素(不推荐)
- 将
overflow
设置为非visible
,常用的是hidden
1 | .outer{ |
clear
clear
属性可以清除浮动元素的效果,可以设置left
、right
或both
。原理是浏览器自动计算,为元素添加一个外边距。
1 | .box1, .box2 { |
现在用clear
解决高度塌陷。
1 | .outer{ |
外边距异常
由于子元素外边距会传递给父元素,会出现外边距异常的问题。
1 | .outer{ |
预期效果:
BFC解决方案:
1 | .outer{ |
伪元素解决方案:
1 | .outer{ |
clearfix类
针对上述问题的解决方案是:
1 | .clearfix::before, |
定位
定位是一种更加高级的布局手段。使用position
属性,取值有:
- static:默认值,不开启定位
- relative 相对定位
- absolute 绝对定位
- fixed 固定定位
- sticky 粘滞定位
开启定位后,使用偏移量进行定位,包括top
,bottom
,left
,right
。
相对定位
相对定位通过相对于自身在文档流的位置的偏移量来进行定位。相对定位后,元素层级提高,会盖住其他元素。相对定位不会使元素脱离文档流,不会改变元素的性质。
绝对定位
绝对定位使得元素脱离文档流,绝对元素会使元素层级提升。绝对定位相对于其包含块进行定位,正常情况下包含块是当前元素最近的祖先块元素,绝对定位的包含块要求开启定位。如果没有开启定位的祖先块,元素相对于根元素进行定位。
开启绝对元素后,仍然需要保证元素布局撑开,此时若没有auto
则自动调整right
。left
和right
默认为auto
。垂直方向也必须满足撑开规则,此时会自动调整bottom
。
1 | .outer{ |
固定定位
固定定位是一种特殊的绝对定位,唯一区别在于其相对于视口进行定位,不随滚动条而移动。
粘滞定位
粘滞定位是一种特殊的相对定位,但其保证其不会移出相对于视口的某位置。
层级
元素的层级由z-index
属性指定,值越高层级越大,显示时显示在上层。层级相同时靠后的元素显示在上层。祖先元素即使设置层级,也没有办法盖住后代元素。
字体
文本属性
color
设置前景色,一般是指字体颜色。font-weight
,字重,一般用bold
加粗,默认为normal
。font-style
,可以设置斜体italic
。line-height
,行高指文字占有的高度。可以设置像素或整数,整数表示字体高度的倍数,默认行高为1.33。字体框会在行高内垂直居中。font-size
设置字体大小。font-family
指定字体族,有五种预选值serif
(衬线字体)、sans-srrif
(非衬线字体)、mono-space
(等宽字体)、cursive
、fantasy
。
一般这样写:会从前至后选择可用的字体。1
font-family: 'Courier New', 'Courier', monospace;
允许用户从服务端使用字体,@font-face
需要注意版权问题。
1 | <style> |
可以简写
1 | font: bold italic 50px/2 'Courier New', 'Courier', monospace; |
text-align
水平对齐,可选left
,right
,center
,justify
。vertical-align
垂直对齐,可选baseline
(默认基线对齐),top
,bottom
,middle
,也可以输入值。
图片也默认使用基线对齐,这时可以使用vertical-align
确保图片与父容器贴合。
text-decoration
可选none
(默认),underline
,upperline
,line-through
。white-space
设置网页如何处理空白,可选值normal
,nowarp
不换行,pre
保留空白。text-indent
设置首行缩进,可以用很大的负值来隐藏文字。text-overflow
设置字体溢出,ellipsis
设置省略号。
1 | .box{ |
图标字体
将小的图标设计为字体,便于放大缩小和上色,图标是使用@font-face
引入的。
引入Font Awesome:
1 | <link rel="stylesheet" href="fontawesome-free-5.12.1-web/css/all.css"> |
使用图标字体的形式有三种:
类的形式:
1 | <i class="fab fa-weixin"></i> |
编码的形式:
1 | <style> |
实体的形式:
1 | <span class="fas"></span> |
引入Iconfont:
1 | <link rel="stylesheet" href="font_1651721_osdsotfjous/iconfont.css"> |
使用:
1 | <span class="iconfont"></span> |
背景
背景图
background-color
可以设置纯色背景颜色。可以用background-image
设置背景图片,可以同时设置这两者。
background-repeat
设置背景图片重复方式,默认为repeat
(平铺),repeat-x
,repeat-y
,no-repeat
。
background-position
设置背景图片的位置,如background-position: top center;
也可以直接使用偏移量。
background-clip
设置背景颜色的作用范围,默认为border-box
,padding-box
,content-box
。
background-origin
设置背景图片的原点,默认为padding-box
,border-box
,content-box
。
background-size
设置背景图片的大小,可选cover
(比例不变,将元素铺满),contain
(比例不变,确保完整),也可以直接设置值。
background-attachment
确定背景图片是否随滚动条滚动,默认为scroll
,可选fixed
。
背景也具有简写background
,需要注意必须先写origin再写clip,格式要求“position/size”。
将多个小图片合并成大图片,再通过background-position
切换,可以有效解决切换图片时的加载延迟问题。这种技术被称为CSS-Sprite(雪碧图)。
渐变
background-image: linear-gradient(red, yellow)
background-image: linear-gradient(to right, red, yellow)
background-image: linear-gradient(45deg, red, yellow)
background-image: linear-gradient(.875turn, red, yellow)
background-image: linear-gradient(red, yellow, green)
background-image: linear-gradient(red, yellow 30px, green)
background-image: repeating-linear-gradient(red 15px, yellow 40px)
background-image: radial-gradient(red, yellow)
=background-image: radial-gradient(ellipse, red, yellow)
background-image: radial-gradient(circle, red, yellow)
background-image: radial-gradient(30px 50px, red, yellow)
background-image: radial-gradient(50px 50px at 0 0, red, yellow)
background-image: radial-gradient(farthest-side at 0 0, red, yellow)
background-image: radial-gradient(closest-corner at 25px 25px, red, yellow)
background-image: repeating-radial-gradient(red 0px, yellow 20px)
background-image: repeating-radial-gradient(30px 40px, red, yellow)
表格
表格和块元素类似,但是可以设置width
。
表格整体和单元格也都可以设置边框,border-spacing
可以设置边框间距,如果希望单元格之间的边框重合,可以使用border-collapse: collapse
。
1 | table{ |
动力铁轨数\矿车类型 | 非运矿车 | 货运矿车 | 客运矿车 | 动力矿车 |
1 | 单格模型 | 多格模型 | ||
多格(未达到阈值) | 多格模型 | |||
多格(达到阈值) | 不存在 | 阈值模型 | 不存在 |
1 | table{ |
动力铁轨数\矿车类型 | 非运矿车 | 货运矿车 | 客运矿车 | 动力矿车 |
1 | 单格模型 | 多格模型 | ||
多格(未达到阈值) | 多格模型 | |||
多格(达到阈值) | 不存在 | 阈值模型 | 不存在 |
设置隔行变色,可以使用伪类选择器。
1 | tr:nth-child(2n){ |
事项 | 支付方式 | 价格 |
---|---|---|
早餐 | 微信 | 6.00 |
午餐 | 支付宝 | 12.00 |
饮料 | 微信 | 4.50 |
晚餐 | 支付宝 | 6.80 |
雪糕 | 微信 | 10.00 |
图书 | 微信 | 51.00 |
元素的垂直居中也可以使用如下的方式,display: table-cell
将元素设为单元格,于是可以使用vertical-align
。
1 | .box1{ |
以前的页面布局经常使用表格,但现在不常用了。
动画
过渡
transition:
指定过渡时间,参数分别指定过渡的属性和时间。过渡需要具体数值才能计算,不能向auto
过渡。
1 | .box{ |
transition
是简写属性:
transition-property
指定过渡的属性,多个属性使用逗号隔开,all
表示全部属性。transition-duration
指定过渡所需时间,单位为s
或ms
,可以对不同属性指定不同的时间,用逗号隔开;transition-timing-function
表示过渡的时序函数,默认为ease
慢入慢出,linear
匀速运动,ease-in
慢入,ease-out
慢出,ease-in-out
慢入慢出。是时序函数使用贝赛尔曲线,可以用cubic-bezier()
表示。也可以指定steps()
,表示分若干步移动,第二个参数默认为end
,表示在时间结束时执行移动,start
表示在开始时执行。transition-delay
表示延迟。
1 | .box2{ |
动画
动画和过渡类似,可以实现动态效果,动画可以自动触发。设置动画效果,必须使用@keyframes
设置关键帧,其中from
和to
表示0%和100%。
1 | @keyframes move{ |
animation-name
动画使用的关键帧名。animation-duration
动画执行的时间。animation-delay
动画的延迟。animation-timing-function
动画执行的时序函数。animation-iteration-count
动画执行的次数,可选infinite
。animation-direction
动画执行的方向,默认为normal
,reverse
反向运行,alternate
会在重复执行时返回,alternate-reverse
反向重复执行并返回。animation-play-state
设置动画的运行状态,默认为running
,pause
为暂停。animation-fill-mode
,动画的填充模式,默认为none
,动画执行完毕回到原位置,可选forwards
,动画执行结束后停在结束位置,backwards
动画延迟等待时处于动画开始位置。both
结合了forwards
和backwards
。
变形
通过CSS改变元素的形状和位置,不会影响页面的布局。使用transform
,在其后使用函数。
translateX()
沿X轴平移,百分比相对于自身,下同。translateY()
沿Y轴平移。translateZ()
沿Z轴平移。
可以用translate
实现居中。
1 | .box{ |
块悬浮效果:
1 | .box:hover{ |
网页默认不支持透视,可以用perspective
给网页设置视距,。
rotateZ()
以Z为轴顺时针旋转。rotateX()
以X为轴顺时针旋转。rotateY()
以Y为轴顺时针旋转。
当元素旋转后,坐标轴也一同旋转。
backface-visbility
设置背面是否可见。
不以中心旋转的物体,可以在外面套一个容器。
transform-origin
可以设置变形操作的原点。
设置transform-style: preserve-3d
,可以保证父元素及子元素作为一个整体的3d物体进行操作。
scaleY()
表示X轴缩放。scaleY()
表示Y轴缩放。scale()
表示XY轴缩放。scaleZ()
表示Z轴缩放,必须对3D物体使用
## 弹性盒
弹性盒也是css中的布局手段,主要用于代替浮动。移动端效果较好,PC端有个别兼容性问题。
要使用弹性盒,必须将元素设置为弹性容器,使用display: flex
或display: inline-flex
。弹性容器的直接子元素叫做弹性元素。一个元素可以同时是弹性容器和弹性元素。
1 | ul{ |
- 1
- 2
- 3
弹性容器
flex-direction
指定弹性容器中弹性元素的默认排列方式,默认为row
水平排列,可选row-reverse
,column
,column-reverse
。弹性元素的排列方式称为主轴,侧轴与主轴垂直。flex-wrap
设置弹性容器的元素是否自动换行,默认为nowrap
,可选wrap
,warp-reverse
沿副轴反向换行。flex-flow
:flex-direction
和flex-wrap
的简写属性。justify-content
,如何分配主轴的空白空间,默认为flex-start
沿起边排列,可选flex-end
沿终边排列,center
居中,space-around
空白平均分配给元素两侧,space-evenly
空白平均分配给元素的间隔及外部,space-between
空白平均分配给元素的间隔。
- flex-end
- space-around
- space-evenly
- space-between
align-items
元素在副轴上如何对齐,默认stretch
将每行元素设置为相等高度,flex-start
,flex-end
,center
,base-line
。
- strentch
- divdiv
- divdiv
- divdivdiv
- divdiv
- div
- flex-start
- divdiv
- divdiv
- divdivdiv
- divdiv
- div
- center
- divdiv
- divdiv
- divdivdiv
- divdiv
- div
align-content
,如何分配副轴的空白空间,默认为stretch
,可选flex-start
,flex-end
,center
,space-around
,space-evenly
,space-between
。
- space-around
- divdiv
- divdiv
- divdivdiv
- divdiv
- div
弹性元素
align-self
覆盖当前弹性元素在容器中设置的align-items
属性。flex-grow
指定弹性元素的伸展系数,默认为0
,表示不伸展。当弹性容器有剩余空间时,元素按flex-grow
的数值比例分配剩余空间。flex-shrink
指定弹性元素的收缩系数,默认为1
,表示不收缩。当弹性容器不足时,元素按flex-shrink
的数值乘元素的大小比例分配不足空间。flex-basis
指定元素在主轴上的基础长度,默认为auto
,相当于使用width
或height
。flex
:flex-grow
,flex-shrink
,flex-basis
的简写属性。initial
相当于默认值1 0 auto
,auto
相当于1 1 auto
,none
相当于0 0 auto
。order
指定元素的排列顺序。
1 | ul{ |
- flex-grow:0
- flex-grow:1
- flex-grow:3
应用
1 | ul { |
1 | .header, .footer { |
header
left
left-content
middle
middle-content
right
right-content
响应式布局
响应式布局使网站可以根据不同设备或窗口大小呈现出不同的布局。响应式布局的关键是媒体查询。
媒体类型使用@media 查询规则{}
媒体类型包括all
,print
打印设备,screen
屏幕设备,speech
屏幕阅读器。
媒体特性主要使用:min-width
最小宽度和max-width
最大宽度。
类型和特性的连接可以使用,
(或),and
(与),not
(非)。
常用的断点有768px,992px,1200px。
1 | @media (min-width:"768px") and (max-width:"1200px"){ |
less简介
less是一门css预处理语言,是css的增强版。
css支持变量,但兼容性不好。
1 | html{ |
less中增添了许多新特性,如变量的支持,mixin等。
注释
less的单行注释//
,less的注释不会解析到css中,css注释/* */
会解析到css中。
变量
1 | @varcolor:#bfa; |
变量可以存储类名、路径、属性名。当作为式子的一部分使用时,需要使用花括号。
1 | @myclass:box; |
可以把属性值作为变量。
1 | .box{ |
运算
1 | .p1{ |
1 | .p1 { |
选择器
1 | .box{//选择器嵌套 |
1 | .box .box2 { |
extend
用extend实现继承,实现方式是分组选择器。
1 | .p1{ |
1 | .p1, |
mixin
在使用类选择器时在其后加括号,其变为mixin,不会解析到css中。调用时将该mixin混入调用的位置。调用时可以省略括号。
1 | .my-inline-block(){ |
1 | .my-block { |
mixin允许传入参数,这是主要用途。
1 | .my-block(@w, @h,@color:#bfa){ |
1 | .p1 { |
less提供了若干预定义mixin。
1 | .p1{ |
1 | .p1 { |
引入
可以引入其他的less文件,相当于复制粘贴,便于模块化处理。
1 | @import "my-less1.less" |
编译属性
可以在less插件里设置编译属性:
1 | "less.compile": { |
compress确定输出的css是否压缩;courceMap会给出css与less的映射表,在调试时可以在检查元素中直接给出less文件的对应行数;out确定是否输出css。
article_txt