Quantcast
Channel: CSSタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9004

【CSS】コロン2つ::とコロン1つ:の違い。(擬似要素と擬似クラスの違いとそれぞれの使い方)

$
0
0

CSSでコロン2つ(::beforeなど)やコロン1つ(:hoverなど)がついたプロパティの違いについて。


  1. コロン2つ::とコロン1つ:の違い
  2. 擬似要素と擬似クラスの違い
  3. 擬似要素
    1. 擬似要素の一覧
    2. ::before
      1. 前方にテキストを追加する
      2. 前方に画像を追加する
      3. 前方に追加する画像のサイズを変更する
      4. 下線を表示する
      5. 上線を表示する
      6. 左に線を表示する
      7. 注意点
    3. ::after
    4. ::first-letter
    5. ::first-line
  4. 擬似クラス
    1. 擬似クラスの一覧
    2. :hover
    3. :active
    4. :link, :visited
    5. :focus
    6. タグ名:nth-child(n)
    7. :nth-of-type(n)
    8. :target


コロン2つ::とコロン1つ:の違い

  • コロン2つ(::)は擬似要素
  • コロン1つ(:)は擬似クラス


▼例外

コロン2つがつくべき擬似要素でも、コロン1つが使われている場合がある。(例 ::before ⇄ :before)

擬似要素にコロン2つが公式に使われるようになったのはCSS3(2011年以降から)。なので、昔の名残で擬似要素にコロン1つが使われている場合もある。


擬似要素と擬似クラスの違い

  • 要素は適用対象の一部に変化を加えるもの。
  • 擬似クラスは適用対象全体に変化を加えるもの。

▼名前の考え方
どちらも本来のcssではなく、後から処理を追加したり、JSで適用する処理をcssで実現したりする処理なので、擬似がつく。

cssなので適用対象はタグになる。あるタグ全体にcssを適用するときclass属性を使うため、擬似クラスと呼ぶ。

一方で、タグの中の一部の要素にのみ変化を加えるため擬似要素という。

例えば、テキストの文字全体にcssを追加する場合は擬似クラス(:)を使い、テキストの一文字目だけにcssを追加する場合は擬似要素(::)を使う。


擬似要素

擬似要素の一覧

image.png

・(参考)MDN 擬似要素

種類は多く見えるが、::grammer-error::markerなどchromeでサポートしていない仕様もある。


主な擬似要素の実例

1. ::before

指定した要素の前方に新たな要素を追加する(装飾する)。

対象要素::before{ 処理 }
 ┗ contentプロパティで要素を追加できる。
 ┗ 指定がない場合インラインで適用する

・contentプロパティとは?
擬似要素::before::afterでのみ使えるプロパティ。指定した値を追加できる。

実例

1-1. 前方にテキストを追加する

.css
.u-prefix-hello::before{content:"こんにちは";color:red;font-weight:bold;}

追加するテキストのCSSも定義できる。

.html
<divclass="u-prefix-hello">元のテキスト</div>

クラス(or id)属性に::beforeをつける必要はない。
cssの中に、対象のセレクタに対し::beforeが記述してあれば自動的に反映される。

▼ブラウザの表示とソースコード

image.png
image.png

ソースコードの要素を追加した箇所に::beforeと表示される。(※指定したテキストは表示されていない)


1-2. 前方に画像を追加する

contentプロパティの値にurlメソッドでパスを指定する。

.css
.u-prefix-hello::before{content:url(/images/small-cat.jpg);display:inline-block;vertical-align:middle;}
image.png


1-3. 前方に追加する画像のサイズを変更する

画像自体のサイズを変更することはできない。
このため、画像を表示する枠を用意し、その中に背景として画像を読み込む。

.css
.u-prefix-hello::before{content:"";display:inline-block;width:100px;height:100px;background-image:url(/images/small-cat.jpg);background-size:contain;vertical-align:middle;}

content:はあえて""と記述する。

image.png

background-size: contain;
縦横比は保持して、枠に収まる最大サイズになるように背景画像を拡大縮小する。

他にも、autoの場合は自動で画像を繰り返す。coverの場合は枠に収まる最少サイズになるよう拡大縮小する。


1-4. 下線を表示する

::beforeを使うと、テキストに好きな長さの下線を引くことができる。

image.png
.css
.u-prefix-text{position:relative;}.u-prefix-text::before{content:'';position:absolute;display:inline-block;background:gold;width:70px;height:4px;bottom:0;}

画面ではなく親要素に対して下線を引くため、親要素をposition: relative;にする。

親要素の一番下に線を引きたいため、::beforeposition: absolute;bottom: 0;を指定。あとは色や長さ高さを指定すればOK。


1-5. 上線を表示する

下線でbottom: 0としたところを、top: 0とすればOK。

.css
.u-prefix-text{position:relative;}.u-prefix-text::before{content:'';position:absolute;display:inline-block;background:gold;width:70px;height:4px;top:0;}
image.png


1-6. 左に線を表示する

image.png

考え方は下線(上線)と同じ。
::beforeで追加した要素のheightを文字サイズと同じにする。線の幅はwidthで指定。

このままだと文字と重なってしまうので、lefttopで線を設置する位置を微調整すればOK。

.css
.u-prefix-text{position:relative;}.u-prefix-text::before{content:'';position:absolute;display:inline-block;background:gold;width:3px;height:20px;top:2px;


注意点

(1) htmlに::beforeの記述は不要

NG
<div class="u-prefix-hello::before">元のテキスト</div>

::beforeも記述するとcssに何も適用されなくなる。

▼ブラウザの表示
image.png
image.png


(2) ::beforeで追加した要素はコピーできない

image.png

ブラウザにはテキストではなく::beforeと表示されている。
値はcssで渡されているため。

image.png


(3) 対象要素のcssは::beforeにも引き継がれる

::beforeをつける前の要素に適用してあるcssは::beforeで追加した要素にも適用される。ただし、同じプロパティを指定した場合は上書きとなる。

.css
.u-prefix-hello{font-weight:bold;font-size:24px;color:blue;}.u-prefix-hello::before{content:'こんにちは';color:red;}
image.png

font-weightやfont-sizeは元の要素の数値が適用される。
一方、colorは::beforeで指定した色で上書きされる。(元の要素はそのまま)



これらの注意点は::afterも同じ。


(補足)yahooニュースの例

image.png

yahooニュースの見出しに、::before::afterが使われている。

▼クラスjeCptP::before::after

image.png


2. ::after

適用の仕方や注意点は::beforeと同じ。
指定した要素の後方を修飾する。

.css
.u-suffix-hello{font-weight:bold;}.u-suffix-hello::after{content:"こんにちは";color:red;}
image.png


3. ::first-letter

指定した要素の一文字めのcssを調整する。

image.png
.css
.u-first-emphasis::first-letter{font-size:20px;font-weight:bold;color:red;}
.html
<divclass="u-first-emphasis">元のテキスト</div>



▼spanタグを使った場合
spanタグで同じ処理ができるが、::first-letterの方が記述および使い回しが簡単。

.html
<div><spanclass="u-emphasis"></span>のテキスト</div>
.css
.u-emphasis{font-size:20px;font-weight:bold;color:red;}


4. ::first-line

<br>で改行された文章の1行目のcssを変更する。

image.png
.css
.u-line-emphasis::first-line{color:blue;font-size:18px;font-weight:bold;}
.html
<divclass="u-line-emphasis">
Lorem ipsum dolor sit amet,<br>
consectetur adipisicing elit,<br>
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>


擬似クラス

擬似クラスの一覧

image.png

・(参考)MDN 擬似クラス


主な擬似クラス

既存の要素にcssを追加する擬似クラス。

aタグのテキストを訪問状態によって色を変えたりする:linkvisitedやホバーしたときにcssを適用する:hoverなどがある。

1. :hover

hover処理がcssのみで簡単に適用できる。

hover.gif
.css
.u-hover-yellow:hover{color:rgb(219,219,9);font-size:32px;font-weight:bold;}
.html
<divclass="u-hover-yellow">元のテキスト</div>


2. :active

:activeを使うと、クリック中のcssを指定することができる。

active.gif
.css
.u-active-red:active{color:red;font-size:32px;font-weight:bold;}
.html
<divclass="u-active-red">元のテキスト</div><aclass="u-active-red">aタグのリンク</div>


3. :link, :visited

:link
aタグのクリック前のcssを指定する。

:visited
aタグのクリック後のcssを指定する。

visited.gif
.css
.u-link-green:link{color:green;}.u-visited-gold:visited{color:gold;}
.html
<aclass="u-link-green u-visited-gold"href="/">aタグのリンク</div>


4. :focus

focusを持つ要素に対して、focus時のcssを指定できる。

focus.gif
.css
.u-focus-red:focus{background-color:lightyellow;color:red;font-weight:bold;}
.html
名前:<inputclass="u-focus-red"type="text"value="テスト 太郎"><br><br>メッセージ:<textareaclass="u-focus-red">

▼focusを持つ要素
a, area, button, details, input, iframe, select, textarea


5. タグ名:nth-child(n)

指定したタグn番目の要素にcssを適用する。

  • セレクタはタグ名であること(.や#は不可)
  • 引数は、2nやodd, evenでの指定もできる。
  • 他のタグの兄弟要素もカウントする
image.png
.css
ulli:nth-child(odd){color:red;font-size:18;}

引数でoddを渡したので、1, 3番目のliタグが赤くなる。

.html
<ul><li>liタグ1</li><li>liタグ2</li><li>liタグ3</li><li>liタグ4</li></ul>



▼注意点

  • 兄弟要素に他の要素があるとそれもカウントする
  • cssが適用されるのは指定した番号の指定したタグのみ

例えば、上記例でulタグの中の一番上にspanタグを挿入すると、カウント1はspanタグになる。

image.png
.css
ulli:nth-child(odd){color:red;font-size:18;}
.html
<ul><span>spanタグ</span><li>liタグ1</li><li>liタグ2</li><li>liタグ3</li><li>liタグ4</li></ul>

1番目はspanタグ。よって、3番目のliタグ(liタグ3)と、5番目のliタグ(liタグ4)にcssが適用される。


6. :nth-of-type(n)

異なる兄弟要素のタグはカウントしない場合は:nth-of-typeを使う。

.css
ulli:nth-of-type(odd){color:red;font-size:18;}
.html
<ul><span>spanタグ</span><li>liタグ1</li><li>liタグ2</li><li>liタグ3</li><li>liタグ4</li></ul>
image.png

spanタグはカウントせず、liタグのみカウントしてcssを適用している。


7. :target

:targetクラスを使うとaタグの内部リンクへのジャンプに合わせてリンク先の要素にcssを適用することができる。

target.gif
.css
.hide{display:none;}.hide:target{display:block;color:white;background:lightgray;height:60px;width:70%;}
.html
<ul><li><ahref="#message">:targetクラスを適用</a></li><li><ahref="#">他の要素にジャンプ(:targetが外れる)</a></li></ul><divid="message"class="hide">デフォルトdisplay="none"で非表示のメッセージです。
</div>

:targetはページ内のリンク(<a href="#~">)で発火し、リンク先の要素にcssを適用する。

ページトップのリンク(<a href="#">)には要素が存在しないため、:targetのcssが外れる。


Viewing all articles
Browse latest Browse all 9004

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>