当前位置: 首页 > 面试题库 >

如何在CSS变量(又称为自定义属性)中存储继承值?

方苗宣
2023-03-14
问题内容

让我们考虑这个简化的示例,以说明问题:

:root {

  --color:rgba(20,20,20,0.5); /*defined as the default value*/

}



.box {

  width:50px;

  height:50px;

  display:inline-block;

  margin-right:30px;

  border-radius:50%;

  position:relative;

}

.red {background:rgba(255,0,0,0.5);}

.blue {background:rgba(0,255,0,0.5);}



.box:before{

  content:"";

  position:absolute;

  top:0;left:0;right:0;bottom:0;

  border-radius:50%;

  transform:translateX(30px);

  background:var(--color);

  filter:invert(1);

}


<!-- we can add any color we want -->

<div class="box red" style="--color:rgba(0,255,0,0.5);">

</div>

<div class="box blue" style="--color:rgba(0,255,255,0.5);">

</div>



<!-- we can add the same color but this won't be dynamic -->

<div class="box red" style="--color:rgba(255,0,0,0.5);">

</div>



<!-- it would be good to be able to inherit the value but this won't work -->

<div class="box red" style="--color:inherit;">

</div>

在上面的代码中,我们能够background使用CSS变量来操纵伪元素的。在某些情况下,我们需要与主要元素具有相同的颜色,但是由于我们不知道使用哪种颜色,因此我们无法手动设置它,最好的方法应该是使用该inherit值。

如此处所述:设置为使用变量继承的CSS显示属性不起作用,使用inherit将不起作用。

有什么方法可以将inherit值存储在CSS变量中,以后再在任何属性中使用它(background在我们的示例中)?


问题答案:

在这种情况下,我们可以考虑CSS变量的后备值。像规范中解释的那样,我们可以这样写:

background:var(--color,inherit)

通过这样做,我们告诉属性(backgroundinherit--color未定义的情况下使用。

这可能可以解决问题,但在我们的情况下,这是不够的,因为--color总是
:root级别定义,并且会被伪元素继承1,因此我们将永远不会使用后备值。

为了解决这个问题,我们可以考虑使用该initial值以取消定义自定义属性并强制使用后备值。如规范中所述:

自定义属性的 初始 值为 空值
;也就是说,什么都没有。此初始值与var()表示法具有特殊的交互作用,这在定义var()的部分中进行了说明。

要将 var()替换为 属性值:

1.
如果由var()函数的第一个参数命名的自定义属性是受动画污染的,并且var()函数正在animation属性或它的一手惯用中使用,则将custom属性视为具有其初始值作为此算法的其余部分。
2. 如果由var()函数的第一个参数命名的自定义属性的值 不是初始值 ,请用相应的自定义属性的值替换var()函数。除此以外,
3. 如果var()函数 具有后备值 作为其第二个参数,请 fallback value 替换var()函数
。如果回退中有任何var()引用,请也替换它们。
4. 否则,包含var()函数的属性在计算值时间无效

我们的代码将如下所示:

:root {

  --color:rgba(25,25,25,0.5); /*defined as the default value*/

}



.box {

  width:50px;

  height:50px;

  display:inline-block;

  margin-right:30px;

  border-radius:50%;

  position:relative;

}

.red {background:rgba(255,0,0,0.5);}

.blue {background:rgba(0,0,255,0.5);}



.box:before{

  content:"";

  position:absolute;

  top:0;left:0;right:0;bottom:0;

  border-radius:50%;

  transform:translateX(30px);

  background:var(--color,inherit);

  filter:invert(1);

}


<div class="box red" style="--color:initial;">

</div>

<div class="box blue" style="--color:initial;">

</div>



<div class="box" style="background:grey;--color:initial;">

</div>

我们只需要设置initial为custom属性,以将强制inherit用作中的值background

的用法initial也可以用于阻止CSS变量在特定级别 传播 ,因为默认情况下它是所有元素继承的。

这是一个例子:

:root {

  --color: blue;

}

.container div{

  border:5px solid var(--color,red);

  padding:5px;

}

.stop {

  --color:initial;

}

.green {

  --color:green;

}


<div class="container">

  <div>

    <div>

      <div class="stop"> <!-- we stop at this level -->

        <div>

        </div>

      </div>

    </div>

  </div>

</div>



<div class="container stop"> <!-- we stop at this level -->

  <div>

    <div>

      <div class="green">  <!-- we redefine at this level -->

        <div>

        </div>

      </div>

    </div>

  </div>

</div>

1:关于自定义属性的继承,而不是背景属性



 类似资料:
  • 问题内容: 如何使用JavaScript(纯文本或jQuery)获取和设置CSS自定义属性(在样式表中使用过的属性)? 这是我失败的尝试:单击按钮会更改常规属性,但不会更改自定义属性: 问题答案: 您可以使用:

  • 问题内容: 我正在使用JAXB来基于某些XSD架构生成Java类。对于诸如以下的元素: jaxb生成以下代码: 问题是我们需要使用一些专有的XML工具,这些工具依赖于getter / setter方法的命名约定。例如,对于字段REC_LOC,他们希望使用名为getRecLoc(String value)和setRecLoc()的方法,而不是getRECLOC()。 有什么方法可以自定义jaxb生成

  • 我想为RDF节点创建一个Lucene分析器。RDF节点可以有多种类型(uri、bnode、plain literal、language的plain literal、datatype的typed literal)。在分析该术语时,我希望创建一个RDFNodeTypeAttribute、LanguageAttribute和DatatypeAttribute来分别存储RDF节点的类型、literal的语

  • 我似乎找不到有关自定义异常类的太多信息。 我所知道的 您可以声明您的自定义错误类并让它从继承,因此可以是d: 这允许您使用以下方法提升它: 稍后,在救援时获取该消息 我不知道的是 我想给我的异常提供一些自定义字段,但我想从父类继承<code>消息@message不是exception类的实例变量,因此我担心我的继承将不起作用。 有人能告诉我更多细节吗?如何使用<code>对象 然后: 得到: 它会

  • 问题内容: 这是一个非常简单的问题,因此我将对其进行简短介绍: 如何判断特定DOM元素的CSS属性是否被继承? 我问的原因是因为使用的方法,它将返回计算的样式,该样式继承了父对象的CSS属性。有没有办法检索在对象本身上设置的属性? 一个例子可以解释我的进步: CSS: HTML: 因此,在继承的实例中,如何判断它是否被继承了? 显然会给我,但我想检索元素 本身 的样式,而不是其父元素。 问题答案:

  • 问题内容: 我注意到有些属性是在CSS中继承的,而有些则不是。例如,text-size属性是继承的,但是padding和margin不被子块继承。那么如何确定哪些属性是继承的,哪些不是? 问题答案: 这是所有可继承属性的列表。我正在使用W3C的信息,所以我认为它 应该 是正确的。但是了解网络浏览器(特别是IE)后,其中一些可能并非所有浏览器都可以继承: