유형
실습문서
주제
css효과
순번
1
태그
설명
오직!! CSS로횡스크롤!!!NO! JS !!
‣
1.이미지다운로드
2. 기본 구조작성
2-1. html 구조작성
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- .container>section+section#sectionPin+section -->
<div class="container">
<section>
<!-- div>(h1>span*3)+p -->
<div>
<h1><span>가로</span><span>스크롤</span><span>페이지</span></h1>
<p>css만으로 구현해보자</p>
</div>
</section>
<section id="sectionPin">
<!-- .pin-wrap-sticky>figure>figcaption+img*3 -->
<div class="pin-wrap-sticky">
<figure class="pin-wrap">
<figcaption>
<h2>Lorem ipsum dolor sit amet consectetur adipisicing elit. Sint, quod, minus adipisci cupiditate quo dolor veniam molestiae nobis quia saepe ea explicabo tempore sed deserunt in quos vero consequatur laudantium?</h2>
</figcaption>
<img src="1.png" alt="">
<img src="2.png" alt="">
<img src="3.png" alt="">
</figure>
</div>
</section>
<section>
<figure>
<img src="3.png" alt="">
<figcaption><h2>Created by Mango</h2></figcaption>
</figure>
</section>
</div>
</body>
</html>
2-2. 초기화코드
@import url(https://qwerewqwerew.github.io/source/style/reset.css);
:root {
--text-color: #111;
--bg-color: #b9b3a9;
}
html {
max-width: 100vw;
}
body {
color: var(--text-color);
background: var(--bg-color);
transition: 0.3s ease-out;
overflow-x: hidden;
max-width: 100vw;
width: 100%;
overscroll-behavior: none;
}
overscroll-behavior CSS 속성 사용자가 스크롤 가능한 범위의 끝이나 시작에 도달했을 때 그 이후의 스크롤 동작을 어떻게 처리할지를 정의한다.
- none : 스크롤 이벤트가 상위 요소로 전파되는 것을 막는다. (터치 스크린 장치에서 유용)
모달 창이나 드롭다운 메뉴 내부에서 스크롤할 때, 사용자가 스크롤의 끝에 도달했을 때 기본 문서(body)까지 스크롤이 전파되지 않도록 하고 싶을 때 사용한다.
2-3. 기초레이아웃
.container section {
min-height: 100vh;
width: 100%;
max-width: 100vw;
overflow-x: hidden;
position: relative;
}
section:not(#sectionPin, .pin-wrap-sticky) {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
grid-gap: 2rem;
padding: 50px 10vw;
margin: auto;
place-items: center;
}
.container img {
height: 80vh;
width: auto;
max-width: 100%;
object-fit: cover;
}
.container h1 {
font-size: clamp(1.5rem, 8vw + 1rem, 6rem);
line-height: 1;
font-weight: 800;
margin-bottom: 1rem;
position: absolute;
top: 10vw;
left: 10vw;
z-index: 4;
overflow-wrap: break-word;
hyphens: auto;
}
.container h1 span {
display: block;
}
.container h2 {
font-size: 2rem;
max-width: 400px;
}
.credit h2 {
color: var(--text-color);
}
.container * {
box-sizing: border-box;
}
#sectionPin {
height: 100vh;
display: flex;
background: var(--text-color);
color: var(--bg-color);
overflow: scroll;
}
.pin-wrap {
height: 100vh;
display: flex;
justify-content: flex-start;
align-items: center;
padding: 50px 10vw;
}
.pin-wrap>* {
min-width: 60vmax;
padding: 0 5vmax;
}
.container>p {
position: absolute;
bottom: 10vw;
right: 10vw;
width: 200px;
line-height: 1.5;
}
2-4. 가로 레이아웃
#sectionPin {
height: 500vh;
overflow: visible;
}
.pin-wrap-sticky {
height: 100vh;
width: 100vw;
position: sticky;
top: 0;
width: 100vw;
overflow-x: hidden;
}
.pin-wrap {
height: 100vh;
width: 250vmax;
}
3. 스크롤 애니메이션 구현
3-1. css 작성
@keyframes move {
to {
/* 우측끝이 뷰포트에 맞도록 수평이동 */
transform: translateX(calc(-100% + 100vw));
}
}
#sectionPin {
/* 스크롤영역을 확보하기 위해 높이 확장 */
height: 500vh;
overflow: visible;
/* 스크롤 애니메이션의 대상 지정 */
view-timeline-name: --section-pin-tl;
view-timeline-axis: block;
}
.pin-wrap-sticky {
/* 스티키할 대상 요소 스타일링 */
height: 100vh;
width: 100vw;
position: sticky;
top: 0;
width: 100vw;
overflow-x: hidden;
}
.pin-wrap {
height: 100vh;
width: 250vmax;
will-change: transform;
animation: linear move forwards;
/* 스크롤 애니메이션의 이름과 범위 설정 */
animation-timeline: --section-pin-tl;
animation-range: contain 0% contain 100%;
}