Javascript 如何在当前页面中CSS沙盒/重置整个DIV区域?
我们正在开发一个bookmarklet,当bookmarklet加载到不同的网站上时,例如:cnn.com、bbc.co.uk、yahoo.com,它会以各种样式显示,我们很难重置这些样式 bookmarklet内容在当前页面DOM中,而不是在iframe中(因为我们需要cookie和对DOM的访问) 我们尝试使用CSS重置,但这只重置了一些基本内容,比如边距。还有一些页面,例如有一个自定义表单,或者它继承的圆形表格矩形,但不应该继承Javascript 如何在当前页面中CSS沙盒/重置整个DIV区域?,javascript,html,css,bookmarklet,Javascript,Html,Css,Bookmarklet,我们正在开发一个bookmarklet,当bookmarklet加载到不同的网站上时,例如:cnn.com、bbc.co.uk、yahoo.com,它会以各种样式显示,我们很难重置这些样式 bookmarklet内容在当前页面DOM中,而不是在iframe中(因为我们需要cookie和对DOM的访问) 我们尝试使用CSS重置,但这只重置了一些基本内容,比如边距。还有一些页面,例如有一个自定义表单,或者它继承的圆形表格矩形,但不应该继承 有没有一种方法可以完全隔离当前页面中的这个DIV区域,使其看
有没有一种方法可以完全隔离当前页面中的这个DIV区域,使其看起来像我们想要的那样?好吧,您可以使用唯一id和添加!对于以后的每个属性都很重要-用于重置DOM中生成的元素-或者您可以在“HTML5”中使用新的作用域属性 但这可能会导致该元素或父元素上所有显式“继承”值样式出现问题。例如,相对字体大小也会导致问题 因此,这是style部分的实验范围属性,但上次我尝试它时,只有Chrome/Chrome支持它,Firefox可能最近也获得了对它的支持——因为邮件列表上有大量讨论 编辑: 另一种解决方案是使用默认情况下不在DOM中的自定义元素。 类似于document.createElement(“thisisfrommyapp”); 您可以像其他元素一样设置它们的样式,但必须应用display:block或任何需要的行为 此外,IE允许使用它们,但实际上您需要先将它们插入Tridents的解析器。如果要在HTML中使用它们,必须在解析DOM之前执行createElement()(因此它很可能位于文档的头部)
document.createElement('customelement');
也可以在IE8中使用
您必须只为Trident执行createElement操作,否则您将由于其显示而导致奇怪的解析行为:inline block defaulted model:)
如果您在网站上使用XHTML是出于愚蠢的原因(由于解析器剥离了XML标记,因此没有有效的理由在HTML上使用XHTML),那么您应该为其使用自定义名称空间
~Cheers试着用一些不太可能出现在他们页面上的模糊元素替换你的div怎么样 例如,
b
或em
或i
,如果你不担心浏览器支持的话,甚至可能是新的html5元素之一
并将它们设置为display:block
,使其功能类似于块元素div
你得到的HTML不是有效的或漂亮的,但它是一个书签,所以,嗯
除此之外,你需要一个真正好的重置
或者你只需要在你的风格上有细微的差异就可以了。我们最终使用
CleanSlate是一个极端的CSS重置样式表。它用于将HTML元素及其所有子元素的样式重置为默认CSS值。它完全由以下内容组成!重要规则,它覆盖所有其他类型的规则。按照以下两个步骤对容器进行沙箱处理
<div class="namespace-box">
<h1 class="namespace-title">Title</h1>
<p class="namespace-text">Text</p>
</div>
喜欢你的防弹容器。为什么不给它一个唯一的id并根据你的喜好设计它呢?我们尝试过这样做,但问题是我们需要定义每个css属性的值。我认为这太过分了。你真的没有选择的余地,如果你将你的div嵌入到一个现有的页面中,并且有一个现有的样式表,那么除了编写你自己的样式之外,没有办法覆盖那些样式。实验范围属性确实可以工作,但这是一个遥远的未来的愿望。也许未来10年所有主流浏览器都将采用。我读了这篇链接文章,但最大的问题仍然是输入标签。您将如何替换它们?这很友好,但输入和其他东西是无法替换的。请参阅我的答案的更高级版本:此外,人们可能只使用
*{font-family:'Comic Sans MS'!important;}
,因此使用晦涩的元素在这里也不会有帮助……并让您使用!重要的是要覆盖这些,这听起来像。
<div class="namespace-box">
<h1 class="namespace-title">Title</h1>
<p class="namespace-text">Text</p>
</div>
[class*="namespace-"],
[class*="namespace-"]:after,
[class*="namespace-"]:before,
[class*="namespace-"]:hover:after,
[class*="namespace-"]:hover:before {
all: unset;
// properties to be unset
}
[class*="namespace-"].namespace-box,
[class*="namespace-"].namespace-title,
[class*="namespace-"].namespace-text {
// original properties
}