See the Pen digitalfatigue copy by Oh Ikmyeong (@dpffpself) on CodePen.
HTML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Digital Fatigue</title> <link rel="stylesheet" href="./style.css" type="text/css"> <script src="./main.js" type="module"></script> </head> <body> <section class="sect sect01">Hello World</section> <section class="sect sect02 normal"> <div class="bg bg02"> <img src="https://plus.unsplash.com/premium_photo-1743169791428-2d1b1a8e518f?q=80&w=1332&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" /> </div> <div class="textWrap02"> <h1>Section 02</h1> <div class="text02"> <p>Lorem, ipsum dolor sit amet consectetur adipisicing elit. Placeat quis, fugit, distinctio enim rem sequi cupiditate quisquam voluptatum eum repellendus vel rerum, itaque accusamus nisi laudantium? Sequi provident et incidunt?</p> <p>Lorem, ipsum dolor sit amet consectetur adipisicing elit. Placeat quis, fugit, distinctio enim rem sequi cupiditate quisquam voluptatum eum repellendus vel rerum, itaque accusamus nisi laudantium? Sequi provident et incidunt?</p> <p>Lorem, ipsum dolor sit amet consectetur adipisicing elit. Placeat quis, fugit, distinctio enim rem sequi cupiditate quisquam voluptatum eum repellendus vel rerum, itaque accusamus nisi laudantium? Sequi provident et incidunt?</p> </div> </div> </section> <section class="sect sect03"> <article class="inner03"> <div class="innerScroll03"> <article class="left03">LEFT</article> <ul class="center03"> <li class="center03Item">01</li> <li class="center03Item">02</li> <li class="center03Item">03</li> <li class="center03Item">04</li> <li class="center03Item">05</li> <li class="center03Item">06</li> <li class="center03Item">07</li> <li class="center03Item">08</li> <li class="center03Item">09</li> <li class="center03Item">10</li> <li class="center03Item">11</li> <li class="center03Item">12</li> <li class="center03Item">13</li> <li class="center03Item">14</li> <li class="center03Item">15</li> </ul> <article class="end03">END</article> </div> </article> </section> <section class="sect sect04"> <div class="inner04"> <h2>fixed until scroll</h2> <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Et perspiciatis maxime debitis laudantium alias iusto nulla ex accusantium porro dolore sit ipsam eius autem expedita incidunt minima, soluta aspernatur veritatis!</p> </div> </section> <section class="sect sect05"> <h1> NORMAL </h1> </section> </body> </html> | cs |
CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 | @charset "UTF-8"; * { margin: 0; padding: 0; box-sizing: border-box; } li{list-style-type:none;} img { vertical-align: middle; width: 100%; height: auto; } .sect { position: relative; width: 100%; } .sect01 { display: flex; justify-content: center; align-items: center; height: 100vh; background: #f1f1f1; font-size: 10vw; } /* ====================================== */ .sect02 { position: relative; overflow: hidden; padding: 20vmax 0; background: beige; border: 2px solid black; text-align: center; } .bg02 { position: absolute; width: 100%; height: 100vh; } .sect02.normal .bg02 { top: 0; left: 0; } .sect02.fixed .bg02 { position: fixed; top: 0; left: 0; } .sect02.end .bg02 { position: absolute; bottom: 0; left: 0; } .bg02 img { width: 100%; height: 100%; object-fit: cover; } .textWrap02 { position: relative; color: #fff; } .textWrap02 h1 { padding: 30vh 0; font-size: 10vmax; } .text02 { display: flex; flex-flow: column nowrap; gap: 2em; padding: 2em 1em; font-size: 3vmax; } /* ====================================== */ .sect03 { position: relative; width: 100%; min-height: 500vh; background: #ccc; border: 2px solid black; } .inner03{ position:sticky; overflow:hidden; top:0;left:0; background:#fff; height:100vh; } .innerScroll03{ display:flex;flex-flow:row nowrap; justify-content:flex-start; align-items:stretch; position:relative; height:100%; } .left03{ flex:none; display:flex; justify-content:center; align-items:center; position:relative; width:80vw; height:100%; border:3px solid black; font-size:10vw; } .center03{ flex:none; display:grid; grid-template-columns:repeat(5, 1fr); grid-template-rows:repeat(3,1fr); position:relative; height:100%; } .center03Item{ display:flex; justify-content:center; align-items:center; position:relative; width:100%; border:3px dotted #000; aspect-ratio:16/9; } .end03{ flex:none; position:relative; width:60vw; height:100%; background:#ccc; border:2px solid #000; } /* ====================================== */ .sect04{ position:relative; width:100%; height:200vh; background:#000; } .inner04{ display:flex; flex-flow: column nowrap; gap:10vmin; justify-content:center; align-items:center; position:absolute; top:0;left:0; width:100%;height:100vh; padding:10vmin; background:beige; } .sect04.fixed .inner04{ position:fixed; } /* ====================================== */ .sect05{ position:relative; width:100%; height:200vh; background:blueviolet; } .sect04.fixed ~ .sect05{ /* padding-top:100vh; */ } /* ====================================== */ | cs |
JS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | window.addEventListener("scroll", () => { const scY = window.scrollY; sect02(scY); sect03(scY); sect04(scY); }); /** * 배경화면 fixed * @param {*} scY */ function sect02(scY) { const $sect02 = document.querySelector(".sect02"); const { top, height } = $sect02.getBoundingClientRect(); if (top >= 0) { $sect02.classList.add("normal"); $sect02.classList.remove("fixed"); $sect02.classList.remove("end"); } else if (top < 0) { if (scY < height) { $sect02.classList.remove("normal"); $sect02.classList.add("fixed"); $sect02.classList.remove("end"); } else { $sect02.classList.remove("normal"); $sect02.classList.remove("fixed"); $sect02.classList.add("end"); } } // console.log(top, height, scY); }//sect02 /** * * @param {*} scY */ function sect03(scY) { const $sect03 = document.querySelector(".sect03"); const $ins = $sect03.querySelector(".innerScroll03"); const { top } = $sect03.getBoundingClientRect(); const widthFull = Array.from($ins.children).reduce((acc, curr) => { return acc + curr.offsetWidth; }, 0); const limit = parseInt(((widthFull - window.innerWidth) / window.innerWidth) * -100); const per = parseInt(top / (window.innerWidth / 100)); if (top <= 0) { if (per <= limit) { $ins.style.transform = `translateX(${limit}%)`; } else { $ins.style.transform = `translateX(${per}%)`; } } else { $ins.style.transform = "translateX(0%)"; } }//sect03 /** * * @param {*} scY */ function sect04(scY) { const $sect04 = document.querySelector(".sect04"); const { top } = $sect04.getBoundingClientRect(); if (top <= 0) { $sect04.classList.add("fixed"); } else { $sect04.classList.remove("fixed"); } }//sect04 | cs |
'CSS&JS > 👀Study and Copy' 카테고리의 다른 글
[CSS+JS] requestAnimationFrame 으로 로딩 효과 구현하기 (0) | 2025.04.10 |
---|---|
[JS+CSS]Madia님 영상보다가 디자인 예쁜거 구현해보기 (고객의 소리 부분) (0) | 2024.10.04 |
[CSS]inverted border-radius 안쪽으로 파인 효과 (0) | 2024.09.30 |
[JS]Trello 스타일의 drag & drop 구현하기 (1) | 2024.09.27 |
[LunDev]CSS only marquee slider (0) | 2024.09.19 |