脱・初心者への最終課題。レスポンシブ対応のWebサイトをゼロからコーディング

HTMLとCSSの基礎から応用まで、長い道のりをお疲れ様でした!
ここまでの知識があれば、もう世の中にある大抵のWebサイトは作れるようになっています。

今回は「総集編」として、架空のカフェ「WDM CAFE」のランディングページを作ります。

以下の技術をすべて盛り込んでいます。

  • ヒーローヘッダー: position と flex で文字を中央配置
  • 特徴エリア: Flexbox で3列レイアウト
  • メニュー: Grid でタイル状に写真を配置
  • お問い合わせ: ユーザーに優しいフォーム
  • スマホ対応: メディアクエリでレイアウト切り替え

完成イメージ

PCで見ると横並び、スマホで見ると縦並びになる、モダンなレスポンシブサイトです。

ソースコード(HTML + CSS)

以下のコードをまるごとエディタに貼り付けて、ブラウザで開いてみてください。
画像はフリー素材(Unsplash)を読み込むようにしているので、準備なしですぐに動きます!

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <!-- ★スマホ対応の必須タグ -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>WDM CAFE | 最高のコーヒーをあなたに</title>
    <style>
        /* === 1. ベース設定 === */
        body {
            font-family: "Helvetica Neue", Arial, sans-serif;
            margin: 0;
            padding: 0;
            color: #333;
            line-height: 1.6;
        }

        /* 共通:見出しのデザイン(擬似要素で下線) */
        h2 {
            text-align: center;
            margin-bottom: 40px;
            font-size: 28px;
            position: relative; /* 擬似要素の基準 */
        }
        
        h2::after {
            content: "";
            display: block;
            width: 60px;
            height: 3px;
            background-color: #d4a373; /* カフェっぽいベージュ色 */
            margin: 10px auto 0; /* 中央寄せ */
        }

        /* 共通:セクションの余白 */
        section {
            padding: 60px 20px;
            max-width: 1000px; /* 横幅が広がりすぎないように制限 */
            margin: 0 auto;    /* 中央寄せ */
        }

        /* === 2. ヒーローヘッダー(トップ画像) === */
        header {
            height: 500px;
            position: relative; /* 子要素(文字)の基準 */
            background-image: url('https://images.unsplash.com/photo-1495474472287-4d71bcdd2085?auto=format&fit=crop&w=1200&q=80');
            background-size: cover;
            background-position: center;
        }

        /* 画像を少し暗くするフィルター(擬似要素の応用!) */
        header::before {
            content: "";
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            background-color: rgba(0, 0, 0, 0.4); /* 黒の半透明 */
        }

        .hero-text {
            position: absolute; /* 自由に配置 */
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%); /* 完全中央寄せ */
            text-align: center;
            color: white;
            width: 90%;
        }

        .hero-text h1 {
            font-size: 48px;
            margin-bottom: 10px;
            text-shadow: 2px 2px 10px rgba(0,0,0,0.5); /* 文字を見やすく */
        }

        /* === 3. 特徴エリア(Flexbox) === */
        .features {
            display: flex; /* 横並びON */
            justify-content: space-between;
            gap: 20px;
        }

        .feature-item {
            flex: 1; /* 均等な幅にする */
            text-align: center;
            padding: 20px;
            background-color: #fdfbf7;
            border-radius: 10px;
            box-shadow: 0 4px 6px rgba(0,0,0,0.05);
        }

        .feature-icon {
            font-size: 40px;
            margin-bottom: 10px;
            display: block;
        }

        /* === 4. メニューエリア(Grid) === */
        .menu-grid {
            display: grid; /* GridモードON */
            grid-template-columns: 1fr 1fr 1fr; /* 3列 */
            gap: 20px;
        }

        .menu-item {
            position: relative;
            height: 200px;
            border-radius: 10px;
            overflow: hidden; /* 画像のはみ出し防止 */
            box-shadow: 0 4px 10px rgba(0,0,0,0.1);
        }

        .menu-item img {
            width: 100%;
            height: 100%;
            object-fit: cover; /* 枠に合わせてトリミング */
            transition: 0.3s;  /* アニメーション */
        }

        /* ホバーで画像が拡大 */
        .menu-item:hover img {
            transform: scale(1.1);
        }

        /* === 5. お問い合わせフォーム === */
        .contact-form {
            background-color: #f9f9f9;
            padding: 40px;
            border-radius: 10px;
        }

        input, textarea {
            width: 100%;
            padding: 10px;
            margin-bottom: 15px;
            border: 1px solid #ccc;
            border-radius: 5px;
            box-sizing: border-box; /* 崩れ防止 */
        }

        button {
            background: linear-gradient(to right, #d4a373, #8c6a46); /* グラデーション */
            color: white;
            padding: 15px 40px;
            border: none;
            border-radius: 30px;
            cursor: pointer;
            font-weight: bold;
            display: block;
            margin: 0 auto; /* ボタン中央寄せ */
            transition: 0.3s;
        }

        button:hover {
            opacity: 0.9;
            transform: translateY(-2px); /* 少し浮く */
            box-shadow: 0 5px 15px rgba(140, 106, 70, 0.4);
        }

        /* === 6. フッター === */
        footer {
            background-color: #333;
            color: white;
            text-align: center;
            padding: 20px;
            margin-top: 50px;
        }

        /* === 7. スマホ対応(メディアクエリ) === */
        @media (max-width: 768px) {
            .hero-text h1 { font-size: 32px; }

            .features {
                flex-direction: column; /* 特徴を縦並びに */
            }

            .menu-grid {
                grid-template-columns: 1fr; /* メニューを1列に */
            }
        }
    </style>
</head>
<body>

    <!-- ヒーローヘッダー -->
    <header>
        <div class="hero-text">
            <h1>WDM CAFE</h1>
            <p>極上のコーヒーと、安らぎの時間を。</p>
        </div>
    </header>

    <!-- 特徴(Flexbox) -->
    <main>
        <section>
            <h2>About Us</h2>
            <div class="features">
                <div class="feature-item">
                    <span class="feature-icon">☕</span>
                    <h3>厳選された豆</h3>
                    <p>世界中から選び抜かれた豆を自家焙煎しています。</p>
                </div>
                <div class="feature-item">
                    <span class="feature-icon">🍰</span>
                    <h3>手作りスイーツ</h3>
                    <p>コーヒーに合うケーキを毎日店内で焼いています。</p>
                </div>
                <div class="feature-item">
                    <span class="feature-icon">🌿</span>
                    <h3>癒やしの空間</h3>
                    <p>緑溢れる店内で、ゆったりとした時間をお過ごしください。</p>
                </div>
            </div>
        </section>

        <!-- メニュー(Grid) -->
        <section>
            <h2>Menu</h2>
            <div class="menu-grid">
                <div class="menu-item"><img src="https://images.unsplash.com/photo-1509042239860-f550ce710b93?auto=format&fit=crop&w=600&q=80" alt="コーヒー"></div>
                <div class="menu-item"><img src="https://images.unsplash.com/photo-1497935586351-b67a49e012bf?auto=format&fit=crop&w=600&q=80" alt="ラテ"></div>
                <div class="menu-item"><img src="https://images.unsplash.com/photo-1579306194872-64d3b7bac4c2?auto=format&fit=crop&w=600&q=80" alt="ケーキ"></div>
                <div class="menu-item"><img src="https://images.unsplash.com/photo-1554118811-1e0d58224f24?auto=format&fit=crop&w=600&q=80" alt="カフェ風景"></div>
                <div class="menu-item"><img src="https://images.unsplash.com/photo-1495147466023-ac5c588e2e94?auto=format&fit=crop&w=600&q=80" alt="デザート"></div>
                <div class="menu-item"><img src="https://images.unsplash.com/photo-1521017432531-fbd92d768814?auto=format&fit=crop&w=600&q=80" alt="豆"></div>
            </div>
        </section>

        <!-- お問い合わせ(Form) -->
        <section>
            <h2>Contact</h2>
            <div class="contact-form">
                <form>
                    <label>お名前</label>
                    <input type="text" placeholder="例:山田 太郎">
                    <label>メールアドレス</label>
                    <input type="email" placeholder="例:abc@example.com">
                    <label>メッセージ</label>
                    <textarea rows="5"></textarea>
                    <button type="submit">送 信</button>
                </form>
            </div>
        </section>
    </main>

    <footer>
        <p>© 2024 WDM CAFE. All Rights Reserved.</p>
    </footer>

</body>
</html>

解説:どこで何を使っている?

この1ページには、これまでの学びが凝縮されています。

  1. ヒーローヘッダー:
    • background-image で背景画像を設定。
    • header::before で黒いフィルターを重ねて文字を見やすく(擬似要素の応用テクニック!)。
    • transform: translate(-50%, -50%) で文字をど真ん中に配置。
  2. About Us(特徴):
    • display: flex で3つのボックスを横並びに。
    • スマホの時は flex-direction: column で縦並びに切り替え。
  3. Menu(メニュー):
    • display: grid で写真をタイル状に配置。
    • hovertransform: scale(1.1) で、マウスを乗せた時にズームするアニメーションを追加。

さいごに

おめでとうございます!
このコードが理解できていれば、あなたはもう自信を持って「Webサイトが作れます」と言って大丈夫です。

ここから先は、色を変えてみたり、自分の好きな写真を入れ替えたりして、オリジナルのポートフォリオサイトに改造してみてください。
Web制作の世界は、手を動かした分だけ楽しくなりますよ!

タイトルとURLをコピーしました