如何保护嵌入的 div 样式不被网站样式覆盖

Posted

技术标签:

【中文标题】如何保护嵌入的 div 样式不被网站样式覆盖【英文标题】:how to protect embedded div style not to be overridden by website style 【发布时间】:2016-12-19 09:38:22 【问题描述】:

我有自己风格的 div。我在其他网站上嵌入了这个 div。

<div id="scoped-div">
  <style>
    label 
      color: green;
    
  </style>

  <label> Scoped div </label>
</div>

但我遇到了问题,我的 div 样式被网站样式覆盖。我不想使用iframe。除了使用iframe,还有其他方法可以通过外部样式更改来保护我的 div 样式吗?

【问题讨论】:

使用更具体的选择器 - 包含元素 ID 的选择器。 (在大多数情况下应该这样做;可能仍然存在站点设法通过!important 或类似的方式覆盖您的样式的极端情况。您也可以为您的所有属性添加!important,但这可能会导致如果不小心处理,您的组件也会出现问题。) @CBroe 我用!important这样的标志写了内联样式:&lt;label style="color:green !important"&gt;&lt;/label&gt;,但即使这样也可以通过使用样式覆盖:label[style] color: yellow !important;写在我的div下面 “但即使这样也可以被覆盖”——当然可以——因为它不是你的网站,你不能指望别的.如果您想要样式的绝对独立性,那么您需要将您的内容与父文档完全分开,就像使用 iframe 一样。 【参考方案1】:

没有办法完全保护您的样式。但您可以尝试以下方法:

尽量指定您的元素选择器(例如,使用属性和 ID) 使用内联样式 使用!important(但要小心使用宽泛的use of importants)

【讨论】:

Andreas 感谢您的回复,我们在 cmets 讨论这种情况【参考方案2】:

您的要求正是Shadow DOM 使之成为可能:

    将 Shadow DOM 附加到要保护的元素(此处: #scope-div), 将要保护的 html 代码放入 Shadow DOM, 从&lt;template&gt; 元素中克隆它以简化操作(可选)。

就是这样!

var div = document.querySelector( "#scoped-div" )
var template = document.querySelector( "template" )

var sh
if ( 'attachShadow' in div )
  sh = div.attachShadow(  mode: "closed"  )  //Shadow DOM v1
else
  sh = div.createShadowRoot()                 //Shadow DOM v0 fallback

sh.appendChild( template.content.cloneNode( true ) )
<template>
  <style>
    label 
      color: green;
    
  </style>

  <label> Scoped div </label>
</template>

<div id="scoped-div">
</div>

【讨论】:

你可以在这里找到更多关于 Shdow DOM 的信息:developers.google.com/web/fundamentals/primers/shadowdom

以上是关于如何保护嵌入的 div 样式不被网站样式覆盖的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖嵌入推文的样式表

如何防止我的样式被周围 div 上的另一种样式覆盖?

我应该如何覆盖锚标签中 div 的悬停样式?

如何在 React App 中排除全局样式?

如何在您的网站中嵌入样式化的谷歌地图

如何覆盖 vuetify 样式?