-->

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 1  라이트

댓글 ( 0)

댓글 남기기

작성