Setzen Sie die CSS-Anzeigeeigenschaft auf den Standardwert zurück

172

Ist es möglich, die Anzeigeeigenschaft mit ihrem Standardwert zu überschreiben? Zum Beispiel, wenn ich es in einem Stil auf "Keine" gesetzt habe und es mit der Standardeinstellung in einem anderen Stil überschreiben möchte.

Oder ist der einzige Weg, um herauszufinden, was der Standard dieses Elements ist, und es dann darauf einzustellen? Ich möchte nicht wissen müssen, ob das Element normalerweise blockiert, inline oder was auch immer ist ...

Svish
quelle
5
Es ist jetzt möglich mit unset.
Minuten
1
Ich weiß, dass bei dieser Frage nur gefragt wird, ob die Anzeige auf die Standardeinstellungen des Browsers zurückgesetzt werden soll, aber für die vielen Personen, die diese Seite besuchen, um alle Attribute auf die Standardeinstellungen des Browsers zurückzusetzen, verwenden Sie: .myclass {all: unset; } div {all: unset; } etc.
user1254723

Antworten:

155

Die Standardstile eines Browsers werden in seinem User Agent-Stylesheet definiert, dessen Quellen Sie hier finden . Leider scheint die Spezifikation Cascading and Inheritance Level 3 keine Möglichkeit zu bieten, eine Stileigenschaft auf die Standardeinstellung ihres Browsers zurückzusetzen. Es ist jedoch geplant, ein Schlüsselwort dafür in Cascading and Inheritance Level 4 wieder einzuführen - die Arbeitsgruppe hat sich einfach noch nicht auf einen Namen für dieses Schlüsselwort festgelegt (der Link sagt derzeit revert, aber es ist nicht endgültig). Informationen zur Browserunterstützung für revertfinden Sie auf caniuse.com .

Während die Level 3-Spezifikation ein initialSchlüsselwort einführt , setzt das Festlegen einer Eigenschaft auf ihren Anfangswert sie auf ihren Standardwert zurück, wie er durch CSS definiert wurde und nicht wie vom Browser definiert . Der Anfangswert von displayist inline; Dies wird hier angegeben . Das initialSchlüsselwort bezieht sich auf diesen Wert, nicht auf die Standardeinstellung des Browsers. Die Spezifikation selbst macht diesen Hinweis unter der allEigenschaft :

Wenn ein Autor beispielsweise all: initialein Element angibt , blockiert er die gesamte Vererbung und setzt alle Eigenschaften zurück, als ob in den Autoren-, Benutzer- oder Benutzeragentenebenen der Kaskade keine Regeln angezeigt würden.

Dies kann für das Stammelement eines in einer Seite enthaltenen "Widgets" nützlich sein, das die Stile der äußeren Seite nicht erben möchte. Beachten Sie jedoch, dass jeder "Standard" -Stil, der auf dieses Element angewendet wird (z. B. display: blockaus dem UA-Stylesheet für Blockelemente wie <div>), ebenfalls weggeblasen wird.

Ich denke, die einzige Möglichkeit, derzeit reines CSS zu verwenden, besteht darin, den Standardwert des Browsers nachzuschlagen und manuell darauf einzustellen:

div.foo { display: inline-block; }
div.foo.bar { display: block; }

(Eine Alternative zu den oben genannten wäre div.foo:not(.bar) { display: inline-block; }, aber dazu muss der ursprüngliche Selektor geändert und nicht überschrieben werden.)

BoltClock
quelle
5
Ah, warum müssen Browser immer so langsam sein, um in die guten und nützlichen Dinge zu gelangen: p Und warum müssen Benutzer so langsam upgraden ... sowieso, genau das wollte ich!
Svish
1
@Svish: Es stellte sich heraus, dass ich falsch interpretiert habe, was initialtatsächlich tut. Ich habe meine Antwort aktualisiert.
BoltClock
14
@Svish: CSS definiert Anfangswerte auf der Eigenschaftsebene, nicht auf Elementbasis, wie ich ursprünglich dachte. In diesem Beispiel ist der Anfangswert von displayimmer inline( w3.org/TR/CSS21/visuren.html#display-prop ), unabhängig davon, ob er sich auf einem divoder einem befindet span. Ein divElement entspricht display: blockstandardmäßig HTML und nicht CSS. Es liegt also am UA-Stylesheet des Browsers div { display: block; }.
BoltClock
1
"CSS definiert Anfangswerte auf der Eigenschaftsebene, nicht auf Elementbasis, wie ich ursprünglich dachte." - Ich musste es tatsächlich ein paar Mal neu lesen, um es zu glauben. (Da CSS immer in (einer Art) Elementkontext angewendet zu werden scheint, deutet die Nichtunterstützung hier darauf hin, dass es nicht trivial zu lernen ist - kennt jemand die Gründe?)
Sz.
1
defaultwurde umbenannt in revert.
Oriol
29

Wenn die Verwendung von Javascript zulässig ist , können Sie die displayEigenschaft auf eine leere Zeichenfolge setzen. Dadurch wird die Standardeinstellung für dieses bestimmte Element verwendet.

var element = document.querySelector('span.selector');

// Set display to empty string to use default for that element
element.style.display = '';

Hier ist ein Link zu einem jsbin .

Das ist schön , weil Sie (nicht über die verschiedenen Arten von Anzeige zu kümmern zurückzukehren block, inline, inline-block, table-cell, etc.).

Dafür ist jedoch Javascript erforderlich. Wenn Sie also nach einer Nur-CSS-Lösung suchen, ist dies nicht die richtige Lösung für Sie.

Hinweis: Dies überschreibt Inline-Stile, jedoch keine in CSS festgelegten Stile

die ganzen Wochen
quelle
11
Beachten Sie, dass dies nur funktioniert, wenn der Stil zunächst mit JavaScript oder einem Inline- styleAttribut festgelegt wurde. Mit dieser Methode können Sie eine Deklaration nicht überschreiben oder aus einem Stylesheet entfernen.
BoltClock
1
@ BoltClock Ich bin anderer Meinung. Hier ist eine Geige, die meiner Meinung nach widerlegt, was Sie sagen. jsfiddle.net/g45qagt3
ganzen Wochen
8
Entschuldigung, meine Verwendung des Wortes Override war verwirrend. Ich meine, wenn Sie einen Stil auf die leere Zeichenfolge setzen, wird nur ein Stil entfernt, der über das styleAttribut oder den JavaScript-Setter angewendet wurde . Sie können eine Stylesheet-Deklaration weiterhin überschreiben, wenn Sie einen bestimmten Wert über JS festlegen. Wenn Sie ihn jedoch auf leer setzen, wird er überhaupt nicht festgelegt. Die Stylesheet-Deklaration bleibt erhalten. Siehe die modifizierte Geige: jsfiddle.net/BoltClock/g45qagt3/1
BoltClock
1
Es ist erwähnenswert, dass eine leere Zeichenfolge für jede Eigenschaft funktioniert, nicht nur für "Anzeige"
Artur Beljajev
11

Unset display:

Sie können den Wert verwenden, unsetder sowohl in Firefox als auch in Chrome funktioniert .

display: unset;

.foo     { display: none;  }
.foo.bar { display: unset; }
Sheharyar
quelle
5
unsethat die gleichen Probleme wie initial. Der Wert von displaywird inline. Siehe codepen.io/Gidgidonihah/pen/mwWxEq
Gidgidonihah
Das OP möchte eindeutig die Standardeinstellung pro Element zurücksetzen, z. B. die Spanne auf Inline und ein Div auf Block zurücksetzen. unsethilft dabei nicht weiter, da es pro Eigenschaft ist und die Anzeige immer auf zurücksetzt inline. Bitte erwägen Sie, Ihre Antwort zu aktualisieren.
Krulik
6

Nein, das ist generell nicht möglich. Sobald ein CSS- (oder HTML-) Code einen Wert für eine Eigenschaft eines Elements festlegt, kann dieser nicht mehr rückgängig gemacht und der Browser angewiesen werden, seinen Standardwert zu verwenden.

Es ist natürlich möglich, einer Eigenschaft einen Wert zuzuweisen, den Sie haben erwarten , dass er der Standardwert ist. Dies funktioniert möglicherweise recht häufig, wenn Sie den Abschnitt zum Rendern von HTML5 CR überprüfen , der hauptsächlich die tatsächlichen Funktionen der Browser widerspiegelt.

Die Antwort lautet jedoch "Nein", da Browser möglicherweise beliebige Standardwerte haben. Sie sollten analysieren, aus welchem ​​Grund die Standardeinstellungen wiederhergestellt werden sollen. Das ursprüngliche Problem ist möglicherweise noch lösbar.

Jukka K. Korpela
quelle
5

Wenn Sie Zugriff auf JavaScript haben , können Sie ein Element erstellen und dessen berechneten Stil lesen.

function defaultValueOfCssPropertyForElement(cssPropertyName, elementTagName, opt_pseudoElement) {
    var pseudoElement = opt_pseudoElement || null;
    var element = document.createElement(elementTagName);
    document.body.appendChild(element);
    var computedStyle = getComputedStyle(element, pseudoElement)[cssPropertyName];
    element.remove();
    return computedStyle;
}

// Usage:
defaultValueOfCssPropertyForElement('display', 'div'); // Output: 'block'
defaultValueOfCssPropertyForElement('content', 'div', ':after'); // Output: 'none'
Frederik Krautwald
quelle
1
Anscheinend müssen Sie das generierte Element tatsächlich an das <body> -Tag anhängen, um den berechneten Stil zu erhalten, zumindest in Chrome.
Dimplex
4

In Bezug auf die Antwort von BoltClock und John hatte ich persönlich Probleme mit dem ursprünglichen Schlüsselwort bei der Verwendung von IE11. Es funktioniert gut in Chrome, aber im IE scheint es keine Wirkung zu haben.

Entsprechend dieser Antwort unterstützt IE das anfängliche Schlüsselwort nicht: Div display: initial funktioniert nicht wie in ie10 und chrome 29 vorgesehen

Ich habe versucht, es stattdessen leer zu setzen, wie hier vorgeschlagen: So kehren Sie nach der Anzeige zum Normalzustand zurück: Keine für Tabellenzeile

Das hat funktioniert und war gut genug für mein Szenario. Um den tatsächlichen Anfangswert festzulegen, ist die obige Antwort natürlich die einzig gute, die ich finden konnte.

Søren Ullidtz
quelle