【问题标题】:Overwrite CSS class selectors without !important覆盖没有 !important 的 CSS 类选择器
【发布时间】:2011-04-18 22:14:35
【问题描述】:

我只是在为 Web 应用程序编写一个 javascript UI 对话框。问题是用户可以为 Web 应用程序创建自己的主题,其中可能包括元素 css 选择器(h1 {...}, div {...} 等),它会覆盖我的 UI 对话框的 css 格式。该对话框是一个 div 元素,它在类选择器上格式化(id 不起作用,因为此对话框可能会出现多次)。有没有办法停止影响 UI 对话框的用户模板样式的元素选择器,而不必使用巨大的 css 重置样式并为 UI 对话框的每种样式使用!important?像jQuery UI这样的UI库怎么会有对话框样式?

例如用户主题包括:

input {color:nuts; height:bananas; width:crazy; background:morenuts; }

UI 的 css:

.ui_modal_wrap input {color:red; border:1px solid black;}

UI 的 html:

<div class="ui_modal_wrap>
<input type="text" name="#" />
</div>

问题仍然是我必须为 .ui_modal_wrap 使用一个巨大的 css 休息,因为你不能真正编写具有用户可以应用的所有属性的 css(在这个例子中,height 和 width 元素仍然会破坏样式,因为 UI 的不包括高度和宽度)。

【问题讨论】:

  • 请展示一些 CSS 代码,尤其是你的对话框是如何定义的。
  • 你能不限制他们可以改变的选择器吗?例如只允许他们改变颜色或字体样式?如果您允许他们打开所有 css,有什么办法阻止他们搞砸您的所有标记?从本质上讲,这将使您为控制 UI 的某些部分所做的任何尝试都毫无意义,因为它们为整个 div 提供了绝对位置并将其向左移动了 30000px。
  • UI 是自定义使用 CMS 的一部分,它允许用户模板,但前端 UI 应该看起来相同,即使模板设计者决定使用元素选择器来完成所有样式。

标签: css css-selectors css-specificity


【解决方案1】:

一般而言,您应该知道使用specificity rules 应用规则(如果两者都在外部样式表中)。

一般有一个你可以考虑的分数,适用于分数最高的元素的规则将被应用。

在选择器链中,每个元素类型值 1,类值 10,id 值 100 分。

body div.wrapper == 12 points

body div.wrapper div span == 14 points

body #quote == 101 points

因此,通常只需使特定于页面的规则(用于设置页面其余部分的样式)不那么具体,并让 UI CSS 接管。或者,您总是可以将 UI 标记放在 HTML 的“超级”位中,例如:

<div id="super">
    <div id="super2">
        //your UI stuff
    </div>
</div>

然后通过将#super #super2 放在该样式表上的每个规则之前,为 UI 的 CSS“命名空间”。

【讨论】:

    【解决方案2】:

    根本没有办法确保这一点,除非:

    1. 您可以过滤用户的 CSS 并删除所有 !important 声明
    2. 保证您的 css 代码插入在他们的后面。然后,您可以在所有内容上使用 !important 以确保您的 css 具有更高的特异性。

    阅读css specificity

    【讨论】:

    • 这是真的,你不能保证你的风格被使用,只有当你能确保这两件事......重要的是要知道,如果通过正确的 css 特异性可以覆盖大多数风格!
    【解决方案3】:

    您将需要使用更具体的选择器的第二组样式,这将覆盖用户样式设置的元素。使用!important 只是这样做的一种方式。查看 CSS 特异性 了解更多信息。

    HTML

    <div class="ui-dialog">
        <h1>Dialog Heading</h1>
    </div>
    

    CSS:

    div.ui-dialog h1 {
        color: red;
    }
    

    jQuery UI 通过在您使用主题滚轮时为您提供指定 CSS“范围”的选项来实现这一点。您可以将范围设置为.system-scope,然后在您的 HTML 中将所有 UI 元素包装在一个具有系统范围类的元素中。

    【讨论】:

    • 嘿 TimS,这只是我使用 atm 的方法,但如果用户应用了您在 UI css 中未使用的样式,则它不起作用,例如以您的示例为例,如果用户应用了样式 h1{text-style:italic} 但您不希望文本在 UI 对话框中为斜体,因此您仍然需要一个巨大的 css 重置(并且我已经完成了不要涵盖所有内容...
    • 是的,我现在和你有一个非常相似的问题。只需在特定范围内重置尽可能多的默认值即可。我很想听听您能提出更多解决方案!
    猜你喜欢
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多