初心者向けweb講座

HTML+CSS応用:position・transform・animation・擬似クラスの使い方

更新日:2026-05-04 著者:unigram 読了目安:9分

この記事の要点

CSSのposition・transform・animation・擬似クラス・擬似要素を体系的に解説。要素の自由な配置から滑らかなアニメーション、:hoverや::beforeを使った装飾まで、モダンなWeb制作に欠かせないテクニックをコード例とともに紹介します。

CSSには、要素を自由な位置に配置する position、形を変える transform、変化を滑らかにする transition、そして自動で動かす animation という強力なプロパティがあります。さらに擬似クラス・擬似要素を活用すれば、HTMLを書き換えることなく豊かな表現が実現できます。

ここでは、これらのCSSテクニックを体系的に整理し、実践的なコード例とともに解説します。


1. position プロパティ:要素を自由に配置する

position プロパティは、要素を「通常の文書の流れ」から切り離して自由な位置に配置するためのテクニックです。FlexboxやGridが「整列」を得意とするのに対し、position は「重ねる」「固定する」「特定の場所を基準に動かす」といった特殊なレイアウトを実現します。

positionプロパティ一覧図
positionプロパティの5種類と特徴

positionの5種類

基準 フローへの影響 主な用途
static HTMLの通常フロー 影響なし(初期値) 通常の配置(top等は無効)
relative 本来の表示位置 元のスペースは残る 子要素のabsoluteの基準点にする
absolute 直近のpositioned親 フローから外れる 画像上のバッジ・ラベル配置など
fixed ビューポート(画面) フローから外れる 固定ヘッダー・フッター・FABボタン
sticky 通常フロー→閾値でfixed 原則フロー内 スクロール追従ナビ・見出し

positionを設定した後は、top / right / bottom / left プロパティで実際の座標を指定します。また、重なり順の制御には z-index を使います。

実践:画像の上にラベルを重ねる(relative + absolute)

<div class="parent">
  <img src="photo.jpg" alt="風景">
  <span class="label">New!</span>
</div>
/* 親要素を基準(原点)にする */
.parent {
  position: relative;
}

/* 子要素を親の左上を基準に配置 */
.label {
  position: absolute;
  top: 10px;
  left: 10px;
  background: red;
  color: white;
  padding: 5px;
}

ポイント:親に position: relative を設定することで、子の absolute はその親の左上を「原点 (0, 0)」として座標を計算します。これを忘れると、ページ全体を基準にしてしまい、意図しない場所に表示されます。


2. transform・transition・animation:動きをつくる

Webサイトに「動き」を加えるCSSには3つの主要な仕組みがあります。

CSSアニメーション主な3つ
transform / transition / animation の役割と関係

transform(変形)

要素の移動・回転・拡大縮小・傾けを行います。単体では「状態の変化」なので、transition や animation と組み合わせて初めて「動き」になります。

関数 効果
translateX(n) 横方向に移動 translateX(50px)
translateY(n) 縦方向に移動(負の値で上) translateY(-5px)
scale(n) 拡大縮小(1が等倍) scale(0.95)
rotate(deg) 回転 rotate(45deg)
skewX(deg) 横方向に傾ける skewX(-25deg)

transition(遷移)

スタイルの変化を一定時間かけて滑らかに表示します。「変化のアニメーター」とも言える存在です。これを指定しないと、:hover などのスタイル変化が瞬時に切り替わってしまいます。

/* すべてのプロパティの変化を0.3秒・ease(緩急あり)で */
transition: all 0.3s ease;

/* 特定のプロパティだけを対象にする場合 */
transition: background-color 0.3s ease, transform 0.2s ease;

animation(アニメーション)

ユーザーの操作に関係なく、自動でループ再生したり複雑な動きを定義したりできます。@keyframes で動きの流れを定義し、animation プロパティで適用します。

/* 動きの定義 */
@keyframes fadeIn {
  from { opacity: 0; transform: translateY(10px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* 要素に適用 */
.card {
  animation: fadeIn 0.5s ease forwards;
}

 


3. 実践:ロールオーバーで変形するボタンの作成

transform・transition・擬似要素を組み合わせた3種類のボタンを実装します。

HTML

<div class="button-container">
  <button class="btn btn-float">浮き上がる</button>
  <button class="btn btn-press">色変化</button>
  <button class="btn btn-shine">光る</button>
</div>

CSS:ベース設定

.btn {
  padding: 22px 64px;
  font-size: 18px;
  font-weight: 700;
  letter-spacing: 0.1em;
  color: #ffffff;
  background-color: #0066ff;
  border-radius: 50px;
  display: inline-block;
  cursor: pointer;
  border: none;
  outline: none;
  position: relative;
  z-index: 1;
  overflow: hidden;
  /* すべての変化を0.3秒で滑らかにする */
  transition: all 0.3s ease;
}

ポイント:transition: all 0.3s ease をベースに書いておくことで、以降のホバースタイルはすべて滑らかにアニメーションします。個別のプロパティに別の速度を設定したい場合は、上書きして調整します。

パターンA:浮き上がるボタン

.btn-float:hover {
  background-color: #0056b3;
  /* Y軸(縦)に-5px(上方向)移動 */
  transform: translateY(-5px);
  /* 影で立体感を演出 */
  box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
}

パターンB:色変化+クリック時に沈むボタン

.btn-press:hover {
  background-color: #3399ff;
}

/* クリックした瞬間(activeな間)の動き */
.btn-press:active {
  transform: scale(0.95); /* 0.95倍に縮小 */
  box-shadow: none;
}

パターンC:光が走るボタン(擬似要素活用)

.btn-shine {
  position: relative;
  overflow: hidden; /* ボタン外にはみ出した光を隠す */
}

/* 光の筋を::afterで作成 */
.btn-shine::after {
  content: '';
  position: absolute;
  top: 0;
  left: -100%; /* 初期状態:ボタン左外に隠す */
  width: 50%;
  height: 100%;
  background: linear-gradient(
    to right,
    rgba(255,255,255,0) 0%,
    rgba(255,255,255,0.3) 50%,
    rgba(255,255,255,0) 100%
  );
  transform: skewX(-25deg); /* 斜めに傾ける */
  transition: all 0.5s ease;
}

/* ホバー時に光を右へ走らせる */
.btn-shine:hover::after {
  left: 150%;
}

4. 擬似クラス・擬似要素

擬似クラス(:)とは

HTMLの構造だけでは指定できない「要素の状態」や「特定の順番」に合わせてスタイルを適用する仕組みです。セレクタの後ろにコロン1つ(:)を付けて記述します。

擬似クラス タイミング・条件
:hover マウスカーソルが要素の上に乗ったとき
:active 要素をクリックしている間
:focus フォームが選択されて入力可能になったとき
:visited 既に訪問済みのリンク
:first-child 兄弟要素の中で最初の要素
:last-child 兄弟要素の中で最後の要素
:nth-child(n) n番目の要素(odd/evenも使用可)
:nth-of-type(n) 同種タグの中でn番目(タグ種類ごとにカウント)

:nth-child と :nth-of-type の違い::nth-child は同じ種類のタグ(例:li)が並んでいる場合に有効です。divh1 など異なるタグが混在する中で特定のタグだけをカウントしたい場合は :nth-of-type を使います。

擬似要素(::)とは

HTMLを書き換えずにCSSだけで「要素の特定の部分」に装飾を加えたり、新しい仮想要素を作ったりする仕組みです。コロン2つ(::)で記述します。

擬似要素 挿入位置 主な用途
::before コンテンツの直前 アイコン・記号の装飾、光のエフェクト
::after コンテンツの直後 引用符・吹き出し・下線装飾
::placeholder input内のヒントテキスト プレースホルダーの色・スタイル変更

重要:擬似要素を使う際は必ず content: ""; を記述してください。装飾目的で中身が空の場合でも、このプロパティがないと画面に表示されません。

/* リンクの前にアイコン風の記号を追加 */
a::before {
  content: "▶";
  color: blue;
  margin-right: 5px;
}

5. モダンなCSS:関数・単位・新記法

CSS関数(計算・比較)

関数 概要
calc() 四則演算でサイズを計算 width: calc(100% - 20px)
clamp(最小, 推奨, 最大) レスポンシブな値の制限 font-size: clamp(1rem, 5vw, 3rem)
min() 複数値のうち小さい方を選択 width: min(80%, 1000px)
max() 複数値のうち大きい方を選択 width: max(300px, 50%)

calc() の注意点:+-の前後には必ず半角スペースを入れてください(例:calc(100% - 20px))。スペースがないと構文エラーになります。

主要な単位の比較

単位 基準 特徴 主な用途
px 絶対値(固定) 常に同じサイズ。ユーザー設定を無視する場合も ボーダー幅・細かい調整
em 親要素のフォントサイズ 入れ子で累積する。ボタン内余白に向く padding(親との比率を保つとき)
rem html要素のフォントサイズ 常に一定の基準。管理しやすい(推奨) フォントサイズ・余白のメイン単位
vw / vh ビューポートの幅/高さ 画面サイズに追従。全画面表示に便利 height: 100vh(全画面)

Flexbox / Grid の新しい記法

/* gap:要素間の余白を親側で一括管理 */
.container {
  display: flex;
  gap: 20px;
}

/* repeat(auto-fit):メディアクエリなしで自動折り返し */
.grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}

/* aspect-ratio:縦横比を固定 */
.video-wrapper {
  aspect-ratio: 16 / 9;
}

/* inset:top/right/bottom/leftの一括指定 */
.overlay {
  position: absolute;
  inset: 0; /* 全方向を0にして親要素いっぱいに広げる */
}

6. 主要CSSプロパティまとめ

レイアウト・配置

display(flex/grid/block/none)、justify-contentalign-items(Flex/Grid内の整列)、position(relative/absolute/fixed/sticky)、z-index(重なり順)、gap(要素間余白)

余白・サイズ

marginpadding(外側・内側の余白)、widthheightmax-width(サイズ指定)、box-sizing: border-box(レイアウト崩れを防ぐ必須設定)、object-fit(画像の収め方)

テキスト・フォント

font-family(書体)、font-size(文字サイズ)、font-weight(太さ)、line-height(行間)、letter-spacing(字間)、text-align(揃え)

色・装飾

colorbackground-color(色)、background-image(背景画像・グラデーション)、border(枠線)、border-radius(角丸)、box-shadow(影)、opacity(透明度)

アニメーション

transition(変化を滑らかに)、transform(移動・回転・拡大縮小)、cursor: pointer(クリック可能を示す)、filter(blur等の特殊効果)


まとめ

ここでは、CSSを使ったレイアウトと動きの表現を体系的に整理しました。

  • position — static / relative / absolute / fixed / sticky の5種類で、要素の配置場所と重なりをコントロール
  • transform — translate・scale・rotate・skew で要素の形を変形
  • transition — スタイルの変化をなめらかにつなぐ「アニメーターの役割」
  • animation — @keyframes で定義した複雑な動きを自動再生・ループ
  • 擬似クラス(:) — hover・active・nth-child など、状態・順番でスタイルを切り替え
  • 擬似要素(::) — before・after でHTMLを触らずに装飾要素を追加
  • モダン単位・関数 — rem / vw / calc() / clamp() でレスポンシブ対応を効率化

プロのエンジニアもすべてのプロパティを暗記しているわけではありません。大切なのは「要素を重ねたいなら position: absolute」「1行おきに色を変えたいなら :nth-child」のように、目的と手段を結びつける力です。細かい値はリファレンスサイトやAIを活用して補完すれば十分です。

この記事を書いた人

unigram
web、印刷、映像などの制作をしています。@京都、フリーランス18年目。 大学で講師もしています。 自身の備忘録も兼ねて、Web制作・WordPress・SEO・GA4・生成AI活用をテーマに情報発信しています。わかりやすく優しい内容で記事作成を心がけています。