html-css-best-practices について
html-css-best-practices は、Hack23 Homepage と関連プロジェクトのインターフェースを構築する開発者向けの HTML・CSS ガイドスキルです。セマンティックな構造、レスポンシブ設計、パフォーマンス、検証方法を扱います。
主な機能
- 01セマンティックな HTML5 構造ルール
- 02CSS の構成とカスタムプロパティ
- 03モバイルファーストのレスポンシブ設計
- 04パフォーマンスとブラウザー互換性の指針
- 05HTML・CSS・ページの検証
活用シーン
- 01セマンティックなページ構造の設計
- 02保守しやすい CSS の整理
- 03モバイルレイアウトとタッチ領域の確認
- 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 を論理的に整理する:
- CSS カスタムプロパティ(変数)
- リセット/正規化
- 基本スタイル(html、body、見出し)
- レイアウト(header、nav、main、footer)
- コンポーネント
- ユーティリティ
- メディアクエリ
- 意味のあるクラス名を使用する(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>© <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 ポリシー
- セキュア開発ポリシー - フロントエンドコードのセキュリティ
関連ドキュメント
- accessibility-wcag SKILL.md - アクセシビリティ要件
- seo-optimization SKILL.md - SEO のベストプラクティス
パフォーマンス予算
- CSS ファイルサイズ:< 50KB(gzip 圧縮後)
- First Contentful Paint:< 1.5s
- Largest Contentful Paint:< 2.5s
- Cumulative Layout Shift:< 0.1
検証とテスト
- HTML Validator:https://validator.w3.org/
- CSS Validator:https://jigsaw.w3.org/css-validator/
- Lighthouse:Chrome DevTools で監査を実行します
- BrowserStack:クロスブラウザテスト
コメント
Markdown 対応