本文为《CSS新世界》的读书笔记。推荐去读原著。
《CSS新世界》微信读书APP链接:CSS新世界-张鑫旭-微信读书 (qq.com)
fit-content
不是一个属性,它是 css 尺寸系列属性的一个新属性值。可用在 width
、height
、min-width
、 min-height
、 max-width
、max-height
等CSS 属性中。fit-content
属性可以让浏览器根据内容所需的长度来设置容器的尺寸。
.cw-content{
width: fit-content;
margin: auot;
}
The
margin-inline-end
CSS property defines the logical inline end margin of an element, which maps to a physical margin depending on the element’s writing mode, directionality, and text orientation. In other words, it corresponds to themargin-top
,margin-right
,margin-bottom
ormargin-left
property depending on the values defined forwriting-mode
,direction
, andtext-orientation
.摘自——margin-inline-end - CSS: Cascading Style Sheets | MDN (mozilla.org)
hyphens是专为英文场景设计的一个属性,这个属性可以让英文单词断开换行的时候带上连字符(也就是短横线)
hyphens: none | manual | auto
查看链接:CSS Level1 - Level4全部颜色关键字 » CSS新世界demo演示 (cssworld.cn)
表示当前元素(或伪元素)所使用的color属性的值。用于非color
属性,调用color
属性值。currentColor关键字主要还是用在背景颜色和背景渐变颜色中。
/* IE9+浏览器均支持 */
.button {
background-color: currentColor;
}
outline-offset属性用于改变outline属性设置的轮廓的偏移位置。
opacity属性没有继承性,因此父、子元素同时设置半透明时,半透明效果是叠加的。例如:
.father { opacity: .5; }
.son { opacity: .5; }
叠加值为 0.5×0.5=0.25
在border边框被占用,或者不方便使用border属性的情况下,我们可以借助box-shadow内阴影来模拟边框效果。
button {height: 40px; border: 0; border-radius: 4px;}
.normal {
background-color: #fff;
/* 模拟边框 */
box-shadow: inset 1px 0 #a2a9b6, inset -1px 0 #a2a9b6, inset 0 1px #a2a9b6, inset 0 -1px #a2a9b6;
}
.primary { color: #fff; background-color: #2a80eb;}
.warning { color: #fff; background-color: #eb4646;}
box-shadow内阴影模拟按钮边框 » CSS新世界demo演示 (cssworld.cn)
box-shadow内阴影有一个实用特性,那就是生成的阴影会位于文字内容的下面,背景颜色的上面。于是我们可以使用box-shadow属性在元素上面再覆盖一层颜色,这种做法在不少场景下非常有用。例如,按钮在被按下的时候其背景色要深一点,这用来给用户提供操作反馈。
button:active {
box-shadow: inset 0 0 0 999px rgba(0, 0, 0, .1);
}
扩展半径还支持负值,可以用来实现单侧阴影效果。理论上,实现单侧阴影效果只要设置一侧阴影的偏移大小为0即可,但是,如果模糊半径设置得较大,就会看到有部分阴影显示在左右两侧了,并不是单侧阴影效果。例如:
header {
width: 150px;
padding: 10px;
background-color: white;
box-shadow: 0 7px 5px -5px rgba(0, 0, 0, .5);
}
box-shadow属性支持无限多个阴影效果不断累加,因此理论上box-shadow属性可以实现任意图形效果,我们只需要设置1px×1px的元素,然后不断投影。当然,我们在实际开发中不会这么使用,因为没必要,性能也很糟糕。
使用box-shadow属性模拟多边框效果,该属性也支持圆角效果。
.multi-border {
height: 100px;
border-radius: 10px;
background-color: deepskyblue;
box-shadow: 0 0 0 4px #fff,
0 0 0 8px deeppink,
0 0 0 12px yellow,
0 0 0 16px purple;
}
多边框的过渡颜色足够细腻,还可以使用box-shadow属性实现由内往外但并不是径向渐变的渐变效果。
.gradient-border {
height: 100px;
border-radius: 10px;
background-color: deepskyblue;
box-shadow: 0 0 0 1px #07b9fb,
0 0 0 2px #17aef4,
0 0 0 3px #27a4ee,
0 0 0 4px #3799E7,
0 0 0 5px #478ee0,
0 0 0 6px #5784d9,
0 0 0 7px #6779d3,
0 0 0 8px #776ecc,
0 0 0 9px #8764c5,
0 0 0 10px #9759be,
0 0 0 11px #a74eb8,
0 0 0 12px #b744b1,
0 0 0 13px #c739aa,
0 0 0 14px #d72ea3,
0 0 0 15px #e7249d,
0 0 0 16px #f71996;
}
多阴影特性与图形绘制 » CSS新世界demo演示 (cssworld.cn)
给按钮设置一个3D投影效果,按下按钮的时候按钮的位置发生偏移,同时投影高度降低,这可以实现非常有立体感的按钮效果。
.shadow-3d-button {
width: 100px; height: 36px;
border: 1px solid #a0b3d6;
background-color: #f0f3f9;
box-shadow: 1px 1px #afc4ea, 2px 2px #afc4ea, 3px 3px #afc4ea;
}
.shadow-3d-button:active {
transform: translate(1px, 1px);
box-shadow: 1px 1px #afc4ea, 2px 2px #afc4ea;
}
多阴影特性与图形绘制 » CSS新世界demo演示 (cssworld.cn)
position:fixed;
失效。所有transform变换本质上都是坐标点位置的矩阵变换,transform-origin属性变化后,所有点的坐标都会发生变化,这导致最终的矩阵变换计算结果也发生变化。
calc()函数支持加减乘除4种运算,任何可以使用
、
、
、、
、
或者
数据类型的地方都可以使用calc()函数。
使用注意事项:
- 不能使用当前CSS属性不支持的数据类型
- 运算符前后带单位或者带百分号的值只能进行加减运算,不能进行乘除运算
- 除法运算斜杠右侧必须是不为0的数值类型
- 加号和减号左右两边一定要有空格
radial-gradient(50px 50%, white, deepskyblue);
50px 为水平半径;50% 为垂直半径;
设置渐变中心为左上角,渐变半径为100px:
radial-gradient(100px at 0 0, white, deepskyblue);
radial-gradient(100px at left top, white, deepskyblue);
设置渐变的中心点在距离右边缘和下边缘100px的位置,渐变半径为100px:
radial-gradient(100px at right 100px bottom 100px, white, deepskyblue);
关键字 | 描述 |
---|---|
closest-side |
渐变结束的边缘形状与容器距离渐变中心点最近的一边相切(圆形)或者至少与距离渐变中心点最近的垂直和水平边相切(椭圆)。 |
closest-corner |
渐变结束的边缘形状与容器距离渐变中心点最近的一个角相交。 |
farthest-side |
与 closest-side 相反,边缘形状与容器距离渐变中心点最远的一边相切(或最远的垂直和水平边)。 |
farthest-corner |
渐变结束的边缘形状与容器距离渐变中心点最远的一个角相交。 |
radial-gradient(farthest-corner circle at right 100px bottom 100px, white, deepskyblue);
circle 表示渐变的形状为圆;与之对应的还有一个关键字ellipse,它表示椭圆。由于径向渐变的默认形状就是椭圆,因此,没有任何一个场景必须要使用ellipse关键字。
线性渐变、径向渐变和锥形渐变都有对应的重复渐变函数,就是在各自的函数名前面添加repeating-前缀
,示意如下:
repeating-linear-gradient(transparent, deepskyblue 40px);
repeating-radial-gradient(transparent, deepskyblue 40px);
repeating-conic-gradient(transparent, deepskyblue 40deg);
perspective的中文意思是透视、视角。指定了观察者与 z=0 平面的距离,使具有三维位置变换的元素产生透视效果。
表示我们的眼睛相对3D变换元素的位置。如:
perspective-origin: top left;
perspective-origin: right 20px bottom 40%;
perspective-origin: 50% 50%;
perspective-origin: -200% 200%;
perspective-origin: 20cm 100ch;
注意:这里的位置不包括远近。远近是通过
perspective
属性设置的。
transform-style[1]支持两个关键字属性值,分别是preserve-3d和flat:
transform-style: preserve-3d;
transform-style: flat;
注意:transform-style属性需要用在3D变换元素的父元素上,也就是舞台元素上才有效果。
指定当元素背面朝向观察者时是否可见。
transition-delay属性可以设置负数。当transition-delay属性值为负值的时候,会省略部分动画进程。
用来设置应用过渡效果的CSS属性,其初始值是all,表示默认所有CSS属性都应用过渡效果。可同时列举多个属性。如:
transition-property: color, background-color, opacity, transform;
由于display:none;
不支持过渡效果,所以要实现显示隐藏的过渡效果我们可以使用visibility
属性。
visibility属性的过渡效果是显示的时候立即显示,隐藏的时候遵循transition-duration设置的时间延时隐藏。
transition-timing-function属性通过设置过渡时间函数来影响过渡效果的过渡速率。ransition-timing-function属性和animation-timing-function支持的属性值类型一致,总共分为三大类:
一般情况下,使用三次贝塞尔时间函数类型的关键字即可,其余两种类型更是很少使用。
三次贝塞尔时间函数类型写作,其正式语法如下:
= ease | ease-in | ease-out | ease-in-out | cubic-bezier(, , , )
贝塞尔曲线种类很多,包括线性贝塞尔曲线、二次方贝塞尔曲线、三次方贝塞尔曲线、四次方贝塞尔曲线、五次方贝塞尔曲线等。cubic-bezier()函数是三次方贝塞尔曲线函数。所有三次方贝塞尔曲线都是由起点、终点和两个控制点组成,在SVG或者Canvas中,三次方贝塞尔曲线的所有控制点都是不固定的。但是在CSS的cubic-bezier()函数中,起点和终点的坐标是固定的,分别是(0, 0)和(1, 1),因此,cubic-bezier()函数支持的参数值只有4个,代表了两个控制点的坐标,语法如下:
cubic-bezier(x1, y1, x2, y2)
其中坐标(x1, y1)表示控制点1的坐标,坐标(x2, y2)表示控制点2的坐标。
其他一些非CSS标准,但也属于常用缓动类型的贝塞尔曲线值:
:root {
--ease-in-quad: cubic-bezier(.55, .085, .68, .53);
--ease-in-cubic: cubic-bezier(.55, .055, .675, .19);
--ease-in-quart: cubic-bezier(.895, .03, .685, .22);
--ease-in-quint: cubic-bezier(.755, .05, .855, .06);
--ease-in-expo: cubic-bezier( .95, .05, .795, .035);
--ease-in-circ: cubic-bezier( .6, .04, .98, .335);
--ease-out-quad: cubic-bezier( .25, .46, .45, .94);
--ease-out-cubic: cubic-bezier( .215, .61, .355, 1);
--ease-out-quart: cubic-bezier( .165, .84, .44, 1);
--ease-out-quint: cubic-bezier( .23, 1, .32, 1);
--ease-out-expo: cubic-bezier(.19, 1, .22, 1);
--ease-out-circ: cubic-bezier(.075, .82, .165, 1);
--ease-in-out-quad: cubic-bezier(.455, .03, .515, .955);
--ease-in-out-cubic: cubic-bezier(.645, .045, .355, 1);
--ease-in-out-quart: cubic-bezier(.77, 0, .175, 1);
--ease-in-out-quint: cubic-bezier(.86, 0, .07, 1);
--ease-in-out-expo: cubic-bezier(l, 0, 0, 1);
--ease-in-out-circ: cubic-bezier(.785, .135, .15, .86);
}
animation属性支持同时应用多个动画规则,例如实现元素淡出和右侧划入同时进行的动画效果。正确做法是分隔设置,而不是设置在一个动画规则中,也就是不推荐使用下面的CSS代码:
.element {
animation: fadeInSlideInRight .2s;
}
@keyframes fadeInSlideInRight {
from {opacity: 0; transform:translateX(100%);}
to{opacity: 1; transform:translateX (0%);}
}
而是推荐将代码分隔成多个独立的动画规则,CSS代码如下:
.element {
animation: fadeIn .2s, slideInRight .2s;
}
@keyframes fadeIn {
from {opacity: 0;}
to {opacity: 1;}
}
@keyframes slideInRight {
from {
transform: translateX(100%);
}
to {
transform: translateX(0%);
}
}
这样做的好处在于我们自定义的动画规则可以在其他场合重复利用。
@keyframes规则的语法如下:
@keyframes {
}
其中
指的是定义的关键帧列表,每个关键帧由关键帧选择器和对应的CSS样式组成。关键帧选择器用来指定当前关键帧在整个动画过程中的位置,其支持from、to这两个关键字和百分比值。
@keyframes规则的特性:
animation-delay可以让动画延时播放。需要注意的是,如果动画是无限循环的,设置的延时不会跟着循环。如:
.loading {
animation: spin 1s infinite;
animation-delay: 300ms;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
此时.loading元素会在延时300ms后不断旋转,而不是在延时300ms后旋转一圈,再在延时300ms后旋转一圈,不断循环。
想要实现每次动画循环都有延时效果,常用的方法是在自定义动画关键帧处进行设置。
.loading {
animation: spin 1s infinite;
}
@keyframes spin {
0%, 30% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
animation-direction属性可以用来控制动画的方向,其本质上是通过控制@keyframes规则中定义的动画关键帧执行的方向来实现的。其中,reverse和alternate这两个关键字都有“相反”的意思,不同之处在于,reverse关键字是让每一轮动画执行的方向相反,而alternate关键字是让下一轮动画的执行方向和上一轮动画的执行方向相反。从效果表现来看,alternate关键字的动画效果表现为来回交替播放。
animation-iteration-count的属性值可以设置成小数。
animation-fill-mode属性的字面意思是“动画填充模式”,主要用来定义动画在执行时间之外应用的值。
animation-fill-mode属性的语法如下:
animation-fill-mode: none; /* 默认值 */
animation-fill-mode: forwards;
animation-fill-mode: backwards;
animation-fill-mode: both;
none是默认值,表示动画开始之前和动画结束之后不会对元素应用@keyframes规则中定义的任何样式。
forwards是“前进”的意思,表示动画结束后(什么时候结束由animation-iteration- count属性决定),元素将应用当前动画结束时的属性值。
backwards是“后退”的意思,表示在动画开始之前,元素将应用当前动画第一轮播放的第一帧的属性值。
both可以让元素的动画在延时等待时保持第一帧的样式,在动画结束后保持最后一帧的样式,适用于绝大多数的开发场景。
使用animation-play-state属性可以控制CSS动画的播放和暂停,语法如下:
/* 播放 */
animation-play-state: running;
/* 暂停 */
animation-play-state: paused;
相比其他布局方法,分栏布局最大的优点是不会改变元素原本的display计算值。例如,在默认状态下,
display:flex
或display:grid
会重置
元素内置的display:list-item
声明。column-width表示每一栏/列的最佳宽度,注意,是“最佳宽度”,实际渲染宽度多半和指定的宽度是有出入的
column-count表示理想的分栏数目,最终的分栏数目可能不受column-count属性值的控制。
在分栏布局中,最终分栏的数量是由column-count与column-width属性共同决定。column-width属性值会换算成column-count属性值,然后比较两者的大小,哪个值小就使用哪一个
column-gap属性表示每一栏之间的空白间隙的大小,可以是长度值,也可以是百分比值。
flex子项块状化。flex子项都是块级水平元素,因此,在flex子项元素中使用vertial-align属性一定是没有任何效果的。flex子项的块状化特性对匿名内联元素同样适用,所谓匿名内联元素指的就是没有嵌套标签的裸露的文本元素。
flex子项浮动失效。
flex子项的margin值不会合并。
flex子项的margin值不会合并。
flex子项是格式化的尺寸。flex子项的尺寸是一种格式化的尺寸,也就是经过精确计算的、应用某个计算值后的尺寸。可以使用margin:auto
进行剩余空间的智能分配。
flex子项如果被设置为绝对定位,则会脱离弹性布局。
flex子项的尺寸默认表现为收缩,如果要设置建议的尺寸,可以给flex子项使用flex-basis属性,或者使用缩写的flex属性。
flex-flow属性是flex-direction属性和flex-wrap属性的缩写,表示弹性布局的流动特性。
flex-flow属性的语法如下:
flex-flow: <'flex-direction'> || <'flex-wrap'>
当多属性值同时使用的时候,使用空格分隔,且不区分前后顺序。
几个特定单词的含义:
因此,justify-content属性就表示整体布局的水平对齐设置,align-items就表示全体元素的垂直对齐样式设置。
align-content
属性和align-items
属性的区别在于align-items属性设置的是每一个flex子项的垂直对齐方式,而align-content属性将所有flex子项作为一个整体进行垂直对齐设置。
flex属性的语法如下:
flex: auto;
flex: none;
flex: <'flex-grow'> <'flex-shrink'>? || <'flex-basis'>
为了让这3个属性更容易被理解,我们不妨把弹性布局中的尺寸分配看成分配家产。
故事是这样的,有一个姓范的人家生了5个孩子,分别叫作范张、范鑫、范旭、范帅和范哥。要是只有一个孩子,那这个孩子就继承100%的家产,但是现在有5个孩子,家长范某需要提早定好家产分配规则。而flex属性的作用就如同制定分配家产的规则。
- flex-basis属性用来分配基础数量的家产。
- flex-grow属性用来家产仍有富余的时候该如何分配。
- flex-shrink属性用来家产不足的时候该如何分配。
flex-grow属性指定了容器剩余空间多余时候的分配规则,默认值是0,表示多余空间不分配.
具体规则如下:
flex-shrink属性指定了容器剩余空间不足时候的分配规则,默认值是1,表示空间不足要分配
具体规则如下:
flex-basis属性则是指定的分配基础尺寸,默认值是auto。
在弹性布局中,一个flex子项的最终尺寸是基础尺寸(或内容尺寸)、弹性增长或收缩、最大最小尺寸共同作用的结果。
最终尺寸计算的优先级是:
最大最小尺寸限制 > 弹性增长或收缩 > 基础尺寸
- 基础尺寸由flex-basis属性或width属性,以及box-sizing盒模型共同决定;
- 内容尺寸指最大内容宽度,当没有设置基础尺寸时会顶替基础尺寸的角色;
- 弹性增长指的是flex-grow属性,弹性收缩指的是flex-shrink属性;
- 最大尺寸主要受max-width属性限制;最小尺寸则比较复杂,受最小内容宽度、width属性和min-width属性共同影响。
弹性布局中的尺寸表现几乎都是围绕基础尺寸展开的。其中flex-basis属性和width属性都可以用来设置flex子项的基础尺寸,对基础尺寸的影响关系如下:
这里出现的“最小尺寸”表示最终尺寸的最小值,这个“最小尺寸”是最小内容宽度、width属性和min-width属性共同作用的结果。
具体规则如下,如果flex-shrink属性不为0,则:
overflow:hidden
,且最小尺寸是由最小内容宽度决定的,则最小尺寸无效。flex:none的尺寸同样不会弹性增大(flex-grow:0),但是也不会弹性收缩(flex-shrink:0),我们可以理解为元素的尺寸没有弹性变化,考虑到此时flex-basis属性值是auto,即基础尺寸由内容决定,因此设置flex:none的元素最终尺寸通常表现为最大内容宽度。
当flex子项的宽度就是内容的宽度,且内容永远不会换行时,则适合使用flex:none;
元素尺寸可以弹性增大,也可以弹性减小,在容器尺寸不足时会优先最小化内容尺寸。
当希望元素充分利用剩余空间,同时不会侵占其他元素应有的宽度的时候,适合使用flex:1,这样的场景在弹性布局中非常多。例如所有等分列表或等比例列表都适合使用flex:1。
元素尺寸可以弹性增大,也可以弹性减小,容器尺寸不足时会优先最大化内容尺寸。
当希望元素充分利用剩余空间,但是元素各自的尺寸又需要按照各自内容进行分配的时候,就适合使用flex:auto
。flex:auto
多用于内容固定和内容可控的布局场景,例如导航数量不固定且每个导航文字数量也不固定的导航效果就适合使用flex:auto
来实现。
grid-template-columns
和grid-template-rows
属性主要用来指定网格的数量和尺寸等信息。如下:
.container {
grid-template-columns: 80px auto 100px;
grid-template-rows: 25% 100px auto 60px;
}
grid-template-columns
属性含3个值,表示网格分为3列,从左往右每列的尺寸分别是80px、auto(自动)和100px。grid-template-rows
属性含4个值,表示网格分为了4行,从上往下每行的高度分别是25%、100px、auto(自动)和60px。grid-template-columns
属性和grid-template-rows
属性有一个特别的功能,就是可以给网格线命名,语法如下:
grid-template-columns: ...;
表示划分出来的小区的尺寸,可以是长度值、百分比值、fr
单位(网格剩余空间比例单位)和尺寸关键字等多种类型的属性值。
表示划分的街道的名称,命名规则和CSS动画的命名规则一样。网格线的命名使用场景不多。
数据类型,共支持9种数据类型,分别如下:
长度值
百分比值
关键字:min-content
。网格布局中的同一行grid子项的高度和同一列grid子项的宽度都是一致的,因此min-content指的并不是某一个格子的最小内容尺寸,而是一排或者一列格子中所有最小内容尺寸中最大的那个最小内容尺寸值。
关键字:max-content
关键字:auto
。如果该网格轨道为最大时,该属性等同于
,为最小时,则等同于
。
注意:网格轨道大小为
auto
(且只有为auto
) 时,才可以被属性align-content
和justify-content
拉伸。
数据类型。用单位 fr
来定义网格轨道大小的弹性系数。每个定义了
的网格轨道会按比例分配剩余的可用空间。
函数:minmax()
函数repeat()
函数:fit-content()
fr
是单词fraction的缩写,表示分数。
网格布局往往有多列或者多行,其中有些列有固定的宽度,有些列的宽度就由页面自动分配,而fr
就表示这些自动分配列的尺寸划分比例。
与关键字
auto
的区别:auto关键字也可以自动分配列的尺寸,但是auto关键字的尺寸划分是随着内容变化的,内容多则尺寸大,内容少则尺寸小,而fr就是纯粹按比例计算,与内容多少无关。
fr
值之和大于1,则按fr
值的比例划分可自动分配尺寸。fr
值之和小于1,最终的尺寸是可自动分配尺寸和fr
值的乘法计算值。minmax()函数支持两个参数值:
minmax(min, max)
表示尺寸范围限制在min~max范围内。
minmax()函数的正式语法如下:
minmax( [ <length> | <percentage> | min-content | max-content | auto ] , [ <length> | <percentage> | <flex> | min-content | max-content | auto ] )
注意:
数据类型(如以fr为单位的值)只能作为第二个参数出现
fit-content()函数的作用用一句话解释就是:让尺寸适应于内容,但不超过设定的尺寸。底层计算公式如下:
fit-content(limit) = max(minimum, min(limit, max-content))
常用于希望grid子项的宽度随着内容变化,但是又不希望宽度太大的场景。
现在,假设有一个布局是12列的,代码如下:
.container {
grid-template-columns: 40px auto 60px 40px auto 60px 40px auto 60px 40px auto 60px;
}
可以看到是40px auto 60px
重复了4次。
上面的写法不易查看与理解。但是有了repeat()
函数就不需要这样写了。下面是repeat()
函数的写法:
.container {
grid-template-columns: repeat(4, 40px auto 60px);
}
由此可见,repeat()函数的作用很简单,就是当网格尺寸可以重复的时候简化属性值的书写,正式语法如下:
repeat( [ | auto-fill | auto-fit ] , )
其中,
是不包括repeat()
函数在内的所有grid-template-columns
支持的属性值。
auto-fill
和auto-fit
相当于一个变量,表示一个不确定的重复次数,究竟重复多少次,是由grid容器和每一个grid子项的尺寸计算得到的。
grid-template-areas
属性用来指定网格区域的划分。
grid-template-areas属性的语法如下:
.container {
grid-template-areas:
" | . | none | ..."
"...";
}
表示对应网格区域的名称.
表示空的网格单元格none
表示没有定义网格区域。我们通过一个案例熟悉一下grid-template-areas属性的使用方法和作用。张老板承包了一块土地,希望开展农作物种植和水产养殖业务,那么就需要对这块土地进行区域划分,决定哪片区域搞种植,哪片区域搞养殖。于是张老板就把这片土地划分成了3×4共12个小格子,最上面3个格子种葡萄,最下面3个格子种西瓜,中间6个格子,左边2个养龙虾,右边4个养鱼。土地区域划分如图6-93所示。
对应的CSS代码如下:
.container {
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 1fr 1fr 1fr 1fr;
grid-template-areas:
"葡萄 葡萄 葡萄"
"龙虾 养鱼 养鱼"
"龙虾 养鱼 养鱼"
"西瓜 西瓜 西瓜";
}
共12个格子,4片区域,因此,grid子项只需要4个元素即可,HTML示意如下:
<div class="container">
<item class="putao">item>
<item class="longxia">item>
<item class="yangyu">item>
<item class="xigua">item>
div>
此时只要使用grid-area属性指定grid子项隶属于哪个区域就可以了(支持中文区域名称):
.putao { grid-area: 葡萄; }
.longxia { grid-area: 龙虾; }
.yangyu { grid-area: 养鱼; }
.xigua { grid-area: 西瓜; }
案例 dome: https://demo.cssworld.cn/new/6/3-3.php
grid-auto-columns
和grid-auto-rows
属性的作用是指定任何自动生成的网格(也称为隐式网格)的尺寸大小。
隐式网格”是非正常网格,其在grid子项多于设置的单元格数量,或grid子项的位置出现在设定的网格范围之外时出现,而在规定容器内显示的网格称为“显式网格”。
grid-auto-flow
属性用来定义子项目元素的自动流动状态,grid-auto-flow
属性在网格布局中的地位非常类似于弹性布局中的flex-direction
属性。
grid-auto-flow属性语法如下:
grid-auto-flow: [ row | column ] || dense
gap
属性用于设置间隙。可用于分栏布局、弹性布局、网格布局。
gap
属性语法如下:
.container {
gap: ;
}
要想justify-content
属性和align-content
属性起作用,就需要让grid子项的总尺寸小于grid容器的尺寸。要么给gird子项设置较小的具体的尺寸值,要么让gird子项的尺寸是auto,同时保证内容尺寸较小。
列范围设置属性grid-column-start
/grid-column-end
和行范围设置属性grid-row-start
/grid-row-end
是应用在grid子项上的,通过指定grid子项行和列的起止位置来表明当前grid子项所占据的范围。
属性的语法如下:
.item {
grid-column-start: | | | span | span | auto;
grid-column-end: | | | span | span | auto;
grid-row-start: | | | span | span | auto;
grid-row-end: | | | span | span | auto;
}
grid-area
是一个缩写属性,它是grid-row-start
、grid-column-start
、grid-row-end
和grid-column-end
这4个CSS属性的缩写。此外,还可以直接使用grid-template-areas
设置的名称作为属性值,从而非常便捷地实现区域范围设置。
语法如下:
grid-area: | / / /
使用CSS Shapes布局可以实现不规则的图文环绕效果,它需要和float属性配合使用。
shape-outside
属性设置环绕形式。其值分为四类:
表示图形盒子。分别是margin-box
、border-box
、padding-box
和content-box
。
表示基本图形函数。
表示图像类。shape-margin
属性很好理解,其作用就是控制文字环绕图形时文字与元素边界的距离。
shape-margin
的有效数值范围是有限制的,即从0到浮动元素的边界,当shape-margin的属性值超过浮动元素边界的时候,布局效果如同普通浮动布局效果,没有不规则的图形环绕效果。
shape-image-threshold
指图像环绕时候的半透明阈值,默认是0.0,也就是图像透明度为0的区域边界才能被文字环绕。同理,如果属性值是0.5,则表示透明度小于0.5的区域都可以被文字环绕。
@media
规则是用来匹配不同设备的。
@media
规则总共有四部分:
举例:
/* 如果设备更新频率慢,或者不支持鼠标行为 */
@media (update: slow) or (hover: none) {}
/* 宽度在320px~480px,同时分辨率是150dpi的设备 */
@media only screen
and (min-width: 320px)
and (max-width: 480px)
and (resolution: 150dpi) {
body { line-height: 1.4; }
}
prefers-color-scheme
媒体特性可以用来检测当前网页是否处于深色模式(或称黑暗模式)中,其支持的参数值如下:
no-preference
表示系统没有告知用户使用的颜色方案。light
表示系统倾向于使用浅色模式。dark
表示系统倾向于使用深色模式。/* 深色模式 */
@media (prefers-color-scheme: dark) {
body { background: #333; color: white; }
}
/* 浅色模式 */
@media (prefers-color-scheme: light) {
body { background: white; color: #333; }
}
any-hover
媒体特性可用于测试是否有任意可用的输入装置可以悬停(就是hover行为)在元素上。例如,鼠标这个输入装置就可以控制鼠标指针的位置,以及悬停在元素上。
none
表示没有输入装置可以实现悬停效果,或者没有可以实现指向的输入装置。hover
表示一个或多个输入装置可以触发元素的悬停交互效果。hover
媒体特性的语法和作用与any-hover
是一样的,两者的主要区别在于,any-hover检测任意输入装置,而hover只检测主要的输入装置。
pointer
和any-pointer
媒体特性主要用于识别当前环境,判断是否可以非常方便地进行点击操作。
any-pointer
支持3个属性值,含义分别如下:
none
表示没有可用的点击设备。coarse
表示至少有一个设备的点击不是很精确。例如,使用手指操作手机就属于点击不精确。fine
表示有点击很精准的设备。例如,用鼠标操作的计算机浏览器。pointer也支持3个属性值,含义分别如下:
none
表示主输入装置点击不可用。coarse
表示主输入装置点击不精确。fine
表示主输入装置点击很精准。touch-action属性是移动端中与手势触摸密切相关的CSS属性。
touch-action属性支持的属性值有:
touch-action: auto;
touch-action: manipulation;
touch-action: none;
touch-action: pan-x;
touch-action: pan-y;
touch-action: pan-left;
touch-action: pan-right;
touch-action: pan-up;
touch-action: pan-down;
touch-action: pinch-zoom;
auto
是默认值,表示手势操作完全由浏览器决定(如
元素的viewport属性通过设置user-scalable=no/yes
来确定是否允许缩放)。manipulation
表示浏览器只允许进行滚动和持续缩放操作,类似双击缩放这种非标准操作就不可以。此属性值可以用来解决点击后延时300ms的问题。iOS 9.3就已经支持该值。none
表示不进行任何手势相关的行为,例如,你想用手指滚动网页就不行,双击放大或缩小页面也不可以,所有这些行为都要自定义。另外,从这个属性值开始,一直到最后一个属性值pinch-zoom,都是iOS 13才开始支持的。pan-x
表示支持手指头水平移来移去的操作。pan-y
表示支持手指头垂直移来移去的操作。pan-left
表示支持手指头往左移动,移动开始后往右可以恢复的操作。pan-right
表示支持手指头往右移动,移动开始后往左可以恢复的操作。pan-up
表示支持手指头往上移动,移动开始后往下可以恢复的操作。pan-down
表示支持手指头往下移动,移动开始后往上可以恢复的操作。pinch-zoom
表示支持手指头缩放页面的操作。image-set()函数可以根据不同设备的屏幕密度或者分辨率来显示不同的背景图(background- image)或者遮罩图片(mask-image)等。例如:
.image-set {
width: 128px; height: 96px;
background: url(fallback.jpg);
background: image-set(
url(w128px.jpg) 1x,
url(w256px.jpg) 2x,
url(w512px.jpg) 3x);
background-size: cover;
}
CSS变量的语法由两部分组成,一部分是CSS变量的声明,另一部分是CSS变量的使用。其中,CSS变量的声明由CSS自定义属性及其对应的值组成,而CSS变量的使用则通过变量函数var()调用CSS自定义属性实现。例如:
:root {
--primary-color: deepskyblue;
}
button {
background-color: var(--primary-color);
}
var()
函数的完整语法为:
var( [, ]? )
其中,
指的就是自定义属性名;
指的是声明值,可以理解为备选值或缺省值,当前面的自定义属性一定无效时,就会使用
定义的值。
如果第一个参数值是不合法的,则var()函数解析为当前CSS属性的初始值或继承值(如果有继承性),也就是按照unset全局关键字的规则渲染。(注意,只是渲染规则类似,并不等同于直接设置unset关键字。)
var()函数的空格尾随特性
html {
font-size: 14px;
}
body {
--size: 20;
font-size: 16px;
font-size: var(--size)px;
}
此处font-size:var(--size)px
等同于font-size:20 px
,注意,20后面有一个空格,这属于不合法的font-size属性值。
CSS自定义属性值可以是任意值或表达式
CSS自定义属性值可以相互传递
body {
--green: #4CAF50;
--successColor: var(--green);
}
CSS自定义属性不能自身赋值
:root {
--primary-color: deepskyblue;
}
.some-class {
--primary-color: var(--primary-color, #2a80eb);
/* --primary-color会被认为是非法的,color的颜色为当前上下文的颜色 */
color: var(--primary-color);
}
CSS自定义属性不支持用在媒体查询中
:root {
--maxWidth: 640px;
}
/* 不合法,语法无效 */
@media (max-width: var(--maxWidth)) {}
在HTML标签中设置CSS自定义属性的方法和在HTML标签中设置普通的CSS属性的方法是一样的,直接将要设置的属性写在style属性中即可,例如:
<div style="--color: deepskyblue;">
<img src="1.jpg" style="border: 10px solid var(--color);">
div>
在JavaScript中,使用setProperty()
方法设置CSS自定义属性:
box.style.setProperty('--color', 'deepskyblue');
在JavaScript中,CSS自定义属性的获取需要使用getPropertyValue()
方法:
// 获取 --color CSS变量值
var cssVarColor = getComputedStyle(box).getPropertyValue('--color');
// 输出cssVarColor值,结果是deepskyblue
console.log(cssVarColor);
有时候需要让CSS变量中的自定义属性值能够同时作为字符内容在页面中呈现。我们很快就会想到使用::before和::after伪元素配合content属性来实现,但是,把CSS自定义属性值作为content属性值是没有任何效果的。例如:
/* 无效 */
.bar::before {
content: var(--percent);
}
那该如何实现呢?这里分享一个实用的技巧,那就是借助CSS计数器呈现CSS自定义属性值,示意代码如下:
/* 有效 */
.bar::before {
counter-reset: progress var(--percent);
content: counter(progress);
}
虽然content属性本身不支持CSS自定义属性值,但是counter-reset属性后面的计数器初始值是支持的,于是我们可以来一招“移花接木”,从而让CSS自定义属性值作为字符在页面中显示。
text-shadow
是文字阴影,box-shadow
是盒阴影,两者语法类似,但仍有两点区别。
text-shadow
不支持inset关键字,也就是text-shadow
只有外阴影,没有内阴影。text-shadow
不支持阴影扩展,也就是text-shadow
最多支持3个数值,分别表示水平偏移、垂直偏移和模糊大小。text-stroke
属性是text-stroke-width
和text-stroke-color
这两个CSS属性的缩写,分别表示文字描边的宽度和文字描边的颜色。如下:
.stroke {
-webkit-text-stroke: 2px red;
}
注意:目前所有浏览器只支持-webkit-私有前缀的语法。
使用text-fill-color
属性可以对文字进行颜色填充,还可以覆盖color
属性设置的颜色,注意,只是覆盖color的渲染表现,实际上元素的颜色计算值还是由color属性决定的。
-webkit-text-fill-color: transparent;
-webkit-text-fill-color: deepskyblue;
-webkit-text-fill-color: #228bff;
-webkit-text-fill-color: rgba(100, 200, 0, .6);
注意:目前所有浏览器只支持-webkit-私有前缀的语法。
text-emphasis家族总共有如下4个CSS属性:
text-emphasis-color
text-emphasis-style
text-emphasis-position
text-emphasis
其中,text-emphasis
是text-emphasis-color
和text-emphasis-style
这两个CSS属性的缩写。
text-emphasis-style语法主要有下面3类:
text-emphasis-style: none
text-emphasis-style: [ filled | open ] || [ dot | circle | double-circle | triangle |
sesame ]
text-emphasis-style:
其中,text-emphasis-style:none
是默认声明,表示没有任何强调装饰。text-emphasis- style:
表示使用任意单个字符作为强调装饰符。例如:
宝贝,爱你,比心!
.emphasis {
-webkit-text-emphasis-style: '❤';
text-emphasis-style: '❤';
}
text-emphasis-position属性用来指定强调装饰符的位置,默认位置是在文字的上方。
语法如下:
text-emphasis-position: [ over | under ] && [ right | left ]
如下:
text-emphasis-position: over left;
text-emphasis-position: under right;
text-emphasis-position: under left;
text-emphasis-position: left over;
text-emphasis-position: right under;
text-emphasis-position: left under;
text- orientation
属性可以设置竖向排版时中文和英文字符的方向。
语法如下:
text-orientation: mixed | upright | sideways
mixed
是默认值,表示中文和英文的文字显示方向是不一致的,中文字符是正立的,而英文字符则顺时针旋转90度后显示upright
表示中文和英文的文字显示方向都是默认的正立显示,没有旋转sideways
表示中文和英文的文字显示方向都是顺时针旋转90度text-orientation与垂直排版文字方向控制 » CSS新世界demo演示 (cssworld.cn)
text-combine-upright属性可以让2~4个字符横向合并显示。
CSS新世界
.upright {
writing-mode: vertical-rl;
}
.upright span {
-ms-text-combine-horizontal: all;
-webkit-text-combine: horizontal;
text-combine-upright: all;
}
text-combine-upright属性的语法如下:
text-combine-upright: none | all | digits?
none
是默认值,表示字符不会参与横向合并;all
表示所有类型的字符都会参与横向合并,不过一个标签内最多只能合并4个字符;digits ?
表示仅数字字符参与横向合并。没有任何浏览器支持该值。unicode-bidi
属性总是和direction
属性配合使用,用来设置字符水平流向的细节。
unicode-bidi
属性比较实用的是: unicode-bidi:plaintext;
。使用plaintext属性值可以在不改变当前文档的水平流向的前提下,让所有字符按照默认的从左往右的流向排列。
ch与em、rem和ex一样,是CSS中为数不多和字符相关的相对单位。与单位em和rem相关的字符是“m”,与ex相关的字符是“x”,和ch相关的字符则是“0”,没错,就是阿拉伯数字0。1ch表示1个“0”字符的宽度,所以“000000”所占据的宽度就是6ch。
使用tab-size
属性可以控制Tab键输入的空格(U+0009)的长度大小。
tab-size
属性的语法如下:
tab-size: |
为整数值。表示Tab键输入的空格的宽度等于几个Space键输入的空格(U+0020)的宽度。
为长度值。表示每个Tab键输入的空格的宽度值。唯一应用场景:
在技术文档中,一定会使用大量的
元素来展示程序代码,因为
元素中white-space的属性值是pre,空格不会发生合并,Tab键输入的空格缩进或者Space键输入的空格缩进都可以准确显示出来,方便代码阅读。但是有一个问题,那就是在所有浏览器中,每个Tab键输入的空格的宽度等同于8个Space键输入的空格的宽度,而在编辑器中却不是这样的。在编辑器中,每个Tab键输入的空格的宽度等同于4个Space键输入的空格的宽度,这就会导致在
元素中使用Tab键缩进的代码产生过度缩进的效果。
使用tab-size属性即可调整:
pre { -moz-tab-size: 4; tab-size: 4; }
字体特征和变体指OpenType字体中包含的不同字形或字符样式。其中的OpenType字体是Adobe和微软联合开发的一种字体,字体文件的原始后缀可能是.otf、.otc、.ttf或.ttc。OpenType目前是国际标准组织(International Organization for Standardization,ISO)的公开标准,于2007年3月以ISO/IEC 14496-22发布。而“不同字形或字符样式”指的是连字(将fi或ffl等字符组合在一起的特殊字形)、字距(调整特定字母形式对之间的间距)、分数、数字样式和其他一些字符。
font-variant-caps属性的语法如下:
font-variant-caps: normal | small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps
font-variant-numeric属性主要用来设置数字的变体效果。
font-variant-numeric属性的语法如下:
font-variant-numeric: normal;
font-variant-numeric: [ lining-nums | oldstyle-nums ] || [ proportional-nums |
tabular-nums ] || [ diagonal-fractions | stacked-fractions ] || ordinal || slashed-zero;
标签就可以让字符“1st,2nd,3rd,4th,5th”表现为图9-37所示的上标效果。ordinal对应的OpenType特征值是"ordn",操作系统中常规的英文字体并没有包含此特征,使用专门设计过的字体才可以实现数字序列化的效果。proportional-nums和tabular-nums用来控制数字的尺寸。其中,proportional- nums表示每个数字占据的宽度并不一致,宽度大小由字形大小决定;tabular-nums表示每个数字占据的宽度都是一样的,数字就好像被约束在宽度一致的表格中。
diagonal-fractions和stacked-fractions用来控制分数的样式。其中,diagonal-fractions表示让分子和分母尺寸变小并将两者用斜线隔开;stacked-fractions表示让分子和分母尺寸变小并将两者使用水平线隔开。
font-variant-alternates属性主要用来让字体发生变化,包括样式和风格的变化,以及字符集和字符的变化,从而让字体变得花哨,或者变成装饰字符、注释字符等。
font-variant-alternates属性值以函数为主,具体代码如下:
font-variant-alternates: normal;
font-variant-alternates: stylistic() || historical-forms || styleset(#) ||
character-variant(#) || swash() || ornaments() || annotation();
image-rendering属性用来设置图像的缩放算法,主要针对PNG和JPG这类位图。image-rendering属性可以设置在元素上,也可以设置在
元素的祖先元素上。在现代浏览器中,image-rendering属性还可以设置background图像和canvas画布图像的缩放算法。image-rendering属性只有在图像发生缩放的时候才会有效果。
语法如下:
image-rendering: auto | crisp-edges | pixelated
cross-fade()函数可以让两张图像半透明混合。语法如下:
cross-fade(url(green.png) 75%, url(red.png) 75%);
cross-fade(url(red.png) 20%, url(yellow.png) 30%, url(blue.png) 50%);
举例:
.cross-fade-image {
width: 300px; height: 300px;
background: no-repeat center / contain;
background-image: -webkit-cross-fade(url(1.jpg), url(2.jpg), 50%);
background-image: cross-fade(url(1.jpg), url(2.jpg), 50%);
}
滤镜 | 描述 |
---|---|
blur(px) | 对图像应用模糊效果。较大的值将产生更多的模糊。如果为指定值,则使用 0。 |
brightness(%) | 调整图像的亮度。0% 将使图像完全变黑。默认值是 100%,代表原始图像。值超过 100% 将提供更明亮的结果。 |
contrast(%) | 调整图像的对比度。0% 将使图像完全变黑。默认值是 100%,代表原始图像。超过 100% 的值将提供更具对比度的结果。 |
drop-shadow(h-shadow v-shadow blur spread color) | 对图像应用阴影效果。可能的值:h-shadow - 必需。指定水平阴影的像素值。负值会将阴影放置在图像的左侧。v-shadow - 必需。指定垂直阴影的像素值。负值会将阴影放置在图像上方。blur -可选。这是第三个值,单位必须用像素。为阴影添加模糊效果。值越大创建的模糊就越多(阴影会变得更大更亮)。不允许负值。如果未规定值,会使用 0(阴影的边缘很锐利)。spread - 可选。这是第四个值,单位必须用像素。正值将导致阴影扩展并增大,负值将导致阴影缩小。如果未规定值,会使用 0(阴影与元素的大小相同)。**注释:**Chrome、Safari 和 Opera,也许还有其他浏览器,不支持第 4 个长度;如果添加,则不会呈现。color - 可选。为阴影添加颜色。如果未规定,则颜色取决于浏览器(通常为黑色)。这个例子创建了红色的阴影,水平和垂直方向均为 8px,带有 10px 的模糊效果:filter: drop-shadow(8px 8px 10px red);**提示:**这个滤镜类似 box-shadow 属性。 |
grayscale(%) | 将图像转换为灰阶。0% (0) 是默认值,代表原始图像。100% 将使图像完全变灰(用于黑白图像)。**注释:**不允许负值。 |
hue-rotate(deg) | 在图像上应用色相旋转。该值定义色环的度数。默认值为 0deg,代表原始图像。**注释:**最大值是 360deg。 |
invert(%) | 反转图像中的样本。0% (0) 是默认值,代表原始图像。100%将使图像完全反转。**注释:**不允许负值。 |
opacity(%) | 设置图像的不透明度级别。opacity-level 描述了透明度级别,其中:0% 为完全透明。100% (1) 是默认值,代表原始图像(不透明)。**注释:**不允许负值。**提示:**这个滤镜类似 opacity 属性。 |
saturate(%) | 设置图像的饱和度。0% (0) will make the image completely un-saturated.100% is default and represents the original image.Values over 100% provides super-saturated results.**注释:**不允许负值。 |
sepia(%) | 将图像转换为棕褐色。0% (0) 是默认值,代表原始图像。100% 将使图像完全变为棕褐色。**注释:**不允许负值。 |
blur()函数支持任意长度值,但是不支持百分比值。blur()函数的参数值表示高斯函数的标准偏差值,可以理解为屏幕上互相融合的像素数量。因此,blur()函数的参数值越大,图像的模糊效果越明显。
由于图像的边缘区域的像素点数量不足,因此,图像边缘的模糊效果是半透明的,存在泛白现象。适当放大图片,可以解决。
更多案例:filter:blur()径向模糊和局部模糊效果 » CSS新世界demo演示 (cssworld.cn)
brightness()函数的参数值支持数值和百分比值,范围是0到无穷大。参数值0或0%表示纯黑色,参数值1或100%表示正常的亮度,0~1或0%~100%的亮度是线性变化的。随着参数值逐渐大于1或大于100%,元素的亮度也会逐渐提升。brightness()函数的参数值可以为空,此时等同于使用参数值1。
除了常规的明暗调整,brightness()函数还可以用来实现黑白着色效果。例如对于黑色图标,设置足够大的亮度值就可以让图标变成白色。
注意:使用brightness()函数改变图标颜色的方法只适用于黑白两色之间切换。
查看实例:filter:brightness()实现按钮图标变色 » CSS新世界demo演示 (cssworld.cn)
使用drop-shadow()函数可以给元素设置符合真实世界阴影规则的投影效果。drop-shadow()函数语法如下:
filter: drop-shadow(x偏移, y偏移, 模糊大小, 色值);
drop-shadow()函数不支持扩展
drop-shadow()函数没有内投影效果
drop-shadow()函数不支持使用逗号语法重叠多个投影
实例对比:filter:drop-shadow()和box-shadow虚线框阴影效果 » CSS新世界demo演示 (cssworld.cn)
CSS绘制的小三角应用drop-shadow()函数也能有投影效果。
使用grayscale()函数可以实现元素的去色效果,让所有彩色值变成灰度值。
grayscale()函数比较经典的应用是在特殊的节日让网页变灰,这个效果只需一行CSS代码即可实现:
body {
filter: grayscale(1);
}
hue-rotate()函数可以调整元素的色调,但饱和度和亮度保持不变。hue-rotate()函数的参数值支持角度值,例如90deg或0.5turn等,角度值的范围没有限制,每360度就是一个循环。
由于hue-rotate()函数不会改变任意灰度色值(包括黑色和白色),因此,可以利用该函数非常方便地复制出包含众多色彩的小组件,如按钮元素。
案例:filter:hue-rotate()与文字彩虹渐变流动效果 » CSS新世界demo演示 (cssworld.cn)
backdrop-filter属性和filter属性的语法几乎是一模一样的。两者的区别在于backdrop-filter属性是让当前元素所在区域后面的内容应用滤镜效果,要想看到滤镜效果,需要当前元素本身是半透明或者完全透明的;而filter属性是让当前元素自身应用滤镜效果。
backdrop-filter属性最实用的能力就是实现毛玻璃效果。案例:backdrop-filter与下拉毛玻璃效果 » CSS新世界demo演示 (cssworld.cn)
CSS有下面3个混合模式相关属性:
mix-blend-mode各个混合模式值效果 » CSS新世界demo演示 (cssworld.cn)
CSS遮罩属性非常实用,它可以让一个元素按照某张图像的轮廓显示。
用于设置使用遮罩效果的图像。所谓遮罩效果,就是只会显示遮罩图像非透明区域(默认情况下)的内容。
语法如下:
mask-image: none | |
表示图像数据类型,包括CSS渐变图像、url()函数、image-set()函数、cross-fade()函数和element()函数等。
表示遮罩元素类型,主要指SVG遮罩元素。案例:
<img src="8.jpg" class="mask-image">
.mask-image {
mask: no-repeat center / contain;
mask-image: url(bird.png);
}
mask-image png图片遮罩效果 » CSS新世界demo演示 (cssworld.cn)
mask-mode属性的默认值是match-source,作用是根据资源的类型自动采用合适的遮罩模式。例如,如果遮罩效果使用的是SVG中的
元素,则此时的mask-mode属性的计算值是luminance,表示基于亮度判断是否要进行遮罩。如果是其他场景,则计算值是alpha,表示基于透明度判断是否要进行遮罩。
mask-mode支持下面3个属性值:
mask-mode: match-source;
mask-mode: luminance;
mask-mode: alpha;
mask-repeat属性的默认值是repeat,作用类似于background-repeat属性。
支持一下值:
mask-repeat: repeat-x;
mask-repeat: repeat-y;
mask-repeat: repeat;
mask-repeat: no-repeat;
mask-repeat: space;
mask-repeat: round;
每个属性值的含义如下:
mask-position和background-position支持的属性值和属性值的表现基本上都是一样的。
mask-clip属性用来设置遮罩效果显示的盒子区域。mask-clip属性支持的属性值如下:
mask-clip: border-box;
mask-clip: padding-box;
mask-clip: content-box;
mask-clip: no-clip;
mask-clip: fill-box;
mask-clip: stroke-box;
mask-clip: view-box;
mask-clip的几个属性值中比较有实用价值的是border-box、padding-box和content-box这3个关键字的属性值。
mask-size属性的性质和background-size属性类似,支持的关键字属性值也类似,作用是控制遮罩图片尺寸。mask-size属性的默认值是auto,它支持contain和cover两个关键字属性值。
mask-composite属性表示同时使用多张图片进行遮罩时的合成方式,它支持如下属性值:
mask-composite: add;
mask-composite: subtract;
mask-composite: intersect;
mask-composite: exclude;
-webkit-mask-box-image和mask-border属性实现的都是边框遮罩效果。两者区别如下:
查看案例:-webkit-mask-box-image尺寸任意渐变提示框效果 » CSS新世界demo演示 (cssworld.cn)
clip-path属性可以用来对任意元素的可视区域进行剪裁。
clip-path属性支持多种不同类型的属性值,示意如下:
/* 关键字属性值 */
clip-path: none;
/* 值类型 */
clip-path: url(resources.svg#someId);
/* 值类型 */
clip-path: margin-box;
clip-path: border-box;
clip-path: padding-box;
clip-path: content-box;
clip-path: fill-box;
clip-path: stroke-box;
clip-path: view-box;
/* 值类型 */
clip-path: inset(100px 50px);
clip-path: circle(50px at 0 100px);
clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
clip-path: path('M0.5,1 C0.5,1,0,0.7,0,0.3 A0.25,0.25,1,1,1,0.5,0.3
A0.25,0.25,1,1,1,1,0.3 C1,0.7,0.5,1,0.5,1 Z');
clip-path 属性很多,但兼容性比较好的暂时只有
值类型,也就是基本形状函数绘制函数。
使用inset()函数可以剪裁出矩形和圆角矩形形状,
它是和clip属性中的rect()函数关系最近的一个函数:
- rect()函数的4个值只对应2个方位,分别是元素的上、左、上、左。
- inset()函数的4个值对应4个方位,分别是元素的上、左、下、右。
inset()函数支持百分比值。
clip-path: inset(10% 20% 30% 40%);
inset()函数还支持圆角的设置,语法如下(注意round的位置和顺序):
inset({1,4} round <'border-radius'>);
/* 偏移大小15%,圆角大小10% 50% 10% 50%*/
clip-path: inset(15% round 10% 50% 10% 50%);
circle()函数可以用来剪裁圆形形状,其语法如下:
circle( [ ]? [ at ]? )
/* 以右下角为圆心进行圆形剪裁 */
img {
clip-path: circle(180px at right bottom);
}
ellipse()函数可以用来剪裁椭圆形状,语法如下:
ellipse( [ {2} ]? [ at ]? )
img {
clip-path: ellipse(30% 50% at 75% 50%);
}
polygon()函数通过设定一个个坐标值,最后连起来形成一个图形。
语法如下:
polygon( ? , [ x, y ]# )
数据类型表示填充规则,值可以是nonzero或evenodd。
Clippy — CSS clip-path 生成器 (html.cn)
通过-webkit-box-reflect
属性,CSS 可以实现倒影效果。
语法如下:
-webkit-box-reflect: [ above | below | right | left ]? ? ?
这一语法分为方位、偏移大小和遮罩图像这3部分:
-webkit-box-reflect: below;
-webkit-box-reflect: right;
-webkit-box-reflect: right 10px;
-webkit-box-reflect: below 0 linear-gradient(transparent, white);
-webkit-box-reflect: below 0 url(shuai2.png);
-webkit-box-reflect倒影属性值效果 » CSS新世界demo演示 (cssworld.cn)
借助offset属性实现元素的不规则运动。offset属性的确挺好用的,但是offset属性有一个缺点,那就是Safari浏览器并不提供对它的支持。
offset-path元素不规则path路径运动 » CSS新世界demo演示 (cssworld.cn)
offset-anchor属性用来确定偏移运动的锚点,也就是确定元素中沿着轨迹运动的点。
offset-anchor: auto |
offset-anchor: top;
offset-anchor: 25% 75%;
offset-anchor: 0 0;
offset-anchor: 1cm 2cm;
offset-anchor: 10ch 8em;
offset-anchor: bottom 10px right 20px;
offset-anchor: right 3em bottom 10px;
offset-distance属性表示偏移的距离大小,也就是元素沿着路径移动的距离,支持百分比值和长度值。
/* 默认值 */
offset-distance: 0;
/* 偏移50%距离 */
offset-distance: 50%;
/* 固定的长度值 */
offset-distance: 50px;
offset-path属性指的是运动的路径,支持多种路径类型。
offset-path: none;
offset-path: ray( [ && && contain? ] );
offset-path: ;
offset-path: ;
offset-path: [ || ];
目前能用的基本只有path()
offset-position属性的作用是定义路径的起始点。
offset-position: auto |
offset-rotate属性用来定义元素沿着offset-path路径运动时的方向和角度。
offset-rotate: [ auto | reverse ] ||
scroll-behavior是一个交互效果渐进增强的CSS属性。
scroll-behavior属性的语法:
scroll-behavior: auto;
scroll-behavior: smooth;
凡是需要滚动的地方都加一句
scroll-behavior:smooth
。
不用管用不用得到,也不用管浏览器兼容性如何,你都可以加上这一句代码。浏览器如果支持它自然是锦上添花,浏览器如果不支持也还是原来的状态。
overscroll-behavior属性可以设置DOM元素滚动到边缘时的行为。
overscroll-behavior: [ contain | none | auto ]{1,2}
案例:CSS overscroll-behavior滚动阻止 » CSS新世界demo演示 (cssworld.cn)
overscroll-behavior本身属于体验增强的CSS属性,因此可以在实际项目中大胆使用,如果浏览器支持自然体验更好,浏览器如果不支持也就是保持现在这个样子而已。
滚动锚定是什么?
当前视口上面的内容突然出现的时候,浏览器会自动改变滚动高度,让视口区域内容固定,就像滚动效果被锚定一样。
语法:
overflow-anchor: auto | none
其中overflow-anchor:auto是初始声明,表示浏览器自己决定滚动锚定的行为,通常表现为执行滚动锚定。overflow-anchor:none则表示禁止滚动锚定的行为。
案例:overflow-anchor值效果对比 » CSS新世界demo演示 (cssworld.cn)
CSS Scroll Snap是CSS中一个独立的模块,可以让网页容器滚动停止的时候,自动平滑定位到指定元素的指定位置。具体效果:CSS Scroll Snap基本效果示意 » CSS新世界demo演示 (cssworld.cn)
scroll-snap-type属性的作用是确定定位方式是水平滚动定位,还是垂直滚动定位。它支持的属性值有以下几个:
scroll-snap-align属性是作用在滚动容器子元素上的,表示捕获点是上边缘、下边缘或中间位置。它支持的属性值有以下几个:
pointer-events:none声明可以让元素无视点击、鼠标悬停和拖拽等行为。
不建议,
pointer-events:none;
用于禁用按钮。原因如下:
- 不能阻止键盘行为
- 影响无障碍访问
通过resize属性可以让元素拥诸如的拉伸效果。
注意:resize属性并不是设置了就有效果,而是有一些限制条件,包括如下条件:
- 不支持内联元素
- 如果是块级元素,需要overflow属性的计算值不是visible
resize属性的语法如下:
resize: none | both | horizontal | vertical | block | inline;
设置了resize属性的元素通过拉伸改变元素的尺寸是通过设置元素的width属性值和height属性值实现的。
因此,如果希望元素拉伸的尺寸不是无限的,可以通过设置min-width、min-height、max-width和max-height这些CSS属性值进行限制。
现代浏览器都支持resize属性,由于resize属性生成的拖拽区域太小,在移动端体验并不好,因此iOS的Safari浏览器并未对其提供支持。
使用caret-color属性可以改变输入框插入光标的颜色,同时又不改变输入框里内容的颜色。
例如:
input {
color: #333;
caret-color: red;
}
语法如下:
user-select: auto | text | none | contain | all
text表示文字和图片可以被选中;all表示整体被选中。
使用::selection伪元素可以改变文字被选中后的颜色和背景色。
@media print {
header, footer {
display: none;
}
}
是否允许浏览器自己调节颜色以便有更好的阅读体验。
color-adjust属性的语法如下:
color-adjust: economy;
color-adjust: exact;
break-before属性的作用是让当前元素作为一栏或一页的起始元素,break-after的作用是让当前元素作为一栏或一页的末尾元素。
orphans和widows属性用来限制在分栏、分页和分区中内容的最小行数,其中orphans属性用来限制底部行数,widows属性用来限制顶部行数。