在 CSS 中,属性选择器具有一些相当强大的匹配功能。 您可以匹配任何属性以及任何具有精确值、以特定文本开头、包含特定文本、以特定文本结尾等的属性。 这使您能够以您想要的方式以非常奇怪的样式“语言”来实现。
例如…
<div fencing="a bit dotty"></div>
这是一个完全虚构的属性,因此希望它在未来的 HTML 中不会有任何意义。 不过我们现在可以选中它
[fencing="a bit dotty"] {
border: 2px dotted black;
}
如果我们正在构建一种“语言”,我们可以创建另一种
[fencing="a lot dotty"] {
border: 4px dotted black;
}
甚至可以像这样分割它…
[fencing] {
border-color: black;
}
[fencing*="dotty"] {
border-style: dotted;
}
[fencing*="a bit"] {
border-width: 2px;
}
[fencing*="a lot"] {
border-width: 4px;
}
奇怪吧。
我在某些情况下看到过它。 这是 Dan Chilton 提供的一个更加完善的示例
<p style="three quarters width with a black
background, light text, red border,
thick border, rounded, lots of padding,
and a drop shadow">
Lorem ipsum...
</p>
CSS 就像这样适应语言…
[style*="full width"] { width: 100%; }
[style*="three quarters width"] { width: 75%; }
[style*="half width"] { width: 50%; }
[style*="quarter width"] { width: 25%; }
[style*="gray background"] { background-color: #CCC; }
[style*="black background"] { background-color: #000; }
[style*="yellow background"] { background-color: #FF0; }
[style*="pink background"] { background-color: #FAA; }
/* a bunch more */
演示
查看 Dan Chilton 的 语义样式语言练习 (@bjork24) 在 CodePen 上的笔。
这可能看起来很愚蠢,但“真实事物”有时也会使用它,比如不久前流行的 Flex 布局属性。

Mark Huot 将这个想法与 Unicode 字符结合在一起。 如何使用像这样的 HTML
<div class="box" box="↖"></div>
<div class="box" box="▣"></div>
以及匹配“语言”的 CSS
[box*="▣"] { padding: 20px; }
[box-xl*="▣"] { padding: 40px; }
[box*="↑"] { padding-top: 20px; }
[box*="→"] { padding-right: 20px; }
[box*="↓"] { padding-bottom: 20px; }
[box*="←"] { padding-left: 20px; }
[box*="↕"] { padding-top: 20px; padding-bottom: 20px; }
[box*="↔"] { padding-left: 20px; padding-right: 20px; }
[box*="↖"] { padding-top: 20px; padding-left: 20px; }
[box*="↗"] { padding-top: 20px; padding-right: 20px; }
[box*="↘"] { padding-right: 20px; padding-bottom: 20px; }
[box*="↙"] { padding-bottom: 20px; padding-left: 20px; }
演示
查看 Mark Huot 的 疯狂盒子填充 (@markhuot) 在 CodePen 上的笔。
将样式语言放入属性的想法与原子 CSS 的想法并不遥远
制作了一些方便的 @code 代码片段来编写原子 CSS。 现在不需要记住 #acss 语法了!
/cc @thierrykoblentz pic.twitter.com/IvfdsKdOak
— Pankaj Parashar (@pankajparashar) 2016 年 3 月 13 日
或者 Expressive CSS,它也鼓励使用特定于样式的类名。
考虑使用
~=属性选择器而不是*=来正确处理空格分隔的值。MDN 说
所以是的,它听起来像是最正确的用法。 为什么呢? 我想可能是 CSS 选择器性能,这通常不是问题。
Chris,我认为使用
~=而不是*=的原因是因为box*="low"会错误地匹配像box="yellow"这样的情况,而你只希望它匹配实际的单词low。 以下是一个示例:http://codepen.io/csuwldcat/pen/QEokbd非常酷!(为什么不使用 data-*)?
那么语义呢? 我记得 Google 的旧格言,“表现性标记不可维护”——https://webmasters.googleblog.com/2012/07/on-web-semantics.html——大多数维护问题似乎都与这一点有关。 当开发人员使用像“clear”、“left”、“vertical”这样的类和内容时,我们都需要做额外的工作。 现在还不清楚这一点真是太愚蠢了。
这些很有趣。 Unicode 内容让我想起了 Mathias Bynens 关于 ES5 标识符的这篇文章.
使用自定义属性而不是
data-*有什么理由吗?如果我是“真的”这样做,我可能会使用
data-*,因为它没有那么有趣。这很酷,但请不要这样做 :D
+1
没错。 如果您的设计具有响应性,并且需要填充的边取决于视窗宽度,则
box="↖"表示padding-left和padding-top并不那么有意义。 或者,如果需要更改设计,而 HTML 分布在多个网站的数百个页面上,并且由不同的技术生成(或静态页面),又该如何呢? 或者,如果您想更好地利用继承来分配填充呢?使用语义内容。
此外,这里的每个示例都可能使用类。 能够使用属性而不是类很不错,但似乎没有比类有任何改进。
您可以用神秘的俳句来声明您的样式,而不是 CSS 类。 工作保障!
您不应该在 HTML 中使用自定义属性时使用data-*吗。
我认为,在 HTML5 中,不使用data-*而只使用自定义属性是无效的。
在为我们的 CMS 构建一个复杂的(可读性:大量变化)网格系统时,我做到了这一点
使用了
data-*属性,因为是 HTML5,但完全理解了虚构属性的吸引力。 我发现这种方法非常有用,因为它消除了围绕“这将如何呈现?”的困惑。 能够将所有内容都基于.grid基本类非常有用(例如.grid { &[data-cells="2"] { .grid-cell { … } } })。好文章!
为什么不使用类?
示例
与其使用 data-cells=”3″,不如使用:.cell-3,或者更好地使用像我们所知的框架那样的 .col-md-3 ;)
@Juanma — 通常我会这样做! 做出这个决定的主要原因是需要非常声明式。 有很多不同的网格组合,而阅读像
class="grid grid-cells-2 grid-cell-asset-download grid-mode-1lg"这样的属性,我觉得不如专门控制特定样式方面的属性清晰。 在这种情况下,这样做是有意义的,因为我们正在组合许多不同的独立样式。@Juanma 您可以使用自定义属性的值作为伪元素的内容——我想不出只使用类就可以完成的方法。 例如
我喜欢在这里看到真正的技巧,而这是我见过的最不可思议也是最没用的技巧之一。
这正是您应该使用
data-fencing的原因。 因为,你永远不知道……这是一个不错的主意! 我喜欢这样的文章。 它们真的会让你以有趣、新颖、古怪的方式思考。
(嘘……别担心,大家,从语气中可以清楚地看出,Chris 并不建议你在生产环境中使用它——这只是一篇文章来激发你的头脑、你的思维和你的大脑……)
使用属性而不是类名还有另一个原因:当使用 Javascript 和 CSS 时,您可能希望将这两个世界尽可能地分开。
在我们的项目中,我们尽量保持概念分离尽可能精确。 CSS 仅用于可视化,例如类名。 Javascript 实现功能,而不是可视化,除了偶尔设置显示或可见性外,JS 中不应该有任何样式或 CSS 引用。 现在,如果将所有由 JS 控制的内容都使用属性,您将从最大限度的概念分离中获益。 查看您的 HTML 代码或实时观看它,您将能够分辨出某个功能是由 JS 控制还是 CSS 控制。 例如,如果您要切换容器的状态,您只需从 JS 设置属性值。 您的 CSS 会选择该值并可视化该状态。 对于应用程序状态,如果您愿意,可以使用 body 元素。 这甚至可以解决一些 CSS 特定性问题。
另一个优点是可能替代 ID。 在较大的项目中,它们会成为一个真正的麻烦。 只需使用类似 data-id=”…” 的内容,您就可以在每个页面上多次使用相同的组件。 冲突已解决。
为了保持 HTML5 兼容性,我们始终使用“data-”属性。
Bootstrap 的工作方式就是这样(通过 data-*)。
优质文章。 它清晰易懂,并附带了一些很好的示例。
这是一个对我来说完全陌生的 CSS 技巧。
谢谢!
感谢您分享有用的信息。
谢谢
Augustin
Glen Maddern 做了一件事,这很有说服力。
我们在我的公司使用
{framework}.{element}:{modifier}@{screen-size}语法写了 类似的东西。我发现一些前端工程师在处理一些比较复杂的flexbox功能时遇到了困难,所以我试图简化它。我有一个需要构建的平台,我拥有样式表控制权,但没有标记控制权。我只能自定义行和小部件的样式属性。所以我最终做了类似的事情
HTML
CSS
我有时候会想我晚上怎么睡得着觉。