実現したいこと
X方向のスクロールコンテナのスクロール時、余白を設けたいです。
前提条件:
スクロールコンテナとhtml要素にscroll-behavior: smoothが効いている
祖先要素にposition: stickyとanimation-timeline: scroll()が効いている
cssでカルーセルを構成している
カルーセルは、クリップコンテナ?マスクコンテナ(.slider)、その中のスクロールコンテナ(.slides)、その中のスライド(.slide)の三段構造に分かれている
カルーセルのボタンを押すと、対応したページ内リンク(X方向)へとスクロール
カルーセルの上にはh2があり、スクロール時にそこが隠れるので何とかしたい
発生している問題・分からないこと
html {}に書いたscroll-padding-topとカルーセルのスライドに書いたネガティブなscroll-marginは効くが、他の要素は効かないです
該当のソースコード
html
1<!--- position: stickyの可動範囲 ---> 2<div id="fellow-container"> 3 <!--- position: stickyを持つクリップコンテナ ---> 4 <section id="fellow"> 5 <!--- animation-timeline: scroll()を持つ要素 ---> 6 <div class="scale-container"> 7 <h2> 8 スタッフ紹介 9 </h2> 10 <!--- カルーセルを二つ横並べにするコンテナ ---> 11 <div class="staff-container"> 12 <!--- カルーセルAのクリップコンテナ ---> 13 <div class="staff-info-container slider"> 14 <!--- カルーセルAのスクロールコンテナ ---> 15 <div class="staff-info-wrapper slides"> 16 <!--- カルーセルAのスライドたち ---> 17 <div class="staff-info slide" id="staff-slide-1"> 18 <p class="roll">やくわり</p> 19 <p class="name">なまえ</p> 20 <p class="comment"> 21 こんにちは 22 </p> 23 <a class="more-info" href="">くわしくみる</a> 24 <a href="#staff-slide-3" class="prev-btn caption">前に戻るボタンはここです。以後、前といいます</a> 25 <a href="#staff-slide-2" class="next-btn caption">次へ行くボタンはここです。以後、次といいます</a> 26 </div> 27 <div class="staff-info slide" id="staff-slide-2"> 28 <p class="roll">やくわり</p> 29 <p class="name">なまえ</p> 30 <p class="comment"> 31 こんにちは 32 </p> 33 <a class="more-info" href="">くわしくみる</a> 34 <a href="#staff-slide-1" class="prev-btn caption">前</a> 35 <a href="#staff-slide-3" class="next-btn caption">次</a> 36 </div> 37 <div class="staff-info slide" id="staff-slide-3"> 38 <p class="roll">やくわり</p> 39 <p class="name">なまえ</p> 40 <p class="comment"> 41 こんにちは 42 </p> 43 <a class="more-info" href="">くわしくみる</a> 44 <a href="#staff-slide-2" class="prev-btn caption">前</a> 45 <a href="#staff-slide-1" class="next-btn caption">次</a> 46 </div> 47 </div> 48 </div> 49 </div> 50 </section> 51 </div>
css
1.slider { 2 .slides { 3 display: flex; 4 overflow: auto; 5 6 scroll-behavior: smooth; 7 8 scroll-snap-type: x mandatory; 9 10 scrollbar-width: none; 11 -ms-overflow-style: none; 12 13 &::-webkit-scrollbar { 14 display: none; 15 } 16 17 &:not(:has(div.slide:target)) { 18 19 .slide { 20 &:nth-of-type(1) { 21 22 .prev-btn, 23 .next-btn { 24 display: block; 25 } 26 } 27 } 28 29 } 30 31 .slide { 32 flex-shrink: 0; 33 scroll-snap-align: center; 34 35 &:target { 36 37 .prev-btn, 38 .next-btn { 39 display: block; 40 } 41 } 42 43 .prev-btn, 44 .next-btn { 45 display: none; 46 } 47 } 48 } 49} 50 51#fellow-container { 52 position: relative; 53 width: 100%; 54 height: 200svh; 55 background-color: var(--white); 56 57 #fellow { 58 color: var(--white); 59 position: sticky; 60 top: 0; 61 left: 0; 62 width: 100%; 63 height: 100svh; 64 background-color: var(--white); 65 overflow: clip; 66 67 .scale-container { 68 position: relative; 69 top: 50%; 70 left: 50%; 71 width: 120%; 72 height: 120vw; 73 border-radius: 50%; 74 background-color: var(--orange); 75 /* animation-name: scaleIn3; */ 76 animation-timing-function: ease-out; 77 animation-fill-mode: both; 78 animation-timeline: scroll(); 79 animation-range: 180svh 250svh; 80 81 translate: -50% -50%; 82 83 h2 { 84 padding-top: 100svh; 85 } 86 87 .staff-container { 88 display: flex; 89 justify-content: center; 90 gap: 153px; 91 padding-top: 50px; 92 93 .staff-info-container { 94 width: 608px; 95 position: relative; 96 97 .staff-info-wrapper { 98 .staff-info { 99 text-align: center; 100 width: 608px; 101 padding-bottom: 20px; 102 103 .roll { 104 font-size: 24px; 105 font-weight: 700; 106 padding-bottom: 22px; 107 } 108 109 .name, 110 .comment { 111 font-family: "Shirokuma"; 112 font-size: 36px; 113 padding-bottom: 40px; 114 } 115 116 a { 117 118 &.more-info { 119 &:hover { 120 background-color: var(--bright-orange); 121 } 122 } 123 124 &.prev-btn, 125 &.next-btn { 126 position: absolute; 127 bottom: 200px; 128 width: 50px; 129 height: 50px; 130 background-color: var(--white); 131 opacity: .6; 132 133 &:hover { 134 opacity: 1; 135 } 136 } 137 138 &.prev-btn { 139 left: -50px; 140 clip-path: polygon(0 50%, 80% 0, 80% 100%); 141 142 &:hover { 143 translate: -5px -5px; 144 } 145 } 146 147 &.next-btn { 148 right: -50px; 149 clip-path: polygon(100% 50%, 20% 100%, 20% 0); 150 151 &:hover { 152 translate: 5px -5px; 153 } 154 } 155 } 156 } 157 } 158 } 159 } 160 } 161 } 162}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
scroll-padding-blockを使ったときに
block方向が、スクロール軸と並行な、積みあがっていくような軸で
inline方向が、スクロール軸と垂直な、少しずつ埋めていくような軸だということは分かったが
解決には至らなかった
(反対だったかもしれない)
補足
所々、要らないコードを書き換えている可能性があります
すみません コードそれでも長いです
###追記
まだテスト中ではありますが、
.slides(スクロールコンテナ)に scroll-padding-bottom: calc((120vw - 100svh - 100px) / 2);
.slide(スライド)に scroll-margin-top: calc((120vw - 100svh - 100px) / 2);を両方とも記述すると、画面上方向 へとスクロールする変化がありました。(記載したコードは一部なので、それだと変化がないかもしれないです)片方を抜いて数値を二倍にすると変化が起こらなくなる(上に余白100pxを空けてスクロールする)なので どういった法則があるのか調べます

回答1件
あなたの回答
tips
プレビュー