向壁虚造

WEBサイト作成のためのプログラミング備忘録

CSSのafterが効かない時に試してほしい4つのこと

CSSでbefore・afterが効かない時に試してほしい4項目

後からコンテンツを付加できるCSSの疑似要素beforeafterは、細かい装飾やコーディングの効率化に役立ちます。

しかし、そのトリッキーな機能ゆえか、頭で思い描いていた通りに画面上に反映されない…なんてトラブルが多々あります。

そこで今回は、beforeafterが効かない時の原因と対処方法を4項目にまとめてみました。

1.contentプロパティは必ず指定しよう

おそらくbeforeafterでつまづく最も多い原因の一つがcontentプロパティを指定していないことです。

実はbeforeafterをきちんと機能させるためには、contentプロパティは必須なのです。

① そもそもcontentって何?

beforeafterはターゲットの前後にコンテンツを挿入するための疑似要素ですが、contentはそのコンテンツに当たります。

例えば以下のようにcontentプロパティには、任意のテキストや画像を放り込むことが可能です。

beforeで要素内の文頭に「『」が、afterで要素内の文末に「』」が付加されます。

before_after_content

② テキストが無くてもcontentは必ず設定しておく

contentプロパティを用いることで要素内の前後にテキストや画像を挿入できますが、テキスト・画像以外のコンテンツを付加することも可能です。

例えば以下のように、空のボックスを要素の前後に追加したい場合にはどうしたら良いでしょう?

before_after_content_box

次のようにwidthheightでサイズを指定すれば、空のボックスを文頭に持ってくることができそうな気がしますよね。

しかし、上記のコードようにcontentプロパティがないbeforeafterは機能してくれません。

実は追加ボックス内のテキストの有無に関わらず、必ずcontentプロパティは指定しておく必要があるようです。

テキストを挿入しない場合は、上記のようにcontentプロパティの値を「""」に指定しておけばOKです。

2.contentが空の場合はdisplayとサイズ指定を忘れずに

contentを空のまま指定した場合に見落としがちなポイントが2点あります。

  • displayの変更
  • サイズの指定

before・afterで挿入されるコンテンツは標準仕様でインライン要素として認識されることに注意です。

そのため、displayblockないしinline-blockに変更しないと、幅と高さを伴うボックスを表示できません。

また、widthheightなどでサイズ指定も忘れないようにしましょう。

3.位置調整する時はpositionに注意

ボックスの見出しやサブタイトルを挿入するためにbeforeafterpositionプロパティを組み合わせるテクニックがあります。

css_after_position

見落としがちなミスとして、親要素のpositionを変更していないことが多いです。

子要素(疑似要素)のpositionabsoluteで調整する場合は、必ず親要素のpositionstatic以外に指定しておく必要があります。

こちらは疑似要素うんぬんではなく、positionの基本的な使い方ですね。

4.before・afterが効かない要素もある

before・afterによってターゲットの前後に画像を挿入することもできます。

例えば以下のような感じにです。

では今度は反対に、img要素をターゲットとし疑似要素を適用させてみましょう。

先ほどと同様に、空のボックスを画像の後ろに配置するよう試みます。

しかし、結果は以下のように、画像の後ろにボックスは挿入されませんでした。

css_after_img

① img・input・textareaにはbefore・afterが効かない

実は画像を挿入する要素imgは、そもそもbeforeafterを適用しても機能しません。

また、img以外にもHTMLにはbeforeafterが効かない要素が存在します。

主に以下の3点は要チェックです。

  • img
  • input
  • textarea

イメージとしては親要素になりえない要素といった感じでしょうか。

beforeafterはあくまで子要素としてターゲット内の前後にコンテンツを配置するため、imgtextareaなど子要素を持ち得ない要素には機能しないのだと思います。

では、これらの要素の前後にCSSでコンテンツを挿入する方法は無いのでしょうか?

② どうしてもbefore・afterを使いたい時はdivで囲んでしまおう

before・afterが効かない要素でも、ひと工夫することで前後にコンテンツを配置させることが可能です。

例えば、以下のようにターゲットとなる要素をdiv等の他の要素で囲んでしまえば、問題は解消します。

そして、親要素のほうに疑似要素を適用させます。

これで無事、画像の横にボックスを表示させることに成功しました。

css_after_img_parent

まとめ

今回は、beforeafterが効かない時の原因と対処方法を解説しました。

非常に便利である半面、疑似要素のトリッキーな操作が難しかったりしますよね。

では、最後に要点をまとめておきましょう。

  • contentプロパティが無いとbeforeafterは機能しない
  • contentの値が空("")の場合は、displayやサイズの設定に注意
  • 疑似要素をpositionで位置調整する場合は、親のpositionstaticになってないか確認しよう
  • そもそもbeforeafterが効かない要素もあるため、divで囲むなどして代替策を取ろう