是否可以将 CSS 选择器中的重要属性值设为不重要的属性值?

Posted

技术标签:

【中文标题】是否可以将 CSS 选择器中的重要属性值设为不重要的属性值?【英文标题】:Is possible to make an important property value from CSS selector a non important one? 【发布时间】:2013-09-24 19:39:53 【问题描述】:

是否可以将 CSS 选择器中的重要属性值设为不重要的值?


例如:Bootstrap 3 defines .hide class 为:

 .hide  display: none !important; 

是否可以在不修改BS3源代码的情况下删除重要值?

思考类似的东西

 .hide  display: none !remove-important; 

请注意,我想保持相同的值!我不想将block !important 设置为.hide 类,因为那是不正确的......

我已经添加了一个新类 .hide-non-important 并在需要的地方使用它:

 .hide-not-important  display: none; 

...但问题是:还有其他选择吗?

【问题讨论】:

我认为这是一个非常糟糕的判断调用 Bootstrap 到 have added that 到它的任何属性(至少不使用一些 mixin 让程序员选择是否拥有 !important 标志) .虽然我同意.hide 应该始终隐藏的想法,但!important 假设太多而且太不灵活,不是明智的解决方案。 @ScottS 这也是我的意见...我已经添加了an issue in Bootstrap repository from Github。 【参考方案1】:

您无需编辑原始源代码。只需创建一个样式表并将其放在 Bootstrap 样式表之后并将其添加到其中:

 .hide  display: block !important; 

现在,说了这么多,我会非常小心地这样做。你不知道你的网站上有多少元素应用了这个类,你几乎肯定会得到意想不到的结果。

应用这个类显然是有原因的,我建议:

    不要这样做

    向元素添加一些其他类并为其添加样式。将您的标记(或使用 js 应用类,如果需要)调整为:

    <div class="hide custom-hide-reset"></div>
    

    然后将此样式添加到您创建的样式表中:

    .custom-hide-reset  display: none; 
    

【讨论】:

但这设置了block 值,我希望none 值隐藏元素。 您不想应用 !important,但仍希望应用样式?我不确定我是否理解您最终要达到的目标。 FWIW,没有办法删除 !important 修饰符,它只能被另一个 !important 样式覆盖。 我已经创建了一个自定义类(参见编辑)。还有其他选择吗? 不,一旦 !important 被应用,它只能被覆盖,不能被取消 @Hannes:因为***.com/questions/18851042/…【参考方案2】:

您可以使用以下命令覆盖它:

 body .hide  display: none !important; 

 .someclass.hide  display: none !important; 

这两个例子的优先级更高

【讨论】:

只有当第二个规则出现在你的 CSS 中的第一个规则之后才会起作用 - 当使用 !important 规则时,特异性也无关紧要。 @Adrift:只要你有多个规则具有相同的属性应用于相同的元素,那么特异性就相关; !important 只是要考虑的另一层优先级。见this answer。在这种情况下,无论顺序如何,.someclass.hide 都会获胜。 啊...是的,我完全错了:[感谢您指出这一点并提供相关答案; +1 @Adrift:不用担心,感谢有机会重温我的一个旧答案:) @BoltClock +1 对您链接的两个答案;我很佩服你只有 21 岁。【参考方案3】:

样式表对象可通过 javascript 访问

var sheets = document.styleSheets

一旦有了样式表数组,就可以遍历规则

var rules = sheets[i].cssRules || sheets[i].rules // browser dependency

每条规则都有一个style 属性,它以通常的方式是可变的。

rule.style[cssPropName] = value;

工作表上有一种方法可以按索引删除规则,deleteRuleremoveRule,具体取决于浏览器。

最后,您可以找到规则并对其进行编辑或删除并以修改后的形式重新添加。

参考:http://www.javascriptkit.com/dhtmltutors/externalcss3.shtml#.Ujsin4ZmjAs

【讨论】:

【参考方案4】:

由于问题可以拆分

如何从应用于我的页面的规则中删除 !important,但是 不改变其值和 不编辑原始 CSS 文件

仅出于纯粹的冒险精神,我认为可以通过以下方式:

    用 jQuery 加载 CSS; 通过搜索 .hide display: none !important; 并将其替换为 .hide display: none; 来替换其内容; 将新的内存中更改的 CSS 应用到页面。

考虑到the solution posted in this answer,它可以用一些东西(完全未经测试,只是为了得到这个想法)进行修改,例如:

$.get(myStylesLocation, function(css)

   var alteredCss = css.replace(".hide  display: none !important; ",".hide  display: none; ");
   $('<style type="text/css"></style>')
      .html(alteredCss)
      .appendTo("head");
);

【讨论】:

【参考方案5】:

您可以将当前的!important 值替换为另一个类似

.col color:red !important; 
.col color:green;  // wont work
.col color:blue !important;  // will work and set color blue instead of red

DEMO.

更新:

此问题与JavaScript 无关,但作为替代方案,您可以使用这些技术完成任务,使用JavaScript 删除规则,然后再次添加新规则。

function getCs-s-rule(ruleName, deleteFlag)                
   ruleName=ruleName.toLowerCase();                       
   if (document.styleSheets)                             
      for (var i=0; i<document.styleSheets.length; i++)  
          var styleSheet=document.styleSheets[i];          
         var ii=0;                                        
         var cssRule=false;                               
         do                                              
            if (styleSheet.cssRules)                     
                cssRule = styleSheet.cssRules[ii];         
             else                                       
                cssRule = styleSheet.rules[ii];            
                                                         
            if (cssRule)                                 
                if (cssRule.selectorText.toLowerCase()==ruleName)  
                    if (deleteFlag=='delete')              
                        if (styleSheet.cssRules)            
                            styleSheet.deleteRule(ii);        
                         else                              
                            styleSheet.removeRule(ii);        
                                                            
                        return true;                         
                     else                                 
                    return cssRule;                      
                                                       
                                                      
                                                     
        ii++;                                         
         while (cssRule)                                
                                                         
                                                         
   return false;                                          
                                                         

function killCs-s-rule(ruleName)                           
    return getCs-s-rule(ruleName,'delete');                  
                                                         

function addCs-s-rule(ruleName, v)                         
    if (document.styleSheets)                             
        if (!getCs-s-rule(ruleName))                         
            if (document.styleSheets[0].addRule)            
                document.styleSheets[0].addRule(ruleName, v,0);
             else                                          
                document.styleSheets[0].insertRule(ruleName+''+v+'', 0);
                                                            
                                                           
                                                          
   return getCs-s-rule(ruleName);

// Check the rule before deleting
console.log(getCs-s-rule('.col')); // .col  color:red !important; 
// At first remove the current rule
killCs-s-rule('.col');
// Now assign nre rule
addCs-s-rule('.col', 'color: red');
// Check the rule after deleting
console.log(getCs-s-rule('.col')); // .col  color:red; 

DEMO.(来源:Totally Pwn CSS with Javascript)

【讨论】:

@Johnツ,检查更新的答案,不是css,但可能有用。

以上是关于是否可以将 CSS 选择器中的重要属性值设为不重要的属性值?的主要内容,如果未能解决你的问题,请参考以下文章

CSS 属性选择器中的“i”是啥意思?

CSS3:元素的边框背景和大小

求助!! C# 把一个Label的值设为空,在窗体中看不到这个Label了,点不到了,怎么才能找到这个控件呢?

010. CSS 选择器

前端小知识

怎样把gis中0值设为nodata