CSS新世界是知名博主张鑫旭CSS世界三部曲的最后一部,主要讲述CSS3及其之后很多实用的新特性,介绍了很多潜藏的特性和有用的细节。CSS世界介绍的是CSS2.1规范及其之前内容,CSS选择器世界介绍的是CSS LV1-LV4的选择器知识,CSS新世界介绍的是CSS3及其之后的知识。
CSS基础知识
- CSS全局关键字属性值
inherit 继承关键字
实现属性继承,如input { font-family: inherit;height:inherit }
initial 初始关键字
适合用在需要重置某些CSS样式,但又不记得初始值的场景,如ul { font-size: 14px } ul li:last-child { font-size: initial }
unset 不固定值关键字
只有配合all属性使用才有意义,批量重置内置样式,如dialog { all: unset }
revert 恢复关键字
让当前元素的样式还原成浏览器内置的样式,如ol { list-style-type: repeat }
@supports规则用来检测当前浏览器是否支持某个CSS新特性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26<style>
/* 支持网格布局 */
@supports (display:grid) { .item { background:red } }
/* 不支持网格布局 */
@supports not (display:grid) { .item { background:red } }
/* 同时支持弹性布局和网格布局 */
@supports (display:flex) and (display:grid) { .item { background:red } }
/* 支持弹性布局或网格布局 */
@supports (display:flex) or (display:grid) { .item { background:red } }
/* 支持弹性布局 但不支持网格布局 */
@supports (display:flex) and (not (display:grid)) { .item { background:red } }
/* @supports规则的大括号里 可以包含其他@规则*/
@supports (display:flex) {
@media screen and (max-width: 750px) {}
@supports (animation: none) { .box { animation: skip }}
@keyframes skip {}
}
</style>
<!-- 浏览器还提供了CSS.supports()方法,用来在javascript代码中检测
当前浏览器是否支持某个CSS特性-->
<script>
// CSS.supports(propertyName, value)
if (window.CSS || CSS.supports || CSS.supports('position', 'sticky')){
document.getElementById('box').style.position = 'sticky'
}
</script>
增强的CSS属性
fit-content关键字 实现元素尺寸的自适应
1
2
3
4
5
6
7
8<!-- 设置元素的width或height为fit-content关键字后,元素的尺寸就是里面内容的尺寸 -->
<!-- 使用width:fit-content加margin:0 auto实现单行文字居中,多行文字居左对齐 -->
<div class="box">单行文字居中,多行文字居左对齐</div>
<style>
.box { width:fit-content; margin:0 auto; }
/* fit-content关键字的兼容性处理 IE浏览器、Edge79之前不支持 但可以用在移动端 */
.ex { width:-webkit-fit-content; width:-moz-fit-content;width:fit-content; }
</style>position:sticky 黏性定位
1
2
3黏性定位:当元素在屏幕内时,随屏幕滚动;当元素滚出屏幕时,元素变成固定定位
黏性定位过去都是使用javascript实现,在现代浏览器可以使用position: sticky实现
在使用position: sticky时,务必保证黏性定位元素的祖先元素没有可滚动元素currentColor 关键字
1
2
3
4
5<!-- currentColor 表示当前元素所使用的color属性的计算值 -->
<div class="box">currentColor 使用当前color相同的颜色</div>
<style>
.box { color: red; border: 1px solid currentColor; /* 边框的颜色和文字颜色一致*/ }
</style>zoom 缩放 除Firefox外其他浏览器都支持
1
2
3
4
5语法 zoom: normal | reset | <number> | <percentage>
zoom 和 scale 的区别
1. zoom属性缩放的中心坐标是元素的左上角,且不能修改。transform中的scale缩放默认的中心坐标是元素的中心点
2. zoom属性缩放会改变元素占据的尺寸空间,transform中的scale缩放不会改变元素占据的尺寸
3. zoom属性不会改变元素的层级,不会影响元素的fixed定位backface-visiblility 元素背面是否可见
1
2
3backface-visiblility: visible 默认值 元素背面是可见的
backface-visiblility: hidden 元素背面是不可见的
常用于transform变换中,是否要隐藏元素的背面,使变换效果更好justify-content: space-evenly 每个flex子项空白间距相等
1
2
3
4ul{
display: flex;
justify-content: space-evenly;
}prefers-color-scheme 用来检测当前网页是否处于深色(黑暗)模式的媒体属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31<style>
/* 支持三个属性:
dark 系统倾向于使用深色模式
light 系统倾向于使用浅色模式
no-perference 系统未告知用户使用的颜色方案 */
/* 深色模式 */
@media (prefers-color-scheme: light) {
body{ color:#333; background-color: #fff; }
}
/* 浅色模式 */
@media (prefers-color-scheme: dark) {
body{ color:#fff; background-color: #000; }
}
/* 快速对现有网页进行深色模式改造的技巧 */
body {
/* 使用filter:invert(1)滤镜对文字颜色和背景色等进行反相 */
filter: invert(1) hue-rotate(180deg);
background-color: #000;
}
/* 对图片进行再次反相将图片还原成真实颜色 避免应body反相后 图片颜色出现异常*/
img{ filter: invert(1) hue-rotate(180deg); }
</style>
<script>
// 判断当前手机浏览器是否支持深色或浅色模式
// 是否支持 prefers-color-scheme 属性
console.log(window.matchMedia('(prefers-color-scheme)').matches) // true
// 是否是浅色模式 prefers-color-scheme: light
console.log(window.matchMedia('(prefers-color-scheme: light)').matches) // true
// 是否是深色模式 prefers-color-scheme: dark
console.log(window.matchMedia('(prefers-color-scheme: dark)').matches) // false
</script>touch-action: manipulation 取消移动端点击事件300ms延迟和双击行为
1
2/* touch-action: manipulation 只允许浏览器进行滚动和持续缩放操作 */
html { touch-action: manipulation; }scroll-behavior: smooth 平滑滚动 safari不支持
1
.box{ scroll-behavior: smooth; } /* 平滑滚动 */
overscroll-behavior: contain 滚动嵌套时,终止外层滚动 safari不支持
1
2/* 局部滚动的滚动条滚动到底部边缘时,再继续滚动时,外部容器不会再跟滚动 */
.box{ overscroll-behavior: contain;-ms-overscroll-behavior: contain; }pointer-events: none 元素无法点击
caret-color: red 更改输入光标的颜色
1
2/* 设置输入光标的颜色 也可以用于设置了 contenteditable的html标签 */
input{ caret-color: red; }
简单实用的css函数
calc()函数的使用
1
2
3
4
5支持“+”、“-”、“*” 和 “/”四则运算;
可以使用百分比、px、em、rem等单位,不能使用当前CSS属性不支持的单位,可以混合使用各种单位进行计算;
表达式中有“+”和“-”时,其前后必须要有空格,如"widht: calc(12%+5em)"这种没有空格的写法是错误的;
表达式中有“*”和“/”时,其前后可以没有空格,但建议留有空格。
.elm { width: calc(100% - 20px + 5px*2)) }min()函数的使用
1
2
3
4min(expression [, expression]) 支持一个或多个表达式,使用逗号分隔,将最小表达式的值作为返回结果
实现网页在大于等于1024px的PC浏览器显示宽度为1024px,在小于1024px时显示宽度为100%
el { width: 1024px; max-width:100% } 使用min()函数 el { min(1024px, 100%) }
min()用来限制最大值(即最大宽度值为1024px),IE和其他低版本浏览器不支持max()函数的使用
1
2
3
4max(expression [, expression]) 支持一个或多个表达式,使用逗号分隔,将最大表达式的值作为返回结果
实现网页在小于等于1024px的PC浏览器显示宽度为1024px,在大于1024px时显示宽度为100%
使用max()函数 el { max(1024px, 100%) }
max()用来限制最小值(即最小宽度值为1024px),IE和其他低版本浏览器不支持clamp()函数的使用
1
2
3
4
5
6
7
8
9
10clamp()函数的作用是返回一个区间范围的值,语法:clamp(MIN, VAL, MAX),MIN表示最小值,MAX表示最大值,
VAL表示首选值,如果VAL在MIN~MAX范围内,则将VAL作为返回值,如果VAL大于MAX则将MAX作为返回值,如果VAL
小于MIN,则将MIN作为返回值。clamp(MIN, VAL, MAX)等同于max(MIN, min(VAL, MAX))
IE和其他低版本浏览器不支持
<button>宽度自适应变化</button>
button{
width: clamp(100px, 50%, 600px)
}
不断改变浏览器视口的宽度,按钮宽度在100px~600px范围内变化,当屏幕宽度的一半大于600px时,宽度为600px
当屏幕宽度的一半小于600px时,宽度在200px~600px之间,当屏幕宽度的一半小于200px时,宽度为200px。env() 环境变量函数
1
2
3
4
5
6
7环境变量env()规范的制定是源于解决‘刘海屏’和‘底部触摸黑条’的移动设备的出现
在使用safe-area-inset-*等env的属性时,一定要设置meta信息<meta name="viewport" content="viewport-fit="cover"">
使用4个安全内边距值, 同时设置兜底尺寸,无法使用safe-area-inset-*时,会使用兜底的值
env(safe-area-inset-top, 20px) 距离顶部 设置顶部刘海区域安全距离
env(safe-area-inset-right, 1em) 距离右边
env(safe-area-inset-bottom, 20px) 距离底部
env(safe-area-inset-left, 20px) 距离左边 设置底部小黑条安全距离
Css变量和自定义属性
--变量名:值 声明css变量
属性:var(--变量名) 使用css变量
1
2
3
4
5
6
7
8
9
10
11
12
13<div class="box">深浅色模式</div>
<style>
:root{ --primary-color: pink; } /* 声明css变量 */
.box{ color: var(--primary-color)} /* 使用css变量 */
.box{ color: var(--primary-color, red)} /* 使用 var(css变量, 备用值) 当css变量无效时 使用备用值 */
</style>
<script>
// 在js中设置和获取 css自定义属性
// 只能借助 xx.style.setProperty 在js中设置 css变量
document.documentElement.style.setProperty('--myColor', '#0000ff')
// 使用 getComputedStyle(document.querySelector('.box')).getPropertyValue('--myColor') 获取css变量
console.log(getComputedStyle(document.querySelector('.box')).getPropertyValue('--myColor')) // #0000ff
</script>