我正在将现有应用程序从 Ext 3.x 更新到 4,并且我已经设法启用 Ext 的作用域重置 CSS 选项以防止 Ext 将其 CSS 重置应用于我的整个应用程序,但是我现在遇到了另一个问题。我的应用程序使用了很多硬编码的、非 ext 生成的 HTML 和 CSS 样式,其中大部分包含在 Ext 组件(面板、选项卡面板等)中。显然,由于这个 html 是 ext 组件的包含元素的后代,它继承了CSS 重置样式。结果,完全提升了非 Ext html 的自定义样式。
具体来说,有两个 CSS 规则会导致问题:
.x-border-box .x-reset, .x-border-box .x-reset * {box-sizing: border-box;-moz-box sizing: border-box;-ms-box-sizing: border-box;-webkit-box-sizing: border-box;}[/php]
这个属性不是什么大问题,我所要做的就是创建我自己的重置包装类,将 box-sizing 改回“content-box”,并将该类应用于我的自定义 html 中最顶层的包装元素。该规则如下:
.my-reset, .my-reset *, .x-reset .my-reset *, .x-border-box .x-reset .my-reset * { box-sizing: content-box; -moz-box-sizing: content-box; -ms-box-sizing: content-box; -webkit-box-sizing: content-box;}
然而,另一个 CSS 规则并不那么容易否定:
.x-reset html, .x-reset body, .x-reset div, .x-reset dl, .x-reset dt, .x-reset dd, .x-reset ul, .x-reset ol, .x-reset li, .x-reset h1, .x-reset h2, .x-reset h3, .x-reset h4, .x-reset h5, .x-reset h6, .x-reset pre, .x-reset code, .x-reset form, .x-reset fieldset, .x-reset legend, .x-reset input, .x-reset textarea, .x-reset p, .x-reset blockquote, .x-reset th, .x-reset td {margin: 0;padding: 0;}
这条规则如此麻烦的原因是我的自定义 HTML 中的所有不同元素都不会有相同的边距和填充,所以我不能像我为 box-sizing 所做的那样覆盖这些样式。这条规则优先于我的绝大多数自定义 CSS 样式的原因是因为它比 CSS 类本身具有更高的特异性。即“.x-reset div”选择器的边距/填充样式会覆盖“.my-cool-class { padding: 5px; margin:5px; }” for '' 之类的规则。
为了克服这个问题,我自然可以更新我的自定义 css 以通过在类选择器前面加上它所针对的元素类型(“div.my-cool-class”)或通过在规则前面加上 .x- 来赋予规则更高的特异性reset (".x-reset .my-cool-class"),但是这些选项中的任何一个都需要手动更新大量已经存在的自定义 css,更不用说增加文件大小和限制CSS 类。
那么有什么方法可以通过 Ext 的设置,或者通过其他一些我只是忽略的 CSS 解决方案,可以优雅地解决这个问题,并且希望没有太多的开销?