mcpField
H
html-css-best-practices

html-css-best-practices

github.com/hack23デザイン・UI13181 回インストール今日更新
リポジトリ

html-css-best-practices について

html-css-best-practices は、Hack23 Homepage と関連プロジェクトのインターフェースを構築する開発者向けの HTML・CSS ガイドスキルです。セマンティックな構造、レスポンシブ設計、パフォーマンス、検証方法を扱います。

主な機能

  1. 01セマンティックな HTML5 構造ルール
  2. 02CSS の構成とカスタムプロパティ
  3. 03モバイルファーストのレスポンシブ設計
  4. 04パフォーマンスとブラウザー互換性の指針
  5. 05HTML・CSS・ページの検証

活用シーン

  1. 01セマンティックなページ構造の設計
  2. 02保守しやすい CSS の整理
  3. 03モバイルレイアウトとタッチ領域の確認
  4. 04パフォーマンスとブラウザー間の動作検証

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/hack23/homepage --skill html-css-best-practices

インストール後、Claude Code で/html-css-best-practicesを入力して読み込まれたか確認します。

詳細

HTML/CSS のベストプラクティススキル

目的

このスキルでは、Hack23 のホームページおよび関連プロジェクトを対象に、アクセシブルで高パフォーマンス、かつ保守しやすいウェブインターフェースを構築するための HTML と CSS のベストプラクティスを定めます。

ルール

セマンティック HTML5

必ず使用すること:

  • サイト/ページのヘッダーには <header> を使用する
  • ナビゲーションメニューには <nav> を使用する
  • メインコンテンツには <main> を使用する(ページごとに 1 つ)
  • 自己完結したコンテンツには <article> を使用する
  • テーマごとのグループ化には <section> を使用する
  • 関連性の低いコンテンツには <aside> を使用する
  • サイト/ページのフッターには <footer> を使用する
  • <h1>-<h6> を階層順に使用する(レベルを飛ばさない)
  • インタラクティブなアクションには <button> を使用する
  • ナビゲーションには <a> を使用する
  • キャプション付きの画像には <figure> と <figcaption> を使用する
  • 日付/時刻には <time datetime=""> を使用する

使用してはならないこと:

  • セマンティック要素がある場合に <div> を使用する
  • ブロックレベルのコンテンツに <span> を使用する
  • 見出しレベルを飛ばす(例:h1 → h3)
  • 間隔を空けるために <br> を使用する(CSS を使用する)
  • レイアウトにテーブルを使用する(CSS Grid/Flexbox を使用する)
HTML 構造

必須事項:

  • <!DOCTYPE html> を含める
  • <html> 要素に lang 属性を設定する
  • 文字セットを含める:<meta charset="UTF-8">
  • viewport メタタグを含める:<meta name="viewport" content="width=device-width, initial-scale=1.0">
  • 説明的な <title> を使用する(ページごとに固有のもの)
  • meta description を含める
  • すべてのタグを正しく閉じる
  • 要素名と属性名には小文字を使用する
  • すべての属性値を引用符で囲む
  • W3C validator で HTML を検証する

例:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="description" content="Hack23 - Cybersecurity consulting with transparency">
  <title>Hack23 - Cybersecurity Consulting</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <header>
    <nav>...</nav>
  </header>
  <main>
    <article>...</article>
  </main>
  <footer>...</footer>
</body>
</html>
CSS の構成

必須事項:

  • 外部スタイルシートを 1 つ使用する(styles.css)
  • CSS を論理的に整理する:
    1. CSS カスタムプロパティ(変数)
    2. リセット/正規化
    3. 基本スタイル(html、body、見出し)
    4. レイアウト(header、nav、main、footer)
    5. コンポーネント
    6. ユーティリティ
    7. メディアクエリ
  • 意味のあるクラス名を使用する(BEM 手法を推奨)
  • !important を避ける(詳細度を正しく使用する)
  • 関連するプロパティをまとめる
  • 適切な場合はショートハンドプロパティを使用する
  • 複雑なセクションにはコメントを付ける

例:

/* CSS Custom Properties */
:root {
  --primary-color: #2c3e50;
  --secondary-color: #3498db;
  --text-color: #333;
  --bg-color: #fff;
  --max-width: 1200px;
  --spacing-unit: 8px;
}

/* Base Styles */
body {
  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  color: var(--text-color);
  background-color: var(--bg-color);
  line-height: 1.6;
  margin: 0;
  padding: 0;
}

/* Layout */
.container {
  max-width: var(--max-width);
  margin: 0 auto;
  padding: 0 calc(var(--spacing-unit) * 2);
}

/* Components */
.button {
  display: inline-block;
  padding: calc(var(--spacing-unit) * 1.5) calc(var(--spacing-unit) * 3);
  background-color: var(--primary-color);
  color: white;
  text-decoration: none;
  border-radius: 4px;
  transition: background-color 0.3s ease;
}

.button:hover,
.button:focus {
  background-color: var(--secondary-color);
}
CSS カスタムプロパティ(変数)

次の項目には必ず使用すること:

  • 色(プライマリ、セカンダリ、背景、テキスト)
  • 余白(マージン、パディングの倍数)
  • タイポグラフィ(フォントサイズ、行の高さ)
  • ブレークポイント
  • トランジション/アニメーション
  • z-index の値

利点:

  • テーマを簡単に切り替えられる
  • サイト全体で値の一貫性を保てる
  • 保守しやすくなる
  • 実行時に更新できる
レスポンシブデザイン

必須事項:

  • モバイルファーストで設計する(モバイル向けの基本スタイルを設定し、大きな画面にはメディアクエリを使用する)
  • 固定の px より相対単位(rem、em、%、vw、vh)を使用する
  • 複数のブレークポイント(320px、768px、1024px、1440px 以上)でテストする
  • レイアウトには CSS Grid または Flexbox を使用する
  • タッチターゲットを少なくとも 44×44px にする
  • 水平方向のスクロールを避ける
  • 読みやすさを保つために max-width を使用する(1 行あたり 60~80 文字)

推奨ブレークポイント:

/* Mobile-first base styles */

/* Tablet */
@media (min-width: 768px) {
  /* Tablet styles */
}

/* Desktop */
@media (min-width: 1024px) {
  /* Desktop styles */
}

/* Large Desktop */
@media (min-width: 1440px) {
  /* Large desktop styles */
}
パフォーマンスの最適化

必須事項:

  • CSS ファイルのサイズを最小限にする(未使用のスタイルを削除する)
  • 本番環境では CSS の圧縮を使用する
  • 深いセレクターのネストを避ける(最大 3 階層)
  • 効率的なセレクターを使用する(ユニバーサルセレクター * を避ける)
  • CSS を <head> で読み込む(ブロッキングは必要です)
  • ファーストビューのコンテンツにはクリティカル CSS の使用を検討する
  • アニメーションでの will-change の使用は控えめにする
  • 画像を最適化する(WebP 形式、遅延読み込み)

画像の最適化:


<picture>
  <source srcset="image.webp" type="image/webp">
  <img src="image.jpg" alt="Description" loading="lazy">
</picture>


<svg width="24" height="24" aria-hidden="true">
  <use xlink:href="#icon-name"></use>
</svg>
ブラウザーの互換性

必須事項:

  • 最新のブラウザー(Chrome、Firefox、Safari、Edge)でテストする
  • ベンダープレフィックスには autoprefixer を使用する
  • 新しい CSS 機能にはフォールバックを用意する
  • プログレッシブエンハンスメントを使用する

フォールバック付きの例:

.grid {
  display: flex; /* Fallback */
  flex-wrap: wrap;
}

@supports (display: grid) {
  .grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
    gap: 20px;
  }
}

例

例 1:セマンティックな HTML ページ構造
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="description" content="Cybersecurity consulting services with transparent security practices">
  <title>Services - Hack23 Cybersecurity Consulting</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <header class="site-header">
    <div class="container">
      <a href="index.html" class="logo">
        <img src="logo.svg" alt="Hack23 Logo" width="150" height="50">
      </a>
      <nav aria-label="Main navigation">
        <ul class="nav-menu">
          <li><a href="index.html">Home</a></li>
          <li><a href="services.html" aria-current="page">Services</a></li>
          <li><a href="projects.html">Projects</a></li>
          <li><a href="blog.html">Blog</a></li>
        </ul>
      </nav>
    </div>
  </header>

  <main class="main-content">
    <div class="container">
      <article>
        <header>
          <h1>Cybersecurity Consulting Services</h1>
          <p class="lead">Transparent, effective security for modern organizations</p>
        </header>

        <section>
          <h2>Security Assessments</h2>
          <p>Comprehensive evaluation of your security posture...</p>
        </section>

        <section>
          <h2>Compliance Support</h2>
          <p>ISO 27001, GDPR, NIS2 compliance assistance...</p>
        </section>
      </article>

      <aside class="sidebar">
        <h2>Related Services</h2>
        <nav aria-label="Related services">
          <ul>
            <li><a href="penetration-testing.html">Penetration Testing</a></li>
            <li><a href="security-training.html">Security Training</a></li>
          </ul>
        </nav>
      </aside>
    </div>
  </main>

  <footer class="site-footer">
    <div class="container">
      <p>&copy; <time datetime="2025">2025</time> Hack23 AB. All rights reserved.</p>
      <nav aria-label="Footer navigation">
        <ul>
          <li><a href="privacy.html">Privacy Policy</a></li>
          <li><a href="accessibility.html">Accessibility</a></li>
        </ul>
      </nav>
    </div>
  </footer>
</body>
</html>
例 2:カスタムプロパティを使った CSS
/* ===========================
   CSS Custom Properties
   =========================== */
:root {
  /* Colors */
  --color-primary: #2c3e50;
  --color-secondary: #3498db;
  --color-accent: #e74c3c;
  --color-text: #333;
  --color-text-light: #666;
  --color-bg: #ffffff;
  --color-bg-alt: #f8f9fa;
  --color-border: #dee2e6;

  /* Typography */
  --font-base: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  --font-mono: 'Courier New', Courier, monospace;
  --font-size-base: 16px;
  --font-size-sm: 0.875rem;
  --font-size-lg: 1.125rem;
  --font-size-xl: 1.5rem;
  --line-height-base: 1.6;
  --line-height-heading: 1.2;

  /* Spacing */
  --spacing-xs: 4px;
  --spacing-sm: 8px;
  --spacing-md: 16px;
  --spacing-lg: 24px;
  --spacing-xl: 32px;
  --spacing-xxl: 48px;

  /* Layout */
  --max-width: 1200px;
  --max-width-narrow: 800px;
  --header-height: 80px;

  /* Transitions */
  --transition-fast: 0.15s ease;
  --transition-base: 0.3s ease;
  --transition-slow: 0.5s ease;

  /* Z-index */
  --z-dropdown: 100;
  --z-sticky: 200;
  --z-modal: 1000;
}

/* ===========================
   Reset & Base Styles
   =========================== */
* {
  box-sizing: border-box;
}

html {
  font-size: var(--font-size-base);
}

body {
  font-family: var(--font-base);
  color: var(--color-text);
  background-color: var(--color-bg);
  line-height: var(--line-height-base);
  margin: 0;
  padding: 0;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

h1, h2, h3, h4, h5, h6 {
  line-height: var(--line-height-heading);
  margin-top: 0;
  margin-bottom: var(--spacing-md);
  color: var(--color-primary);
}

h1 { font-size: 2.5rem; }
h2 { font-size: 2rem; }
h3 { font-size: 1.75rem; }
h4 { font-size: 1.5rem; }
h5 { font-size: 1.25rem; }
h6 { font-size: 1rem; }

a {
  color: var(--color-secondary);
  text-decoration: none;
  transition: color var(--transition-fast);
}

a:hover,
a:focus {
  color: var(--color-accent);
  text-decoration: underline;
}

/* ===========================
   Layout
   =========================== */
.container {
  max-width: var(--max-width);
  margin: 0 auto;
  padding: 0 var(--spacing-md);
}

.site-header {
  background-color: var(--color-primary);
  color: white;
  height: var(--header-height);
  display: flex;
  align-items: center;
  position: sticky;
  top: 0;
  z-index: var(--z-sticky);
}

.main-content {
  min-height: calc(100vh - var(--header-height) - 200px);
  padding: var(--spacing-xxl) 0;
}

.site-footer {
  background-color: var(--color-bg-alt);
  padding: var(--spacing-xl) 0;
  border-top: 1px solid var(--color-border);
}

/* ===========================
   Components
   =========================== */
.button {
  display: inline-block;
  padding: var(--spacing-sm) var(--spacing-lg);
  background-color: var(--color-primary);
  color: white;
  border: none;
  border-radius: 4px;
  font-size: var(--font-size-base);
  cursor: pointer;
  transition: background-color var(--transition-base);
}

.button:hover,
.button:focus {
  background-color: var(--color-secondary);
  text-decoration: none;
}

.card {
  background-color: var(--color-bg);
  border: 1px solid var(--color-border);
  border-radius: 8px;
  padding: var(--spacing-lg);
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  transition: box-shadow var(--transition-base);
}

.card:hover {
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
}

/* ===========================
   Utilities
   =========================== */
.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border-width: 0;
}

.text-center {
  text-align: center;
}

/* ===========================
   Responsive
   =========================== */
@media (min-width: 768px) {
  .container {
    padding: 0 var(--spacing-lg);
  }

  h1 { font-size: 3rem; }
  h2 { font-size: 2.5rem; }
}

@media (min-width: 1024px) {
  .container {
    padding: 0 var(--spacing-xl);
  }
}
例 3:レスポンシブナビゲーション
<nav class="main-nav" aria-label="Main navigation">
  <button class="nav-toggle" aria-expanded="false" aria-controls="nav-menu">
    <span class="visually-hidden">Toggle navigation</span>
    <span class="hamburger"></span>
  </button>
  <ul id="nav-menu" class="nav-menu">
    <li><a href="index.html">Home</a></li>
    <li><a href="services.html">Services</a></li>
    <li><a href="projects.html">Projects</a></li>
    <li><a href="blog.html">Blog</a></li>
  </ul>
</nav>
.main-nav {
  position: relative;
}

.nav-toggle {
  display: block;
  background: none;
  border: none;
  cursor: pointer;
  padding: var(--spacing-sm);
}

.nav-menu {
  display: none;
  list-style: none;
  margin: 0;
  padding: 0;
}

/* Show menu when expanded */
.nav-toggle[aria-expanded="true"] + .nav-menu {
  display: block;
}

/* Desktop: horizontal menu, hide toggle */
@media (min-width: 768px) {
  .nav-toggle {
    display: none;
  }

  .nav-menu {
    display: flex;
    gap: var(--spacing-md);
  }
}

関連する ISMS ポリシー

関連ドキュメント

パフォーマンス予算

  • CSS ファイルサイズ:< 50KB(gzip 圧縮後)
  • First Contentful Paint:< 1.5s
  • Largest Contentful Paint:< 2.5s
  • Cumulative Layout Shift:< 0.1

検証とテスト

コメント