其他问题解释了自定义属性和 CSS 变量,但是如果我们简单地说自定义属性只是为了让我们在 CSS 默认属性之外添加更多属性,那会怎样。当然,单独的自定义属性是没有用的,因为浏览器不会对它做任何事情,这就是为什么在 99% 的情况下它们与 CSS 变量一起使用。
另一个事实是,在做 CSS 时,我们会直观地考虑使用默认的 CSS 属性来做我们想做的事情,当我们面临复杂的情况时,我们会尝试将很多属性、伪元素等组合在为了满足我们的需求。但是,如果我们以不同的方式思考并开始为此目的使用自定义属性呢?如果不是复杂的 CSS 代码,我们只需编写一个自定义属性并实现一个 JS/jQuery 代码来为我们完成这项工作。
让我们举一个简单而常见的例子。您有一个元素,您想将其设置为绝对位置,以便将其用作其父元素的叠加层。使用 CSS,我们将执行以下操作:
.block {
height:100px;
width:100px;
margin:20px;
border:1px solid red;
position:relative; /* we usually forget this !*/
}
.overlay {
position:absolute;
top:0;
right:0;
left:0; /*sometimes we use width:100% but it won't work with padding!*/
bottom:0;
padding:5px;
z-index:1; /* we can forget this sometimes*/
background:rgba(0,0,0,0.5);
}
<div class="block">
<span class="overlay"></span>
some text here
</div>
这很简单,如果我们想拥有相同的东西,我们可以在任何地方使用相同的类。但是我们可以考虑使用自定义属性来减少 CSS 代码并使其更容易:
$('*').each(function() {
if ($.trim($(this).css('--overlay')) === "top") {
$(this).css({
'position': 'absolute',
'top': 0,
'bottom': 0,
'left': 0,
'right': 0,
'z-index':2
});
$(this).parent().css('position','relative');
} else {
//we test the other values and we do the necessary changes
}
})
.block {
height: 100px;
width: 100px;
margin: 20px;
border: 1px solid red;
}
.overlay {
--overlay: top;
background: rgba(0, 0, 0, 0.5);
}
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<div class="block">
<span class="overlay"></span>
some text here
</div>
我知道第一个想法是“为什么要费心使用所有这些代码来完成我们可以使用 CSS 完成的如此简单的事情?”和“如果属性发生变化怎么办?如果父级已经设置了位置怎么办?”这是真的,但这是一个非常简单的例子。想象一下,您构建了一个 JS 或 jQuery 库,在其中为复杂的东西提供了许多自定义属性(创建常见的 CSS 形状,在难以计算值的情况下进行复杂的转换等),并为每个属性提供了一个文档及其各自的值。
它就像一个 JS/jQuery 库,它告诉您向元素添加一个类并调用一个函数,然后您就有一个响应式滑块、一个交互式地图、一个 twitter 小部件等。为什么不对自定义属性做同样的事情?我们要求人们包含该库并简单地编写 CSS,然后看看它的魔力。
我们也可以通过添加更多有用的属性来将其视为升级,以使事情变得更容易。就像 CSS 制造商所做的那样,但我们是自己做的,不要等到有新的规范出现后再批准。
我们以 flexbox 为例。在 flexbox 之前,如果我们想在一个大小完全相同的容器中拥有 N 个 div 并填充所有容器,我们必须编写一些复杂的代码,每次添加新元素时都必须调整这些代码。现在有了 flexbox,我们只需设置 flex:1 就可以了!浏览器将为我们完成所有复杂的工作。
我们可以做同样的事情。我们创建自定义属性以使事情变得更容易,并将其分享给社区。人们将开始使用它们并可能会发现它们很有用,然后它们可以成为常见问题的参考。也许某些浏览器甚至会考虑一种实现来集成它们。
所以自定义属性也可以成为增强 CSS 的一种方式。