Webサイトをコーディングしている際、
「複数のボタンがある中で、一番右の要素だけ右寄せにしたい」
といった場面に遭遇することは非常に多いでしょう。
HTML側にわざわざ「last」というクラスを付けなくても、CSSの擬似クラスを使えば特定の順番の要素を自由自在に指定できます。
しかし、構造によっては「指定したはずなのにスタイルが効かない」というトラブルも起きやすいポイントです。
この記事では、CSSで「最後の要素だけ」を指定する基本の :last-child の使い方から、より柔軟な :last-of-type、実務で役立つ「最後の要素以外」の指定方法、さらには Flexbox を使った右寄せのテクニックまで、実用的なサンプルコード付きで詳しく解説します。
![]() 執筆者:マヒロ |
|
- OS:Windows 11 / macOS Sequoia
- IDE:Visual Studio / VS Code / IntelliJ IDEA
- その他:Chrome DevTools / 各言語最新安定版
※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。
最後の要素だけを指定する基本::last-child 擬似クラス
CSSで要素の集まりのうち、最後の一つだけをターゲットにする最も一般的な方法が :last-child です。
この擬似クラスを使えば、リスト(liタグ)やボックス(divタグ)の末尾に対して、ピンポイントでスタイルを当てることができます。
基本的な使い方のサンプル
例えば、ナビゲーションメニューや記事一覧で、各項目の間に線を引いている場合、一番最後の項目には線が不要なケースがあります。
<ul class="sample-list">
<li>メニュー項目1</li>
<li>メニュー項目2</li>
<li>メニュー項目3</li>
</ul>
<style>
.sample-list li {
padding: 10px;
border-bottom: 1px solid #ccc;
}
/* 一番最後のli要素だけ下線を消す */
.sample-list li:last-child {
border-bottom: none;
color: #e74c3c; /* わかりやすく赤色に */
}
</style>
このソースコードでは、まず .sample-list li に対して共通の下線を設定しています。
その直後に、擬似クラスの :last-child を使って、3つ目のメニュー項目だけ border-bottom: none; を指定し、下線を上書きして消去しました。
こうすることで、HTML側を変更することなく、要素の増減にも自動で対応できるスマートな管理が可能になります。
注意!:last-child が効かない原因と解決策
「コードは間違っていないはずなのに、最後の要素にスタイルが反映されない」というトラブルは、初心者が最もハマりやすいポイントです。
その原因の多くは、「最後の子要素が指定したタグではない」というHTML構造のズレにあります。
:last-child と :last-of-type の決定的な違い
CSSの :last-child は、「その要素自身が、親要素の最後の子要素である場合にのみ」適用されます。
以下のNG例を見てみましょう。
<!-- NG例:スタイルが効かない構造 -->
<div class="parent">
<p>段落1</p>
<p>段落2(ここが最後のpタグ)</p>
<div>補足テキスト(これが本当の最後の子要素)</div>
</div>
<style>
/* これは効きません */
.parent p:last-child {
color: red;
}
/* こちらが正解 */
.parent p:last-of-type {
color: blue;
}
</style>
ソースの構造を詳しく読み解くと、.parent の中の一番最後の子要素は div タグになっています。
そのため、.parent p:last-child というセレクタは、最後の子要素が div であり p ではないため、不一致となりスタイルが無視されてしまいます。
これを解決するのが :last-of-type です。
これはクラス名や属性は関係なく、あくまでタグ名(要素の種類)を基準にして「同じタグの中で最後にあるもの」を探してくれます。
途中に別のタグが混ざっていても確実に目的の要素を捕まえることができるため、用途に合わせて使い分けることが非常に重要です。
実践テクニック:最後の要素だけ「右寄せ」にする方法
実務でよくある要望が、「複数のメニュー項目を並べつつ、一番最後のボタンだけ右端に配置したい」というケースです。
これは、現代のレイアウト手法であるFlexboxと組み合わせるのが最もスマートな解決策です。
margin-left: auto を活用した右寄せ
<div class="button-group">
<button>ホーム</button>
<button>会社概要</button>
<button>お問い合わせ(右寄せ)</button>
</div>
<style>
.button-group {
display: flex;
gap: 10px;
padding: 20px;
background-color: #f5f5f5;
}
/* 最後のボタン要素だけ左マージンを自動にする */
.button-group button:last-child {
margin-left: auto;
background-color: #3498db;
color: #fff;
}
</style>
親要素に display: flex; を設定すると、子要素は横並びになります。
この時、最後の子要素に対して margin-left: auto; を指定すると、ブラウザは「左側の余白を可能な限り最大に取る」という計算を行います。
結果として、最後のボタンだけが右端に押しやられ、きれいな右寄せレイアウトが完成します。
float: right; を使う必要がないため、現代のWeb制作における「鉄板」のテクニックと言えます。
逆転の発想:「最後の要素以外」を指定するテクニック
「最後だけスタイルを変える」のではなく、「最後以外に共通のスタイルを当てたい」という場面も頻繁にあります。
そんな時は、否定擬似クラスの :not() を組み合わせます。
:not(:last-child) の活用
/* 最後の子要素「以外」に右マージンを付ける */
.nav-item:not(:last-child) {
margin-right: 20px;
border-right: 1px solid #ddd;
}
この書き方であれば、「一番最後だけ余分なマージンが付いてレイアウトが崩れる」といった問題を防げます。
以前は li { margin-right: 20px; } と書いた後に li:last-child { margin-right: 0; } と打ち消す必要がありましたが、:not を使えば一行でスッキリと記述でき、コードの可読性が飛躍的に向上します。
ただし、JavaScriptなどで要素を動的に追加・削除する場合は、意図しない要素(コメントや非表示の要素など)が「最後」と判定され、デザインが崩れる可能性があるため注意が必要です。
最初の要素を指定する場合(:first-child)
最後の要素をマスターしたら、セットで覚えておきたいのが最初の要素を指定する :first-child です。
最初の要素だけ特別な装飾をする
/* 最初の要素だけ文字を大きく、太字にする */
.article-list li:first-child {
font-size: 1.25rem;
font-weight: bold;
}
/* 最初の要素「以外」に上線を引く */
.article-list li:not(:first-child) {
border-top: 1px dashed #aaa;
}
「最初の要素だけ」あるいは「最初の要素以外」を指定するロジックも、考え方は最後の場合と全く同じです。
見出しの直後の要素だけ余白を詰めたい場合などに重宝します。
高度な指定:最後から数える nth-last-child()
「最後の一つ」だけでなく、「後ろから二番目」や「最後の三つ」といった指定をしたい場合は、nth-last-child() を使います。
最後から数えた順番でデザインする
/* 後ろから2番目の要素を指定 */
li:nth-last-child(2) {
background-color: #fff9e6;
}
/* 最後の3つの要素すべてを指定 */
li:nth-last-child(-n+3) {
opacity: 0.5;
}
カッコ内の数字や式を変えることで、後ろからの位置を自由自在に指定できます。
特に -n+3 という式は、「-n(0から順に減る数) + 3」つまり「3、2、1」という数値を生成するため、結果として「最後から3つすべて」を指定することができます。
nth-child(前から数える)は有名ですが、この nth-last-child を使いこなせると、複雑なグリッドレイアウトや動的なリスト表示において非常に強力な武器となります。
特殊なケース:最後の文字だけ色を変える
タグ(要素)単位ではなく、文章の「最後の文字」だけを装飾したいという要望を受けることもあります。
CSSには、最初の1文字を指定する ::first-letter はありますが、残念ながら意味的に「最後の1文字」だけを直接指定できる擬似要素は存在しません。
最後の文字を装飾する代替案
どうしても実現したい場合は、最後の一文字だけを <span> タグなどで囲み、そのクラスに対してスタイルを当てるのが現実的な解決策です。
あるいは、JavaScriptを使って文字列の末尾を抽出し、動的にタグを挿入する処理を検討しましょう。
HTML/CSSのスキルを活かして年収を上げる方法
以上、CSSで最後の要素だけスタイルを適用する方法について解説してきました。
| 年収アップにこだわりたい方 (平均アップ額138万円の実績) | テックゴー |
| 未経験・経験者問わず幅広く探したい方 | ユニゾンキャリア |
| 業界に精通した担当者に相談したい方 | キッカケエージェント |
| ゲーム業界への転職を志望する方 | ファミキャリ |
| エンジニア未経験からキャリアを築く方 | イーチキャリア |



