具有css自定义属性的条件样式

2izufjch  于 2023-01-27  发布在  其他
关注(0)|答案(3)|浏览(210)

我喜欢使用 *css自定义属性 *,但是我经常发现我希望我能做这件事。
我希望能够根据css自定义属性的值有条件地应用一些样式。下面是一些伪代码:

.something {
  border: var(--is-dark-theme) ? 1px solid : none;
}

我知道自定义属性不是这样工作的。但是可能有一些我不知道的其他方法可以帮助我达到类似的结果?
或者,也许有一些规范的建议,将这可能在未来?

olhwl3o2

olhwl3o21#

下面是另一个类似于Ori Drori answer的想法,我依赖于在border内部使用一个无效值来删除边界。如果您想使用像false/true/yes/no这样的关键字,这会很有用

.something {
  border: var(--is-dark-theme,2px) solid black;
}
<div class="something">Dark theme</div>

<div class="something" style="--is-dark-theme: false">Light theme</div>
h43kikqp

h43kikqp2#

有时你可以使用calc()来得到大致相似的结果。在这种情况下,如果--is-dark-theme是0或1,你可以用它乘以边界的width,来显示或隐藏它:

.something {
  border: calc(var(--is-dark-theme) * 1px) solid black;
}
<div class="something" style="--is-dark-theme: 1">Dark theme</div>

<div class="something" style="--is-dark-theme: 0">Light theme</div>
pvcm50d1

pvcm50d13#

如果你有类似"条件xyz是onoff"的情况(比如在light theme vs dark theme的例子中),你可以使用下面的CSS技巧(我知道如果你是第一次看到这个技巧,这看起来很奇怪,但是与其他答案中的技巧相比,这个技巧对所有CSS属性都有效):
为每个开/关条件定义两个自定义属性,一个用于"开"情况,一个用于"关"情况。使用值initial代替on,使用值``代替off(空格字符)。

.light-theme {
  --is-light-theme: initial; 
  --is-dark-theme: ;
}

.dark-theme {
  --is-light-theme: ;
  --is-dark-theme: initial;
}

div {
  font-family: Helvetica, Arial, sans-serif;
  padding: 1rem;
  
  color:
    var(--is-light-theme, black)
    var(--is-dark-theme, white);
  
  background-color:
    var(--is-light-theme, white)
    var(--is-dark-theme, black);

  border:
    var(--is-light-theme, none)
    var(--is-dark-theme, 5px solid #aaa);
}
<div class="light-theme">
  light theme
</div>
<div class="dark-theme">
  dark theme
</div>

相关问题