CSS学习-高级课程

201 阅读34分钟

CSS 圆角

四个角圆角半径都是25px

border-radius: 25px

border-radius 属性实际上是以下属性的简写属性:

  • border-top-left-radius
  • border-top-right-radius
  • border-bottom-right-radius
  • border-bottom-left-radius

CSS border-radius - 指定每个角

border-radius 属性可以接受一到四个值。规则如下:

四个值 - border-radius: 15px 50px 30px 5px; (依次分别用于:左上角、右上角、右下角、左下角):

三个值 - border-radius: 15px 50px 30px; (第一个值用于左上角,第二个值用于右上角和左下角,第三个用于右下角):

两个值 - border-radius: 15px 50px; (第一个值用于左上角和右下角,第二个值用于右上角和左下角):

一个值 - border-radius: 15px; (该值用于所有四个角,圆角都是一样的):

CSS 渐变

CSS 渐变使您可以显示两种或多种指定颜色之间的平滑过渡。

CSS 定义了两种渐变类型:

  • 线性渐变(向下/向上/向左/向右/对角线)
  • 径向渐变(由其中心定义)

线性渐变

线性渐变 - 从上到下(默认)

#grad {
  background-image: linear-gradient(red, yellow);
}

image.png

线性渐变 - 从左到右

#grad {
  background-image: linear-gradient(to right, red , yellow);
}

image.png

线性渐变 - 对角线

您可以通过指定水平和垂直起始位置来实现对角渐变。

#grad {
  background-image: linear-gradient(to bottom right, red, yellow);
}

image.png

使用角度

如果希望对渐变角度做更多的控制,您可以定义一个角度,来取代预定义的方向(向下、向上、向右、向左、向右下等等)。值 0deg 等于向上(to top)。值 90deg 等于向右(to right)。值 180deg 等于向下(to bottom)。

#grad {
  background-image: linear-gradient(-90deg, red, yellow);
}

使用多个色标

下面的例子展示了带有多个色标的线性渐变(从上到下):

实例

#grad {
  background-image: linear-gradient(red, yellow, green);
}

image.png

重复线性渐变

repeating-linear-gradient() 函数用于重复线性渐变:

#grad {
  background-image: repeating-linear-gradient(red, yellow 10%, green 20%);
}

image.png

CSS 径向渐变

径向渐变由其中心定义。

如需创建径向渐变,您还必须定义至少两个色标。

#grad {
  background-image: radial-gradient(red, yellow, green);
}

image.png

设置形状

shape 参数定义形状。它可接受 circle 或 ellipse 值。默认值为 ellipse(椭圆)。

下面的例子展示了一个圆形的径向渐变:

#grad {
  background-image: radial-gradient(circle, red, yellow, green);
}

image.png

CSS 阴影效果

效果

image.png

  • text-shadow 文字阴影
  • box-shadow 边框阴影

CSS text-shadow 文字阴影

h1 {
  text-shadow: 2px 2px 5px red;
}

四个参数分别是:x轴偏移量 y轴偏移量 模糊程度 阴影颜色;

也可以设置多种阴影效果。

h1 {
  text-shadow: 0 0 3px #FF0000, 0 0 5px #0000FF;
}

使用 text-shadow 属性在文本周围创建纯边框(无阴影):

h1 {
  color: yellow;
  text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;
}

image.png

CSS box-shadow 边框阴影

属性

div {
  box-shadow: 10px 10px 5px grey;
}

四个参数分别是:x轴偏移量 y轴偏移量 模糊程度 阴影颜色;

CSS 文本效果

CSS 文本溢出、整字换行、换行规则以及书写模式

  • text-overflow
  • word-wrap
  • word-break
  • writing-mode

text-overflow 文字溢出

CSS text-overflow 属性规定应如何向用户呈现未显示的溢出内容。

text-overflow: clip

被裁剪:

image.png

text-overflow: ellipsis;

将其呈现为省略号(...)

image.png

如果想要在鼠标悬停时展示全部文本,可以这样设置:

div.test:hover {
  overflow: visible;
}

word-wrap 字换行

CSS word-wrap 属性使长文字能够被折断并换到下一行。

如果一个单词太长而无法容纳在一个区域内,它会向外扩展:

image.png

通过 word-wrap 属性,您可以强制对文本进行换行 - 即使这意味着在词中间将其拆分:

image.png

word-break 换行规则

CSS word-break 属性指定换行规则。

本段包含一些文本。此行将连字符打断:

p.test1 {
  word-break: keep-all;
}

此行将连字符打断:

image.png

p.test2 {
  word-break: break-all;
}

这些行将在任何字符处中断:

image.png

writing-mode 书写模式

CSS writing-mode 属性规定文本行是水平放置还是垂直放置。

p.test1 {
  writing-mode: horizontal-tb;
}

span.test2 {
  writing-mode: vertical-rl;
}

p.test2 {
  writing-mode: vertical-rl;
}

image.png

CSS 2D 转换

CSS 转换(transforms)允许您移动、旋转、缩放和倾斜元素。

CSS 2D 转换方法

通过使用 CSS transform 属性,您可以利用以下 2D 转换方法:

  • translate()
  • rotate()
  • scaleX()
  • scaleY()
  • scale()
  • skewX()
  • skewY()
  • skew()
  • matrix()

translate() 方法

Translate

translate() 方法从其当前位置移动元素(根据为 X 轴和 Y 轴指定的参数)。

下面的例子把 <div> 元素从其当前位置向右移动 50 个像素,并向下移动 100 个像素:

div {
  transform: translate(50px, 100px);
}

rotate() 方法

Rotate

rotate() 方法根据给定的角度顺时针或逆时针旋转元素。

下面的例子把 <div> 元素顺时针旋转 20 度:

div {
  transform: rotate(20deg);
}

使用负值将逆时针旋转元素。

scale() 方法

Scale

scale() 方法增加或减少元素的大小(根据给定的宽度和高度参数)。

下面的例子把 <div> 元素增大为其原始宽度的两倍和其原始高度的三倍:

div {
  transform: scale(2, 3);
}

scaleX() 方法

scaleX() 方法增加或减少元素的宽度。

下面的例子把 <div> 元素增大为其原始宽度的两倍:

div {
  transform: scaleX(2);
}

scaleY() 方法

scaleY() 方法增加或减少元素的高度。

下面的例子把 <div> 元素增大到其原始高度的三倍:

div {
  transform: scaleY(3);
}

skewX() 方法

skewX() 方法使元素沿 X 轴倾斜给定角度。

下例把 <div> 元素沿X轴倾斜 20 度:

div {
  transform: skewX(20deg);
}

skewY() 方法

skewY() 方法使元素沿 Y 轴倾斜给定角度。

下例把 <div> 元素沿 Y 轴倾斜 20 度:

div {
  transform: skewY(20deg);
}

skew() 方法

skew() 方法使元素沿 X 和 Y 轴倾斜给定角度。

下面的例子使 <div> 元素沿 X 轴倾斜 20 度,同时沿 Y 轴倾斜 10 度:

div {
  transform: skew(20deg, 10deg);
}

如果未指定第二个参数,则值为零。因此,下例使 <div> 元素沿 X 轴倾斜 20 度:

matrix() 方法

Rotate

matrix() 方法把所有 2D 变换方法组合为一个。

matrix() 方法可接受六个参数,其中包括数学函数,这些参数使您可以旋转、缩放、移动(平移)和倾斜元素。

参数如下:matrix(scaleX(),skewY(),skewX(),scaleY(),translateX(),translateY())

div {
  transform: matrix(1, -0.3, 0, 1, 0, 0);
}

CSS 3D 转换

CSS 还支持 3D 转换。

CSS 3D 转换方法

通过 CSS transform 属性,您可以使用以下 3D 转换方法:

  • rotateX()
  • rotateY()
  • rotateZ()

rotateX() 方法

Rotate X

rotateX() 方法使元素绕其 X 轴旋转给定角度:

#myDiv {
  transform: rotateX(150deg);
}

rotateY() 方法

Rotate Y

rotateY() 方法使元素绕其 Y 轴旋转给定角度:

#myDiv {
  transform: rotateY(130deg);
}

rotateZ() 方法

rotateZ() 方法使元素绕其 Z 轴旋转给定角度:

#myDiv {
  transform: rotateZ(90deg);
}

CSS 过渡

CSS 过渡允许您在给定的时间内平滑地改变属性值。

  • transition
  • transition-delay
  • transition-duration
  • transition-property
  • transition-timing-function

如何使用 CSS 过渡?

如需创建过渡效果,必须明确两件事:

  • 您要添加效果的 CSS 属性
  • 效果的持续时间

注意:如果未规定持续时间部分,则过渡不会有效果,因为默认值为 0。

下面的例子展示了 100px * 100px 的红色 <div> 元素。 <div> 元素还为 width 属性指定了过渡效果,持续时间为 2 秒:

div {
  width: 100px;
  height: 100px;
  background: red;
  transition: width 2s;
}

改变若干属性值

下面的例子为 width 和 height 属性都添加了过渡效果,width 是 2 秒,height 是 4 秒:

div {
  transition: width 2s, height 4s;
}

指定过渡的速度曲线

transition-timing-function 属性规定过渡效果的速度曲线。

transition-timing-function 属性可接受以下值:

  • ease - 规定过渡效果,先缓慢地开始,然后加速,然后缓慢地结束(默认)
  • linear - 规定从开始到结束具有相同速度的过渡效果
  • ease-in -规定缓慢开始的过渡效果
  • ease-out - 规定缓慢结束的过渡效果
  • ease-in-out - 规定开始和结束较慢的过渡效果
  • cubic-bezier(n,n,n,n) - 允许您在三次贝塞尔函数中定义自己的值

延迟过渡效果

transition-delay 属性规定过渡效果的延迟(以秒计)。

下例在启动之前有 1 秒的延迟:

div {
  transition-delay: 1s;
}

过渡 + 转换

下例为转换添加过渡效果:

div {
  transition: width 2s, height 2s, transform 2s;
}

更多过渡实例

您可以可以一一指定 CSS 过渡属性,如下所示:

div {
  transition-property: width;
  transition-duration: 2s;
  transition-timing-function: linear;
  transition-delay: 1s;
}

或使用简写的 transition 属性:

div {
  transition: width 2s linear 1s;
}

CSS 动画

动画属性。

  • @keyframes
  • animation-name
  • animation-duration
  • animation-delay
  • animation-iteration-count
  • animation-direction
  • animation-timing-function
  • animation-fill-mode
  • animation

对动画的浏览器支持

表格中的数字注明了完全支持该属性的首个浏览器版本。

属性ChromeIEFirefoxSafariOpera
@keyframes43.010.016.09.030.0
animation-name43.010.016.09.030.0
animation-duration43.010.016.09.030.0
animation-delay43.010.016.09.030.0
animation-iteration-count43.010.016.09.030.0
animation-direction43.010.016.09.030.0
animation-timing-function43.010.016.09.030.0
animation-fill-mode43.010.016.09.030.0
animation43.010.016.09.030.0

什么是 CSS 动画?

动画使元素逐渐从一种样式变为另一种样式。

您可以随意更改任意数量的 CSS 属性。

如需使用 CSS 动画,您必须首先为动画指定一些关键帧。

关键帧包含元素在特定时间所拥有的样式。

@keyframes 规则

如果您在 @keyframes 规则中指定了 CSS 样式,动画将在特定时间逐渐从当前样式更改为新样式。

要使动画生效,必须将动画绑定到某个元素。

下面的例子将 "example" 动画绑定到 <div> 元素。动画将持续 4 秒钟,同时将 <div> 元素的背景颜色从 "red" 逐渐改为 "yellow":

动画实例:

/* 动画代码 */
@keyframes example {
  from {background-color: red;}
  to {background-color: yellow;}
}

/* 向此元素应用动画效果 */
div {
  width: 100px;
  height: 100px;
  background-color: red;
  animation-name: example;
  animation-duration: 4s;
}

注意:animation-duration 属性定义需要多长时间才能完成动画。如果未指定 animation-duration 属性,则动画不会发生,因为默认值是 0s(0秒)。

在上面的例子中,通过使用关键字 "from" 和 "to"(代表 0%(开始)和 100%(完成)),我们设置了样式何时改变。

您也可以使用百分比值。通过使用百分比,您可以根据需要添加任意多个样式更改。

下面的例子将在动画完成 25%,完成 50% 以及动画完成 100% 时更改 <div> 元素的背景颜色:

/* 动画代码 */
@keyframes example {
  0%   {background-color: red;}
  25%  {background-color: yellow;}
  50%  {background-color: blue;}
  100% {background-color: green;}
}

/* 应用动画的元素 */
div {
  width: 100px;
  height: 100px;
  background-color: red;
  animation-name: example;
  animation-duration: 4s;
}

延迟动画

animation-delay 属性规定动画开始的延迟时间。

下面的例子在开始动画前有 2 秒的延迟:

div {
  width: 100px;
  height: 100px;
  position: relative;
  background-color: red;
  animation-name: example;
  animation-duration: 4s;
  animation-delay: 2s;
}

负值也是允许的。如果使用负值,则动画将开始播放,如同已播放 N 秒。

在下面的例子中,动画将开始播放,就好像它已经播放了 2 秒钟一样:

设置动画应运行多少次

animation-iteration-count 属性指定动画应运行的次数。

下面的例子在停止前把动画运行 3 次:

div {
  width: 100px;
  height: 100px;
  position: relative;
  background-color: red;
  animation-name: example;
  animation-duration: 4s;
  animation-iteration-count: 3;
}

使用值 "infinite" 使动画永远持续下去。

反向或交替运行动画

animation-direction 属性指定是向前播放、向后播放还是交替播放动画。

animation-direction 属性可接受以下值:

  • normal - 动画正常播放(向前)。默认值
  • reverse - 动画以反方向播放(向后)
  • alternate - 动画先向前播放,然后向后
  • alternate-reverse - 动画先向后播放,然后向前

下例将以相反的方向(向后)运行动画:

div {
  width: 100px;
  height: 100px;
  position: relative;
  background-color: red;
  animation-name: example;
  animation-duration: 4s;
  animation-direction: reverse;
}

指定动画的速度曲线

animation-timing-function 属性规定动画的速度曲线。

animation-timing-function 属性可接受以下值:

  • ease - 指定从慢速开始,然后加快,然后缓慢结束的动画(默认)
  • linear - 规定从开始到结束的速度相同的动画
  • ease-in - 规定慢速开始的动画
  • ease-out - 规定慢速结束的动画
  • ease-in-out - 指定开始和结束较慢的动画
  • cubic-bezier(n,n,n,n) - 运行您在三次贝塞尔函数中定义自己的值
#div1 {animation-timing-function: linear;}
#div2 {animation-timing-function: ease;}
#div3 {animation-timing-function: ease-in;}
#div4 {animation-timing-function: ease-out;}
#div5 {animation-timing-function: ease-in-out;}

指定动画的填充模式

CSS 动画不会在第一个关键帧播放之前或在最后一个关键帧播放之后影响元素。animation-fill-mode 属性能够覆盖这种行为。

在不播放动画时(在开始之前,结束之后,或两者都结束时),animation-fill-mode 属性规定目标元素的样式。

animation-fill-mode 属性可接受以下值:

  • none - 默认值。动画在执行之前或之后不会对元素应用任何样式。
  • forwards - 元素将保留由最后一个关键帧设置的样式值(依赖 animation-direction 和 animation-iteration-count)。
  • backwards - 元素将获取由第一个关键帧设置的样式值(取决于 animation-direction),并在动画延迟期间保留该值。
  • both - 动画会同时遵循向前和向后的规则,从而在两个方向上扩展动画属性。

下面的例子让 <div> 元素在动画结束时保留来自最后一个关键帧的样式值:

动画简写属性

下例使用六种动画属性:

div {
  animation-name: example;
  animation-duration: 5s;
  animation-timing-function: linear;
  animation-delay: 2s;
  animation-iteration-count: infinite;
  animation-direction: alternate;
}

使用简写的 animation 属性也可以实现与上例相同的动画效果:

div {
  animation: example 5s linear 2s infinite alternate;
}

CSS 工具提示

基础的工具提示

创建一个鼠标移到元素上时显示的工具提示:

<style>
/* Tooltip 容器 */
.tooltip {
  position: relative;
  display: inline-block;
  border-bottom: 1px dotted black; /* 如果需要在可悬停文本下面显示点线 */
}

/* Tooltip 文本 */
.tooltip .tooltiptext {
  visibility: hidden;
  width: 120px;
  background-color: black;
  color: #fff;
  text-align: center;
  padding: 5px 0;
  border-radius: 6px;
 
  /* 定位工具提示文本 - 请看下面的例子 */
  position: absolute;
  z-index: 1;
}

/* 将鼠标悬停在工具提示容器上时,显示工具提示文本 */
.tooltip:hover .tooltiptext {
  visibility: visible;
}
</style>

<div class="tooltip">Hover over me
  <span class="tooltiptext">Tooltip text</span>
</div>

效果:

image.png

例子解释

HTML:

使用容器元素(例如 <div>)并向其添加 "tooltip" 类。当用户将鼠标悬停在此 <div> 上时,会显示工具提示文本。

工具提示文本位于 class="tooltiptext" 的嵌入式元素(如 <span>)中。

CSS:

tooltip 类使用 position:relative,用于放置工具提示文本(position:absolute)。

tooltiptext 类保存实际的工具提示文本。默认情况下它是隐藏的,并会在鼠标悬停时可见(。我们还为其添加了一些基本样式:120 像素的宽度、黑色背景、白色文本、文本居中以及 5px 的上下内边距(padding)。

CSS border-radius 属性用于向工具提示文本添加圆角。

当用户将鼠标移到 class="tooltip" 的 <div> 上时,:hover 选择器用于显示工具提示文本。

定位工具提示

工具提示位于“可悬停”文本(<div>)的右侧(left:105%) 另外请注意,top:-5px 用于将其放置在其容器元素的中间。

右侧工具提示

.tooltip .tooltiptext {
  top: -5px;
  left: 105%; 

image.png

左侧工具提示

.tooltip .tooltiptext {
  top: -5px;
  right: 105%; 
}

image.png

如果您希望工具提示位于上方或下方,请看下面的例子。请注意,我们使用了负 60 像素的左外边距属性(margin-left)。这是为了把工具提示与可悬停文本进行居中对齐。该值是工具提示宽度的一半(120/2 = 60)。

顶部工具提示

.tooltip .tooltiptext {
  width: 120px;
  bottom: 100%;
  left: 50%; 
  margin-left: -60px; /* Use half of the width (120/2 = 60), to center the tooltip */
}

image.png

底部工具提示

.tooltip .tooltiptext {
  width: 120px;
  top: 100%;
  left: 50%;
  margin-left: -60px; /* Use half of the width (120/2 = 60), to center the tooltip */
}

image.png

工具提示箭头

如需创建在工具提示的指定侧面显示的箭头,请在工具提示后添加“空的”内容,并使用伪元素类 ::after 和 content 属性。箭头本身是使用边框创建的。这会使工具提示看起来像气泡。

本例演示如何在工具提示的底部添加箭头:

底部箭头

.tooltip .tooltiptext::after {
  content: " ";
  position: absolute;
  top: 100%; /* At the bottom of the tooltip */
  left: 50%;
  margin-left: -5px;
  border-width: 5px;
  border-style: solid;
  border-color: black transparent transparent transparent;
}

image.png

例子解释

将箭头定位在工具提示内:top: 100% 将箭头放置在工具提示的底部。left: 50% 将使箭头居中。

注意:border-width 属性指定箭头的大小。如果您更改此设置,也请将 margin-left 值更改为相同值。这将使箭头居中。

border-color 用于将内容转换为箭头。我们将上边框设置为黑色,其余设置为透明。如果所有面都是黑色,则最终将得到一个黑色的方形框。

下例演示了如何在工具提示的顶部添加箭头。请注意,这次我们设置了下边框的颜色:

顶部箭头

.tooltip .tooltiptext::after {
  content: " ";
  position: absolute;
  bottom: 100%;  /* At the top of the tooltip */
  left: 50%;
  margin-left: -5px;
  border-width: 5px;
  border-style: solid;
  border-color: transparent transparent black transparent;
}

image.png

左侧箭头

.tooltip .tooltiptext::after {
  content: " ";
  position: absolute;
  top: 50%;
  right: 100%; /* To the left of the tooltip */
  margin-top: -5px;
  border-width: 5px;
  border-style: solid;
  border-color: transparent black transparent transparent;
}

image.png

右侧箭头

.tooltip .tooltiptext::after {
  content: " ";
  position: absolute;
  top: 50%;
  left: 100%; /* To the right of the tooltip */
  margin-top: -5px;
  border-width: 5px;
  border-style: solid;
  border-color: transparent transparent transparent black;
}

image.png

CSS 图像样式

圆角图像

border-radius: 8px;

缩略图图像

img {
  border: 1px solid #ddd;
  border-radius: 4px;
  padding: 5px;
  width: 150px;
}
image.png

响应式图像

响应式图像会自动调整以适合屏幕尺寸。

如果您希望根据需要缩小图像,但需要杜绝放大到大于原始尺寸,请添加如下代码:

img {
  max-width: 100%;
  height: auto;
}

居中图像

如需使图像居中,请将左右外边距设置为 auto 并将其设置为块元素:

img {
  display: block;
  margin-left: auto;
  margin-right: auto;
  width: 50%;
}

图像滤镜

CSS filter 属性把视觉效果(如模糊和饱和度)添加到元素。

注意:Internet Explorer 或 Edge 12 不支持 filter 属性。

实例

把所有图像的颜色更改为黑白(100% 灰色):

img {
  filter: grayscale(100%);
}

其他样式。

.blur {filter: blur(4px);}
.brightness {filter: brightness(250%);}
.contrast {filter: contrast(180%);}
.grayscale {filter: grayscale(100%);}
.huerotate {filter: hue-rotate(180deg);}
.invert {filter: invert(100%);}
.opacity {filter: opacity(50%);}
.saturate {filter: saturate(7);}
.sepia {filter: sepia(100%);}
.shadow {filter: drop-shadow(8px 8px 10px green);}

翻转图像

img:hover {
  transform: scaleX(-1);
}

CSS object-fit 属性

CSS object-fit 属性用于规定应如何调整 <img> 或 <video> 的大小来适应其容器。

浏览器支持

表格中的数字注明了完全支持该属性的首个浏览器版本。

属性ChromeIEFirefoxSafariOpera
object-fit31.016.036.07.119.0

CSS object-fit 属性

CSS object-fit 属性用于指定应如何调整 <img> 或 <video> 的大小以适合其容器。

这个属性告诉内容以不同的方式填充容器。比如“保留长宽比”或者“展开并占用尽可能多的空间”。

请看下面来自上海鲜花港的郁金香图片,它是 300x300 像素:

Tulip

但是,如果我们把上面的图像设置为 200x300 像素,则它会看起来像这样:

WechatIMG242111.jpg

我们看到图像被压缩以适合 200x300 像素的容器,并且原始宽高比被破坏了。

如果我们使用 object-fit: cover;,它会剪切图像的侧面,保留长宽比,并填充空间,如下所示:

image.png

另一个实例

在这里,我们有两幅图像,我们希望它们填充浏览器窗口的 50% 的宽度和 100% 的高度。

在下面的例子中,我们不使用 object-fit,因此,当我们调整浏览器窗口的大小时,图像的长宽比将被破坏:

我们使用 object-fit: cover;,因此,当我们调整浏览器窗口的大小时,将保留图像的长宽比。

CSS object-fit 属性的所有值

object-fit 属性可接受如下值:

  • fill - 默认值。调整替换后的内容大小,以填充元素的内容框。如有必要,将拉伸或挤压物体以适应该对象。
  • contain - 缩放替换后的内容以保持其纵横比,同时将其放入元素的内容框。
  • cover - 调整替换内容的大小,以在填充元素的整个内容框时保持其长宽比。该对象将被裁剪以适应。
  • none - 不对替换的内容调整大小。
  • scale-down - 调整内容大小就像没有指定内容或包含内容一样(将导致较小的具体对象尺寸)

下面的例子演示了 object-fit 属性的所有可能值:

fill {object-fit: fill;}
contain {object-fit: contain;}
cover {object-fit: cover;}
scale-down {object-fit: scale-down;}
none {object-fit: none;}

CSS 多列

CSS 多列布局

CSS 多列布局允许我们轻松定义多列文本 - 就像报纸那样:

image.png

CSS 多列属性

在本章中,您将学到以下多列属性:

  • column-count
  • column-gap
  • column-rule-style
  • column-rule-width
  • column-rule-color
  • column-rule
  • column-span
  • column-width

浏览器支持

表格中的数字注明了完全支持该属性的首个浏览器版本。

属性ChromeIEFirefoxSafariOpera
column-count50.010.052.09.037.0
column-gap50.010.052.09.037.0
column-rule50.010.052.09.037.0
column-rule-color50.010.052.09.037.0
column-rule-style50.010.052.09.037.0
column-rule-width50.010.052.09.037.0
column-span50.010.071.09.037.0
column-width50.010.052.09.037.0

CSS 创建多列

column-count 属性规定元素应被划分的列数。

下面的例子将 <div> 元素中的文本分为 3 列:

实例

<head>
<style>
  .newspaper {
    column-count: 3;
  }
</style>
</head>
<body>

<div class="newspaper">
  话说天下大势,分久必合,合久必分:周末七国分争,并入于秦;及秦灭之后,楚、汉分争,又并入于汉;汉朝自高祖斩白蛇而起义,一统天下,后来光武中兴,传至献帝,遂分为三国。推其致乱之由,殆始于桓、灵二帝。桓帝禁锢善类,崇信宦官。及桓帝崩,灵帝即位,大将军窦武、太傅陈蕃,共相辅佐;时有宦官曹节等弄权,窦武、陈蕃谋诛之,机事不密,反为所害,中涓自此愈横。建宁二年四月望日,帝御温德殿。方升座,殿角狂风骤起,只见一条大青蛇,从梁上飞将下来,蟠于椅上。帝惊倒,左右急救入宫,百官俱奔避。须臾,蛇不见了。忽然大雷大雨,加以冰雹,落到半夜方止,坏却房屋无数。建宁四年二月,洛阳地震;又海水泛溢,沿海居民,尽被大浪卷入海中。光和元年,雌鸡化雄。六月朔,黑气十馀丈,飞入温德殿中。秋七月,有虹现于玉堂,五原山岸,尽皆崩裂。种种不祥,非止一端。帝下诏问群臣以灾异之由,议郎蔡邕上疏,以为蜺堕鸡化,乃妇寺干政之所致,言颇切直。帝览奏叹息,因起更衣。曹节在后窃视,悉宣告左右;遂以他事陷邕于罪,放归田里。后张让、赵忠、封谞、段珪、曹节、侯览、蹇硕、程旷、夏恽、郭胜十人朋比为奸,号为“十常侍”。帝尊信张让,呼为“阿父”。朝政日非,以致天下人心思乱,盗贼蜂起。
</div>

</body>

效果:

image.png

CSS 指定列之间的间隙

column-gap 属性规定列之间的间隔。

下面的例子指定列之间的间距为 40 像素:

实例

div {
  column-gap: 40px;
}

CSS 列规则

column-rule-style 属性规定列之间的规则样式:

image.png

column-rule-width 属性规定列之间的规则宽度:

column-rule-color 属性规定列之间的规则的颜色:

column-rule 属性是用于设置上面所有 column-rule-* 属性的简写属性。

下例设置了列之间的规则的宽度、样式和颜色:

div {
  column-rule: 1px solid lightblue;
}

指定元素应该横跨多少列

column-span 属性规定元素应跨越多少列。

下例规定了<h2> 元素应跨所有列:

实例

h2 {
  column-span: all;
}
<head>
  <style>
    .newspaper {
      column-count: 3;
      column-gap: 40px;
      column-rule: 1px solid lightblue;
    }

    h2 {
      column-span: all;
    }
  </style>
</head>
<body>

<div class="newspaper">
  <h2>第一回 宴桃园豪杰三结义 斩黄巾英雄首立功</h2>
  话说天下大势,分久必合,合久必分:周末七国分争,并入于秦;及秦灭之后,楚、汉分争,又并入于汉;汉朝自高祖斩白蛇而起义,一统天下,后来光武中兴,传至献帝,遂分为三国。推其致乱之由,殆始于桓、灵二帝。桓帝禁锢善类,崇信宦官。及桓帝崩,灵帝即位,大将军窦武、太傅陈蕃,共相辅佐;时有宦官曹节等弄权,窦武、陈蕃谋诛之,机事不密,反为所害,中涓自此愈横。建宁二年四月望日,帝御温德殿。方升座,殿角狂风骤起,只见一条大青蛇,从梁上飞将下来,蟠于椅上。帝惊倒,左右急救入宫,百官俱奔避。须臾,蛇不见了。忽然大雷大雨,加以冰雹,落到半夜方止,坏却房屋无数。建宁四年二月,洛阳地震;又海水泛溢,沿海居民,尽被大浪卷入海中。光和元年,雌鸡化雄。六月朔,黑气十馀丈,飞入温德殿中。秋七月,有虹现于玉堂,五原山岸,尽皆崩裂。种种不祥,非止一端。帝下诏问群臣以灾异之由,议郎蔡邕上疏,以为蜺堕鸡化,乃妇寺干政之所致,言颇切直。帝览奏叹息,因起更衣。曹节在后窃视,悉宣告左右;遂以他事陷邕于罪,放归田里。后张让、赵忠、封谞、段珪、曹节、侯览、蹇硕、程旷、夏恽、郭胜十人朋比为奸,号为“十常侍”。帝尊信张让,呼为“阿父”。朝政日非,以致天下人心思乱,盗贼蜂起。
</div>

</body>

image.png

指定列宽度

column-width 属性为列指定建议的最佳宽度。

下例规定了列的建议最佳宽度应为 100px:

实例

div {
  column-width: 100px;
}

CSS 调整大小

resize 属性规定元素是否应(以及如何)被用户调整大小。

注意:Internet Explorer 不支持 resize 属性。

image.png

下例允许用户调整宽度和高度

div {
resize: auto;
overflow: auto;
}

下例只允许用户调整 <div> 元素的宽度

div {
  resize: horizontal;
  overflow: auto;
}

下例只允许用户调整 <div> 元素的高度:

div {
  resize: vertical;
  overflow: auto;
}

CSS 变量

CSS 变量

var() 函数用于插入 CSS 变量的值。

CSS 变量可以访问 DOM,这意味着您可以创建具有局部或全局范围的变量,使用 JavaScript 来修改变量,以及基于媒体查询来修改变量。

使用 CSS 变量的一种好方法涉及设计的颜色。您可以将它们放在变量中,而不必一遍又一遍地复制和粘贴相同的颜色。

var() 函数的语法

var() 函数用于插入 CSS 变量的值。

var() 函数的语法如下:

var(name, value)
描述
name必需。变量名(以两条破折号开头)。
value可选。回退值(在未找到变量时使用)。

注释:变量名称必须以两个破折号(--)开头,且区分大小写!

全局变量可以在整个文档中进行访问/使用,而局部变量只能在声明它的选择器内部使用。

如需创建具有全局作用域的变量,请在 :root 选择器中声明它。 :root 选择器匹配文档的根元素。

如需创建具有局部作用域的变量,请在将要使用它的选择器中声明它。

下面,我们声明两个全局变量(--blue 和 --white)。然后,我们使用 var() 函数稍后在样式表中插入变量的值:

:root {
  --blue: #1e90ff;
  --white: #ffffff;
}

body { background-color: var(--blue); }

h2 { border-bottom: 2px solid var(--blue); }

.container {
  color: var(--blue);
  background-color: var(--white);
  padding: 15px;
}

button {
  background-color: var(--white);
  color: var(--blue);
  border: 1px solid var(--blue);
  padding: 5px;
}

使用 var() 有如下优势:

  • 使代码更易于阅读(更容易理解)
  • 使修改颜色值更加容易

如需将蓝色和白色改为较柔和的蓝色和白色,您只需要修改两个变量值:

:root {
  --blue: #6495ed;
  --white: #faf0e6;
}

body { background-color: var(--blue); }

h2 { border-bottom: 2px solid var(--blue); }

.container {
  color: var(--blue);
  background-color: var(--white);
  padding: 15px;
}

button {
  background-color: var(--white);
  color: var(--blue);
  border: 1px solid var(--blue);
  padding: 5px;
}

浏览器支持

表格中的数字注明了完全支持该属性的首个浏览器版本。

函数ChromeIEFirefoxSafariOpera
var()49.015.031.09.136.0

CSS 覆盖变量

用局部变量覆盖全局变量

上面有说,可以在整个文档中访问/使用全局变量,而局部变量只能在声明它的选择器内使用。

有时,我们希望变量仅在页面的特定部分中进行更改。

假设我们想要按钮元素使用不同的蓝色。那么,我们可以在 button 选择器内重新声明 --blue 变量。当我们在这个选择器中使用 var(--blue) 时,它将使用此处声明的局部 --blue 变量值。

我们看到局部的 --blue 变量会覆盖 button 元素的全局 --blue 变量:

:root {
  --blue: #1e90ff;
  --white: #ffffff;
}

body {
  background-color: var(--blue);
}

h2 {
  border-bottom: 2px solid var(--blue);
}

.container {
  color: var(--blue);
  background-color: var(--white);
  padding: 15px;
}

button {
  --blue: #0000ff;//在这里--------------------------
  background-color: var(--white);
  color: var(--blue);
  border: 1px solid var(--blue);
  padding: 5px;
}

CSS 使用 JavaScript 更改变量

使用 JavaScript 更改变量

CSS 变量可以访问 DOM,这意味着您可以通过 JavaScript 更改它们。

<script>
// 获取根元素
var r = document.querySelector(':root');

// 创建获取变量值的函数
function myFunction_get() {
  // Get the styles (properties and values) for the root
  var rs = getComputedStyle(r);
  // Alert the value of the --blue variable
  alert("The value of --blue is: " + rs.getPropertyValue('--blue'));
}

// 创建设置变量值的函数
function myFunction_set() {
  // Set the value of variable --blue to another value (in this case "lightblue")
  r.style.setProperty('--blue', 'lightblue');
}
</script>

CSS 在媒体查询中使用变量

现在,我们希望在媒体查询中修改变量值。

提示:媒体查询旨在为不同的设备(显示器、平板电脑、手机等)定义不同的样式规则。

在这里,我们首先为 .container 类声明一个名为 --fontsize 的新局部变量。我们将其值设置为 25 像素。然后我们在 .container 类中进一步使用它。然后,我们创建一个 @media 规则,内容为“当浏览器的宽度为 450px 或更宽时,将 .container 类的 --fontsize 变量值更改为 50px。”

/* 变量声明 */
:root {
  --blue: #1e90ff;
  --white: #ffffff;
}

.container {
  --fontsize: 25px;
}

/* 样式 */
body {
  background-color: var(--blue);
}

h2 {
  border-bottom: 2px solid var(--blue);
}

.container {
  color: var(--blue);
  background-color: var(--white);
  padding: 15px;
  font-size: var(--fontsize);
}

@media screen and (min-width: 450px) {
  .container {
    --fontsize: 50px;
  }
}

也可以修改它的颜色

@media screen and (min-width: 450px) {
  .container {
    --fontsize: 50px;
  }
   :root {
    --blue: lightblue;
  }
}

CSS Box Sizing

CSS Box Sizing

CSS box-sizing 属性允许我们在元素的总宽度和高度中包括内边距(填充)和边框。

假如不指定 CSS box-sizing 属性

默认情况下,元素的宽度和高度是这样计算的:

  • width + padding + border = 元素的实际宽度
  • height + padding + border = 元素的实际高度

这意味着:当您设置元素的宽度/高度时,该元素通常看起来比您设置的更大(因为元素的边框和内边距已被添加到元素的指定宽度/高度中)。

下图展示了两个有相同指定宽度和高度的 <div> 元素:

.div1 {
  width: 300px;
  height: 100px;
  border: 1px solid blue; 
}

.div2 {
  width: 300px;
  height: 100px;
  padding: 50px;
  border: 1px solid red;
}

image.png

上面的两个 <div> 元素在最终结果中呈现出不同的尺寸(因为 div2 指定了内边距):

box-sizing 属性解决了这个问题。

如果使用 CSS box-sizing 属性

box-sizing 属性允许我们在元素的总宽度和高度中包括内边距和边框。

如果在元素上设置了 box-sizing: border-box;,则宽度和高度会包括内边距和边框:

.div1 {
  width: 300px;
  height: 100px;
  border: 1px solid blue;
  box-sizing: border-box;
}

.div2 {
  width: 300px;
  height: 100px;
  padding: 50px;
  border: 1px solid red;
  box-sizing: border-box;
}

image.png

该例与上例相同,两个 <div> 元素都设置了 box-sizing: border-box;

由于使用 box-sizing: border-box; 的效果如此之好,许多开发人员希望页面上的所有元素都能够以这种方式工作。

下面的代码能够确保以这种更直观的方式调整所有元素的大小。许多浏览器已经在对许多表单元素使用 box-sizing: border-box;(但并非全部 - 这就是为什么 input 和 textarea 在 width: 100%; 时看起来不同)。

将其应用于所有元素是安全且明智的:

* {
  box-sizing: border-box;
}

CSS Flexbox

CSS Flexbox 布局模块

在 Flexbox 布局模块(问世)之前,可用的布局模式有以下四种:

  • 块(Block),用于网页中的部分(节)
  • 行内(Inline),用于文本
  • 表,用于二维表数据
  • 定位,用于元素的明确位置

弹性框布局模块,可以更轻松地设计灵活的响应式布局结构,而无需使用浮动或定位。

浏览器支持

所有现代浏览器均支持 flexbox 属性。

Flexbox 元素

如需开始使用 Flexbox 模型,您需要首先定义 Flex 容器。

父元素(容器)

通过将 display 属性设置为 flex,flex 容器将可伸缩:

.flex-container {
  display: flex;
}

以下是 flex 容器属性:

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

flex-direction 属性

flex-direction 属性定义容器要在哪个方向上堆叠 flex 项目。

column 值设置垂直堆叠 flex 项目(从上到下):

.flex-container {
  display: flex;
  flex-direction: column;
}

image.png

column-reverse 值垂直堆叠 flex 项目(但从下到上):

.flex-container {
  display: flex;
  flex-direction: column-reverse;
}

row 值水平堆叠 flex 项目(从左到右):

.flex-container {
  display: flex;
  flex-direction: row;
}

row-reverse 值水平堆叠 flex 项目(但从右到左):

.flex-container {
  display: flex;
  flex-direction: row-reverse;
}

flex-wrap 属性

flex-wrap 属性规定是否应该对 flex 项目换行。

下面的例子包含 12 个 flex 项目,以便更好地演示 flex-wrap 属性。

wrap 值规定 flex 项目将在必要时进行换行:

.flex-container {
  display: flex;
  flex-wrap: wrap;
}

image.png

nowrap 值规定将不对 flex 项目换行(默认):

.flex-container {
  display: flex;
  flex-wrap: nowrap;
}

wrap-reverse 值规定如有必要,弹性项目将以相反的顺序换行:

.flex-container {
  display: flex;
  flex-wrap: wrap-reverse;
}

flex-flow 属性

flex-flow 属性是用于同时设置 flex-direction 和 flex-wrap 属性的简写属性。

.flex-container {
  display: flex;
  flex-flow: row wrap;
}

justify-content 属性

justify-content 属性用于对齐 flex 项目:

.flex-container {
  display: flex;
  justify-content: center;
}

image.png

flex-start 值将 flex 项目在容器的开头对齐(默认):

.flex-container {
  display: flex;
  justify-content: flex-start;
}

flex-end 值将 flex 项目在容器的末端对齐:

.flex-container {
  display: flex;
  justify-content: flex-end;
}

space-around 值显示行之前、之间和之后带有空格的 flex 项目:

.flex-container {
  display: flex;
  justify-content: space-around;
}

image.png

space-between 值显示行之间有空格的 flex 项目:

.flex-container {
  display: flex;
  justify-content: space-between;
}

image.png

align-items 属性

align-items 属性用于垂直对齐 flex 项目。

center 值将 flex 项目在容器中间对齐:

.flex-container {
  display: flex;
  height: 200px;
  align-items: center;
}

image.png

flex-start 值将 flex 项目在容器顶部对齐:

.flex-container {
  display: flex;
  height: 200px;
  align-items: flex-start;
}

image.png

flex-end 值将弹性项目在容器底部对齐:

.flex-container {
  display: flex;
  height: 200px;
  align-items: flex-end;
}

image.png

stretch 值拉伸 flex 项目以填充容器(默认):

.flex-container {
  display: flex;
  height: 200px;
  align-items: stretch;
}

image.png

baseline 值使 flex 项目基线对齐:

.flex-container {
  display: flex;
  height: 200px;
  align-items: baseline;
}

image.png

align-content 属性

align-content 属性用于对齐弹性线。

在这些例子中,我们使用 600 像素高的容器,并将 flex-wrap 属性设置为 wrap,以便更好地演示 align-content 属性。

.flex-container {
  display: flex;
  height: 600px;
  flex-wrap: wrap;
  align-content: space-between;
}

image.png

space-around 值显示弹性线在其之前、之间和之后带有空格:

.flex-container {
  display: flex;
  height: 600px;
  flex-wrap: wrap;
  align-content: space-around;
}

image.png

stretch 值拉伸弹性线以占据剩余空间(默认):

.flex-container {
  display: flex;
  height: 600px;
  flex-wrap: wrap;
  align-content: stretch;
}

image.png

center 值在容器中间显示弹性线:

.flex-container {
  display: flex;
  height: 600px;
  flex-wrap: wrap;
  align-content: center;
}

image.png

flex-start 值在容器开头显示弹性线: flex-end 值在容器的末尾显示弹性线:

完美的居中

在下面的例子中,我们会解决一个非常常见的样式问题:完美居中。

解决方案:将 justify-content 和 align-items 属性设置为居中,然后 flex 项目将完美居中:

.flex-container {
  display: flex;
  height: 300px;
  justify-content: center;
  align-items: center;
}

image.png

子元素(项目)

flex 容器的直接子元素会自动成为弹性(flex)项目。

<div class="flex-container">
  <div>1</div>
  <div>2</div>
  <div>3</div> 
  <div>4</div>
</div>

image.png

上面的元素代表一个灰色 flex 容器内的四个蓝色 flex 项目。

用于弹性项目的属性有:

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

order 属性

order 属性规定 flex 项目的顺序。

代码中的首个 flex 项目不必在布局中显示为第一项。

order 值必须是数字,默认值是 0。

order 属性可以改变 flex 项目的顺序:

<div class="flex-container">
  <div style="order: 3">1</div>
  <div style="order: 2">2</div>
  <div style="order: 4">3</div> 
  <div style="order: 1">4</div>
</div>

image.png

flex-grow 属性

flex-grow 属性规定某个 flex 项目相对于其余 flex 项目将增长多少。

实例:

使第三个弹性项目的增长速度比其他弹性项目快八倍:

<div class="flex-container">
  <div style="flex-grow: 1">1</div>
  <div style="flex-grow: 1">2</div>
  <div style="flex-grow: 8">3</div> 
</div>

flex-shrink 属性

flex-shrink 属性规定某个 flex 项目相对于其余 flex 项目将收缩多少。

该值必须是数字,默认值是 0。

不要让第三个弹性项目收缩得与其他弹性项目一样多:

<div class="flex-container">
  <div>1</div>
  <div>2</div>
  <div style="flex-shrink: 0">3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
  <div>9</div>
  <div>10</div>
</div>

flex-basis 属性

flex-basis 属性规定 flex 项目的初始长度。

将第三个弹性项目的初始长度设置为 200 像素:

<div class="flex-container">
  <div>1</div>
  <div>2</div>
  <div style="flex-basis: 200px">3</div>
  <div>4</div>
</div>

flex 属性

flex 属性是 flex-grow、flex-shrink 和 flex-basis 属性的简写属性。

使第三个弹性项目不可增长(0),不可收缩(0),且初始长度为 200 像素:

<div class="flex-container">
  <div>1</div>
  <div>2</div>
  <div style="flex: 0 0 200px">3</div>
  <div>4</div>
</div>

align-self 属性

align-self 属性规定弹性容器内所选项目的对齐方式。

align-self 属性将覆盖容器的 align-items 属性所设置的默认对齐方式。

把第三个弹性项目对齐到容器的中间:

<div class="flex-container">
  <div>1</div>
  <div>2</div>
  <div style="align-self: center">3</div>
  <div>4</div>
</div>

image.png

将第二个弹性项目在容器顶部对齐,将第三个弹性项目在容器底部对齐:

<div class="flex-container">
  <div>1</div>
  <div style="align-self: flex-start">2</div>
  <div style="align-self: flex-end">3</div>
  <div>4</div>
</div>

image.png

CSS 媒体查询

CSS2 引入了媒体类型

CSS2 中引入了 @media 规则,它让为不同媒体类型定义不同样式规则成为可能。

例如:您可能有一组用于计算机屏幕的样式规则、一组用于打印机、一组用于手持设备,甚至还有一组用于电视,等等。

不幸的是,除了打印媒体类型之外,这些媒体类型从未得到过设备的大规模支持。

CSS3 引入了媒体查询

CSS3 中的媒体查询扩展了 CSS2 媒体类型的概念:它们并不查找设备类型,而是关注设备的能力。

媒体查询可用于检查许多事情,例如:

  • 视口的宽度和高度
  • 设备的宽度和高度
  • 方向(平板电脑/手机处于横向还是纵向模式)
  • 分辨率

使用媒体查询是一种流行的技术,可以向台式机、笔记本电脑、平板电脑和手机(例如 iPhone 和 Android 手机)提供定制的样式表。

浏览器支持

表格中的数字注明了完全支持 @media 规则的首个浏览器版本。

属性ChromeIEFirefoxSafariOpera
@media21.09.03.54.09.0

媒体查询语法

媒体查询由一种媒体类型组成,并可包含一个或多个表达式,这些表达式可以解析为 true 或 false。

@media not|only mediatype and (expressions) {
  CSS-Code;
}

如果指定的媒体类型与正在显示文档的设备类型匹配,并且媒体查询中的所有表达式均为 true,则查询结果为 true。当媒体查询为 true 时,将应用相应的样式表或样式规则,并遵循正常的级联规则。

除非您使用 not 或 only 运算符,否则媒体类型是可选的,且隐含 all 类型。

CSS3 媒体类型

描述
all用于所有媒体类型设备。
print用于打印机。
screen用于计算机屏幕、平板电脑、智能手机等等。
speech用于大声“读出”页面的屏幕阅读器。

媒体查询的简单实例

使用媒体查询的一种方法是在样式表内有一个备用的 CSS 部分。

下面的例子在视口宽度为 480 像素或更宽时将背景颜色更改为浅绿色(如果视口小于 480 像素,则背景颜色会是粉色):

@media screen and (min-width: 480px) {
  body {
    background-color: lightgreen;
  }
}

下例显示了一个菜单,如果视口的宽度为 480 像素或更宽,则该菜单会浮动到页面的左侧(如果视口小于 480 像素,则该菜单将位于内容的顶部):

@media screen and (min-width: 480px) {
  #leftsidebar {width: 200px; float: left;}
  #main {margin-left: 216px;}
}

CSS 媒体查询 - 实例

/* 在小于或等于 992 像素的屏幕上,将背景色设置为蓝色 */
@media screen and (max-width: 992px) {
  body {
    background-color: blue;
  }
}

横竖屏

@media only screen and (orientation: landscape) {
  body {
    background-color: lightblue;
  }
}

最小宽度到最大宽度

@media screen and (max-width: 900px) and (min-width: 600px) {
  div.example {
    font-size: 50px;
    padding: 50px;
    border: 8px solid black;
    background: yellow;
  }
}