【问题标题】:how to protect embedded div style not to be overridden by website style如何保护嵌入的 div 样式不被网站样式覆盖
【发布时间】: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 一样。

标签: css sass less webpack shadow-dom


【解决方案1】:

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

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

【讨论】:

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

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

  1. 将 Shadow DOM 附加到要保护的元素(此处: #scope-div),
  2. 将要保护的 HTML 代码放入 Shadow DOM,
  3. &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>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 2018-02-22
  • 1970-01-01
  • 2011-11-19
  • 2019-03-10
相关资源
最近更新 更多