html - 如何使用 CSS 选择器从类中提取子字符串?
问题描述
我有一个 Hugo 生成的静态网站,在每个代码片段中,我想将语言名称放在右下角。
我已经能够使用 CSS 选择器language-x
在标签中获取整个类 ( ),code
但我只想从类名中捕获语言名称,而不是整个类。
这是迄今为止我所拥有的最小工作示例:
https://codepen.io/anon/pen/gZWWNP
<html>
<style>
pre {
background: #26282C;
color: #fff;
text-align: left;
padding: 0.5em;
padding-left: 0.5em;
padding-left: .8em;
word-break: break-all;
white-space: pre-wrap;
overflow: auto;
tab-size: 4;
margin-bottom: 20px;
border-left: 5px solid #F27563;
border-bottom-right-radius: 5px;
border-top-right-radius: 5px;
}
code[class*="language-"]:after,
pre[class*="language-"]:after {
content: attr(class);
color: #fff;
font-size: smaller;
font-weight: bold;
display: block;
text-align: right;
padding-top: 5px;
}
</style>
<body>
<pre>
<code class="language-perl6">class Person {
has Str $.firstname;
has Str $.lastname;
has Str $.age;
}
</code>
</pre>
</body>
</html>
在这种情况下,language-perl6
我不想只显示perl6
. 除了 CSS 或可能是 vanilla JS 之外,我希望在不使用任何其他工具的情况下尽可能地减少这一点。
解决方案
content
不幸的是,您无法更新该值,但您可以attr
通过 javascript 创建一个新值并在您的 CSS 中使用它。我在您的 CSS - 中引用了一个新属性content: attr(short-lang);
,然后编写了一些纯 JavaScript 来转换您的类并将其分配给新属性。
我已经创建了代码,因此它适用于pre
和code
元素,因为这是您的 CSS 建议所需要的。我pre
在演示中添加了一个类。
我会认真考虑将语言存储在它自己的属性中,而不是作为一个类,就像你必须添加任何其他类一样,这段代码也会显示这些类。
// Get all code and pre elements
var elements = document.querySelectorAll('code,pre');
// Cycle through each code element
for (var i = 0; i < elements.length; i++) {
// Load language from class
var lang = elements[i].getAttribute("class");
// Remove 'language-' if lang is not empty
if (lang != null ) {
lang = lang.substr(lang.length - (lang.length-9));
}
// Create 'short-lang' parameter for element
elements[i].setAttribute("short-lang", lang);
}
pre {
background: #26282C;
color: #fff;
text-align: left;
padding: 0.5em;
padding-left: 0.5em;
padding-left: .8em;
word-break: break-all;
white-space: pre-wrap;
overflow: auto;
tab-size: 4;
margin-bottom: 20px;
border-left: 5px solid #F27563;
border-bottom-right-radius: 5px;
border-top-right-radius: 5px;
}
code[class*="language-"]:after,
pre[class*="language-"]:after {
content: attr(short-lang);
color: #fff;
font-size: smaller;
font-weight: bold;
display: block;
text-align: right;
padding-top: 5px;
}
<html>
<body>
<pre>
<code class="language-perl6">
class Person {
has Str $.firstname;
has Str $.lastname;
has Str $.age;
}
</code>
</pre>
<pre class="language-perl9">
class Person {
has Str $.firstname;
has Str $.lastname;
has Str $.age;
}
</pre>
</body>
</html>
推荐阅读
- postgresql - 检查字符串是否是数组之一
- vue.js - GraphQL:可重复组件上的深度过滤器引发错误
- javascript - 无法从“Window”读取“localStorage”属性:访问被拒绝
- python - 广播火炬张量时,“具有多个值的张量的布尔值不明确”
- javascript - 根据条件添加或删除类
- c# - 如何监控由 chromeriver 打开的 chromebrowser 操作?
- javascript - 使用 JS 序列化已经存在的 FontFace
- c# - C# Aps.Net AppSettings.json 加载顺序
- python - 在某些情况下,在两个不同的事件中更改一个字典会导致 KeyError(因为键事件的时间 + 由于 dt 的事件)
- join - 如何连接或列出同一列中的两个值以将其与另一列中的值连接