CSS

반응형 웹사이트 예시

데이터_박과장 2023. 11. 27. 00:38

Intro

  • 브라우저 사이즈에 따라서 반응형으로 웹 페이지 레이아웃이 변경되도록 하는것이 이번 장의 목표입니다.
  • flex를 이용하는 방법으로도 레이아웃을 만들 수 있지만, 이번에는 Grid를 이용해보겠습니다.
  • Live Demo 👈 우리가 작업할 레이아웃을 미리 확인할 수 있습니다.
  • 너비가 1024px 이상일 떄는 아래와 같은 레이아웃이 되도록 해야합니다.

  • 너비가 768px 이상일 때는 다음과 같아야합니다.

  • 너비가 768px 이하 일때는 아래와 같아야 합니다.


HTML

  • 그리드 레이아웃을 구성
    • 768px 이하 일 때는 1개씩
    • 768px 이상 일 때는 첫 번째 줄에 1개, 두 번째 줄부터 2개씩
    • 1024px 이상 일 때는 첫 번째 줄에 2개, 두 번째 줄부터 4개씩 card 컨테이너가 등장합니다.
  • 배경 이미지는 image 클래스에 미리 들어가 있습니다.
<div class="container">
  <div class="menu-1">
    <a href="#" class="card">
      <div class="image" style="background-image: url(https://media.istockphoto.com/photos/fried-egg-with-bacon-in-a-white-plate-with-fried-pieces-of-bread-picture-id1079584712?k=20&m=1079584712&s=170667a&w=0&h=JuK4Je9_SHk3jZXYeifSVRvutE3CKih-_iRfH8T0Kb4=)">
      </div>
      <article>
        <h1>아메리카 브런치 세트</h1>
        <p>정성스럽게 구운 팬케익과 프렌치 토스트에 각종 사이드 디쉬, 그리고 샐러드를 곁들인 푸짐한 정통 미국식 브런치</p>
        <span>16,500원</span>
      </article>
    </a>
  </div>
  <div class="menu-2">
    <a href="#" class="card">
      <div class="image" style="background-image: url(https://images.unsplash.com/photo-1596649299486-4cdea56fd59d?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8MTV8fGJ1cmdlcnxlbnwwfHwwfHw%3D&auto=format&fit=crop&w=500&q=60)">
      </div>
      <article>
        <h1>트리플 머쉬룸 더블 버거</h1>
        <p>육즙 가득한 수제 버거패티와 트러플로 만든 특제 소스로 즐기는 프리미엄 더블 치즈 버거</p>
        <span>16,500원</span>
      </article>
    </a>
  </div>
  <div class="menu-3">
    <a href="#" class="card">
      <div class="image" style="background-image: url(https://images.unsplash.com/photo-1544025162-d76694265947?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1469&q=80);"></div>
      <article>
        <h1>로스티드 립&토마토</h1>
        <p>
          특제 허니갈릭 페스토를 얹어 통마늘과 함께 구워낸 취향저격 립
          스테이크
        </p>
        <span>31,000원</span>
      </article>
    </a>
  </div>
  <div class="menu-4">
    <a href="#" class="card">
      <div class="image" style="background-image: url(https://images.unsplash.com/photo-1540420773420-3366772f4999?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8M3x8c2FsYWR8ZW58MHx8MHx8&auto=format&fit=crop&w=500&q=60);"></div>
      <article>
        <h1>리코타 치즈 샐러드</h1>
        <p>매장에서 직접 끓여서 만든 수제 리코타치즈와 제철 과일 그리고 호밀빵</p>
        <span>Kezz Bracey</span>
      </article>
    </a>
  </div>
  <div class="menu-5">
    <a href="#" class="card">
      <div class="image" style="background-image: url(https://images.unsplash.com/photo-1593253500499-50e579a5733f?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8MTA1fHxwYXN0YXxlbnwwfHwwfHw%3D&auto=format&fit=crop&w=500&q=60);"></div>
      <article>
        <h1>명란 오일 파스타</h1>
        <p>각종 해산물과 마늘 그리고 신선한 명란알을 넣은 시그니처 오일 파스타</p>
        <span>14,500원</span>
      </article>
    </a>
  </div>
  <div class="menu-6">
    <a href="#" class="card">
      <div class="image" style="background-image: url(https://images.unsplash.com/photo-1587116861219-230ac19df971?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8Mjh8fG1lYWx8ZW58MHx8MHx8&auto=format&fit=crop&w=500&q=60);"></div>
      <article>
        <h1>스트립 관자</h1>
        <p>관자살의 부드러운 식감을 느낄 수 있는 샐러드</p>
        <span>17,500원</span>
      </article>
    </a>
  </div>
  <div class="menu-7">
    <a href="#" class="card">
      <div class="image" style="background-image: url(https://images.unsplash.com/photo-1562022791-b74585b094d8?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8MTEyfHxkZXNzZXJ0fGVufDB8fDB8fA%3D%3D&auto=format&fit=crop&w=500&q=60);"></div>
      <article>
        <h1>딸기 케이크</h1>
        <p>진한 우유 생크림과 딸기가 조화를 이룬 케이크</p>
        <span>26,000원</span>
      </article>
    </a>
  </div>
</div>

CSS 1 - grid-template

  • container 클래스에 grid-template 속성을 이용해서 레이아웃을 구성합니다.
  • 브라우저 너비가 768px 이하 일때는 container 클래스의 grid-template-columns를 1fr 하나만 줍니다.
  • 즉 컬럼을 1개만 생성한다는 의미입니다.
  • 768px 이상 일 때는 컬럼을 2개 생성합니다.
  • 그리고 첫 번째 card인 menu-1 클래스에 grid-column을 직접 할당 함으로써 1줄을 다 차지하도록 합니다.
  • 1024px 이상 일 떄는 컬럼을 4개 생성합니다.
  • 첫 번째와 두 번째 card인 menu-1과 menu-2 클래스에 공평하게 grid-column 값을 할당 함으로써 1줄에 2개의 card를 구성합니다.
    html {
  background: #f5f5f5;
  font-family: 'Roboto', sans-serif;
  padding: 20px 0;
}

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

a {
  text-decoration: none;
  color: #555;
}

.container {
  width: 90%;
  max-width: 1240px;
  margin: 0 auto;

  display: grid;

  grid-template-columns: 1fr;
  grid-template-rows: auto;
  grid-gap: 20px;
}

@media screen and (min-width: 768px) {
  .container {
    grid-template-columns: 1fr 1fr;
  }

  .menu-1 {
    grid-column: 1 / 3;
  }

  .menu-1 h1 {
    font-size: 2rem;
  }
}

@media screen and (min-width: 1024px) {
  .container {
    grid-template-columns: repeat(4, 1fr);
  }

  .menu-1 {
    grid-column: 1 / 3;
  }

  .menu-2 {
    grid-column: 3 / 5;
  }
}

.card {
  min-height: 100%;
  background: #EEE;
  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
  display: flex;
  flex-direction: column;
  position: relative;
  top: 0;
  transition: all 0.2s ease-in-out;
}

.card:hover {
  top: -3px;
  box-shadow: 0 10px 10px rgba(0, 0, 0, 0.1);
}

.card article {
  padding: 1.5rem;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  flex: 1;
  background-color: white;
}

.image {
  padding-bottom: 50%;
  background-size: cover;
  background-position: center center;
}

.card p {
  flex: 1;
  line-height: 1.4;
}

h1 {
  font-size: 1.5rem;
  color: #444;
}

.card span {
  font-size: 0.8rem;
  font-weight: bold;
  color: #AAA;
  margin: 2rem 0 0 0;
}

CSS 2 - grid-template-area

  • container 클래스에 grid-template-area를 할당하고, menu-1~menu-7 클래스에 grid-area를 할당하는 방법도 살펴보겠습니다.
  • 나머지 style은 위의 css와 동일합니다.
.container {
  grid-template-areas:
    "menu1 menu1 menu2 menu2"
    "menu3 menu4 menu5 menu6"
    "menu7 . . .";
}

@media screen and (max-width: 1024px) {
  .container {
    grid-template-areas:
      "menu1 menu1"
      "menu2 menu3"
      "menu4 menu5"
      "menu6 menu7";
  }
}

@media screen and (max-width: 768px) {
  .container {
    grid-template-areas:
      "menu1"
      "menu2"
      "menu3"
      "menu4"
      "menu5"
      "menu6"
      "menu7";
  }
}

.menu-1 {
  grid-area: menu1;
}
.menu-2 {
  grid-area: menu2;
}
.menu-3 {
  grid-area: menu3;
}
.menu-4 {
  grid-area: menu4;
}
.menu-5 {
  grid-area: menu5;
}
.menu-6 {
  grid-area: menu6;
}
.menu-7 {
  grid-area: menu7;
}

나가면서

  • 지금까지 Grid를 사용해서 반응형 페이지 레이아웃을 구성해 보았습니다.
  • card를 감싸는 container 태그에 grid-template속성을 주는 방식과 grid-template-area속성을 주는 방식이 있습니다.
  • 둘 중에 아무거나 사용해도 상관없습니다.
  • Grid를 사용하면 웹 페이지 레이아웃을 구성하는 작업이 간편해진다는 것을 알게되었습니다.

참고

'CSS' 카테고리의 다른 글

GRID 사용정리  (0) 2024.03.11
flex 사용정리  (0) 2024.03.11
CSS flex를 이용한 Youtube Navbar 만들기  (0) 2023.11.27
CSS - 플렉스 박스  (0) 2023.10.24
CSS - 반응형 레이아웃  (0) 2023.10.24