快速答案是使用"all:revert"
.element {
all:revert;
}
all:revert
会将元素上的所有样式属性重置回原始浏览器默认UA样式表属性值,或者返回父级body元素中的样式。但它不会擦除像initial
这样的样式属性,将它们返回到完全未经过样式化的状态。
对于文本或继承属性,"revert"
将您的元素的CSS属性重置回从"body"元素或浏览器的默认UA样式值继承而来的值,而不是属性的基本样式。对于非继承属性,它将其重置回浏览器的UA默认样式表,而不是属性的基本样式。 "all"允许影响所有属性。这可能是您想要看到的。
使用"all:revert"
时可能出现的问题
"all:revert"
是一个较新的CSS声明,仅在更现代的HTML5浏览器(2015年后)中起作用,在某些现代浏览器(如Internet Explorer 1-11、Edge Trident和一些移动浏览器)中支持非常差。所有旧的、非HTML5浏览器(2010年之前)都不会理解这个声明,因此它将被广泛地忽略,无论是旧的还是新的浏览器。(请参见下面我的混合CSS解决方案,其中包含Internet Explorer的修复方法)。
使用"initial"
和"unset"
时可能出现的问题
您可以使用"initial"
或"unset"
,但必须为每个属性手动应用它们,更糟糕的是,它们不会将属性返回到由每个浏览器的默认UA样式表设置的元素的默认显示值,但"initial"
本质上会擦除元素的属性值并创建一个完全未经过样式化的元素。例如,在块级元素上的"display:block"将被擦除。因为样式属性仍然需要某种默认值,所有具有"display"的块级和非块级元素都将在使用"display:initial"时更改为"display:inline"。您不希望这样做,因为它会完全擦除您的样式和所选元素的浏览器默认UA元素样式。
"unset"
的工作方式与此类似,但对于继承的基于文本的CSS属性,其属性继承在元素上面的父级中继承任何内容(可能是浏览器的默认UA样式或上面的HTML父级中的任何内容),但对于非继承属性,它的工作方式类似于"initial"
。
我的建议是避免在CSS中使用
all:initial
或任何形式的
initial
,除非你试图消除其他方法无法消除的单个CSS属性。为什么?
initial
不仅会擦除你应用的样式,还会擦除浏览器默认UA样式表应用的所有样式。
all:revert
不会这样做。就使用
initial
而言,它在Internet Explorer中具有更好的支持,与其类似的是
inherit
。但只有IE8+才能理解
initial
。因此,此属性值存在各种问题,不可靠。
CSS之所以起作用是因为所有HTML元素都没有任何样式,直到浏览器应用了默认的用户代理样式表,为所有HTML元素提供基本样式。除了像textarea和button这样的“替换”元素外,所有HTML元素看起来都是一样的,直到每个浏览器的默认UA样式表被应用。"initial"和"unset"将从浏览器中抹去大部分内容。 “revert”至少保留了用户浏览器应用的基本样式集,并因此优于“initial”和“unset”。您可以在下面的链接中查看所有随浏览器一起提供的各种默认样式表。
默认浏览器样式表列表:
https://meiert.com/en/blog/user-agent-style-sheets/
现在有一个更好的解决方案:
这里有两个概念被混淆了:
第一个想法是“返回”样式到浏览器的UA样式表值设置(安装时随浏览器一起提供的样式表,定义每个元素的外观)。每个浏览器都定义自己的样式,以指定元素应如何默认显示。这个想法是将所有页面样式返回到每个浏览器的本地元素样式。
第二个想法是“重置”所有默认浏览器样式为所有浏览器共享的常见外观和感觉。人们构建特殊的“重置”样式表,试图将所有浏览器元素对齐到普遍认可的样式上。这与浏览器的默认UA样式无关,更多的是“清理”并使所有浏览器对齐到一个基本样式上。这只是一种添加过程。
这些是人们在这里困惑的两个非常不同的概念。因为每个浏览器通常具有默认的开箱即用的元素和布局样式,看起来略有不同,所以人们想出了“重置”或“重新启动”样式表的想法,在应用自定义CSS之前对齐所有浏览器。Bootstrap现在就是这样做的。但这与人们想要返回浏览器的默认外观和感觉无关。
问题不在于构建这些自定义的“重置”样式表,而在于找出每个浏览器和每个元素在应用任何样式之前的默认CSS是什么。大多数人发现,除非“清除”已经应用的所有样式,否则无法重建现有的干净级联。但是如何返回默认的浏览器样式呢?
对于一些人来说,这意味着不仅要将元素返回到浏览器附带的UA样式表中,还要将其重置为“initial”属性值,这与浏览器的默认样式没有任何关系,而实际上是属性的默认值。这是危险的,因为在“display”推回块级元素到“inline”并破坏表格布局和其他事物的情况下。
因此,我不同意在此处使用“initial”来重置任何内容或自定义重置类,将每个属性更改回某个任意的基本值集。
对我来说,一个更好的解决方案始终是尝试将所有核心元素样式返回到浏览器的UA样式表值,这正是我们所有最终用户正在使用的方式。如果您正在创建一个新网站,您不必这样做。您可以从浏览器的默认样式开始,并在其上进行样式设置。只有在添加第三方CSS产品或发现自己有复杂的CSS级联时,您才需要尝试返回到浏览器默认样式表值。
出于这个原因,我支持创建自己的“重置”表以首先将所有元素重置为一种共同的样式,这是所有旧浏览器和新浏览器共享的。然后,您就有了一个坚实的框架,更容易恢复而无需返回到浏览器默认设置。您只是在重置一组常见的元素样式值的基础上构建。一旦构建了自己的“重置”表,即添加而不是更改浏览器UA样式的表,您就可以轻松修改网站。
那么唯一剩下的问题就是当您有一个没有这样的重置表的网站,或者具有复杂的第三方CSS并且需要尝试返回到浏览器UA样式时,该怎么办?
我意识到Internet Explorer已经迫使我们手动重置每个属性以返回到任何类型的重置。但是,将这些属性值全部推回“initial”会完全破坏浏览器UA样式表值!坏主意!更好的方法是仅对使用通配符的每个元素在非IE浏览器上使用“all:revert”,并仅对影响页面中所有继承子的少数继承根级属性中的“html”和“body”元素使用“inherit”。 (请参见下文)。我不赞成使用“initial”或返回我们假定所有浏览器或IE都将使用的某种想象标准来进行这些大规模的属性重置。首先,“initial”在IE中的支持很差,并且不会将值重置为元素默认值,而仅重置为属性默认值。但是,如果您要创建一个重置表以将所有元素对齐到共同样式,则它也是无意义的。在这种情况下,清除样式并重新开始是无意义的。
这里是一个简单的解决方案,对于大多数情况下从根本上筛选出来的基于文本的值,可以重置它们并使用"all:revert"强制所有非IE浏览器将非继承值完全返回到浏览器的UA样式表中,从而实现真正的重启。这不会干扰覆盖在元素样式上的更高级别的类和样式,这总是目标。这就是为什么我不支持这些自定义重置类,这很繁琐,也没有必要,而且也无法将元素返回到其浏览器UA样式。请注意下面略微更有选择性的选择器,例如,它们会覆盖Bootstrap的“重新引导”样式值,将它们返回到浏览器默认样式。当然,这些不会重置IE上元素的样式,但对于非IE浏览器和大多数可继承文本样式,它将使大多数代理程序中的元素返回到浏览器附带的UA样式表中。
:root, html {
display: block;
font-family: inherit;
font-size: inherit;
font-weight: inherit;
line-height: inherit;
-webkit-text-size-adjust: inherit;
-webkit-tap-highlight-color: inherit;
all: revert;
}
html body {
display: block;
font-family: inherit;
font-size: inherit;
font-weight: inherit;
line-height: inherit;
margin: inherit;
padding: inherit;
color: inherit;
text-align: inherit;
background-color: inherit;
background: inherit;
all: revert;
}
html body * {
all: revert;
}
您还可以使用我的免费通用CSS框架,它在重置样式表中实现了 revert。
all
的属性正在被提议,用于将给定元素的所有CSS属性重置为某些CSS全局值 - 您想使用的值是unset
,它将属性重置为其默认继承的值,否则为其初始值。没有关于实现的消息,但知道有人已经考虑过这个问题很不错。 - BoltClock