상품 카드 hover 시 caption이
아래에서 슬라이드 업 되는 원리
쇼핑몰에서 자주 보는 패턴이다. 평소에는 상품 이미지만 보이다가, 마우스를 올리면 설명·가격이 적힌 검은 반투명 박스가 아래에서 슬라이드 업 하면서 이미지를 덮는다. 핵심 트릭은 caption을 처음부터 화면에 그려두지 않고, 이미지 바로 아래(보이지 않는 곳)에 숨겨두었다가 hover 시 위로 끌어올리는 것이다.
-
상품 1
상품 1
상품 1 설명 텍스트
가격 : 12,345원
-
상품 2
상품 2
상품 2 설명 텍스트
가격 : 12,345원
-
상품 3
상품 3
상품 3 설명 텍스트
가격 : 12,345원
이 코드의 가장 중요한 발상은 caption이 hover 순간 없다가 새로 만들어지는 게 아니라, 처음부터 li 영역 바로 아래(top:200px) 자리에 그려져 있다는 점이다. 평소엔 두 가지 장치로 안 보이게 처리한다.
- li 박스 밖으로 삐져나간 부분 잘라냄
- caption은 top:200px → li 아래쪽 → 잘려서 안 보임
- 이게 없으면 평소에도 카드 밑에 caption이 보임
- 완전 투명 — 위치는 그대로지만 시각적으로 0
- hover 시 1로 페이드인
- 이중 안전장치 + 페이드 효과까지 부여
display:none이 아니라 opacity:0을 쓴 이유: display:none은 transition이 안 먹는다. 부드러운 페이드를 주려면 opacity여야 한다.absolute는 "가장 가까운 position이 지정된 조상"을 기준으로 위치한다. 이번 코드에서 만약 li에 position:relative가 없다면, caption은 화면(body) 기준 top:200px로 가버려서 카드 아래가 아니라 페이지 어딘가에 떠다니게 된다.
- 오버레이를 깔고 싶으면 → 부모 relative + 자식 absolute
- 모달 띄우고 싶으면 → body·section relative + 자식 absolute (또는 fixed)
- tooltip 띄우고 싶으면 → 호버 대상 relative + tooltip absolute
이번 코드의 이미지 높이가 200px이다. caption도 height:200px이다. top:200px은 caption을 이미지의 정확히 아래 칸에 배치한다.
hover 시 translateY(-200px)로 caption을 200px 위로 끌어올리면, 이미지 위치를 정확히 덮는다.
"caption을 위로 올리고 싶다"면 top: 0으로 바꿔도 결과는 같아 보인다. 하지만 두 방식은 성능과 부드러움이 다르다.
| 방식 | 처리 단계 | 부드러움 |
|---|---|---|
top 변경 |
레이아웃 → 페인트 → 합성 | 박스 위치 재계산 발생, 끊겨 보일 수 있음 |
transform 변경 |
합성만 (GPU 가속) | 레이아웃 영향 없음 → 부드러움 |
그냥 black이면 caption이 이미지를 완전히 가린다. rgba(0,0,0,0.6)은 검정 + 60% 불투명으로, 뒤의 이미지가 살짝 비치면서 텍스트가 잘 읽힌다.
이번 코드에서 img는 z-index:5, caption은 z-index:10이다. 숫자가 클수록 위에 그려진다. caption이 슬라이드업 했을 때 이미지를 덮어야 하니까 caption 쪽이 더 커야 한다.
position: static(기본값)인 요소엔 z-index가 안 먹힌다- relative, absolute, fixed, sticky 중 하나여야 효과 있음
- 이번 코드는 caption이 absolute, img는 float 상태 — 같은 stacking 컨텍스트 안에서 비교
| 실수 | 증상 | 해결 |
|---|---|---|
li에 position:relative 빠뜨림 |
caption이 페이지 어딘가로 날아감 | 부모 li에 relative 명시 |
overflow:hidden 빠뜨림 |
평소에도 caption이 카드 밑에 보임 | li에 overflow:hidden |
| caption에 transition 없음 | 딸깍 — 점프하듯 나타남 | caption 평소 상태에 transition 정의 (양방향 적용) |
display:none으로 숨김 |
페이드 효과가 안 먹음 | opacity:0 + transition |
| hover 상태에 transition 정의 | 들어갈 땐 부드럽고 나올 땐 점프 | transition은 항상 평소 상태에 정의 |
| z-index가 caption < img | caption이 이미지 뒤로 가려져 안 보임 | caption의 z-index를 img보다 크게 |
| top 변경으로 슬라이드 | 버벅거림, 모바일에서 끊김 | transform: translateY로 GPU 가속 |
이번 원본은 float:left로 카드를 가로 정렬했다. 2026년 기준 권장은 부모에 flex나 grid를 주는 방식이다.
.prod-list li {
float: left;
}clearfix 필요, 반응형 어려움
.prod-list {
display: flex;
flex-wrap: wrap;
gap: 14px;
}정렬·간격이 한 번에 깔끔
핵심 한 줄 요약
Tags
'php' 카테고리의 다른 글
| 포트폴리오 공통 CSS — mportpolio.css 완전 정리 (0) | 2026.06.20 |
|---|---|
| 이미지 hover 시 확대 + 그림자 — transform-origin · scale · box-shadow 완전 정리 (0) | 2026.06.20 |
| CSS transition-delay 완전 정리 — 같은 시간을 줘도 늦게 출발하는 박스 (0) | 2026.06.20 |
| 실습 2 — 호버 시 사진을 회전시키며 둥근 테두리로 (0) | 2026.06.20 |
| 실습 1 — 호버 시 초록 → 노랑 박스 색상 전환 (0) | 2026.06.20 |
왕진 블로그

댓글