如何重置/删除特定元素或选择器的CSS样式

694

是否有一条CSS规则可以删除样式表中为特定元素设置的任何先前样式?一个很好的使用示例可能是移动优先的RWD网站,在小屏幕视图中用于特定元素的大部分样式在桌面视图中需要“重置”或删除。

一条CSS规则可以实现类似以下效果:

.element {
  all: none;
}

示例用法:

/* mobile first */
.element {
   margin: 0 10;
   transform: translate3d(0, 0, 0);
   z-index: 50;
   display: block;
   etc..
   etc..
}

@media only screen and (min-width: 980px) {
  .element {
    all: none;
  }
}

因此,我们可以快速删除或重置样式,而无需声明每个属性。


做到这一点的方法是首先使用媒体查询进行限制。 - Kevin Lynch
26
有一个名为 all 的属性正在被提议,用于将给定元素的所有CSS属性重置为某些CSS全局值 - 您想使用的值是 unset,它将属性重置为其默认继承的值,否则为其初始值。没有关于实现的消息,但知道有人已经考虑过这个问题很不错。 - BoltClock
以下是一条2015年的推文链接:https://twitter.com/LeaVerou/status/577390241763467264 - Dan Dascalescu
17个回答

800

CSS属性all有一个关键字initial,可以将CSS属性设置为规范中定义的初始值。除了IE和Opera Mini家族外,all关键字在广泛的浏览器中得到支持。点击此处查看详情

/* basic modern patch */

#reset-this-root {
    all: unset;
}
或者
#reset-this-root {
    all: initial;
}

由于IE的支持不足可能会导致问题,以下是一些重置某些CSS属性到初始值的方法:

.reset-this {
    animation : none;
    animation-delay : 0;
    animation-direction : normal;
    animation-duration : 0;
    animation-fill-mode : none;
    animation-iteration-count : 1;
    animation-name : none;
    animation-play-state : running;
    animation-timing-function : ease;
    backface-visibility : visible;
    background : 0;
    background-attachment : scroll;
    background-clip : border-box;
    background-color : transparent;
    background-image : none;
    background-origin : padding-box;
    background-position : 0 0;
    background-position-x : 0;
    background-position-y : 0;
    background-repeat : repeat;
    background-size : auto auto;
    border : 0;
    border-style : none;
    border-width : medium;
    border-color : inherit;
    border-bottom : 0;
    border-bottom-color : inherit;
    border-bottom-left-radius : 0;
    border-bottom-right-radius : 0;
    border-bottom-style : none;
    border-bottom-width : medium;
    border-collapse : separate;
    border-image : none;
    border-left : 0;
    border-left-color : inherit;
    border-left-style : none;
    border-left-width : medium;
    border-radius : 0;
    border-right : 0;
    border-right-color : inherit;
    border-right-style : none;
    border-right-width : medium;
    border-spacing : 0;
    border-top : 0;
    border-top-color : inherit;
    border-top-left-radius : 0;
    border-top-right-radius : 0;
    border-top-style : none;
    border-top-width : medium;
    bottom : auto;
    box-shadow : none;
    box-sizing : content-box;
    caption-side : top;
    clear : none;
    clip : auto;
    color : inherit;
    columns : auto;
    column-count : auto;
    column-fill : balance;
    column-gap : normal;
    column-rule : medium none currentColor;
    column-rule-color : currentColor;
    column-rule-style : none;
    column-rule-width : none;
    column-span : 1;
    column-width : auto;
    content : normal;
    counter-increment : none;
    counter-reset : none;
    cursor : auto;
    direction : ltr;
    display : inline;
    empty-cells : show;
    float : none;
    font : normal;
    font-family : inherit;
    font-size : medium;
    font-style : normal;
    font-variant : normal;
    font-weight : normal;
    height : auto;
    hyphens : none;
    left : auto;
    letter-spacing : normal;
    line-height : normal;
    list-style : none;
    list-style-image : none;
    list-style-position : outside;
    list-style-type : disc;
    margin : 0;
    margin-bottom : 0;
    margin-left : 0;
    margin-right : 0;
    margin-top : 0;
    max-height : none;
    max-width : none;
    min-height : 0;
    min-width : 0;
    opacity : 1;
    orphans : 0;
    outline : 0;
    outline-color : invert;
    outline-style : none;
    outline-width : medium;
    overflow : visible;
    overflow-x : visible;
    overflow-y : visible;
    padding : 0;
    padding-bottom : 0;
    padding-left : 0;
    padding-right : 0;
    padding-top : 0;
    page-break-after : auto;
    page-break-before : auto;
    page-break-inside : auto;
    perspective : none;
    perspective-origin : 50% 50%;
    position : static;
    /* May need to alter quotes for different locales (e.g fr) */
    quotes : '\201C' '\201D' '\2018' '\2019';
    right : auto;
    tab-size : 8;
    table-layout : auto;
    text-align : inherit;
    text-align-last : auto;
    text-decoration : none;
    text-decoration-color : inherit;
    text-decoration-line : none;
    text-decoration-style : solid;
    text-indent : 0;
    text-shadow : none;
    text-transform : none;
    top : auto;
    transform : none;
    transform-style : flat;
    transition : none;
    transition-delay : 0s;
    transition-duration : 0s;
    transition-property : none;
    transition-timing-function : ease;
    unicode-bidi : normal;
    vertical-align : baseline;
    visibility : visible;
    white-space : normal;
    widows : 0;
    width : auto;
    word-spacing : normal;
    z-index : auto;
    /* basic modern patch */
    all: initial;
    all: unset;
}

以上所述,除非只存在一种网络浏览器并且最终浏览器设置了“默认”值,否则我认为 CSS 重置不可行。


8
我认为原则上这是正确的,但各人的情况可能不同。例如,默认情况下某些元素(如文本区域)具有边框,在应用此重置时会将这些文本区域的边框去除,因此这并不是真正的重置。我最终只使用它来重置我关心的特定属性。您还可以将其与“*”选择器组合使用,重置所有元素或重置特定元素内的所有元素。 - user566245
9
如果使用通配符选择器应用这个,将会导致你的浏览器崩溃并且一只小猫咪会死去。这并不是真正的重置样式。真正的重置样式其实是不存在的。 - Milche Patern
你可以使用 all 属性,该属性被 所有现代浏览器 支持。 - Dan Dascalescu
警告:您绝对不想像这样使用“initial”!这将擦除大多数Web浏览器元素的默认UA样式表,这意味着诸如块级元素现在使用“display:inline”等等。大多数Web开发人员不了解,大多数元素在应用默认用户代理样式表(随浏览器提供)之前没有样式。这个样式表是在作者应用自己的样式之前为元素提供基本样式的东西。如果您使用“initial”,则会擦除所有样式,并且无法在您的网页上为查看者获取元素样式。 - Stokely

262

all 属性可以实现这一功能,其工作方式如下:

CSS:


CSS:

#someselector {
  all: initial;
}

#someselector * {
  all: unset
}

SCSS:

#someselector {
  all: initial;
  * {
    all: unset;
  }
}
  • 可以在目前仍然得到支持的所有主要浏览器中运行。如果你还需要维护使用Internet Explorer的网站,那么它将无法工作。
  • 适用于所有仍得到支持的主流浏览器,但不支持Internet Explorer浏览器,如果您必须保留该浏览器,则无法正常工作。

1
我刚刚读到:“在继承属性上,初始值可能会令人惊讶,您应该考虑使用inherit、unset或revert关键字。此外,这是否与特定于浏览器的问题有关?这个初始值是由谁设置的?DDT?” - Milche Patern
all: revert; 在 MDN 文档中对于组件/小部件听起来非常有用,但从 @AsimKT 的评论中并不清楚它应该如何使用。你能详细说明一下吗?https://developer.mozilla.org/en-US/docs/Web/CSS/revert - Micros
如果您想为#someselector添加一些样式(并重置其他设置),该怎么办?我尝试了初始和取消设置,再加上其他东西(颜色或边框),但它不起作用。 - Thomas
要重置所有样式,但保留其中某些样式,可以这样做(例如,假设我们想保持字体大小为18px):#selector { all: initial; font-size: 18px; }。对我非常有效! - aderchox
我建议尝试使用revert而不是unset,否则用户代理对于诸如<table><details>之类的元素的默认设置将全部崩溃。 - James Pearce

82
请使用all: revertall: unset
来自MDN

在许多情况下,revert关键字的工作方式与unset完全相同。唯一的区别是对于由浏览器或用户创建的自定义样式表(在浏览器端设置)设置的属性具有值的属性。

您需要“一个可用的CSS规则,可以删除之前为特定元素在样式表中设置的任何样式。” 因此,如果元素具有类名remove-all-styles
HTML:
<div class="remove-all-styles other-classe another-class"> 
   <!-- content -->
   <p class="text-red other-some-styles"> My text </p>
</div>

使用CSS:
  .remove-all-styles {
    all: revert;
  }

这将重置所有应用于 other-classanother-class 以及所有继承和应用于该 div 的样式。
或者在您的情况下:
/* mobile first */
.element {
   margin: 0 10;
   transform: translate3d(0, 0, 0);
   z-index: 50;
   display: block;
   etc..
   etc..
}

@media only screen and (min-width: 980px) {
  .element {
    all: revert;
  }
}

好的。

如果我们想要将嵌入式小部件/组件与包含它们的页面的样式隔离开来,我们可以编写以下代码:

.isolated-component {
 all: revert;
}

这将还原所有作者样式(即开发者CSS)为用户样式(即网站用户设置的样式 - 不太可能的情况),或者如果没有用户样式,则还原为用户代理样式本身。

29

快速答案是使用"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;
    }
    
    /* This rule attempts to manually reset all elements back to the 
    UA browser style sheet using "revert" and the "wildcard" (*)
    which resets all properties on all HTML elements.
    This would overwrite most of Bootstraps "reboot" styles
    on elements, for example.
    Note: This selector should be ignored by IE. */

    html body * {
        all: revert;
    }

您还可以使用我的免费通用CSS框架,它在重置样式表中实现了 revert。


28
问题

你需要在HTML文档中插入标记,并且它需要以特定的方式显示。此外,你并不拥有这个文档,因此无法更改现有的样式规则。你不知道样式表可能是什么,或者它们可能会变成什么样。

这种情况的应用场景是当你为未知的第三方网站提供可显示组件时。例如:

  1. 广告标签
  2. 构建插入内容的浏览器扩展程序
  3. 任何类型的小部件
最简单的解决方法

把所有东西放到 iframe 中。这也有其自身的限制:

  1. 跨域限制:你的内容将完全无法访问原始文档。你不能覆盖内容,修改DOM等
  2. 显示限制:您的内容被锁在一个矩形内。

如果你的内容可以适应一个框,你可以通过让你的内容编写一个iframe并明确设置内容来绕过问题#1,从而规避该问题,因为iframe和文档将共享相同的域。

CSS解决方案

你所能做的最好的事情就是显式地覆盖所有可能被覆盖的属性,并将它们覆盖为你认为它们的默认值应该是什么。

即使在你覆盖时,也没有办法确保更具针对性的CSS规则不会覆盖你的规则。你在这里能做到的最好的事情就是尽可能地使你的覆盖规则具有特定的目标,并希望父文档不会意外地超越它:在你内容的父元素上使用一个模糊或随机的ID,并在所有属性值定义上使用!important。


3
您可以使用all属性,该属性被所有现代浏览器支持。 - Dan Dascalescu
1
这个普遍问题的正确解决方案是使用Web组件 - GetFree
2
这是一个非常真实的问题,但只有在首次开发CSS时存在。如果您正在创建标记和CSS,并且已经正确完成了它,那么您的样式中不应该出现任何第三方应用程序的影响。如果我负责CSS规范,我不会感到尴尬,而是会感到沮丧,因为人们正在残忍地滥用我所创造的东西。 - ESR
@DanDascalescu all 属性不会恢复为“默认”的浏览器 CSS 样式。它只会恢复为“初始”的 CSS 样式。区别在于一个样式将页面呈现为如果没有 CSS 存在,而另一个样式将使用元素样式(例如,p { color: blue} 不会被重置)。 - Cameron

11

7

如果你正在使用sass构建系统,一种在所有主要浏览器中都有效的方法是将所有样式导入包装在:not()选择器中,如下所示...

:not(.disable-all-styles) {
  @import 'my-sass-file';
  @import 'my-other-sass-file';
}

你可以在一个容器上使用disable类,然后子内容就不会有任何你的样式。

<div class="disable-all-styles">
  <p>Nothing in this div is affected by my sass styles.</p>
</div>

当然,现在您所有的样式都将以:not()选择器为前缀,所以有点丑,但效果很好。

6

我不建议使用标记为正确答案的内容,因为它是一个试图覆盖所有情况的庞大的CSS代码块。

我建议您根据具体情况评估如何从元素中删除样式。

比如说,出于SEO目的,您需要在一个没有实际标题设计的页面上包含H1。您可能希望将该页面的导航链接设置为H1,但当然您不希望该导航链接在页面上显示为巨大的H1。

您应该将该元素包装在h1标签中并进行检查。查看哪些CSS样式特别应用于h1元素。

假设我看到以下样式应用于该元素。

//bootstrap.min.css:1
h1 {
    font-size: 65px;
    font-family: 'rubikbold'!important;
    font-weight: normal;
    font-style: normal;
    text-transform: uppercase;
}

//bootstrap.min.css:1
h1, .h1 {
    font-size: 36px;
}

//bootstrap.min.css:1
h1, .h1, h2, .h2, h3, .h3 {
    margin-top: 20px;
    margin-bottom: 10px;
}

//bootstrap.min.css:1
h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
    font-family: inherit;
    font-weight: 500;
    line-height: 1.1;
    color: inherit;
}

//bootstrap.min.css:1
h1 {
    margin: .67em 0;
    font-size: 2em;
}

//user agent stylesheet
h1 {
    display: block;
    font-size: 2em;
    -webkit-margin-before: 0.67em;
    -webkit-margin-after: 0.67em;
    -webkit-margin-start: 0px;
    -webkit-margin-end: 0px;
    font-weight: bold;
}

现在你需要确定应用于H1的确切样式,并在CSS类中取消设置它们。这看起来像以下内容:
.no-style-h1 {
    font-size: unset !important;
    font-family: unset !important;
    font-weight: unset !important;
    font-style: unset !important;
    text-transform: unset !important;
    margin-top: unset !important;
    margin-bottom: unset !important;
    line-height: unset !important;
    color: unset !important;
    margin: unset !important;
    display: unset !important;
    -webkit-margin-before: unset !important;
    -webkit-margin-after: unset !important;
    -webkit-margin-start: unset !important;
    -webkit-margin-end: unset !important;
}

这样做更加简洁,不会将一个随机的代码块倾泻到你的CSS中,而你并不知道它实际上在做什么。

现在,您可以将此类添加到您的h1标签中。

<h1 class="no-style-h1">
     Title
</h1>

1
在我的具体场景中,我想跳过将常见样式应用于页面的特定部分,更好地说明如下:
<body class='common-styles'>
    <div id='header'>Wants common styles</div>
    <div id='container'>Does NOT want common styles</div>
    <div id='footer'>Wants common styles</div>
</body>

使用 CSS 重置尝试失败后(主要是由于规则优先级和复杂的样式表层次结构),通常会采用 jQuery 来解决问题,这种方法非常快速且有效:
$(function() {
    $('body').removeClass('common-styles');
    $('#header,#footer').addClass('common-styles');
});

(现在告诉我们使用JS来处理CSS是多么邪恶 :-))

1

如果有人正在寻找使用 iframe 的答案,这里提供一份:

<iframe srcdoc="<html><body>your-html-here</body></html>" />

https://caniuse.com/iframe-srcdoc


这个回答如何解决从特定元素中删除CSS样式的问题?这个回答应该被删除。 - TylerH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接