๊ด€๋ฆฌ ๋ฉ”๋‰ด

๋ฆฌ์ œ

Visual Studio Code ์‹ค์Šต๋ฌธ์ œ ํ†บ์•„๋ณด๊ธฐ ๋ณธ๋ฌธ

๊ฐœ๋ฐœ์ž ํ˜ธ์†Œ์ธ/Front

Visual Studio Code ์‹ค์Šต๋ฌธ์ œ ํ†บ์•„๋ณด๊ธฐ

๋ฆฌ์ œ๐Ÿซง 2026. 6. 22. 11:57
<nav class="navbar"> <div class="logo">MyPortfolio</div>
       <ul class="menu"> <li>ํ™ˆ</li>
    </ul>
</nav>

<header class="hero"> <h1>์•ˆ๋…•ํ•˜์„ธ์š”, CSS๋ฅผ ๋ฐฐ์šฐ๋Š” ์ค‘์ž…๋‹ˆ๋‹ค</h1>
</header>
<section> <h2 class="section-title">ํ”„๋กœํ•„</h2>
     <div class="profile-card"> <span class="badge">NEW</span><h3>์ตœ์ง€์›</h3>
   </div>
</section>

โ‘  ์™œ <header>, <section>, <nav> ํƒœ๊ทธ๋ฅผ ์“ฐ๋‚˜์š”?

์ด๊ฒƒ๋“ค์€ '์‹œ๋งจํ‹ฑ ํƒœ๊ทธ(Semantic Tags)'์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ "์ด ๋ถ€๋ถ„์€ ๋ฉ”๋‰ด์•ผ", "์ด ๋ถ€๋ถ„์€ ๋ณธ๋ฌธ์ด์•ผ"๋ผ๊ณ  ์˜๋ฏธ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ˆœํžˆ <div>๋กœ๋งŒ ๋„๋ฐฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฒ€์ƒ‰ ์—”์ง„์ด ๋‚ด ํŽ˜์ด์ง€๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค.

 

โ‘ก ์™œ position: relative์™€ absolute๋ฅผ ์“ฐ๋‚˜์š”?

  • relative (์ƒ๋Œ€์  ์œ„์น˜): "๋‚˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ž์‹์„ ๋ฐฐ์น˜ํ•˜๊ฒ ๋‹ค"๋ผ๋Š” ์„ ์–ธ์ž…๋‹ˆ๋‹ค. .profile-card์— ์„ค์ •๋œ ์ด์œ ์ž…๋‹ˆ๋‹ค.
  • absolute (์ ˆ๋Œ€์  ์œ„์น˜): "๊ฐ€์žฅ ๊ฐ€๊นŒ์šด relative ๋ถ€๋ชจ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์œ„์น˜๋ฅผ ์žก๊ฒ ๋‹ค"์ž…๋‹ˆ๋‹ค. ๋•๋ถ„์— NEW ๋ฑƒ์ง€๊ฐ€ ์นด๋“œ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€์ง€ ์•Š๊ณ  ์ •ํ™•ํžˆ ์นด๋“œ ๋‚ด๋ถ€ ์šฐ์ธก ์ƒ๋‹จ์— ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค.

โ‘ข ์™œ display: flex๋ฅผ ์ž์ฃผ ์“ฐ๋‚˜์š”?

  • justify-content: ์š”์†Œ๋“ค์„ ๊ฐ€๋กœ๋กœ ์–ด๋””์— ๋‘˜์ง€ ์ •ํ•ฉ๋‹ˆ๋‹ค (์ค‘์•™, ์–‘ ๋ ๋“ฑ).
  • gap: ์š”์†Œ๋“ค ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ํ•œ ์ค„๋กœ ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • flex-wrap: ํ™”๋ฉด์ด ์ข์•„์ง€๋ฉด ์•„๋ž˜๋กœ ๋„˜๊ธธ์ง€ ๋ง์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

 


<!DOCTYPE html>
<html lang="ko"> <head>
    <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CSS ์ข…ํ•ฉ ์‹ค์Šต (๋ฌธ์ œ)</title>

    <link rel="preconnect" href="
https://fonts.googleapis.com
">
    <link rel="preconnect" href="
https://fonts.gstatic.com
" crossorigin>
    <link href="
https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&display=swap
" rel="stylesheet">

    <style>
        /* [์ „์ฒด ์ดˆ๊ธฐํ™”] ๋ชจ๋“  ์š”์†Œ์˜ ๊ธฐ๋ณธ ๋งˆ์ง„/ํŒจ๋”ฉ์„ 0์œผ๋กœ ์—†์• ๊ณ  ํฌ๊ธฐ ๊ณ„์‚ฐ์„ border ํฌํ•จ์œผ๋กœ ํ†ต์ผํ•ฉ๋‹ˆ๋‹ค. */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        /* [๋ณธ๋ฌธ ์Šคํƒ€์ผ] ์ „์ฒด ํฐํŠธ ์ ์šฉ, ๋ฐฐ๊ฒฝ์ƒ‰ ์ง€์ • ๋ฐ ์ƒ๋‹จ ๊ณ ์ • ๋ฉ”๋‰ด๋ฅผ ๊ณ ๋ คํ•ด ์œ„์ชฝ ์—ฌ๋ฐฑ์„ ์ค๋‹ˆ๋‹ค. */
        body {
            font-family: "Noto Sans KR", sans-serif;
            background: #f0f0f0;
            color: black;
            padding-top: 55px;
            line-height: 1.6;
        }

        /* [๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”] ul, ol ํƒœ๊ทธ์˜ ๊ธฐ๋ณธ ๋ถˆ๋ › ํฌ์ธํŠธ(์ )๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. */
        ul, ol {
            list-style: none;
        }

        /* [๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”] ํ™”๋ฉด ์ƒ๋‹จ์— ๊ณ ์ •ํ•˜๋ฉฐ, Flexbox๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ๋“ค์„ ์–‘์˜†์œผ๋กœ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. */
        .navbar {
            position: fixed; /* ์Šคํฌ๋กคํ•ด๋„ ํ™”๋ฉด ์ƒ๋‹จ์— ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค. */
            top: 0;
            left: 0;
            width: 100%;
            height: 55px;
            background: #2c3e50;
            border-bottom: 3px solid white;
            display: flex; /* ์ž์‹ ์š”์†Œ๋“ค์„ ๊ฐ€๋กœ๋กœ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. */
            justify-content: space-between; /* ๋กœ๊ณ ์™€ ๋ฉ”๋‰ด ์‚ฌ์ด๋ฅผ ์ตœ๋Œ€ํ•œ ๋ฒŒ๋ฆฝ๋‹ˆ๋‹ค. */
            padding: 0 24px;
            align-items: center; /* ์„ธ๋กœ ์ค‘์•™ ์ •๋ ฌ์„ ํ•ฉ๋‹ˆ๋‹ค. */
            color: white;
        }

        /* [๋ฉ”๋‰ด ๋ชฉ๋ก] ๋ฉ”๋‰ด ํ•ญ๋ชฉ๋“ค์„ ๊ฐ€๋กœ๋กœ ๋ฐฐ์น˜ํ•˜๊ณ  gap์œผ๋กœ ๊ฐ„๊ฒฉ์„ ์ค๋‹ˆ๋‹ค. */
        .menu {
            display: flex;
            gap: 20px;
        }

        /* [๋ฉ”๋‰ด ์•„์ดํ…œ] ๋งˆ์šฐ์Šค ์ปค์„œ๋ฅผ ์˜ฌ๋ ธ์„ ๋•Œ์˜ ๋ณ€ํ™”(transition)๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. */
        .menu li {
            cursor: pointer;
            transition: all 0.1s ease;
        }

        /* [๋ฉ”๋‰ด Hover] ๋งˆ์šฐ์Šค๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋ฉด ์‚ด์ง ์ž‘์•„์ง€๊ณ  ๊ธ€์”จ๊ฐ€ ๊ตต์–ด์ง‘๋‹ˆ๋‹ค. */
        .menu li:hover {
            scale: calc(0.98);
            font-weight: 600;
        }

        /* [๋ฐฐ๋„ˆ] ํŽ˜์ด์ง€ ์ƒ๋‹จ ์ œ๋ชฉ๊ณผ ๋ถ€์ œ๋ชฉ์„ ์ค‘์•™ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. */
        .hero {
            text-align: center;
            color: white;
            background: #4a90d9;
            padding: 55px 0;
        }
        
        .hero h1 {
            font-size: 30px;
            margin-bottom: 10px;
        }

        /* [์„น์…˜ ํƒ€์ดํ‹€] ๊ฐ ๊ตฌ์—ญ์˜ ์ œ๋ชฉ์„ ์ค‘์•™์— ๋ฐฐ์น˜ํ•˜๊ณ  ์—ฌ๋ฐฑ์„ ์ค๋‹ˆ๋‹ค. */
        .section-title {
            text-align: center;
            margin: 30px 0;
        }

        /* [ํ”„๋กœํ•„ ์นด๋“œ] ๋ฐ•์Šค ๋ชจ๋ธ๋กœ ์นด๋“œ๋ฅผ ๋งŒ๋“ค๊ณ , ์ž์‹ ์š”์†Œ ๋ฐฐ์น˜๋ฅผ ์œ„ํ•ด position์„ relative๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. */
        .profile-card {
            width: 300px;
            background: white;
            margin: 0 auto; /* ์ขŒ์šฐ ๋งˆ์ง„ ์ž๋™ ์ ์šฉ์œผ๋กœ ์ค‘์•™ ์ •๋ ฌ */
            padding: 24px;
            border: 1px solid #e4e4e4;
            border-radius: 8px;
            position: relative; /* ์ž์‹์˜ absolute ์œ„์น˜ ๋ฐฐ์น˜์˜ ๊ธฐ์ค€์ (๊ธฐ์ค€์  ์ƒ์„ฑ) */
        }

        /* [๋ฑƒ์ง€] ๋ถ€๋ชจ ์นด๋“œ ๋‚ด ์šฐ์ธก ์ƒ๋‹จ์— ์ ˆ๋Œ€ ์œ„์น˜๋กœ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. */
        .badge {
            position: absolute; /* ๋ถ€๋ชจ(profile-card)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์œ„์น˜ */
            right: 10px;
            top: 10px;
            background: #e74c3c;
            color: white;
            font-size: 12px;
            padding: 4px 8px;
            border-radius: 4px;
        }

        /* [๊ธฐ์ˆ  ์Šคํƒ ์ปจํ…Œ์ด๋„ˆ] Flexbox๋ฅผ ์ด์šฉํ•ด ์นด๋“œ๋ฅผ ๊ฐ€๋กœ๋กœ ๋‚˜์—ดํ•˜๊ณ  ์ค„๋ฐ”๊ฟˆ(wrap)์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. */
        .cards {
            display: flex;
            justify-content: center;
            flex-wrap: wrap; /* ํ™”๋ฉด์ด ์ข์•„์ง€๋ฉด ๋‹ค์Œ ์ค„๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. */
            gap: 20px;
        }

        /* [์นด๋“œ ์Šคํƒ€์ผ] ๊ฐ ์นด๋“œ์˜ ํฌ๊ธฐ์™€ ํ…Œ๋‘๋ฆฌ, ๊ทธ๋ฆผ์ž(box-shadow)๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. */
        .card {
            width: 240px;
            padding: 24px;
            background: white;
            border: 1px solid #e4e4e4;
            border-radius: 8px;
            box-shadow: 0 2px 4px #e4e4e4;
        }

        /* [์„ ํƒ์ž ์—ฐ์Šต - ํ›„์† ์„ ํƒ์ž] .relation ๋‚ด๋ถ€์˜ ๋ชจ๋“  p ํƒœ๊ทธ ์ ์šฉ */
        .relation p {
            color: purple;
        }

        /* [์„ ํƒ์ž ์—ฐ์Šต - ์ž์‹ ์„ ํƒ์ž] .relation ๋ฐ”๋กœ ์•„๋ž˜์˜ span ํƒœ๊ทธ๋งŒ ์ ์šฉ */
        .relation > span {
            color: orange;
            font-weight: bold;
        }

        /* [์„ ํƒ์ž ์—ฐ์Šต - ID ์„ ํƒ์ž] ํŠน์ • ID๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๋งŒ ์ ์šฉ */
        #special {
            background: #fff3cd;
            padding: 12px;
        }

        /* [๋ฏธ๋””์–ด ์ฟผ๋ฆฌ - ๋ฐ˜์‘ํ˜•] ๊ฐ€๋กœํญ 768px ์ดํ•˜์—์„œ ๋ ˆ์ด์•„์›ƒ์„ ์„ธ๋กœ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. */
        @media (max-width: 768px) {
            .cards {
                flex-direction: column; /* ์„ธ๋กœ ์ •๋ ฌ */
                align-items: center;
            }
            .menu {
                gap: 10px;
            }
        }
    </style>
</head>
<body>
    <nav class="navbar">...</nav>
    <header class="hero">...</header>
    <section>ํ”„๋กœํ•„...</section>
    <section>๊ธฐ์ˆ  ์Šคํƒ...</section>
    <section>์„ ํƒ์ž ์—ฐ์Šต...</section>
</body>
</html>