✨ ホバー効果とアニメーション
:hover(ホバー効果)
マウスが要素の上に来たときのスタイルを設定します。インタラクティブなサイトに必須です。
💡 使い方: セレクタ:hover { スタイル } で指定します。transitionと組み合わせると滑らかに変化します。
/* ボタンのホバー効果 */
.button {
background-color: #4CAF50;
color: white;
padding: 15px 30px;
border: none;
border-radius: 5px;
transition: all 0.3s;
}
.button:hover {
background-color: #45a049;
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0,0,0,0.3);
}
/* カードの浮き上がり効果 */
.card {
transition: transform 0.3s, box-shadow 0.3s;
}
.card:hover {
transform: translateY(-10px);
box-shadow: 0 20px 40px rgba(0,0,0,0.2);
}
/* リンクの下線アニメーション */
.link {
position: relative;
text-decoration: none;
}
.link::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 0;
height: 2px;
background-color: blue;
transition: width 0.3s;
}
.link:hover::after {
width: 100%;
}
✅ 結果: インタラクティブで魅力的なUIになります
@keyframes(キーフレームアニメーション)
複雑なアニメーションを作成できます。要素を動かしたり、回転させたり自由自在です。
💡 使い方: @keyframes でアニメーションを定義し、animation で適用します。
/* フェードイン */
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.element {
animation: fadeIn 1s ease;
}
/* スライドイン */
@keyframes slideIn {
from {
transform: translateX(-100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
.slide-element {
animation: slideIn 0.5s ease;
}
/* 回転するローディング */
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.loader {
animation: spin 1s linear infinite; /* 無限ループ */
}
/* バウンス効果 */
@keyframes bounce {
0%, 100% {
transform: translateY(0);
}
50% {
transform: translateY(-20px);
}
}
.bounce-element {
animation: bounce 1s ease infinite;
}
✅ 結果: プロフェッショナルなアニメーションが作れます
backdrop-filter(ガラス効果)
背景にぼかしや色調整を加えて、モダンなガラスのような効果を作ります。
💡 使い方: backdrop-filter: blur() で背景をぼかします。半透明背景と組み合わせます。
/* ガラスモーフィズム(最新トレンド!) */
.glass-card {
background: rgba(255, 255, 255, 0.2);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.3);
border-radius: 15px;
padding: 30px;
}
/* 暗いガラス効果 */
.dark-glass {
background: rgba(0, 0, 0, 0.3);
backdrop-filter: blur(15px);
border-radius: 20px;
}
/* ナビゲーションバー */
.navbar {
background: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(10px);
position: sticky;
top: 0;
}
✅ 結果: 2024年のトレンド「ガラスモーフィズム」デザインが実現します
🎨 デザインのベストプラクティス
カラーパレットの作り方
統一感のある色使いでプロフェッショナルなサイトを作る方法です。
💡 使い方: CSS変数(カスタムプロパティ)を使って色を管理します。
/* カラーパレットを定義 */
:root {
/* メインカラー */
--primary: #6366f1;
--primary-dark: #4f46e5;
--primary-light: #818cf8;
/* アクセントカラー */
--accent: #ec4899;
/* グレースケール */
--white: #ffffff;
--gray-100: #f3f4f6;
--gray-500: #6b7280;
--gray-900: #111827;
/* ステータスカラー */
--success: #10b981;
--warning: #f59e0b;
--error: #ef4444;
}
/* 使用例 */
.button-primary {
background-color: var(--primary);
color: var(--white);
}
.button-primary:hover {
background-color: var(--primary-dark);
}
.alert-success {
background-color: var(--success);
color: var(--white);
}
✅ ポイント: 色を一箇所で管理でき、変更も簡単です
🎨 ツール: coolors.co や Adobe Color で美しいカラーパレットを作れます
余白(ホワイトスペース)の使い方
適切な余白でプロフェッショナルなデザインにする技術です。
💡 使い方: 8の倍数ルールを使うと統一感が出ます。
/* 余白のルール(8の倍数) */
:root {
--spacing-xs: 8px;
--spacing-sm: 16px;
--spacing-md: 24px;
--spacing-lg: 32px;
--spacing-xl: 48px;
--spacing-2xl: 64px;
}
/* 使用例 */
.card {
padding: var(--spacing-lg); /* 32px */
margin-bottom: var(--spacing-md); /* 24px */
}
.section {
padding: var(--spacing-2xl) 0; /* 上下64px */
}
/* 悪い例 */
.bad {
padding: 13px 19px 22px 15px; /* バラバラで統一感なし */
}
/* 良い例 */
.good {
padding: 16px 24px; /* 8の倍数で統一感 */
}
✅ 結果: プロっぽい整ったデザインになります
タイポグラフィ(文字の整え方)
読みやすく美しい文字組みの技術です。
💡 使い方: フォントサイズ、行間、行の長さを最適化します。
/* 基本設定 */
body {
font-family: 'Noto Sans JP', sans-serif;
font-size: 16px;
line-height: 1.6; /* 行間は1.5〜1.8が読みやすい */
color: #333;
}
/* 見出しのスケール */
h1 {
font-size: 2.5rem; /* 40px */
line-height: 1.2;
margin-bottom: 1rem;
}
h2 {
font-size: 2rem; /* 32px */
line-height: 1.3;
margin-bottom: 0.75rem;
}
h3 {
font-size: 1.5rem; /* 24px */
line-height: 1.4;
}
/* 読みやすい段落 */
p {
max-width: 65ch; /* 1行65文字まで(読みやすさの限界) */
margin-bottom: 1em;
}
/* Google Fontsの使用例 */
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;600;700&display=swap');
body {
font-family: 'Poppins', sans-serif;
}
✅ 結果: 読みやすく美しいテキストになります
🎭 CSS Transform テクニック集
transform: rotate()(回転)
要素を回転させます。角度はdeg(度)で指定します。
💡 使い方: transform: rotate(角度deg) で回転させます。
/* 45度回転 */
.rotate-45 {
transform: rotate(45deg);
}
/* アイコンのホバー回転 */
.icon {
transition: transform 0.3s;
}
.icon:hover {
transform: rotate(180deg);
}
/* ローディングスピナー */
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.spinner {
animation: spin 1s linear infinite;
}
✅ 結果: 要素が回転します
transform: scale()(拡大縮小)
要素のサイズを変更します。1が元のサイズ、2で2倍、0.5で半分です。
💡 使い方: transform: scale(倍率) で拡大縮小します。
/* 1.2倍に拡大 */
.scale-up {
transform: scale(1.2);
}
/* ボタンのホバー拡大 */
.button {
transition: transform 0.3s;
}
.button:hover {
transform: scale(1.1);
}
/* 横だけ拡大 */
.scale-x {
transform: scaleX(1.5);
}
/* 縦だけ拡大 */
.scale-y {
transform: scaleY(1.5);
}
✅ 結果: 要素が拡大縮小します
transform: translate()(移動)
要素を移動させます。positionを使わずに位置を変更できます。
💡 使い方: transform: translate(X, Y) で移動します。
/* 右に50px、下に30px移動 */
.move {
transform: translate(50px, 30px);
}
/* 上に浮かぶ効果 */
.card {
transition: transform 0.3s;
}
.card:hover {
transform: translateY(-10px);
}
/* 中央配置 */
.center {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
✅ ポイント: 中央配置の定番テクニックです
transform: skew()(傾斜)
要素を斜めに傾けます。斬新なデザインに使えます。
💡 使い方: transform: skew(X角度, Y角度) で傾けます。
/* X方向に20度傾ける */
.skew-x {
transform: skewX(20deg);
}
/* Y方向に10度傾ける */
.skew-y {
transform: skewY(10deg);
}
/* 平行四辺形のボタン */
.parallelogram {
transform: skew(-20deg);
padding: 15px 30px;
}
.parallelogram span {
display: inline-block;
transform: skew(20deg);
}
✅ 結果: ユニークな斜めデザインになります
複数のtransform組み合わせ
複数のtransformを同時に適用できます。
💡 使い方: スペースで区切って複数指定します。
/* 回転+拡大 */
.combo-1 {
transform: rotate(45deg) scale(1.5);
}
/* 移動+回転 */
.combo-2 {
transform: translate(50px, 0) rotate(30deg);
}
/* カードの3Dめくれ効果 */
.card-flip {
transition: transform 0.6s;
}
.card-flip:hover {
transform: rotateY(180deg) scale(1.1);
}
✅ 注意: 順番が重要です!結果が変わることがあります
transform-origin(変形の基準点)
回転や拡大の中心点を変更します。
💡 使い方: transform-origin: X Y で基準点を設定します。
/* 左上を基準に回転 */
.rotate-corner {
transform-origin: top left;
transform: rotate(45deg);
}
/* 右側を基準に拡大 */
.scale-right {
transform-origin: right center;
transform: scale(1.5);
}
/* ドアの開閉効果 */
.door {
transform-origin: left center;
transition: transform 0.5s;
}
.door:hover {
transform: rotateY(-90deg);
}
✅ 結果: より自然なアニメーションになります
3D transform: rotateX/Y/Z
3D空間での回転を実現します。立体的な効果が作れます。
💡 使い方: perspective と組み合わせて使います。
/* 3D回転の準備 */
.container-3d {
perspective: 1000px;
}
/* X軸回転(上下に回転) */
.rotate-x {
transform: rotateX(45deg);
}
/* Y軸回転(左右に回転) */
.rotate-y {
transform: rotateY(45deg);
}
/* Z軸回転(平面回転) */
.rotate-z {
transform: rotateZ(45deg);
}
/* カードフリップ */
.card-3d {
transition: transform 0.6s;
transform-style: preserve-3d;
}
.card-3d:hover {
transform: rotateY(180deg);
}
✅ 結果: 立体的な動きが実現します
perspective(遠近法)
3D transformに奥行き感を与えます。
💡 使い方: 親要素に perspective を設定します。
/* 遠近法を適用 */
.scene {
perspective: 500px; /* 小さいほど強い遠近感 */
}
/* 3D空間の要素 */
.cube {
transform-style: preserve-3d;
transform: rotateX(30deg) rotateY(45deg);
}
/* カルーセルの3D効果 */
.carousel {
perspective: 1000px;
}
.carousel-item {
transition: transform 0.5s;
}
.carousel-item:hover {
transform: translateZ(50px);
}
✅ ポイント: 値が小さいほど遠近感が強くなります
backface-visibility(裏面の表示制御)
3D回転したときの裏面を隠すかどうかを制御します。
💡 使い方: backface-visibility: hidden で裏面を非表示にします。
/* フリップカードの表面 */
.card-front {
backface-visibility: hidden;
position: absolute;
}
/* フリップカードの裏面 */
.card-back {
backface-visibility: hidden;
transform: rotateY(180deg);
}
/* カード全体 */
.flip-card {
position: relative;
transform-style: preserve-3d;
transition: transform 0.6s;
}
.flip-card:hover {
transform: rotateY(180deg);
}
✅ 結果: きれいなカードフリップアニメーションができます
matrix()(行列変換)
すべての2D transformを1つで表現できる高度な方法です。
💡 使い方: transform: matrix(a, b, c, d, e, f) で複雑な変形を一度に指定します。
/* 回転+拡大+移動を1つで */
.matrix-transform {
transform: matrix(1.5, 0.5, -0.5, 1.5, 30, 30);
}
/* これは以下と同等: */
.equivalent {
transform: scale(1.5) rotate(30deg) translate(30px, 30px);
}
/* 3D版 */
.matrix-3d {
transform: matrix3d(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1);
}
✅ 注意: 高度な技術なので、通常は他のtransformを使う方が簡単です
🎨 CSS Filter エフェクト
filter: blur()(ぼかし)
要素をぼかします。背景ぼかしやフォーカス効果に使います。
💡 使い方: filter: blur(ピクセル数) でぼかします。
/* 軽いぼかし */
.blur-light {
filter: blur(2px);
}
/* 強いぼかし */
.blur-heavy {
filter: blur(10px);
}
/* ホバーでフォーカス */
.image {
filter: blur(5px);
transition: filter 0.3s;
}
.image:hover {
filter: blur(0);
}
/* ローディング中の背景 */
.loading-bg {
filter: blur(8px);
pointer-events: none;
}
✅ 結果: 要素がぼやけます
filter: brightness()(明るさ)
要素の明るさを調整します。
💡 使い方: filter: brightness(%) で明るさを変更します。
/* 暗くする */
.dark {
filter: brightness(50%);
}
/* 明るくする */
.bright {
filter: brightness(150%);
}
/* 画像のホバー効果 */
.img-hover {
filter: brightness(70%);
transition: filter 0.3s;
}
.img-hover:hover {
filter: brightness(100%);
}
/* 無効化されたボタン */
.button:disabled {
filter: brightness(80%);
cursor: not-allowed;
}
✅ 結果: 明るさが変わります(100%が通常)
filter: contrast()(コントラスト)
色の明暗差を強調します。
💡 使い方: filter: contrast(%) でコントラストを調整します。
/* コントラスト強化 */
.high-contrast {
filter: contrast(150%);
}
/* コントラスト弱化 */
.low-contrast {
filter: contrast(50%);
}
/* 写真のような効果 */
.photo-effect {
filter: contrast(120%) brightness(110%);
}
/* ホバーで鮮明に */
.image {
filter: contrast(80%);
transition: filter 0.3s;
}
.image:hover {
filter: contrast(100%);
}
✅ 結果: 画像がくっきり or ぼんやりします
filter: grayscale()(グレースケール)
要素を白黒にします。
💡 使い方: filter: grayscale(%) で白黒度を指定します。
/* 完全に白黒 */
.grayscale {
filter: grayscale(100%);
}
/* 50%白黒 */
.half-gray {
filter: grayscale(50%);
}
/* ホバーでカラーに戻る */
.image {
filter: grayscale(100%);
transition: filter 0.3s;
}
.image:hover {
filter: grayscale(0%);
}
/* 無効な要素 */
.disabled {
filter: grayscale(100%);
opacity: 0.6;
}
✅ 結果: 白黒になります
filter: hue-rotate()(色相回転)
色を変更します。カラフルな効果を作れます。
💡 使い方: filter: hue-rotate(角度deg) で色を回転させます。
/* 90度回転 */
.hue-90 {
filter: hue-rotate(90deg);
}
/* 180度回転(反対色) */
.hue-180 {
filter: hue-rotate(180deg);
}
/* アニメーション */
@keyframes rainbow {
from { filter: hue-rotate(0deg); }
to { filter: hue-rotate(360deg); }
}
.rainbow {
animation: rainbow 3s linear infinite;
}
/* ホバーで色変化 */
.icon:hover {
filter: hue-rotate(45deg);
}
✅ 結果: 色が変わります
filter: saturate()(彩度)
色の鮮やかさを調整します。
💡 使い方: filter: saturate(%) で彩度を変更します。
/* 鮮やかに */
.vibrant {
filter: saturate(200%);
}
/* 彩度を下げる */
.desaturate {
filter: saturate(30%);
}
/* ホバーで鮮明に */
.image {
filter: saturate(50%);
transition: filter 0.3s;
}
.image:hover {
filter: saturate(150%);
}
/* インスタ風フィルター */
.instagram {
filter: saturate(120%) contrast(110%);
}
✅ 結果: 色が鮮やかになったり、くすんだりします
filter: sepia()(セピア調)
古い写真のようなセピア色にします。
💡 使い方: filter: sepia(%) でセピア度を指定します。
/* 完全セピア */
.sepia {
filter: sepia(100%);
}
/* 軽いセピア */
.light-sepia {
filter: sepia(50%);
}
/* ヴィンテージ風 */
.vintage {
filter: sepia(80%) contrast(90%) brightness(110%);
}
/* ホバーで通常に */
.image {
filter: sepia(100%);
transition: filter 0.3s;
}
.image:hover {
filter: sepia(0%);
}
✅ 結果: レトロな雰囲気になります
filter: invert()(色反転)
色を反転させます。ダークモードなどに使えます。
💡 使い方: filter: invert(%) で反転度を指定します。
/* 完全反転 */
.invert {
filter: invert(100%);
}
/* 部分反転 */
.half-invert {
filter: invert(50%);
}
/* ダークモード切り替え */
.dark-mode {
filter: invert(100%) hue-rotate(180deg);
}
/* アイコンの色変更 */
.icon-white {
filter: invert(100%);
}
✅ 結果: 白黒が反転します
filter: opacity()(透明度)
要素を透明にします。opacity プロパティと似ていますが、filterとして使えます。
💡 使い方: filter: opacity(%) で透明度を指定します。
/* 半透明 */
.semi-transparent {
filter: opacity(50%);
}
/* ほぼ透明 */
.almost-invisible {
filter: opacity(10%);
}
/* フェードイン効果 */
.fade {
filter: opacity(0%);
transition: filter 0.5s;
}
.fade.show {
filter: opacity(100%);
}
/* 複数フィルターと組み合わせ */
.combo {
filter: opacity(80%) blur(2px);
}
✅ ポイント: 通常は opacity プロパティの方が一般的です
filter: drop-shadow()(ドロップシャドウ)
要素の形に沿った影をつけます。box-shadowより柔軟です。
💡 使い方: filter: drop-shadow(X Y ぼかし 色) で影を作ります。
/* 基本の影 */
.shadow {
filter: drop-shadow(0 4px 6px rgba(0,0,0,0.3));
}
/* 大きな影 */
.big-shadow {
filter: drop-shadow(0 10px 20px rgba(0,0,0,0.5));
}
/* カラフルな影 */
.colored-shadow {
filter: drop-shadow(0 0 10px #ff00ff);
}
/* PNG画像の影(box-shadowではできない) */
.png-shadow {
filter: drop-shadow(5px 5px 10px rgba(0,0,0,0.5));
}
/* ホバーで影を強調 */
.card {
filter: drop-shadow(0 2px 4px rgba(0,0,0,0.1));
transition: filter 0.3s;
}
.card:hover {
filter: drop-shadow(0 8px 16px rgba(0,0,0,0.2));
}
✅ ポイント: 透過PNG画像にも影がつけられます!
複数filterの組み合わせ
複数のfilterを同時に適用して独自の効果を作れます。
💡 使い方: スペースで区切って複数のfilterを指定します。
/* インスタグラム風フィルター */
.instagram-filter {
filter: contrast(110%) brightness(110%) saturate(130%);
}
/* ヴィンテージ効果 */
.vintage-filter {
filter: sepia(50%) contrast(120%) brightness(110%);
}
/* ネオン効果 */
.neon-filter {
filter: brightness(150%) contrast(120%) saturate(150%);
}
/* ドラマチック効果 */
.dramatic {
filter: contrast(130%) brightness(90%) saturate(120%) drop-shadow(0 0 20px rgba(0,0,0,0.5));
}
/* ホバーでフィルター変化 */
.image {
filter: grayscale(100%) contrast(120%);
transition: filter 0.5s;
}
.image:hover {
filter: grayscale(0%) contrast(100%) saturate(120%);
}
✅ 結果: プロ級の画像効果が作れます
SVG filterの参照
SVGで定義した高度なfilterを使えます。
💡 使い方: filter: url(#フィルターID) でSVGフィルターを参照します。
/* HTML内にSVGフィルターを定義 */
<svg style="display: none;">
<filter id="goo">
<feGaussianBlur in="SourceGraphic" stdDeviation="10" />
<feColorMatrix values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 18 -7"/>
</filter>
</svg>
/* CSSで使用 */
.goo-effect {
filter: url(#goo);
}
/* ぼかし効果 */
.blur-effect {
filter: url(#blur);
}
/* 複雑なエフェクト */
.complex-effect {
filter: url(#complex) brightness(110%);
}
✅ 高度: SVGフィルターで超高度な効果が作れます
backdrop-filter(背景フィルター)
要素の背後にfilterをかけます。ガラス効果に必須です。
💡 使い方: backdrop-filter: blur() などで背景にフィルターをかけます。
/* ガラスモーフィズム */
.glass {
background: rgba(255, 255, 255, 0.2);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.3);
}
/* フロストガラス */
.frost {
backdrop-filter: blur(20px) saturate(180%);
background: rgba(255, 255, 255, 0.3);
}
/* ダークガラス */
.dark-glass {
backdrop-filter: blur(15px) brightness(80%);
background: rgba(0, 0, 0, 0.3);
}
/* モーダルの背景 */
.modal-backdrop {
backdrop-filter: blur(5px) brightness(70%);
background: rgba(0, 0, 0, 0.5);
}
✅ トレンド: 2024年の最新デザインに必須です
filter: url() カスタムフィルター
完全にカスタマイズしたfilter効果を作成できます。
💡 使い方: SVGのfilter要素でカスタムフィルターを定義します。
/* グリッチ効果 */
<svg>
<filter id="glitch">
<feTurbulence baseFrequency="0.02" numOctaves="3" />
<feDisplacementMap in="SourceGraphic" scale="50" />
</filter>
</svg>
.glitch {
filter: url(#glitch);
}
/* 水彩画風 */
<filter id="watercolor">
<feTurbulence baseFrequency="0.05" />
<feColorMatrix type="hueRotate" values="90" />
<feGaussianBlur stdDeviation="2" />
</filter>
.watercolor {
filter: url(#watercolor);
}
✅ プロ技: 独自のアート効果が作れます
🎪 高度なアニメーションテクニック
パララックス効果
スクロールに応じて要素が異なる速度で動く視差効果です。
💡 使い方: transform: translateY() と JavaScript を組み合わせます。
/* CSS */
.parallax {
transition: transform 0.1s linear;
}
/* JavaScript */
window.addEventListener('scroll', () => {
const scrolled = window.pageYOffset;
const parallax = document.querySelector('.parallax');
parallax.style.transform = `translateY(${scrolled * 0.5}px)`;
});
✅ 結果: 奥行きのあるスクロール体験
スムーススクロール
ページ内リンクをなめらかにスクロールします。
💡 使い方: scroll-behavior: smooth を使います。
/* CSSで簡単実装 */
html {
scroll-behavior: smooth;
}
/* JavaScriptでより細かく制御 */
element.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
✅ 結果: なめらかなスクロール
スティッキーヘッダー
スクロールしても固定されるヘッダーを作ります。
💡 使い方: position: sticky を使います。
.header {
position: sticky;
top: 0;
z-index: 1000;
background: white;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
✅ 結果: 常に表示されるナビゲーション
カウントアップアニメーション
数字が0から目標値まで増えていくアニメーションです。
💡 使い方: JavaScriptで数値を徐々に増やします。
function countUp(element, target, duration) {
let start = 0;
const increment = target / (duration / 16);
const timer = setInterval(() => {
start += increment;
if (start >= target) {
element.textContent = target;
clearInterval(timer);
} else {
element.textContent = Math.floor(start);
}
}, 16);
}
✅ 結果: 統計数値が動的にカウントアップ
タイピングエフェクト
文字が1文字ずつ表示されるタイプライター効果です。
💡 使い方: setInterval で文字を追加します。
function typeWriter(element, text, speed) {
let i = 0;
function type() {
if (i < text.length) {
element.textContent += text.charAt(i);
i++;
setTimeout(type, speed);
}
}
type();
}
✅ 結果: タイプライター風の文字表示
無限スクロールカルーセル
要素が自動で横にスクロールし続けるアニメーションです。
💡 使い方: @keyframes で無限ループアニメーションを作ります。
@keyframes scroll {
0% { transform: translateX(0); }
100% { transform: translateX(-50%); }
}
.scroll-container {
display: flex;
animation: scroll 20s linear infinite;
}
/* 要素を2倍にして継ぎ目をなくす */
.scroll-container::after {
content: '';
flex: 0 0 100%;
}
✅ 結果: 途切れないスクロールアニメーション
モーフィングアニメーション
形が変化するアニメーションです。
💡 使い方: clip-path でアニメーションさせます。
@keyframes morph {
0% {
clip-path: circle(50% at 50% 50%);
}
50% {
clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
}
100% {
clip-path: circle(50% at 50% 50%);
}
}
.morph {
animation: morph 3s ease-in-out infinite;
}
✅ 結果: 円から菱形に変化
パーティクルアニメーション
複数の小さな要素が動き回る効果です。
💡 使い方: 複数要素にランダムなアニメーションを適用します。
@keyframes float {
0%, 100% {
transform: translate(0, 0);
}
50% {
transform: translate(var(--x), var(--y));
}
}
.particle {
animation: float var(--duration) ease-in-out infinite;
}
/* JavaScriptでランダム値を設定 */
particle.style.setProperty('--x', Math.random() * 100 + 'px');
particle.style.setProperty('--y', Math.random() * 100 + 'px');
✅ 結果: 動的なパーティクル効果
🖼️ レイアウトテクニック応用
カードグリッドレイアウト
レスポンシブなカードグリッドを作ります。
💡 使い方: auto-fit と minmax を使います。
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 30px;
padding: 20px;
}
.card {
background: white;
border-radius: 10px;
padding: 20px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
✅ 結果: 自動調整されるカードレイアウト
マソンリーレイアウト
Pinterest風の不規則な高さのグリッドです。
💡 使い方: column-count を使います。
.masonry {
column-count: 3;
column-gap: 20px;
}
.masonry-item {
break-inside: avoid;
margin-bottom: 20px;
}
@media (max-width: 768px) {
.masonry {
column-count: 2;
}
}
@media (max-width: 480px) {
.masonry {
column-count: 1;
}
}
✅ 結果: Pinterest風レイアウト
ホーリーグレイルレイアウト
ヘッダー・フッター固定、サイドバー+メインの定番レイアウトです。
💡 使い方: Grid で完璧に実装できます。
.container {
display: grid;
grid-template-areas:
"header header header"
"nav main aside"
"footer footer footer";
grid-template-columns: 200px 1fr 200px;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
}
.header { grid-area: header; }
.nav { grid-area: nav; }
.main { grid-area: main; }
.aside { grid-area: aside; }
.footer { grid-area: footer; }
✅ 結果: 完璧な3カラムレイアウト
フルスクリーンセクション
各セクションが画面いっぱいに表示されます。
💡 使い方: height: 100vh を使います。
.section {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
scroll-snap-align: start;
}
.container {
scroll-snap-type: y mandatory;
overflow-y: scroll;
height: 100vh;
}
✅ 結果: スライドショー風のページ
🎯 パフォーマンス最適化テクニック
遅延読み込み(Lazy Loading)
画像を必要になるまで読み込まない技術です。
💡 使い方: loading="lazy" 属性を使います。
<img src="image.jpg" alt="画像" loading="lazy">
/* Intersection Observer API でより細かく制御 */
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
observer.unobserve(img);
}
});
});
document.querySelectorAll('img[data-src]').forEach(img => {
observer.observe(img);
});
✅ 結果: ページ読み込みが高速化
Critical CSS インライン化
初期表示に必要なCSSだけを先に読み込みます。
💡 使い方: 重要なCSSを<head>内に直接書きます。
<head>
<style>
/* 初期表示に必要な最小限のCSS */
body { margin: 0; font-family: sans-serif; }
.hero { height: 100vh; background: #667eea; }
</style>
<!-- 残りのCSSは後で読み込む -->
<link rel="preload" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
</head>
✅ 結果: 初期表示が爆速に
will-change プロパティ
アニメーションを最適化するヒントをブラウザに与えます。
💡 使い方: 変化する前に will-change を指定します。
/* アニメーション前に設定 */
.element {
will-change: transform, opacity;
}
/* ホバー時のみ適用 */
.card {
transition: transform 0.3s;
}
.card:hover {
will-change: transform;
transform: translateY(-10px);
}
✅ 注意: 使いすぎるとメモリを消費するので慎重に
contain プロパティ
要素の影響範囲を制限してレンダリングを最適化します。
💡 使い方: contain: layout/paint/size を指定します。
/* レイアウトを分離 */
.widget {
contain: layout;
}
/* 描画を分離 */
.card {
contain: paint;
}
/* 厳密な分離 */
.isolated {
contain: strict;
}
✅ 結果: 大規模サイトでパフォーマンス向上
content-visibility
画面外の要素のレンダリングをスキップします。
💡 使い方: content-visibility: auto を使います。
.section {
content-visibility: auto;
contain-intrinsic-size: 0 500px;
}
✅ 結果: 長いページの表示が劇的に速くなります
CSS contain-intrinsic-size
要素のサイズヒントを与えてレイアウトシフトを防ぎます。
💡 使い方: content-visibility と併用します。
.lazy-section {
content-visibility: auto;
contain-intrinsic-size: 1000px;
}
✅ 結果: スクロール時のガタつき防止
font-display swap
Webフォント読み込み中もテキストを表示します。
💡 使い方: @font-face で font-display を指定します。
@font-face {
font-family: 'Custom Font';
src: url('font.woff2') format('woff2');
font-display: swap;
}
✅ 結果: フォント読み込み中も文字が見える
プリロード・プリフェッチ
リソースを事前に読み込んで高速化します。
💡 使い方: link rel="preload/prefetch" を使います。
<!-- 重要なリソースを先読み -->
<link rel="preload" href="main.css" as="style">
<link rel="preload" href="hero.jpg" as="image">
<!-- 次に必要になるページを先読み -->
<link rel="prefetch" href="next-page.html">
<!-- DNS解決を先に -->
<link rel="dns-prefetch" href="https://fonts.googleapis.com">
✅ 結果: ページ遷移が瞬時に
🔐 セキュリティとアクセシビリティ
ARIA ラベル
スクリーンリーダー用の説明を追加します。
💡 使い方: aria-label 属性を使います。
<button aria-label="メニューを開く">
☰
</button>
<img src="logo.png" alt="会社ロゴ" aria-label="ABC株式会社のロゴ">
✅ 結果: 視覚障害者も使いやすいサイトに
キーボード操作対応
マウス無しでも操作できるようにします。
💡 使い方: tabindex と focus を活用します。
<div tabindex="0" role="button">クリック可能</div>
/* フォーカス時のスタイル */
.button:focus {
outline: 3px solid #4A90E2;
outline-offset: 2px;
}
✅ 結果: キーボードだけで操作可能
コントラスト比の確保
読みやすい色の組み合わせを使います。
💡 使い方: WCAG基準(4.5:1以上)を守ります。
/* 良い例:十分なコントラスト */
.text {
color: #333333;
background: #FFFFFF;
}
/* 悪い例:薄すぎて読みにくい */
.bad-text {
color: #CCCCCC;
background: #FFFFFF;
}
✅ ツール: WebAIMのコントラストチェッカーを使おう
prefers-reduced-motion
アニメーションを苦手な人のための配慮です。
💡 使い方: メディアクエリで分岐します。
/* 通常 */
.element {
animation: bounce 1s infinite;
}
/* アニメーション軽減モード */
@media (prefers-reduced-motion: reduce) {
.element {
animation: none;
transition: none;
}
}
✅ 結果: 誰にでも優しいサイトに
CSP(Content Security Policy)
XSS攻撃を防ぐセキュリティヘッダーです。
💡 使い方: meta タグまたはHTTPヘッダーで設定します。
<meta http-equiv="Content-Security-Policy"
content="default-src 'self';
script-src 'self' https://trusted.cdn.com;
style-src 'self' 'unsafe-inline';">
✅ 結果: 不正なスクリプトの実行を防止
rel="noopener noreferrer"
外部リンクのセキュリティリスクを防ぎます。
💡 使い方: target="_blank" と併用します。
<a href="https://example.com"
target="_blank"
rel="noopener noreferrer">
外部サイト
</a>
✅ 結果: タブナビゲーション攻撃を防止
サブリソース整合性(SRI)
外部ファイルの改ざんを検出します。
💡 使い方: integrity 属性を使います。
<script
src="https://cdn.example.com/library.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/ux..."
crossorigin="anonymous">
</script>
✅ 結果: CDNファイルの改ざんを検出
🎨 モダンUI/UXパターン
スケルトンスクリーン
コンテンツ読み込み中にプレースホルダーを表示します。
💡 使い方: グレーの矩形でレイアウトを示します。
.skeleton {
background: linear-gradient(
90deg,
#f0f0f0 25%,
#e0e0e0 50%,
#f0f0f0 75%
);
background-size: 200% 100%;
animation: loading 1.5s infinite;
}
@keyframes loading {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
✅ 結果: 体感速度が向上
インフィニットスクロール
スクロールで自動的にコンテンツを追加読み込みします。
💡 使い方: Intersection Observer を使います。
const observer = new IntersectionObserver((entries) => {
if (entries[0].isIntersecting) {
loadMoreContent();
}
});
observer.observe(document.querySelector('.load-more-trigger'));
✅ 結果: SNS風の無限スクロール
プログレスバー
進捗状況を視覚的に示します。
💡 使い方: width を動的に変更します。
<div class="progress-bar">
<div class="progress" style="width: 60%"></div>
</div>
.progress-bar {
width: 100%;
height: 8px;
background: #e0e0e0;
border-radius: 10px;
}
.progress {
height: 100%;
background: linear-gradient(90deg, #667eea, #764ba2);
border-radius: 10px;
transition: width 0.3s;
}
✅ 結果: 進捗が一目瞭然
トースト通知
画面隅に表示される一時的な通知です。
💡 使い方: 固定位置+アニメーションで実装します。
.toast {
position: fixed;
bottom: 20px;
right: 20px;
background: #333;
color: white;
padding: 15px 20px;
border-radius: 8px;
animation: slideIn 0.3s, slideOut 0.3s 2.7s;
}
@keyframes slideIn {
from { transform: translateX(400px); opacity: 0; }
to { transform: translateX(0); opacity: 1; }
}
@keyframes slideOut {
to { transform: translateX(400px); opacity: 0; }
}
✅ 結果: 控えめで効果的な通知
ドロワーメニュー
横からスライドするメニューです。
💡 使い方: transform で実装します。
.drawer {
position: fixed;
top: 0;
left: -300px;
width: 300px;
height: 100vh;
background: white;
transition: transform 0.3s;
z-index: 1000;
}
.drawer.open {
transform: translateX(300px);
}
.overlay {
position: fixed;
inset: 0;
background: rgba(0,0,0,0.5);
opacity: 0;
pointer-events: none;
transition: opacity 0.3s;
}
.overlay.show {
opacity: 1;
pointer-events: all;
}
✅ 結果: スマホ定番のメニュー