web/toy project

[html css] 웹사이트 상품 리스트 제작하기

xudegloss 2023. 3. 12. 23:34

1. 트랜스폼과 트랜지션 동시에 이용하기

- 트랜스폼을 이용하여 화면에 변화를 줄 수 있다.

- 트랜지션을 이용하여 변화를 부드럽게 보여줄 수 있다.

 

  • 마우스 올렸을 때 트랜스폼을 이용하여 translateY로 글자를 위로 올려버린다.
  • 자연스러운 움직임을 위하여 트랜지션을 이용한다.
  • 글자 마다 늦어지는 속도가 다르기 때문에, 모든 글자에 다 다른 transition-delay를 넣어준다.

이런 식으로 동시에 이용하면 부드러운 변화를 생성할 수 있다.

2. 웹사이트 상품 리스트 만들기

필요한 기능
1. 4 x 3 정렬시키기.
2. 마우스를 올리면 화면 살짝 까매지면서 커지게 만들기. 살짝 까만 화면과 투명도 이용하면 된다.
3. 마우스를 올리면 상품 정보 올라오게 만들기. 투명도를 이용하면 된다.

내가 만들어야 되는 것은 사진 정렬과 상품 정렬 그리고 살짝 까만 화면이다.

  • 사진, 상품 정보, 살짝 까만 화면 만들기. 살짝 까만 화면은 after를 이용하여 만들 것이다. 이 때 주의할 점은 display : block과 content를 잘 적어주기.
  • 마우스 올리기 전 후를 투명도 이용하여 만들어주기. 이 때 글자가 잘 보이도록 z-index 이용하기.
  • 마우스를 올렸을 때, 트랜스폼을 이용하여 위로 올리기.
  • 변화가 적용되는 모든 곳에 트랜지션을 이용하여 부드럽게 만들기. 모두 동일하여 공통으로 설정하였다.
  • 4 x 3 정렬 시에 width와 height는 calc 함수와 aspect-ratio 이용하여 만들어주기.
  • 주의할 점은 가로, 세로 길이를 설정할 때 100%를 잘 이용하자. 부모 태그에 설정했더라도, 자식 태그에 100%가 설정되지 않으면 적용되지 않는 경우가 생기기 때문이다.
  • position : relative와 absolute를 잘 이용하여 원하는 위치에 넣을 수 있도록 조정하기.
1. 공통되는 부분 한 개를 만들어서 확인한 후에 여러 개를 찍어낸다.
2. 레이아웃을 지정하기.
3. 트랜스폼 적용하기. 각각의 요소 결과에 트랜스폼 적용하기.
4. 트랜지션 적용하기. 각각의 요소 그 자체에 트랜지션 적용하기.


주의할 점
1. % 이용할 때 부모 태그를 항상 확인하기. %는 부모 태그의 사이즈에 따라 자식 태그의 사이즈가 결정되기 때문이다.
2. 각각의 요소 그 자체에 트랜지션 적용하기. 그것의 부모 태그에 적용하면 원하는 스타일이 적용되지 않을 수가 있다. 결과에 적용하는 것은 트랜스폼!

3. html 코드

<!DOCTYPE html>
<html lang="ko">
  <head>
    <title>Goods List</title>
    <link rel="stylesheet" href="./goods__list.css" />
  </head>
  <body>
    <div class="container">
      <div class="item">
        <div class="imgBox">
          <img src="./images/item1.jpeg" alt="탁상용 조명" />
        </div>
        <div class="textBox">
          <p class="textBox__name">탁상용 조명</p>
          <p class="textBox__price">260,000 원</p>
        </div>
      </div>
      <div class="item">
        <div class="imgBox">
          <img src="./images/item2.png" alt="머그컵" />
        </div>
        <div class="textBox">
          <p class="textBox__name">머그컵</p>
          <p class="textBox__price">32,000 원</p>
        </div>
      </div>
      <div class="item">
        <div class="imgBox">
          <img src="./images/item3.jpeg" alt="거실용 슬리퍼" />
        </div>
        <div class="textBox">
          <p class="textBox__name">거실용 슬리퍼</p>
          <p class="textBox__price">28,000 원</p>
        </div>
      </div>
      <div class="item">
        <div class="imgBox">
          <img src="./images/item1.jpeg" alt="탁상용 조명" />
        </div>
        <div class="textBox">
          <p class="textBox__name">탁상용 조명</p>
          <p class="textBox__price">260,000 원</p>
        </div>
      </div>
      <div class="item">
        <div class="imgBox">
          <img src="./images/item2.png" alt="머그컵" />
        </div>
        <div class="textBox">
          <p class="textBox__name">머그컵</p>
          <p class="textBox__price">32,000 원</p>
        </div>
      </div>
      <div class="item">
        <div class="imgBox">
          <img src="./images/item3.jpeg" alt="거실용 슬리퍼" />
        </div>
        <div class="textBox">
          <p class="textBox__name">거실용 슬리퍼</p>
          <p class="textBox__price">28,000 원</p>
        </div>
      </div>
      <div class="item">
        <div class="imgBox">
          <img src="./images/item1.jpeg" alt="탁상용 조명" />
        </div>
        <div class="textBox">
          <p class="textBox__name">탁상용 조명</p>
          <p class="textBox__price">260,000 원</p>
        </div>
      </div>
      <div class="item">
        <div class="imgBox">
          <img src="./images/item2.png" alt="머그컵" />
        </div>
        <div class="textBox">
          <p class="textBox__name">머그컵</p>
          <p class="textBox__price">32,000 원</p>
        </div>
      </div>
      <div class="item">
        <div class="imgBox">
          <img src="./images/item3.jpeg" alt="거실용 슬리퍼" />
        </div>
        <div class="textBox">
          <p class="textBox__name">거실용 슬리퍼</p>
          <p class="textBox__price">28,000 원</p>
        </div>
      </div>
      <div class="item">
        <div class="imgBox">
          <img src="./images/item1.jpeg" alt="탁상용 조명" />
        </div>
        <div class="textBox">
          <p class="textBox__name">탁상용 조명</p>
          <p class="textBox__price">260,000 원</p>
        </div>
      </div>
      <div class="item">
        <div class="imgBox">
          <img src="./images/item2.png" alt="머그컵" />
        </div>
        <div class="textBox">
          <p class="textBox__name">머그컵</p>
          <p class="textBox__price">32,000 원</p>
        </div>
      </div>
      <div class="item">
        <div class="imgBox">
          <img src="./images/item3.jpeg" alt="거실용 슬리퍼" />
        </div>
        <div class="textBox">
          <p class="textBox__name">거실용 슬리퍼</p>
          <p class="textBox__price">26,000 원</p>
        </div>
      </div>
    </div>
  </body>
</html>

4. css 코드

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

.container {
  display: flex;
  flex-flow: row wrap;
  justify-content: space-between;
  align-content: flex-start;
}

/* item에 hidden 처리하기. */
.item {
  width: calc(25% - 7px);
  aspect-ratio: 6/5;
  position: relative;
  overflow: hidden;
  border-radius: 10px;
}

.item:after {
  /* block & content */
  display: block;
  content: "";
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.2);
  position: absolute;
  top: 0;
  left: 0;
  z-index: 2;
  opacity: 0;
}

.imgBox {
  width: 100%;
  height: 100%;
  position: absolute;
}

.imgBox img {
  width: 100%;
  height: 100%;
  /* 사진이나 비디오의 규격 맞출 때 object-fit 이용하기. */
  object-fit: cover;
  z-index: 1;
}

.textBox {
  position: absolute;
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  align-items: flex-start;
  padding: 20px;
  z-index: 3;
}

.textBox p {
  color: white;
  margin: 5px 0 0;
}

.textBox__name {
  font-size: 22px;
  font-weight: 500;
  opacity: 0;
  transform: translateY(50px);
}

.textBox__price {
  font-size: 16px;
  font-weight: 400;
  opacity: 0;
  transform: translateY(50px);
}

/* 마우스 올렸을 때에 기능 추가하기. */
.item:hover:after {
  opacity: 1;
}

/* 기능 1 : 화면 살짝 불투명 + 화면 커지기. */
.item:hover .imgBox img {
  transform: scale(1.1);
  /* 블러 처리하기. */
  filter: blur(3px);
}

/* 기능 2 : 상품 정보 보이면서 위로 올라가기. */
.item:hover .textBox .textBox__name {
  opacity: 1;
  transform: translateY(0px);
}

/* 기능 2 : 상품 정보 보이면서 위로 올라가기. */
.item:hover .textBox .textBox__price {
  opacity: 1;
  transform: translateY(0px);
}

/* 자연스럽게 트랜지션 적용하기. */
.item:after,
.item .imgBox img,
.item .textBox__name,
.item .textBox__price {
  transition: all 0.4s ease-in-out;
}