CSS:特定の要素にコンテンツを追加しない後


100

CSS :afterプロパティの動作を理解できません。仕様によると(ここここ):

名前が示すように、:beforeおよび:after擬似要素は、要素のドキュメントツリーコンテンツの前後のコンテンツの場所を指定します。

これは、:after(または:before)プロパティを持つことができる要素に制限を課すようには見えません。ただし、特定の要素でのみ機能するようです... <p>機能<img>しますか、<input>機能しません、<table>機能しません。もっとテストすることはできますが、要点はわかります。これはブラウザ間でかなり一貫しているように見えることに注意してください。オブジェクトが:beforeand :afterプロパティを受け入れることができるかどうかを決定するものは何ですか?

回答:


156

imginputはどちらも置き換えられた要素です。

置換された要素は、その外観と寸法が外部リソースによって定義されている要素です。例としては、画像(含む<img>タグ)、プラグイン(<object>タグ)、及びフォーム要素(<button><textarea><input>、および<select>タグ)。他のすべての要素タイプは、非置換要素と呼ぶことができます。

:beforeおよび:after非置換要素を有する唯一の作品。

スペックから:

注意。この仕様は、置換された要素(HTMLのIMGなど):beforeとの相互作用を完全には定義していません :after。これは、将来の仕様でより詳細に定義されます。

を使用するspan:before, span:afterと、DOMは次のようになります。

<span><before></before>Content of span<after></after></span>

明らかに、これはで動作しません<img src="" />


2
「生成されたコンテンツはドキュメントツリーを変更しません。」ですから<before></before>、ソースで" "のようなものを見つけることができたら、私は驚きます。
Knu

4
@Knu:その通りです、私はそれを不十分に説明しました。あなたは決して見つけることはありません<before></before>。「ふりをするDOM」か何かを言うべきだった。ポイントは、:beforeそれ:afterが要素の外側ではなく、要素の内側にあることを示すことでした。
thirtydot 2011

いいえ、シャドウDOMには保存されません。
ツール

3
引用された仕様はそれを言っていない:before:after置換要素のための作業をしないでください。それは、それがどのように「完全に定義する」のではなく、これが将来定義されることになると言っているだけです(これは今のところ起こっていません)。DOMで何が起こるかはここでは関係ありません。ブラウザはこれらの疑似要素をサポートしていない要素もありますが、これは仕様に含まれておらず、実装が行うことだけです。
Jukka K.Korpela、2014年

以前は実際のコンテンツ::before::after持たないvoid(空の)要素に対しては論理的説明を考慮していませんでした。しかし、驚くべきことに、それらhrはほとんどすべてのブラウザーの要素で機能します。
Ilya Streltsyn 2014

9

:beforeそして、:afterされていない必要な置換要素のために仕事に、そしてCSSの仕様は、彼らが彼らのために働くだろうか指定していない、と置き換え要素の概念はやや曖昧です。

CSS 2.1仕様で、それら置換された要素に対して機能することを明確に示唆しており、その方法は「完全に定義」されていないだけです。これは、置き換えられた要素には、CSSによって制御されない独自の視覚的レンダリングがあると予想されるが、疑似要素は要素のコンテンツに何かを追加する必要があるという問題に関連しています。仕様では、これは将来の仕様で「より詳細に」定義されると追加されていますが、これは今のところ行われていません。

ブラウザベンダーは、一部の要素に対してこれらの疑似要素をまったく実装しないことで問題を回避することを決定しました。

「置き換えられた要素」が何を意味するのかはまったく明確ではなく、意味が多少変更されたようです。多くの場合、空の要素(EMPTYコンテンツが宣言されていない要素、つまりコンテンツを持つことができない要素)と同じ意味として解釈されますが、CSS 2.1自体にセレクター付きのサンプルスタイルシートbr:beforeが表示されます(ブラウザーはこれを無視し、br独自のスタイルシートを実装しています)仕方)。少なくとも部分的には、ますます多くの要素がCSSレンダリングのスコープに移動したと主張できます。たとえば、input要素(そのフォント、色などを含む)は、最新のブラウザーのCSSで主に制御できます。

現在のブラウザ(Firefox、IE、Chrome)は、以外の空の要素の:afterおよび:before疑似要素をサポートしていないようですhr。の場合hr、IEとChromeは生成されたコンテンツを境界ボックス内に配置します。これはの実装ですhr。内容によってボックスの高さが高くなります。Firefoxは、両方の(!)擬似要素のコンテンツを、その実装である水平方向のルールの後に配置しhrます。このバリエーションは、CSS 2.1で言及されている「相互作用」の問題の種類を示しています。

これらの疑似要素は、HTML定義でコンテンツが許可されていないため、空の要素には使用できないとよく言われます。これはカテゴリエラーです。マークアップ言語の構文規則は、CSSで実行できることを制限しません。

結論として、 :after:before現在は空の要素には使用できません(ただし、のわずかな例外を除くhr)。これは主に実装が原因であり、将来変更される可能性があります。


-1

終了タグのない要素はvoid要素であり、その中にコンテンツを表示できません。

https://www.w3.org/TR/html5/syntax.html#void-elements

すべてのBlink、Webkit、およびQuantumブラウザーでは、チェックボックスでのみ疑似要素を作成できますが、仕様でこの動作を許可していないため、これは議論の余地があります。

ここに例:https : //codepen.io/equinusocio/pen/BOBaEM/

input[type="checkbox"] {
  appearance: none;
  color: #000;
  width: 42px;
  height: 24px;
  border: 1px solid currentColor;
  border-radius: 100px;
  cursor: pointer;
  transition: all 100ms;
  background-size: 30%;
  outline: none;
  position: relative;
  box-sizing: border-box;
  background-color: #eee;
  transition: background-color 200ms;

  &::before {
    content: '';
    position: absolute;
    left: 2px;
    top: 2px;
    bottom: 2px;
    height: 18px;
    width: 18px;
    border-radius: 50%;
    background-color: currentColor;
    will-change: transform;
    transition: transform 200ms cubic-bezier(.01,.65,.23,1);
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
  }

  &:checked {
    background-color: aquamarine;

    &::before {
      transform: translateX(100%);
    }
  }
}

すべてのブラウザで機能するわけではありません...そして、今はできるという仕様はありません... 疑似要素を入力で検討するのは安全でないため、もしあれば、共有してください
Temani Afif

IEを除くすべてのブラウザで動作します。フレックスボックスでさえIE 9ではサポートされていないので、どこが問題なのでしょう。このソリューションは、すべてのBlink、Webkit、およびQuantumブラウザーで機能し、ElectronのようなWebkitのみの環境で作業するユーザーにとって非常に役立ちます。
Mattia Astorino

回答でおっしゃったように、仕様はありません。そのため、ある日機能しなくなる可能性があります。仕様が定義されていなくても動作し、機能するのはそれだけではありませんが、それらに依存して動作するわけではありません。それは時代遅れのタグのようなものですが、それらはまだ機能しますが、いつか機能しなくなるので、使用を停止する必要があります。つまり、これは人々に役立つ可能性があり、私のコメントは、これが公式ではないことを知っておくべきだと人々に警告するのにも役立ちます。
Temani Afif
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.