note.parts-tips.com

ヘッダーやサイドのメニューなど、画面スクロール時に特定の要素を固定したいという場合、これまではJavaScriptを使用して実装する必要がありましたが、現在はCSSのみで実装することが可能です。

以下はそれぞれ「ヘッダーを固定」「サイドメニューを固定」するHTMLとCSSのサンプルコードです。

【ヘッダー固定】
<div class="wrapper">
   
   <header>
      <h1>header</h1>
   </header>
   
   <main>
      <p>main</p>
   </main>
   
   <footer>
      <p>footer</p>
   </footer>
   
</div>

header {
   margin-bottom: 2em;
   padding: 1em;
   background-color: #758a93;
   position: sticky;
   top: 0;
}

h1 {
   color: #ecd5bc;
   font-size: 1.5em;
   text-align: center;
}

main {
   margin-inline: auto;
   padding: 1em;
   color: #ecd5bc;
   text-align: center;
   background-color: #c66e52;
   width: 90%;
   height: 1000px;
}

footer {
   margin-top: 2em;
   padding: 1em;
   color: #ecd5bc;
   text-align: center;
   background-color: #758a93;
}


【サイドメニュー固定】
<div class="wrapper">
   
   <header>
      <h1>header</h1>
   </header>
   
   <main>
      <div class="box_left">
         <p>main</p>
      </div>
      <div class="box_right">
         <p>side</p>
      </div>
   </main>
   
   <footer>
      <p>footer</p>
   </footer>
   
</div>

header {
   margin-bottom: 2em;
   padding: 1em;
   background-color: #758a93;
}

h1 {
   color: #ecd5bc;
   font-size: 1.5em;
   text-align: center;
}

main {
   margin-inline: auto;
   color: #ecd5bc;
   text-align: center;
   width: 90%;
   display: flex;
   align-items: flex-start;
}

.box_left {
   margin-right: auto;
   padding: 1em;
   background-color: #c66e52;
   width: 70%;
   height: 1000px;
}

.box_right {
   padding: 1em;
   width: 20%;
   background-color: #e9b63b;
   position: sticky;
   top: 0;
}

footer {
   margin-top: 2em;
   padding: 1em;
   color: #ecd5bc;
   text-align: center;
   background-color: #758a93;
}


サンプルコードのCSSはレイアウトやデザインも含んでいますが、要素固定の鍵となるのは、それぞれheader.box_rightに記述している以下のCSSです。


position: sticky;
top: 0;


positionは要素の配置を設定するプロパティで、stickyは「粘着性がある」という和訳のとおり、付箋のようなイメージです。初期配置は他の要素と同様ですが、画面が下方向にスクロールし position: sticky;が指定された要素に到達すると、その要素は指定した位置にとどまります。この状態で画面が上方向にスクロールされ、 position: sticky;が指定された要素が本来の表示位置に到達すると、以降上方向スクロール時は通常の要素と同様の挙動になります。

サンプルコードでは位置を top: 0;と指定しているので画面上部にピタッと吸い付きますが、上(top)、下(bottom)、左(left)、右(right)、あるいはまとめて(inset)位置指定が可能です。

なお、現時点では position: sticky;を指定した要素が「固定された状態」の場合にCSSを変更する(固定されたら背景色を変えるなど)ことができないので、この場合は position: sticky;を使用せず、JavaScriptを使用して固定する必要があります。

以下は参考情報です。




てがろぐの投稿フォームにも実装されている「ファイル選択」フォーム。このフォームの「ファイルを選択」というボタン(ブラウザによって「選択」など名称が異なります)は、CSSでスタイルの装飾が可能です。
以下はサンプルコードです。

<!-- HTML記述 -->
<input type="file" class="btn_custom">


/* CSS記述 */
.btn_custom::file-selector-button {
  padding: 0.25em;
  color: #fff;
  background-color: #000;
  border: 1px solid #000;
  border-radius: 5px;
}

.btn_custom:hover::file-selector-button {
  color: #000;
  background-color: #ccc;
}


ファイル選択フォーム(<input type="file">)に対して、擬似要素である::file-selector-buttonを追加することで、そのスタイルを変更することが可能です。

以下は参考情報です。



このコンテンツの右下に表示される「ページ上部へ戻る」ボタンでも表示している三角形は、CSSで実装しています。
以下はそのサンプルコードです。

<!-- HTML記述 -->
<div class="triangle"></div>


/* CSS記述 */
.triangle {
  background-color: #000;
  width: 40px;
  height: calc(tan(60deg) * 40px / 2);
  clip-path: polygon(50% 0, 100% 100%, 0 100%); /* 上向き */
  clip-path: polygon(0 0, 100% 50%, 0 100%); /* 右向き */
  clip-path: polygon(0 0, 100% 0, 50% 100%); /* 下向き */
  clip-path: polygon(0 50%, 100% 0, 100% 100%); /* 左向き */
}

.triangle { /* 正三角形 */
  background-color: #000;
  width: 40px;
  height: calc(40px / 2 * tan(60deg));
  clip-path: polygon(50% 0, 100% 100%, 0 100%);
}


三角形のサイズ調整は40pxの部分を変更します。heightcalc()に式を入れて、自動算出します(三角関数を使用します)
三角形の形は、clip-pathを使用します。このプロパティは対象の要素を指定した形でクリッピングします。三角形の場合はpolygon()(多角形)を使用し、三角形を定義します。

数値を変えたりすると三角形ではなくなりますが、それはそれで様々な形が生まれておもしろいので、いろいろ試してみてください。

以下は参考情報です。



このコンテンツの右下に表示される「ページ上部へ戻る」ボタンもそうですが、クリック(タップ)するとスルスルっと流れるようなアニメーションで画面がスクロールする挙動は、CSSで実装が可能です。
以下、そのコードです。

html {
  scroll-behavior: smooth;
}


scroll-behaviorはページ内リンクなどでスクロールが発生した際、その挙動を指定するプロパティです。初期値はautoです(初期値だとクリックするとアニメーションなくその箇所にすぐ移動します)
基本的にはそのページのページ内リンク全体に対してのスクロールの挙動となるため、html要素に対してCSSをあてます。

以前はJavaScriptで実装していたものですが、すこしまえのバージョンのブラウザからすでに対応済みなので、安心して実装できると思います。
ただスクロールアニメーションが追加されるだけでもサイトがいい感じに見えるので、ぜひ。

以下はこのプロパティのMDNの解説ページとブラウザ対応状況です。ご参考まで。

_admim_