ES2020 都有哪些新写法?
2025年7月3日 17:53
1、可选链操作符 支持的场景: 属性访问 obj?.prop 动态属性 obj?.[expr] 函数调用 func?.() 2、空值合并运算符 作用:精准判断 null/undefined(不包含其他
从 Chrome 137 版本开始,CSS 正式引入if()
条件函数,这是继 CSS 变量、网格布局后又一革命性特性。该函数允许在样式声明中直接编写条件逻辑,彻底改变了传统 CSS 依赖媒体查询、属性选择器实现条件渲染的模式。
property: if(
condition-1: value-1;
condition-2: value-2;
/* 更多条件... */
else: default-value);
media()
(媒体查询)、supports()
(功能检测)、style()
(样式值判断)三种条件表达式else
默认值场景:根据屏幕宽度动态调整导航栏布局
nav {
display: if(
media(min-width: 768px): flex; /* 平板以上横排 */
else: block); /* 移动端竖排 */
background-color: if(
media(hover: hover): rgba(0,0,0,0.9); /* 支持悬停时半透明 */
else: #000); /* 触摸设备纯黑 */
}
优势:
@media
更精准控制单一属性场景:根据浏览器能力自动切换渲染方案
.hero-section {
backdrop-filter: if(
supports(backdrop-filter: blur(20px)): blur(20px); /* 新浏览器毛玻璃 */
else: none); /* 旧浏览器无效果 */
background: if(
supports(backdrop-filter: blur(20px)): rgba(255,255,255,0.3); /* 配合毛玻璃半透明 */
else: #fff); /* 纯背景色 */
}
最佳实践:
supports()
再处理样式,避免冗余代码style()
实现「能力检测 + 状态判断」复合逻辑场景:根据元素数据属性动态切换主题色
<button class="btn" data-state="primary">提交</button>
<button class="btn" data-state="secondary">取消</button>
.btn {
--state: attr(data-state);
color: if(
style(--state: primary): white;
style(--state: secondary): #333;
else: #666);
background: if(
style(--state: primary): #409EFF;
style(--state: secondary): #F5F7FA;
border: if(
style(--state: secondary): 1px solid #DCDFE6;
else: none);
}
技术要点:
attr()
获取元素属性值并赋值给 CSS 变量style()
可直接比较变量值,实现类似 JavaScript 的if (state === 'primary')
逻辑.grid-container {
display: grid;
grid-template-columns: if(
media(min-width: 1200px): repeat(4, 1fr); /* 大屏4列 */
media(min-width: 768px): repeat(3, 1fr); /* 平板3列 */
else: repeat(2, 1fr)); /* 手机2列 */
gap: if(
media(hover: hover): 24px; /* 鼠标设备宽间距 */
else: 16px); /* 触摸设备窄间距 */
}
对比传统方案:
@media
块,现合并为 1 个属性声明grid-template-columns
属性,避免全局布局切换<button class="action-btn" data-loading="false">提交</button>
.action-btn {
--loading: attr(data-loading);
cursor: if(
style(--loading: true): wait; /* 加载中显示沙漏 */
else: pointer); /* 常态显示小手 */
opacity: if(
style(--loading: true): 0.6; /* 加载中半透明 */
else: 1);
&::before {
content: if(
style(--loading: true): '加载中...'; /* 加载中显示文字 */
else: '提交');
}
}
动态效果:
data-loading
属性,样式自动响应<html data-theme="light">
<body class="page">...</body>
</html>
.page {
--theme: attr(data-theme);
color: if(
style(--theme: dark): #f5f5f5; /* 暗黑模式浅色文字 */
else: #333); /* 亮色模式深色文字 */
background: if(
style(--theme: dark): #121212; /* 暗黑模式深色背景 */
else: #f9f9f9); /* 亮色模式浅色背景 */
/* 智能适配系统主题 */
background: if(
media(prefers-color-scheme: dark) and not(style(--theme: light)): #121212;
else: #f9f9f9);
}
逻辑拆解:
data-theme
属性当前支持:Chrome 137+、Edge 137+(需开启实验性特性)
降级方案:
.fallback {
/* 基础样式(旧浏览器生效) */
color: #333;
/* 新特性增强(新浏览器覆盖) */
color: if(style(--theme: dark): #f5f5f5; else: #333);
}
避免多层嵌套:
/* 推荐 */
font-size: if(media(min-width: 768px): 18px; else: 16px);
/* 不推荐(嵌套过深影响解析性能) */
font-size: if(media(min-width: 1200px): if(media(hover: hover): 20px; else: 18px); else: 16px);
条件顺序优化:将高频条件放在前面
结合 CSS 变量管理:
:root {
--mobile-breakpoint: 768px;
}
.component {
width: if(media(min-width: var(--mobile-breakpoint)): 50%; else: 100%);
}
配合 PostCSS 插件:在低版本浏览器中自动转换if()
为传统语法
if () 函数的引入标志着 CSS 从「声明式样式」向「逻辑式样式」的重要跨越。未来可能延伸的特性包括:
循环函数:如for()
实现动态生成样式
数学表达式:支持calc()
与条件的组合运算
函数嵌套:在条件中调用自定义 CSS 函数
对于前端开发者,掌握 if () 将成为必备技能 —— 它不仅简化样式逻辑,更推动 CSS 向完整「样式编程语言」演进,让界面动态性与维护性达到新高度。
[1位符号位][11位指数位][52位尾数位] 来存储的
符号位:决定数字的正负(0是正数,1是负数)
指数位:表示2的幂次(采用偏移码表示,实际指数 = 存储值 - 1023)
范围:-1022 到 1023(特殊值 0 和 2047用于表示0和无穷大)
尾数位/有效数字(52 bits + 隐含位)
- 关键点:实际精度是 53 bits(52位显式存储 + 1位隐含的"1") 采用"隐含前导1"的表示法(normalized numbers)
综上: 数值的计算公式为:
2^53 -1