CSS表示プロパティをデフォルト値にリセット


172

displayプロパティをデフォルト値でオーバーライドすることは可能ですか?たとえば、あるスタイルでそれをnoneに設定し、デフォルトで別のスタイルをオーバーライドしたい場合などです。

または、その要素のデフォルトが何であるかを調べて、それに設定する唯一の方法は何ですか?要素が通常ブロックか、インラインか、どちらかであるかどうかを知る必要はありません...


5
を使用できるようになりましたunset


1
この質問はディスプレイをブラウザーのデフォルトにリセットすることについてのみ尋ねるのは知っていますが、このページにアクセスしてすべての属性をブラウザーのデフォルトにリセットしようとする多くの人は、.myclass {all:unset; } div {all:unset; }など
user1254723

回答:


155

ブラウザのデフォルトスタイルは、そのユーザーエージェントスタイルシートで定義されています。ソースはここにあります。残念ながら、Cascading and Inheritanceレベル3仕様は、スタイルプロパティをブラウザのデフォルトにリセットする方法を提案していないようです。ただし、Cascading and Inheritanceレベル4でこのためのキーワードを再導入する計画があります。ワーキンググループはまだこのキーワードの名前を決めていません(リンクには現在とありますがrevert、最終的なものではありません)。ブラウザのサポートに関する情報revertは、caniuse.comにあります。

レベル3の仕様ではinitialキーワードが導入されていますが、プロパティを初期値に設定すると、ブラウザはなくCSS定義されているデフォルト値にプロパティがリセットされます。の初期値はです。これはここで指定されます。キーワードは、その値ではなく、ブラウザのデフォルトを指します。仕様自体は、プロパティの下でこのメモを作成しますdisplayinlineinitialall

たとえば、作成者がall: initial要素で指定した場合、カスケードの作成者、ユーザー、またはユーザーエージェントレベルにルールが表示されないかのように、すべての継承がブロックされ、すべてのプロパティがリセットされます。

これは、外部ページのスタイルを継承したくない、ページに含まれる「ウィジェット」のルート要素に役立ちます。ただし、その要素に適用された「デフォルト」スタイル(たとえばdisplay: block、のようなブロック要素のUAスタイルシートなど<div>)も吹き飛ばされることに注意してください。

したがって、純粋なCSSを使用している現在の唯一の方法は、ブラウザのデフォルト値を調べて手動で設定することだと思います。

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

(上記の代替案div.foo:not(.bar) { display: inline-block; }はですが、オーバーライドではなく元のセレクターを変更する必要があります。)


5
ああ、なぜブラウザは常に良い便利なものにアクセスするのにとても遅くなければならないのですか:pそして、なぜユーザーはとても遅くアップグレードしなければならないのです...とにかく、それがまさに私が欲しかったものです!
Svish

1
@Svish:私がinitial実際に何をしているのかを誤解していることがわかりました。回答を更新しました。
BoltClock

14
@Svish:CSSは最初に考えた要素ごとではなく、プロパティレベルで初期値を定義します。この例では、初期値がdisplay常にあるinlinew3.org/TR/CSS21/visuren.html#display-prop)にかかわらず、それは上のかどうかのdivspandiv要素がありdisplay: block、デフォルトでHTMLによると、およびないCSSは、それは言うために、ブラウザのUAスタイルシートまでですdiv { display: block; }
BoltClock

1
「CSSは、当初考えていたように、要素ごとではなくプロパティレベルで初期値を定義します。」-実際にそれを信じるには、何度か読み直さなければなりませんでした。(CSSは常に(ある種の)要素のコンテキストで適用されるように見えるため、ここでサポートしないことは、重要なことを学ぶことを示唆しています-理論的根拠を知っている人はいますか?)
Sz。

1
defaultに名前が変更されましたrevert
オリオール

29

JavaScriptの使用が許可されている場合は、displayプロパティを空の文字列に設定できます。これにより、その特定の要素のデフォルトが使用されます。

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

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

ここにjsbinへのリンクがあります

あなたは(に戻すために、ディスプレイの異なる種類を心配する必要はありませんので、これはいいですblockinlineinline-blocktable-cell、など)。

ただし、JavaScriptが必要なため、CSSのみのソリューションを探している場合、これはあなたにとってソリューションではありません。

注:これはインラインスタイルをオーバーライドしますが、CSSで設定されたスタイルはオーバーライドしません


11
これstyleは、最初にJavaScriptまたはインライン属性を使用してスタイルが設定されている場合にのみ機能することに注意してください。このメソッドを使用して、スタイルシートの宣言をオーバーライドまたは削除することはできません。
BoltClock

1
@BoltClock同意しない。これは私があなたの言っていることを反証していると思うjsfiddleです。jsfiddle.net/g45qagt3
thetallweeks

8
申し訳ありませんが、オーバーライドという言葉の使い方は混乱を招きました。つまり、スタイルを空の文字列に設定すると、style属性またはJavaScriptセッターを介して適用されたスタイルのみが削除されます。JSを介して特定の値を設定した場合でも、スタイルシート宣言をオーバーライドできますが、それを空に設定することは、まったく設定しないことと同じです。スタイルシート宣言はそのまま残ります。修正されたフィドルを参照してください:jsfiddle.net/BoltClock/g45qagt3/1
BoltClock

1
空の文字列は "display"だけでなく、どのプロパティでも機能することは注目に値します
Artur Beljajev

11

設定解除display

FirefoxとChromeのunset両方で機能する値を使用できます。

display: unset;

.foo     { display: none;  }
.foo.bar { display: unset; }

5
unsetと同じ問題がありinitialます。の値はdisplayになりinlineます。codepen.io/Gidgidonihah/pen/mwWxEqを
Gidgidonihah

OPは明らかに要素ごとのデフォルトにリセットしたいです。例えば、スパンをインラインに、divをブロックにリセットします。unsetプロパティごとに表示されるため、これは役に立ちませんinline。表示は常ににリセットされます。回答の更新を検討してください。
krulik

6

いいえ、それは一般的に不可能です。CSS(またはHTML)コードが要素のプロパティの値を設定すると、それを元に戻してブラウザにデフォルト値を使用するように指示する方法はありません。

もちろん、プロパティをデフォルト値として期待する値に設定することは可能です。HTML5 CRの[ レンダリング]セクションを確認すると、これはかなり広く機能する可能性があり、主にブラウザーが実際に行っていることを反映しています。

それでも、答えは「いいえ」です。ブラウザには、デフォルト値が何であってもよいからです。デフォルトにリセットしたい理由を分析する必要があります。オリジナルの問題はまだ解決可能かもしれません。


5

場合は、あなたがアクセスしていJavaScriptを、あなたは要素を作成し、その計算されたスタイルを読み取ることができます。

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'

1
少なくともChromeでは、計算されたスタイルを取得するために、生成された要素を<body>タグに実際に追加する必要があるようです。
dimplex 2017年

4

BoltClockとJohnの回答については、IE11を使用するときに、個人的に最初のキーワードに問題がありました。Chromeでは問題なく動作しますが、IEでは効果がないようです。

:この回答によると、IEは最初のキーワードはサポートしていない 事業部の表示:初期はIE10とクロム29で意図したとおりに動作していないが

ここで提案されているように、代わりに空白に設定してみました: 表示後に通常に戻す方法:テーブル行のなし

これは機能し、私のシナリオには十分でした。もちろん、実際の初期値を設定するには、上記の答えが私が見つけた唯一の良い答えです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.