CSS3

 

 

 

 

 

1. HTML 기본 구조

  • <!DOCTYPE html>: HTML 문서가 HTML5 표준을 따름을 명시합니다.
  • <html lang="ko">: 문서의 언어를 한국어(ko)로 설정합니다.
  • <head>: 문서의 메타데이터와 스타일링, 폰트 로드를 위한 영역입니다.
  • <body>: 웹 페이지의 실제 콘텐츠가 들어가는 부분입니다.

 

 

2. Head 섹션

  • <meta charset="UTF-8" />: 문서의 인코딩을 UTF-8로 설정하여 한글을 비롯한 다양한 문자를 지원합니다.
  • <meta http-equiv="X-UA-Compatible" content="IE=edge" />: IE 브라우저 호환성을 위해 설정합니다.
  • <meta name="viewport" content="width=device-width, initial-scale=1.0" />: 반응형 웹 디자인을 위해 뷰포트를 설정합니다.
  • <script src="https://cdn.tailwindcss.com"></script>: Tailwind CSS를 외부 CDN에서 불러옵니다.
  • Google Fonts 관련 설정: Nanum Gothic 폰트를 사용하기 위해 구글 폰트에서 폰트를 불러오고, 전체 페이지의 폰트를 Nanum Gothic으로 설정합니다.

 

3. Body 섹션

  • 전체 컨테이너 (<div class="flex items-center justify-center min-h-screen bg-cyan-50">)
    • 페이지의 모든 콘텐츠를 포함하는 최상위 컨테이너입니다. flex를 사용해 자식 요소들을 중앙에 정렬하고, 배경색을 bg-cyan-50으로 설정했습니다.
  • 카드 컨테이너 (<div class="bg-white p-6 m-3 space-y-10 shadow-2xl rounded-3xl md:p-40">)
    • 메인 콘텐츠를 감싸는 카드 형태의 컨테이너입니다. 흰색 배경(bg-white), 여백(p-6 m-3), 그림자(shadow-2xl), 모서리 둥글기(rounded-3xl) 등 스타일이 적용되었습니다.
<div class="flex items-center justify-center min-h-screen bg-cyan-50">
  <div class="bg-white p-6 m-3 space-y-10 shadow-2xl rounded-3xl md:p-40">
    ...
  </div>
</div>

 

  • flex: 플렉스 박스를 적용하여 자식 요소들을 배치합니다.
  • items-center: 플렉스 박스의 자식 요소들을 수직으로 가운데 정렬합니다.
  • justify-center: 플렉스 박스의 자식 요소들을 수평으로 가운데 정렬합니다.
  • min-h-screen: 최소 높이를 화면 전체 높이로 설정합니다.
  • bg-cyan-50: 배경색을 cyan-50로 설정합니다. (Tailwind에서 제공하는 색상 팔레트 중 하나입니다)
  • bg-white: 배경색을 흰색으로 설정합니다.
  • p-6: 내부 패딩을 1.5rem(24px)로 설정합니다.
  • m-3: 외부 마진을 0.75rem(12px)로 설정합니다.
  • space-y-10: 수직 방향으로 2개의 자식 요소 간의 간격을 2.5rem(40px)로 설정합니다.
  • shadow-2xl: 그림자 효과를 크게 적용합니다.
  • rounded-3xl: 모서리를 크게 둥글게 만듭니다.
  • md:p-40: 중간 크기 이상의 화면에서 패딩을 10rem(160px)로 설정합니다

 

 

 

 

4. 메뉴 섹션

  • 메뉴 컨테이너 (<div class="flex flex-col items-center ...">)
    • 상단에 네 개의 메뉴 항목이 포함되어 있으며, Flexbox를 사용하여 메뉴를 가로 또는 세로로 정렬합니다. group 클래스를 이용해 메뉴 항목에 호버 효과를 추가했습니다.

 

<div class="flex flex-col items-center justify-center space-y-3 md:flex-row md:space-y-0 md:space-x-8 md:mb-24 md:justify-end">
  ...
</div>

 

  • flex-col: 플렉스 박스를 열 방향으로 배치합니다.
  • space-y-3: 자식 요소 사이에 0.75rem(12px) 간격을 추가합니다.
  • md:flex-row: 중간 크기 이상의 화면에서는 행 방향으로 배치합니다.
  • md:space-y-0: 중간 크기 이상의 화면에서는 수직 간격을 제거합니다.
  • md:space-x-8: 중간 크기 이상의 화면에서는 수평 간격을 2rem(32px)로 설정합니다.
  • md:mb-24: 중간 크기 이상의 화면에서는 하단 마진을 6rem(96px)로 설정합니다.
  • md:justify-end: 중간 크기 이상의 화면에서는 자식 요소를 오른쪽 끝으로 정렬합니다

 

 

 

5. 검색 및 업로드 섹션

  • 검색 입력 (<input type="text" class="ml-6 border-none md:w-80 placeholder:font-thin focus:outline-none" ... />)
    • 사용자로부터 검색어를 입력받는 필드입니다. 입력 필드는 border-none으로 테두리를 없애고, 화면 크기에 따라 폭이 조정되도록 설정했습니다.
  • 검색 버튼 (돋보기 아이콘)
    • 검색 버튼은 SVG 아이콘으로 구현되었습니다. 호버 시 크기가 확대되는 효과가 적용되어 있습니다.
  • 업로드 버튼 (<button class="py-3 px-14 text-lg font-normal ...">업로드</button>)
    • 사용자가 이미지를 업로드할 수 있는 버튼입니다. 검은 배경(bg-black)에 흰색 텍스트(text-white)를 사용하여 강조하고, 호버 시 색상이 반전되도록 설정했습니다.

 

  • justify-between: 자식 요소들을 좌우로 끝에 배치합니다.
  • space-y-5: 자식 요소들 사이에 1.25rem(20px) 간격을 추가합니다.
  • md:flex-row: 중간 크기 이상의 화면에서는 행 방향으로 배치합니다.
  • md:space-y-0: 중간 크기 이상의 화면에서는 수직 간격을 제거합니다

 

 

 

 

6. 갤러리 섹션

  • 갤러리 컨테이너 (<div class="grid gap-4 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5">)
    • 이미지를 그리드 레이아웃으로 배치하기 위한 컨테이너입니다. 화면 크기에 따라 3, 4, 5개의 열로 조정됩니다.
  • 이미지 카드 (<div class="relative group"> 내부)
    • 각 이미지와 관련된 정보를 포함하는 카드입니다. 이미지를 감싸는 relative 클래스의 div는 자식 요소들에 대해 상대적 위치를 설정할 수 있게 합니다.
    • 이미지 호버 효과
      • 각 이미지는 호버 시 opacity-0에서 opacity-100으로 변경되며, 배경이 어두워지고 텍스트와 아이콘이 나타납니다.
    • 텍스트와 북마크 아이콘
      • 이미지 아래에는 제목과 좋아요 수, 공유 횟수 등의 정보가 표시됩니다. 또한, 북마크 아이콘이 있어 사용자가 이미지를 저장할 수 있는 기능을 시각적으로 제공합니다.

 

<div class="grid gap-4 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5">
  ...
</div>

 

          <div class="relative group">
            <img src="images/image1.jpg" alt="" class="w-72" />
            <div
              class="absolute bottom-0 left-0 right-0 p-2 px-4 text-white duration-500 bg-black opacity-0 group-hover:opacity-100 bg-opacity-40"
            >
              <div class="flex justify-between w-full">
                <div class="font-normal">
                  <p class="text-sm">추상화</p>
                  <p class="text-xs">좋아요 245개 - 공유 35회</p>
                </div>
                <div class="flex items-center">
                  <img src="images/bookmark.svg" alt="북마크" />
                </div>
              </div>
            </div>
          
          </div>

 

  • grid: 그리드 레이아웃을 적용합니다.
  • gap-4: 그리드 항목들 사이에 1rem(16px) 간격을 설정합니다.
  • md:grid-cols-3: 중간 크기 이상의 화면에서는 그리드 항목을 3열로 배치합니다.
  • lg:grid-cols-4: 큰 화면에서는 그리드 항목을 4열로 배치합니다.
  • xl:grid-cols-5: 매우 큰 화면에서는 그리드 항목을 5열로 배치합니다

 

 

전체 코드

<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <script src="https://cdn.tailwindcss.com"></script>
    <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=Nanum+Gothic:wght@400;700;800&display=swap" rel="stylesheet">
  <style>*{ font-family: "Nanum Gothic", sans-serif; font-weight: 700;}</style>
    <title>이미지 갤러리</title>
  </head>
  <body>
    <!-- 전체 컨테이너 -->
    <div class="flex items-center justify-center min-h-screen bg-cyan-50">
      <!-- 카드 컨테이너 -->
      <div class="bg-white p-6 m-3 space-y-10 shadow-2xl rounded-3xl md:p-40">
        <!-- 메뉴 컨테이너 -->
        <div
          class="flex flex-col items-center justify-center space-y-3 md:flex-row md:space-y-0 md:space-x-8 md:mb-24 md:justify-end"
        >
          <!-- 메뉴 항목 -->
          <div class="group">
            <a href="#">벡터</a>
            <div
              class="mx-2 mt-2 duration-500 border-b-2 opacity-0 border-black group-hover:opacity-100"
            ></div>
          </div>
          <div class="group">
            <a href="#">일러스트레이션</a>
            <div
              class="mx-2 mt-2 duration-500 border-b-2 opacity-0 border-black group-hover:opacity-100"
            ></div>
          </div>
          <div class="group">
            <a href="#">이미지</a>
            <div
              class="mx-2 mt-2 duration-500 border-b-2 opacity-0 border-black group-hover:opacity-100"
            ></div>
          </div>
          <div class="group">
            <a href="#">아이콘</a>
            <div
              class="mx-2 mt-2 duration-500 border-b-2 opacity-0 border-black group-hover:opacity-100"
            ></div>
          </div>
        </div>

        <!-- 검색 컨테이너 -->
        <div
          class="flex flex-col justify-between space-y-5 md:flex-row md:space-y-0"
        >
          <!-- 입력 및 SVG 컨테이너 -->
          <div class="flex justify-between border-b">
            <input
              type="text"
              class="ml-6 border-none md:w-80 placeholder:font-thin focus:outline-none"
              placeholder="검색"
            />
            <button>
              <svg
                xmlns="http://www.w3.org/2000/svg"
                class="w-8 text-gray-300 duration-200 hover:scale-110"
                viewBox="0 0 24 24"
                stroke-width="1.5"
                stroke="currentColor"
                fill="none"
                stroke-linecap="round"
                stroke-linejoin="round"
              >
                <path stroke="none" d="M0 0h24v24H0z" fill="none" />
                <circle cx="10" cy="10" r="7" />
                <line x1="21" y1="21" x2="15" y2="15" />
              </svg>
            </button>
          </div>

          <!-- 업로드 버튼 -->
          <button
            class="py-3 px-14 text-lg font-normal text-white bg-black border border-black rounded-md shadow-2xl duration-200 hover:bg-white hover:text-black"
          >
            업로드
          </button>
        </div>

        
        <!-- 갤러리 컨테이너 -->
        <div class="grid gap-4 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5">
          <!-- 이미지 1 -->
          <div class="relative group">
            <img src="https://picsum.photos/336?random=1" alt="" class="w-72" />
            <div
              class="absolute bottom-0 left-0 right-0 p-2 px-4 text-white duration-500 bg-black opacity-0 group-hover:opacity-100 bg-opacity-40"
            >
              <div class="flex justify-between w-full">
                <div class="font-normal">
                  <p class="text-sm">추상화</p>
                  <p class="text-xs">좋아요 245개 - 공유 35회</p>
                </div>
                <div class="flex items-center">
                  <img src="images/bookmark.svg" alt="북마크" />
                </div>
              </div>
            </div>
          
          </div>

          <!-- 이미지 2 -->
          <div class="relative group">
            <img src="https://picsum.photos/336?random=2" alt="" class="w-72" />
            <div
              class="absolute bottom-0 left-0 right-0 p-2 px-4 text-white duration-500 bg-black opacity-0 group-hover:opacity-100 bg-opacity-40"
            >
              <div class="flex justify-between w-full">
                <div class="font-normal">
                  <p class="text-sm">추상화</p>
                  <p class="text-xs">좋아요 245개 - 공유 35회</p>
                </div>
                <div class="flex items-center">
                  <img src="images/bookmark.svg" alt="북마크" />
                </div>
              </div>
            </div>
          </div>

          <!-- 이미지 3 -->
          <div class="relative group">
            <img src="https://picsum.photos/336?random=3" alt="" class="w-72" />
            <div
              class="absolute bottom-0 left-0 right-0 p-2 px-4 text-white duration-500 bg-black opacity-0 group-hover:opacity-100 bg-opacity-40"
            >
              <div class="flex justify-between w-full">
                <div class="font-normal">
                  <p class="text-sm">추상화</p>
                  <p class="text-xs">좋아요 245개 - 공유 35회</p>
                </div>
                <div class="flex items-center">
                  <img src="images/bookmark.svg" alt="북마크" />
                </div>
              </div>
            </div>
          </div>

          <!-- 이미지 4 -->
          <div class="relative group">
            <img src="https://picsum.photos/336?random=4" alt="" class="w-72" />
            <div
              class="absolute bottom-0 left-0 right-0 p-2 px-4 text-white duration-500 bg-black opacity-0 group-hover:opacity-100 bg-opacity-40"
            >
              <div class="flex justify-between w-full">
                <div class="font-normal">
                  <p class="text-sm">추상화</p>
                  <p class="text-xs">좋아요 245개 - 공유 35회</p>
                </div>
                <div class="flex items-center">
                  <img src="images/bookmark.svg" alt="북마크" />
                </div>
              </div>
            </div>
          </div>

          <!-- 이미지 5 -->
          <div class="relative group">
            <img src="https://picsum.photos/336?random=5" alt="" class="w-72" />
            <div
              class="absolute bottom-0 left-0 right-0 p-2 px-4 text-white duration-500 bg-black opacity-0 group-hover:opacity-100 bg-opacity-40"
            >
              <div class="flex justify-between w-full">
                <div class="font-normal">
                  <p class="text-sm">추상화</p>
                  <p class="text-xs">좋아요 245개 - 공유 35회</p>
                </div>
                <div class="flex items-center">
                  <img src="images/bookmark.svg" alt="북마크" />
                </div>
              </div>
            </div>
          </div>

          <!-- 이미지 6 -->
          <div class="relative group">
            <img src="https://picsum.photos/336?random=6" alt="" class="w-72" />
            <div
              class="absolute bottom-0 left-0 right-0 p-2 px-4 text-white duration-500 bg-black opacity-0 group-hover:opacity-100 bg-opacity-40"
            >
              <div class="flex justify-between w-full">
                <div class="font-normal">
                  <p class="text-sm">추상화</p>
                  <p class="text-xs">좋아요 245개 - 공유 35회</p>
                </div>
                <div class="flex items-center">
                  <img src="images/bookmark.svg" alt="북마크" />
                </div>
              </div>
            </div>
          </div>
        </div>


      </div>
    </div>



  </body>
</html>

 

 

 

 

Grid 

 

1. CSS Grid의 기본 개념

  • Grid Container: display: grid; 속성을 사용하여 Grid 레이아웃이 적용된 컨테이너입니다. 이 컨테이너는 자식 요소들을 행과 열로 나눕니다.
  • Grid Items: Grid Container 내부의 자식 요소들이 Grid Item이 됩니다. 이들은 지정된 행과 열에 배치됩니다.
  • Grid Lines: 그리드를 나누는 가상의 선입니다. 이 선들 사이에 Grid Item이 위치하게 됩니다.
  • Grid Tracks: Grid Line 사이의 간격을 의미하며, 이는 행(가로) 또는 열(세로)로 구성됩니다.
  • Grid Cell: Grid Line에 의해 정의된 하나의 셀입니다.

 

2. Tailwind CSS에서의 Grid 사용법

Tailwind CSS에서는 Grid 시스템을 구현할 때 여러 유틸리티 클래스를 제공합니다. 주요 클래스와 그 기능을 설명하겠습니다.

 

Grid Container 설정

  • grid: 요소를 Grid Container로 설정합니다. 이 클래스가 적용된 요소는 Grid 레이아웃을 가지게 됩니다.

 

<div class="grid">...</div>

 

Grid 열의 수 설정

  • grid-cols-{n}: Grid 레이아웃에서 열(column)의 수를 설정합니다. {n}은 열의 개수를 나타냅니다.

 

<div class="grid grid-cols-3">...</div>


 

열 간격 설정

  • gap-{n}: Grid 항목 간의 간격을 설정합니다. {n}은 Tailwind의 spacing scale을 따릅니다

 

<div class="grid grid-cols-3 gap-4">...</div>


 

  • 이 예시에서는 열 간격과 행 간격이 모두 4 (1rem)로 설정됩니다.

반응형 디자인

  • md:grid-cols-{n}, lg:grid-cols-{n}: 화면 크기에 따라 열의 수를 다르게 설정할 수 있습니다. 예를 들어, 모바일에서는 2열, 태블릿에서는 3열, 데스크탑에서는 4열로 구성하는 것이 가능합니다.

 

<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4">...</div>

  • 위 예시에서는 기본적으로 2개의 열로 구성되지만, 화면이 커지면 3개 또는 4개의 열로 변경됩니다.

자동 행과 열 크기 조정

  • auto-cols-{value}와 auto-rows-{value}: 열과 행의 크기를 자동으로 조정할 수 있습니다.

 

<div class="grid grid-cols-3 auto-rows-min">...</div>

 

  • 이 코드는 3개의 열을 가지며, 행의 높이는 콘텐츠에 따라 최소 크기로 조정됩니다.

3. 실제 코드에서의 Grid 사용

주어진 코드에서 grid가 사용된 부분을 다시 살펴보겠습니다:

 

<div class="grid gap-4 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5">


 

 

이 코드는 다음과 같은 레이아웃을 만듭니다:

  • 기본 설정: grid 클래스를 사용하여 Grid Container를 만듭니다.
  • 열의 수 설정:
    • 기본: 화면이 작은 경우 1열로 표시됩니다.
    • 중간 크기 (md): 화면이 중간 크기 이상일 때는 grid-cols-3로 설정하여 3개의 열을 만듭니다.
    • 큰 크기 (lg): 화면이 큰 경우 grid-cols-4로 설정하여 4개의 열로 구성됩니다.
    • 매우 큰 크기 (xl): 화면이 매우 큰 경우 grid-cols-5로 5개의 열로 구성됩니다.
  • 간격 설정: gap-4 클래스를 사용하여 Grid Item 간에 4 (1rem) 크기의 간격을 설정합니다.

4. Grid Item 배치

Grid Container 내부에 있는 요소들은 자동으로 Grid Item으로 배치되며, 설정된 행과 열에 따라 자동 정렬됩니다. Grid 시스템을 사용하면 복잡한 레이아웃도 손쉽게 구성할 수 있습니다.

5. Grid와 Flexbox의 비교

  • Grid: 2차원 레이아웃 (행과 열) 구성이 가능하며, 복잡한 레이아웃에 적합합니다.
  • Flexbox: 1차원 레이아웃 (행 또는 열) 구성이 주목적이며, 단순한 정렬과 배치에 적합합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

Glory is the fair child of peril. (호랑이를 잡으려면 호랑이 굴에 들어가야 한다.)

댓글 ( 0)

댓글 남기기

작성

CSS3 목록    more