【问题标题】:Prepend all CSS selectors前置所有 CSS 选择器
【发布时间】:2012-06-25 01:08:38
【问题描述】:

是否有一个文本过滤器或 javascript/jquery 函数可以在样式表中的所有 css 选择器前面加上一些东西?我试图用 twitter bootstrap 只影响一个 div,但它正在影响它之外的侧边栏,有没有办法做到这一点? (我不想使用 iframe。)

编辑:

我想要的只是能够为 css 文件中的每个选择器添加一个 ID“#content”。

【问题讨论】:

  • 嗯...你为什么不找到一种方法来唯一标识 div 呢?更改页面的所有样式似乎是个坏主意,因为它可能会破坏其他东西
  • 不能同意@nico。发布您的网站或小提琴,一定有更好的方法
  • 它不会破坏页面,我想将 twitter bootstrap css 应用到单个 div,我只想在 bootstrap.css 文件中添加 css。

标签: javascript jquery css regex css-selectors


【解决方案1】:

您在 sabithpocker 的回答下的评论告诉我,您希望静态修改 CSS,而不是动态更改样式。我认为使用正则表达式最简单:

查找:([,|\}][\s$]*)([\.#]?-?[_a-zA-Z]+[_a-zA-Z0-9-]*)
替换为:$1#content $2

正则表达式分解

  • ([,|\}][\s$]*) - 从前面的样式中查找},,后跟空格(空格/制表符:\s,换行符:$)。右大括号\逗号可防止正则表达式查看样式内部。
  • [\.#]? - 匹配样式名称中的起始 #.(如果存在)。
  • -?[_a-zA-Z]+ - CSS 样式名称可以以下划线或字母开头。此外,样式名称可以在前面加上破折号。
  • [_a-zA-Z0-9-]* - 匹配样式名称的其余部分。这可以省略,但最好知道所有已修改样式的样式名称。
  • $1#content $2 - }(或,)和空格保留原样($1)。其后是您插入的文本#content(注意空格),然后是样式名称($2)。

我在 Notepad++ 中对此进行了测试,它适用于我的样式表。
需要注意的是,如果你的 CSS 没有被压缩(并且是多行的), 您将需要支持多行正则表达式的编辑器(Notepad++ 支持)。

【讨论】:

  • 谢谢!!它得到了大部分,但留下了一些这样的:#content audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; } 它没有画布或视频。
  • @Raymond - 更新为包含逗号分隔的名称。 (\} 只需更改为[,|\}]
  • 不错,但它并不能获取所有信息(例如:在媒体查询中添加 a 标签)
  • 关于我上面的评论,你可以做一个额外的css = css.replace(/(@media[^{]+{[\s$]*)([\.#]?-?[_a-zA-Z]+[_a-zA-Z0-9-]*)/, "$1" + prependClass + " $2"); 来捕捉这些情况。
  • 嗨。我在使用以字母开头的十六进制颜色时遇到问题(如果它们以数字开头,它们是正确的)。有问题的 CSS 类似于:background: linear-gradient(to bottom, #ae9e9e, #454545);。除了以字母开头的颜色之外,如果我使用 rgb,它也不起作用。在所有情况下,结果都类似于:background: linear-gradient(to bottom, #myDiv #ae9e9e, #454545)。有什么想法吗?
【解决方案2】:

改进了 RustyTheBoyRobot 和 BoltClock♦ 答案以允许 cmets 和媒体查询。

查找:([,|\}][\s$]*)((?|\/\/.*[\s$]+|.*\/\*.*\*\/[\s$]*|@media.*\{[\s$]*|)*)([\.#]?-?[_a-zA-Z]+[_a-zA-Z0-9-]*)

替换为:$1$2 #content $3

编辑

我注意到我提供的代码仅适用于 PHP。

这是一个改进的版本,应该可以在 Javascript 和 PHP 中运行

正则表达式模式*

(^(?:\s|[^@{])*?|[},]\s*)(\/\/.*\s+|.*\/\*[^*]*\*\/\s*|@media.*{\s*|@font-face.*{\s*)*([.#]?-?[_a-zA-Z]+[_a-zA-Z0-9-]*)(?=[^}]*{)

完整示例*

var outputString = inputString.replace(
    /(^(?:\s|[^@{])*?|[},]\s*)(\/\/.*\s+|.*\/\*[^*]*\*\/\s*|@media.*{\s*|@font-face.*{\s*)*([.#]?-?[_a-zA-Z]+[_a-zA-Z0-9-]*)(?=[^}]*{)/g,
    "$1$2 #content $3"
);

这也应该解决@Mariano Martinez Peck 与background: linear-gradient(to bottom, #ae9e9e, #454545); 的问题和@font-face 的问题

【讨论】:

  • 我得到一个错误编译,它应该是?|?:
  • 呃,?| 是 PCRE 的东西,所以在 java 中不支持
  • 尝试从 JS 使用它时出现错误。我正在尝试这个:" .{} /*.table tbody > tr > td {font-family: verdana; font-size: small} */ .researchCompanyReportTableControls { display: none; } ".replace(/([,|\}][\s$]*)((?|\/\/.*[\s$]+|.*\/\*.*\*\/[\s$]*|@media.*\{[\s$]*|)*)([\.#]?-?[_a-zA-Z]+[_a-zA-Z0-9-]*)/g, "$1" + "$2" + "#myDiv" + " $3"); 但它因无效组而失败。有任何想法吗?我看起来不喜欢?|
【解决方案3】:

使用 SCSS 可以更轻松地完成此操作。只需使用您现有的 CSS,使用 #my-new-selector { ... } 将其全部嵌套,然后通过 SCSS 到 CSS 编译器运行它(有在线工具可以做到这一点,而无需安装任何东西。

【讨论】:

  • 在当今,这是一种更加一致且实际上更简单的方法。正则表达式在系统之间非常繁琐,你会遇到很多边缘情况,但是 SCSS 解析和理解 css,所以除非 SCSS 编译器不好,否则你很可能会得到你想要的。
【解决方案4】:

一种解决方法(如果您真的需要这样做):

  1. 等待窗口加载并应用所有样式
  2. 获取您希望应用的样式保持不变的元素
  3. 获取他们的样式并内联应用它

对于跨浏览器实现,您可以使用如下所示的 jquery 插件:

$('#mydiv *').each(function(){
    $(this).css($(this).getStyleObject());
    });

然后禁用原来的样式表

document.stylesheets[n].disabled = true;
//or use this : $('link[title=mystyle]')[0].disabled=true;

//n should be index of style sheet -- counts external + internal style sheets

插件:

/*
 * getStyleObject Plugin for jQuery JavaScript Library
 * From: http://upshots.org/?p=112
 */

(function($){
    $.fn.getStyleObject = function(){
        var dom = this.get(0);
        var style;
        var returns = {};
        if(window.getComputedStyle){
            var camelize = function(a,b){
                return b.toUpperCase();
            };
            style = window.getComputedStyle(dom, null);
            for(var i = 0, l = style.length; i < l; i++){
                var prop = style[i];
                var camel = prop.replace(/\-([a-z])/g, camelize);
                var val = style.getPropertyValue(prop);
                returns[camel] = val;
            };
            return returns;
        };
        if(style = dom.currentStyle){
            for(var prop in style){
                returns[prop] = style[prop];
            };
            return returns;
        };
        return this.css();
    }
})(jQuery);

【讨论】:

  • 是否有导出它以便我可以保存 .css 文件?我宁愿这是一个静态文件。
  • 你为什么需要那个,你能解释一下你到底想要完成什么吗?
  • 我想将 twitter 引导 css (bootstrap.css) 应用到单个 div,目前它正在影响页面上的所有内容。
【解决方案5】:

不,样式表只是一个复制粘贴文件。你必须用唯一标识符包装你想要的所有东西,然后使用这个唯一标识符引用它。

【讨论】:

  • 我有一个唯一标识符,问题是所有的 css 都不匹配,我需要一种方法来处理文本并将 #content 添加到每个选择器。
  • css 以文本形式出现,然后在浏览器中作为对象保存在 document.stylesheets 数组中,现代浏览器有直接攻击它们的方法。看看兼容性和可用功能的怪癖quirksmode.org/dom/w3c_css.html
  • @sabithpocker 我知道 CSS 是如何工作的,我想要一个针对特定于 CSS 格式的文本文件的文本过滤器,使用该过滤器我想为该文本文件中的所有选择器添加一个前缀。
猜你喜欢
  • 2013-08-07
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 2020-08-17
  • 2015-08-31
  • 2016-12-21
  • 1970-01-01
  • 2011-03-21
相关资源
最近更新 更多