目录
样式优先级
自闭和标签
box-shadow
fixed定位
hsl()
颜色渐变
::before和::after
关键帧和动画
animation
@keyframes
媒体查询
自适应
图片自适应
Flex容器
justify-content属性
align-items属性
flex-shrink和flex-grow属性
flex短方法属性
align-self属性
CSS网格
调整大小
间距
grid-column
grid-area
repeat函数
auto-fill/fit 创建弹性布局
样式优先级
!important > 内联 > id选择器 > 类选择器
自闭和标签
<img> <hr>
box-shadow
box-shadow属性的阴影依次由下面这些值描述:
offset-x
阴影的水平偏移量;offset-y
阴影的垂直偏移量;blur-radius
模糊半径;spread-radius
阴影扩展半径;color
其中 blur-radius
和 spread-radius
是可选的。
fixed定位
它是一种特殊的绝对(absolute)定位,将元素相对于浏览器窗口定位。 类似于绝对位置,它与 CSS 偏移属性一起使用,并且也会将元素从当前的文档流里面移除。 其它元素会忽略它的存在,这样也许需要调整其他位置的布局。
但 fixed
和 absolute
的最明显的区别在于,前者定位的元素不会随着屏幕滚动而移动。
hsl()
颜色具有多种特性,包括色相、饱和度和亮度。 CSS3 引入了 hsl()
做为颜色的描述方式。
色相 是色彩的基本属性,就是平常所说的颜色名称,如红色、黄色等。 以颜色光谱为例,光谱左边从红色开始,移动到中间的绿色,一直到右边的蓝色,色相值就是沿着这条线的取值。 在 hsl()
里面,色相用色环来代替光谱,色相值就是色环里面的颜色对应的从 0 到 360 度的角度值。
饱和度 是指色彩的纯度,也就是颜色里灰色的占比。 饱和度越高则灰色占比越少,色彩也就越纯;反之则完全是灰色。 饱和度的取值范围是表示灰色所占百分比的 0 至 100。
亮度 决定颜色的明暗程度,也就是颜色里白色或者黑色的占比。 其中,100% 的亮度表示纯白色, 0% 的亮度则表示纯黑色;而 50% 的亮度就表示在色相中选取的颜色
红 | hsl(0, 100%, 50%) |
绿 | hsl(120, 100%, 50%) |
蓝 | hsl(240, 100%, 50%) |
黄 | hsl(60, 100%, 50%) |
颜色渐变
HTML 元素的背景色并不局限于单色。 CSS 还为我们提供了颜色渐变。 可通过 background
里的 linear-gradient()
实现线性渐变, 以下是它的语法:
background: linear-gradient(gradient_direction, color 1, color 2, color 3, ...);
第一个参数指定了颜色过渡的方向——它的值是角度,90deg
表示垂直渐变(从左到右),45deg
表示沿对角线渐变(从左下方到右上方)。 其他参数指定了渐变颜色的顺序:
background: linear-gradient(90deg, red, yellow, rgb(204, 204, 255));
::before和::after
::before
和 ::after
。 ::before
创建一个伪元素,它是所选元素的第一个子元素; ::after
创建一个伪元素,它是所选元素的最后一个子元素。 在下面的代码中,::before
伪元素用来给 class 为 heart
的元素添加一个正方形:
.heart::before {
content: "";
background-color: yellow;
border-radius: 25%;
position: absolute;
height: 50px;
width: 70px;
top: -50px;
left: 5px;
}
::before
和 ::after
必须配合 content
来使用。 这个属性通常用来给元素添加内容诸如图片或者文字。 尽管有时 ::before
和 ::after
是用来实现形状而非文字,但 content
属性仍然是必需的,此时它的值可以是空字符串。 在上面的例子里,class 为 heart
元素的 ::before
伪类添加了一个黄色的长方形,长方形的高和宽分别为 50px
和 70px
。 这个矩形有圆角,因为它的 border-radius
为 25%,它的位置是绝对位置,位于离元素左边和顶部分别是 5px
、50px
的位置。
//爱心
<style>
.heart {
position: absolute;
margin: auto;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: pink;
height: 50px;
width: 50px;
transform: rotate(-45deg);
}
.heart::after {
background-color: pink;
content: "";
border-radius: 50%;
position: absolute;
width: 50px;
height: 50px;
top: 0px;
left: 25px;
}
.heart::before {
content: "";
background-color: pink;
border-radius: 50%;
position: absolute;
width: 50px;
height: 50px;
top: -25px;
left: 0px;
}
</style>
<div class="heart"></div>
关键帧和动画
如果要给元素添加动画,你需要了解 animation 属性以及 @keyframes
规则。 animation 属性控制动画的外观,@keyframes
规则控制动画中各阶段的变化。 总共有 8 个 animation 属性。
animation
1. animation-name
用来设置动画的名称。
2. animation-duration
设置动画所花费的时间。
3. animation-fill-mode
指定了在动画结束时元素的样式: 你可以这样设置:
animation-fill-mode: forwards;
4. animation-iteration-count
,这个属性允许你控制动画循环的次数。
5. animation-timing-function
用来定义动画的速度曲线。有一些预定义的关键字可用于常见的选项。 比如,默认值是 ease
,动画以低速开始,然后加快,在结束前变慢。 其它常用的值包括 ease-out
:动画以高速开始,以低速结束;ease-in
,动画以低速开始,以高速结束;linear
:动画从头到尾的速度是相同的。
cubic-bezier
来定义贝塞尔曲线。cubic-bezier
函数包含了 1 * 1 网格里的4个点:p0
、p1
、p2
、p3
。 其中 p0
和 p3
是固定值,代表曲线的起始点和结束点,坐标值依次为 (0, 0) 和 (1, 1)。 你只需设置另外两点的 x 值和 y 值,设置的这两点确定了曲线的形状从而确定了动画的速度曲线。 在 CSS 里面通过 (x1, y1, x2, y2)
来确定 p1
和 p2
。 以下就是 CSS 贝塞尔曲线的例子:
animation-timing-function: cubic-bezier(0.25, 0.25, 0.75, 0.75);
@keyframes
@keyframes
可以通过设置特定时间点的行为来创建动画。 为此,我们只需要给持续时间内的特定帧(从 0% 到 100%)加上 CSS 规则。 如果用一部电影来做类比,那么 CSS 里面的 0% 关键帧就像是电影里面的开场镜头;100% 关键帧就像是电影里的片尾,就是那个之后会出现演职人员列表的片尾。 在动画设定的时间内,CSS 会根据关键帧的规则来给元素添加动画效果。 100% 位置的 CSS 属性就是元素最后的样子,相当于电影里的演职员表或者鸣谢镜头。 然后CSS 应用魔法来在给定的时间内转换元素以使其脱离场景。
媒体查询
媒体查询是 CSS3 中引入的一项新技术,它可以根据不同的视口大小调整内容的布局。 视口是指浏览器中,用户可见的网页内容。 视口会随访问网站的设备不同而改变。
媒体查询由媒体类型组成,如果媒体类型与展示网页的设备类型匹配,则应用对应的样式。 你可以在媒体查询中使用各种选择器和样式。
下面是一个媒体查询的例子,当设备宽度小于或等于 100px
时返回内容:
@media (max-width: 100px) { /* CSS Rules */ }
自适应
图片自适应
img {
max-width: 100%;
height: auto;
}
Flex容器
justify-content属性
lex 子元素有时不能充满整个 flex 容器, 所以我们经常需要告诉 CSS 以什么方式排列 flex 子元素,以及调整它们的间距。 幸运的是,我们可以通过 justify-content
属性的不同值来实现。 在介绍属性的可选值之前,我们要先理解一些重要术语。这张图片的元素横着排列,很好的描述了下面概念。
回忆一下,如果把 flex 容器设为一个行,它的子元素会从左到右逐个排列; 如果把 flex 容器设为一个列,它的子元素会从上到下逐个排列。 子元素排列的方向被称为 main axis(主轴)。 对于行,主轴水平贯穿每一个项目; 对于列,主轴垂直贯穿每一个项目。
对于如何沿主轴线排放 flex 项目,有几种选择。 很常用的一种是 justify-content: center;
:即 flex 子元素在 flex 容器中居中排列。 其他选择包括:
flex-start
:从 flex 容器的起始位置开始排列项目。 对行来说是把项目移至左边, 对于列是把项目移至顶部。 如未设置justify-content
的值,那么这就是默认值。flex-end
:从 flex 容器的终止位置开始排列项目。 对行来说是把项目移至右边, 对于列是把项目移至底部。space-between
:项目间保留一定间距地沿主轴居中排列。 第一个和最后一个项目被放置在容器边沿。 例如,在行中第一个项目会紧贴着容器左边,最后一个项目会紧贴着容器右边,然后其他项目均匀排布。space-around
:与space-between
相似,但头尾两个项目不会紧贴容器边缘,所有项目之间的空间均匀排布。space-evenly
:头尾两个项目不会紧贴容器边缘,所有项目之间的空间均匀排布。
align-items属性
align-items
属性与 justify-content
类似。 回忆一下,justify-content
属性使 flex 子元素沿主轴排列。 行的主轴是水平线,列的主轴是垂直线。
Flex 容器中,与主轴垂直的叫做 cross axis(交叉轴)。 行的交叉轴是垂直的,列的交叉轴是水平的。CSS 中的 align-items
属性用来定义 flex 子元素沿交叉轴的对齐方式。 对行来说,定义的是元素的上下对齐方式; 对列来说,是定义元素的左右对齐方式。
align-items
的可选值包括:
flex-start
:从 flex 容器的起始位置开始对齐项目。 对行来说,把项目移至容器顶部; 对列来说,是把项目移至容器左边。flex-end
:从 flex 容器的终止位置开始对齐项目。 对行来说,把项目移至容器底部; 对列来说,把项目移至容器右边。center
:把项目居中放置。 对行来说,垂直居中(项目距离顶部和底部的距离相等); 对列来说,水平居中(项目距离左边和右边的距离相等)。stretch
:拉伸项目,填满 flex 容器。 例如,排成行的项目从容器顶部拉伸到底部。 如未设置align-items
的值,那么这就是默认值。baseline
:沿基线对齐。 基线是文本相关的概念,可以认为它是字母排列的下端基准线。
flex-shrink和flex-grow属性
首先介绍的是 flex-shrink
属性。 使用之后,如果 flex 容器太小,则子元素会自动缩小。 当容器的宽度小于里面所有子元素的宽度之和时,所有子元素都会自动压缩。
子元素的 flex-shrink
接受数值作为属性值。 数值越大,则该元素与其他元素相比会被压缩得更厉害。
与 flex-shrink
相对的是 flex-grow
。 你应该还记得,flex-shrink
会在容器太小时对子元素作出调整。 相应地,flex-grow
会在容器太大时对子元素作出调整。
flex短方法属性
上面几个 flex 属性有一个简写方式。 flex-grow
、flex-shrink
和 flex-basis
属性可以在 flex
中一并设置。
例如,flex: 1 0 10px;
会把项目属性设为 flex-grow: 1;
、flex-shrink: 0;
以及 flex-basis: 10px;
。
属性的默认设置是 flex: 0 1 auto;
。
align-self属性
flex 子项目的最后一个属性是 align-self
。 这个属性允许你调整单个子元素自己的对齐方式,而不会影响到全部子元素。 因为 float
、clear
和 vertical-align
等调整对齐方式的属性都不能应用于 flex 子元素,所以这个属性显得十分有用。
align-self
可设置的值与 align-items
的一样,并且它会覆盖 align-items
所设置的值。
CSS网格
调整大小
在 CSS 网格中,可以使用绝对单位(如 px
)或相对单位(如 em
)来定义行或列的大小。 下面的单位也可以使用:
fr
:设置列或行占剩余空间的比例,
auto
:设置列宽或行高自动等于它的内容的宽度或高度,
%
:将列或行调整为它的容器宽度或高度的百分比,
间距
grid-gap
属性是前两个挑战中出现的 grid-row-gap
和 grid-column-gap
的简写属性,它更方便使用。 如果 grid-gap
只有一个值,那么这个值表示行与行之间、列与列之间的间距均为这个值。 如果有两个值,那么第一个值表示行间距,第二个值表示列间距。
grid-column
到目前为止,所有的讨论都是围绕网格容器的。 grid-column
属性是我们要讨论的,第一个用于网格项本身的属性。
网格中,假想的水平线和垂直线被称为线(lines)。 这些线在网格的左上角从 1 开始编号,垂直线向右、水平线向下累加计数。
这是一个 3x3 网格的线条:
要设置一个网格项占据几列,你可以使用 grid-column
属性加上网格线条的编号来定义网格项开始和结束的位置。
示例如下:
grid-column: 1 / 3;
这会让网格项从左侧第一条线开始到第三条线结束,占用两列。
grid-area
我们在上一次挑战中学到的 grid-area
属性还有另一种使用方式。 如果网格中没有定义区域模板,你也可以像这样为它添加一个模板:
item1 { grid-area: 1/1/2/4; }
这里使用了你之前学习的网格线编号来定义网格项的区域。 上例中数字代表这些值:
grid-area: 行起始线 / 列起始线 / 行终止线 / 列终止线;
因此,示例中的网格项将占用第 1 条水平网格线(起始)和第 2 条水平网格线(终止)之间的行,及第 1 条垂直网格线(起始)和第 4 条垂直网格线(终止)之间的列。
repeat函数
你还可以用 repeat 方法重复多个值,并在定义网格结构时与其他值一起使用。 比如:
grid-template-columns: repeat(2, 1fr 50px) 20px;
效果相当于:
grid-template-columns: 1fr 50px 1fr 50px 20px;
注意: 1fr 50px
重复了两次,后面跟着 20px。
auto-fill/fit 创建弹性布局
repeat 方法带有一个名为自动填充(auto-fill)的功能。 它的功能是根据容器的大小,尽可能多地放入指定大小的行或列。 你可以通过结合 auto-fill
和 minmax
来更灵活地布局。
repeat(auto-fill, minmax(60px, 1fr));
上面的代码效果是这样:首先,列的宽度会随容器大小改变。其次,只要容器宽度不足以插入一个宽为 60px 的列,当前行的所有列就都会一直拉伸。请自己调整宽度,动手试一下就不难理解了。 注意: 如果容器宽度不足以将所有网格项放在同一行,余下的网格项将会移至新的一行。
auto-fit
效果几乎和 auto-fill
一样。 不同点仅在于,当容器的大小大于各网格项之和时,auto-fill
会持续地在一端放入空行或空列,这样就会使所有网格项挤到另一边;而 auto-fit
则不会在一端放入空行或空列,而是会将所有网格项拉伸至合适的大小。
更多推荐
CSSHTML学习笔记
发布评论