【问题标题】:How to stop Injected HTML-div / CSS from inheriting styles ? (Internet Explorer)如何阻止注入的 HTML-div / CSS 继承样式? (IE浏览器)
【发布时间】:2010-11-13 23:17:07
【问题描述】:

我正在为 Internet Explorer 创建一个扩展,我在网页上注入 CSS 样式的 span 标签。如果单击此组件的特定部分,则会显示一个弹出窗口。

这个弹出窗口实际上是一个“DIV”元素,我在内容页面的最后注入了它:s“BODY”标签。我在这个 div 中有一个 CSS 样式的表格,根据我所在的站点,这个弹出窗口的外观要么符合规范(关于宽度等),要么不符合。

我对 CSS 等没有太多了解,但这可能是因为“父”页面已经有一些用于“BODY”、“DIV”或“TABLE”元素的 CSS被我的元素继承了?

如果是这种情况,有什么办法可以阻止这种情况?

【问题讨论】:

    标签: html css internet-explorer


    【解决方案1】:

    有(至少)两种方法可以做到这一点1,但它们都有点混乱。

    使用带有自己的 css 的 iframe(这样页面就被两个完全不同的网页分开了)。

    使用增加的特异性来定位插入的 html 元素。

    body {
      /* targets the 'body', and these styles are inherited by its descendant elements */
    }
    
    body div {
      /* targets all divs that are contained within the 'body' element */
    }
    
    body > div {
      /* targets only divs that are directly contained within the body element */
      /* and these styles will/may be inherited by the children of these divs */
    }
    

    后一种方法的问题在于,您必须明确指定几乎所有可能的排列。而且总会有一些边缘情况没有被考虑在内。您最好使用类名来指定新内容的样式:

    .insertedDiv {
      /* this will apply to all elements of class 'insertedDiv', but may be overridden */
      /* by a more specific id-based selector such as '#container > .insertedDiv' */
    

    1. 但我现在只能想到这两个。

    【讨论】:

      【解决方案2】:

      CSS 自然地“级联”,这意味着如果容器元素具有属性,则默认情况下它的子元素会继承它。当然,您可以通过重新定义样式来覆盖更具体的项目的值。

      您需要将 CSS 与指定弹出窗口所有必要属性的 HTML 一起注入。与大多数 CSS 不同,您不能假定任何默认值,您需要为您的 div 指定任何可能被页面覆盖的内容。确保您在 CSS 中通过 id 专门引用 div,以确保您的样式覆盖页面的样式,并且您不会无意中弄乱页面的格式。

      【讨论】:

      • +1:使用 div id 覆盖类,剩下的就是为新 div id 中的子元素重置 css,或者在它们之上声明新样式。
      【解决方案3】:

      您应该以css reset stylesheet 开头。但必须对其进行修改以仅影响您的 html。因此,如果您将 html 包装在 id 为“23d4o829”之类的 div 中,您可以使用编辑重置样式表中的每个规则,这样它只会影响该 div 中的 html。

      例如,

      html, body { /* some stuff */ }
      table { /* more stuff */ }
      

      变成

      html #23d4o829, body #23d4o829 { /* some stuff */ }
      #23d4o829 table { /* more stuff */ }
      

      等等。之后,您就可以拥有控制外观所需的所有css规则了。

      编辑:我认为使用 David Thomas 提到的 iFrame 更好。

      【讨论】:

      • CSS 重置样式表仅用于重置浏览器默认值,主机页面可能具有未重置的样式。
      • 实际上,我的解决方案可能无法在所有情况下都完美运行。它在大多数情况下都可以工作,但如果现有页面的 css 规则中有一些非常具体的标识符(例如:body #foo div #bar { padding: 5px }),那么它可能不会被重置。
      • @Zack Bloom 您对重置样式表的预期用途是正确的,但我认为它们可以在这里使用。这不是一个完美的解决方案。使用 iFrame 是一种更合理的方法。
      猜你喜欢
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 2012-10-05
      • 2010-10-18
      相关资源
      最近更新 更多