我有一个字符串,下面的CSS,我需要处理与JavaScript
h1
{
color: red;
}
.info
{
border: 1px dotted blue;
padding: 10px;
}
#rect
{
background: pink;
}
h2,
h3,
h4
{
font-weight: bold;
}
table td:last td
{
background: gainsboro;
}
我怎样才能给每个规则添加前缀.page
,这样css就不会被破坏?
我想要这个结果
.page h1
{
color: red;
}
.page .info
{
border: 1px dotted blue;
padding: 10px;
}
...
现在,我通过查找缩进来解决它,但是代码在这种情况下失败了
h1
{
color: red;
}
最后就变成了
.page h1
{
.page color: red;
}
我还可以查找只有方括号的行,但这种情况会失败
h1 { color: red; }
我不想构建自己的css解析器,我发现的那些解析器主要处理应用于DOM中元素的css,而不是用css处理字符串。有没有一个好的解析器,或者可以通过其他方式实现?
6条答案
按热度按时间ijnw1ujt1#
下面是一个函数,它可以在所有选择器前面加上一个类名。这个函数正确地处理了@ rules:
如果你只想有
html
和body
选择器的类名,添加这个:ilmyapht2#
你已经提出了一个问题,如何做你认为是你的实际问题的解决方案,这似乎是,我如何将一些CSS只应用到一个文档的一个部分?
最终,解决方案将是
<style scoped>
。在我们等待的同时,您可以尝试使用polyfill,例如https://github.com/PM5544/scoped-polyfill,http://thomaspark.co/2015/07/polyfill-for-scoped-css/,https://github.com/thingsinjars/jQuery-Scoped-CSS-plugin或https://github.com/thomaspark/scoper。如果你有一个CSS字符串(你从哪里得到的?),那么要使用这些polyfill,你可以简单地在
.page
元素下插入一个<style scoped>
元素到你的DOM中,包含你在字符串中得到的CSS。所有这些polyfill都有一个主要的优点,那就是它们是基于浏览器正确解析的CSS,并且不会在出现问题的第一个迹象时就崩溃,因为你不明智地接受了regexp解决方案,而所有其他regexp解决方案都不可避免地会崩溃。
9rygscc13#
如果你想使用sass,你可以简单地写如下
这将被编译成你想要的。但是如果这不是一个选择,你必须编写自己的解析器。
yftpprvb4#
一个解决方案是,循环CSS规则并动态更新它们。
eivgtgni5#
如果你不想使用Regex,而想利用postcss,你可以安装postcss-prefix-selector并这样做:
返回的输出:
wfsdck306#
看看正则表达式
例如像这样:
应该在第一组中捕获css字符串中的所有选择器,在第二组中捕获和规则。然后你做类似这样的事情来替换匹配项
如果您不熟悉正则表达式,我建议您阅读Eloquent Javascript中的相关章节