You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过CSS从元素属性动态设置::before/::after的宽高?

问题

我们知道元素的::before伪元素可通过同元素的字符串属性生成内容,示例如下:

HTML代码:

<div class="progress">
   <span class="percentage" data-percentage="24%"></span>
</div>

CSS代码:

.progress > .percentage::before {
  content: attr(data-percentage);
  /* 其他样式 */
}

但能否通过CSS从元素属性动态设置宽度或高度?尝试的CSS代码如下:

.progress > .percentage::after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  height: 1rem;
  width: attr(data-percentage);
  background: red;
}

已知该问题可通过JavaScript解决,请问是否存在纯CSS实现方案?

纯CSS实现方案

是存在纯CSS实现方式的,主要有两种可行思路:

1. 带类型参数的attr()函数

CSS的attr()函数现在支持指定返回值类型,针对width、height这类长度属性,用attr(属性名 类型)的写法就能直接把属性值解析为合法的长度单位。

修改后的CSS代码如下:

.progress {
  position: relative;
  /* 给父元素加相对定位,确保伪元素的绝对定位生效 */
}
.progress > .percentage::after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  height: 1rem;
  width: attr(data-percentage length);
  background: red;
}

注意:这种写法的浏览器兼容性需要留意,目前Chrome 88+、Firefox 77+等现代浏览器已支持,老旧浏览器可能无法兼容。

2. 结合CSS自定义属性(变量)

这是兼容性更好的方案,先把元素的data-percentage属性值赋值给CSS变量,再在样式里引用这个变量:

HTML代码保持不变,修改CSS为:

.progress {
  position: relative;
}
/* 将data属性值赋值给CSS变量 */
.progress > .percentage {
  --percent: attr(data-percentage);
}
.progress > .percentage::after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  height: 1rem;
  width: var(--percent);
  background: red;
}

这种方式兼容大部分主流浏览器,适用场景更广。

另外补充:如果data-percentage的属性值是纯数字(比如24而非24%),可以用calc()函数转换成百分比,写法为width: calc(var(--percent) * 1%);。

内容的提问来源于stack exchange,提问作者BimaPria_4420

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 06:15:04