稍微记录一下2023年CSS推出的新功能。
参考来源:developer.chrome.com/blog/css-wr…
架构基础
三角函数
添加了对三角函数的支持,分别为sin() cos() tan() asin() acos() atan() atan2()。
可以通过三角函数,更加精确地计算出旋转的位置。
<div class="main">
<div class="container">
<div class="center"></div>
<div class="round"></div>
</div>
</div>
.round {
position: absolute;
width: 10px;
height: 10px;
background-color: #088ea7;
border-radius: 50%;
transform: translate(calc(100px * cos(30deg)), calc(100px * sin(30deg)));
}
复杂的第n-*选择
可以将选择器列表传递到:nth-child :nth-last-child中,即可以在使用An+B进行子元素选择之前,对子元素进行过滤。
<div class="main">
<div class="box">1</div>
<div class="box special">2</div>
<div class="box special">3</div>
<div class="box">4</div>
<div class="box special">5</div>
</div>
.special {
color: red;
}
.main :nth-child(2n-1 of .special) {
background-color: #b1d7c8;
}
如图中,子元素选择时会从.special中进行选择。
镜
使用@scope,可以限制选择器的覆盖面。为此,可以设置作用域根,确定需要定位的子树的上限。设定作用域根集后,
其中包含的样式规则将只会从DOM的这一有限子树中进行选择。
<div class="main">
<div class="container1">
<div class="container2">
<div class="box">123</div>
</div>
</div>
<div class="box">456</div>
</div>
@scope (.container2) {
.box {
background-color: #71c3b5;
}
}
如图中,我们可以不必使用.main.container1.container2.box来选择其中的div,以此避开选择外层的box。
我们可以使用@scope(.container2),将后续的样式选择,指定为.container2中,在准确选中div的同时,避免编写
特异性高抑或与DOM紧密耦合的选择器。
嵌套
以前的css样式写法一般如下,在嵌套之前,每个选择器都需要单独进行显式声明,这可能会导致重复、大量的样式表以及零散的创作体验。
.main {
}
.main .box1 {
}
.main .box2 {
}
支持嵌套之后,选择器可以继续,并且其相关的样式规则可以在其中分组。
.main {
.box1 {
}
.box2 {
}
}
同时,css原生也内置支持&嵌套选择器,样式的继承以及层级结构会更加的直观。也算是加入了Less等预处理器中,让人体验舒适的样式写法。
排版
首字母
initial-letter属性,可以调整字母的放置位置,使其变为向下或突起。
属性接受两个参数:
- 第一个参数,表示将字母放到相应段落中的深度。
- 第二个参数,表示将字母放到相应段落中的高度。
一般处理首字母突出,会采用::first-letter为元素来实现。
但是,在计算第一个字母的大小时,可能需要float等属性。也可以使用lh来解决这部分的问题,但是lh仅在Chrome中受支持。
p::first-letter {
color: hsl(220, 94%, 51%);
font-weight: bold;
font-size: 3lh;
float: left;
line-height: 1;
margin-right: 0.1lh;
}
而采用initial-letter,可以更加精细、方便地控制首字母的样式。
p::first-letter {
initial-letter: 3.5 3;
}
文本换行平衡/美观
使用text-wrap:balance;,可以让文本的换行更为平衡、美观。可以理解为,将调整文本布局,使其更为平衡/美观的任务,交给浏览器,
让浏览器来计算如何进行排版。
(未使用text-wrap)
(使用text-wrap)
但它的使用有限制。由于浏览器需要遍历迭代以发现最佳平衡的封装解决方案,它更适用于6个及以下的换行段落。
颜色
CSS Color 4 为网页提供了广色域颜色工具和功能:更多的颜色、操作函数、更好的渐变效果。
可查阅:developer.chrome.com/docs/css-ui…
自适应设计
容器查询
容器查询支持查询网页中的父元素,而不是使用视口的全局尺寸信息来应用CSS样式,即可以在多个布局和多个视图中为组件设置动态样式。
容器查询对于自适应设计和可重复使用的组件特别有用。例如,启用一个卡片组件,该组件在置于边栏中时可采用一种布局方式,在产品网格中可采用另一种配置布局。
使用容器查询,需要先在父元素上设置包含,同时为其指定类型和名称。
.card-container {
container: card / inline-size;
}
然后,该容器可以通过@container将样式应用于子级中。
.card-child {
display: grid;
grid-template-columns: 1fr 1fr;
}
@container (max-width: 400px) {
.card-child {
grid-template-columns: 1fr;
}
}
样式查询
可以使用@container style()查询父元素上的自定义属性的值,如container style(--rain: true)。
但现在仅为部分功能实现,可期待。
:包含选择器
如下图,可以使用has()根据是否包含某个子元素来筛选父元素。
<div class="everybody">
<div>
<div class="a-good-time">a good time</div>
</div>
</div>
<div class="everybody"></div>
.everybody {
width: 100px;
height: 100px;
border: 1px solid black;
}
.everybody:has(.a-good-time) {
background-color: #0e7d91;
}
更新媒体查询
使用update媒体查询,可以使界面适应设备的刷新频率。可以传入三个值
- fast,查询设备是否渲染内容时具有较快的刷新频率
- slow,适合电子阅读器等刷新率较慢的设备
- none,适合打印纸张、电子墨水显示屏等只提供一个渲染通道的设备,不刷新
@media (update: fast) {
}
为媒体查询编写脚本
透明度媒体查询
详见:developer.chrome.com/blog/css-pr…
交互
视图转换
详见:developer.chrome.com/docs/web-pl…
线性加/减速函数
详见:developer.chrome.com/docs/css-ui…
滚动
在滚动完成后触发事件。
document.onscrollend = event => {
}
滚动驱动的动画
可以获取现有的CSS动画或使用Web Animations API构建的动画,并将其与滚动条的滚动偏移量相结合。 在水平滚动条中上下滚动或左右滚动的时候,关联的动画会以直接响应的方式向前和向后拖动。 详见:developer.chrome.com/docs/css-ui…
延迟时间轴附加功能
详见:developer.chrome.com/docs/css-ui…
离散属性转换
详见:developer.chrome.com/blog/entry-…
起始样式规则
详见:developer.chrome.com/blog/entry-…
叠加动画
详见:developer.chrome.com/blog/entry-…
组件
弹出式窗口
Popover API可以构建叠加在页面其余部分上的元素。
创建简单的弹出式窗口,可以向弹出的元素添加popover属性和id,然后使用popovertarget="my-popover"将其id属性连接到调用按钮。
Popover API支持以下功能:
- 提升到顶层。弹出式窗口将显示在页面其余部分之上的单独一层中,从而不必再调整
z-index。 - 轻度关闭功能。点击弹出式窗口区域以外的位置会关闭弹出式窗口并返回焦点。
- 默认的焦点管理。打开弹出式窗口会是下一个标签页停止在弹出式窗口内显示。
- 无障碍键盘绑定。点按
esc键或进行双重切换会关闭弹出式窗口并返回焦点。 - 可访问的组件绑定。从语义上将弹出式窗口元素连接到弹出式窗口触发器。
<button class="menu-btn" popovertarget="menu">
test
</button>
<div popover role="menu" id="menu">
<button class="close-btn" popovertarget="menu" popovertargetaction="hide">
<span>close</span>
</button>
<ul>
<li>云想衣裳花想容,</li>
<li>春风拂槛露华浓。</li>
<li>若非群玉山头见,</li>
<li>会向瑶台月下逢。</li>
</ul>
</div>
选定小时数
详见:developer.chrome.com/blog/hr-in-…
用户有效/无效的伪类
专属手风琴
可以在<details>元素上使用name属性,使用此属性时,具有相同name值的多个<details>元素会形成语义组。
组中最多只能有一个元素同时打开。即当打开组中的某个<details>元素时,之前打开的元素将自动关闭。