Open18

Scss

まさきちまさきち

モダンCSSまとめ

https://zenn.dev/hiraoku/articles/926cbb8bc35eaa


  1. コンテナクエリの登場

container-type: inline-size;でコンテナのタイプを指定することで、コンテナの幅(inline-size)に基づいてクエリが適用される。

.product-container {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  padding: 10px;
  container-type: inline-size; /* コンテナタイプを設定 */
}

/* @containerを使って、クエリを設定 */
/* 幅が500px以上のときのスタイル */
@container (width >= 500px) {
  .product-card {
    background-color: lightblue; /* 背景色を青に変更 */
    flex-basis: calc(33.333% - 10px); /* 幅を変更 */
    font-size: initial; /* フォントサイズをリセット */
  }
}


  1. カスケードレイヤー @layer

CSSの詳細度とスタイルの順番を明示的に階層化することが可能。
※ カスケードレイヤーで当てたスタイルは、!importantで指定するより優先度が低い。

/* 1.レイヤー名を定義する */
@layer レイヤー1, レイヤー2;

/* 2.レイヤーを利用する */
@layer レイヤー1 {
  /*任意のスタイルを記述する*/
}

@layer レイヤー2 {
  /*任意のスタイルを記述する*/
}

https://qiita.com/degudegu2510/items/51bb0a66423d419dc7ea

まさきちまさきち

カードレイアウト

カードレイアウトをデザインする際にFlexboxを使用した場合

<ul class="flex">
  <li>
    <img src="https://placehold.jp/200x200.png" />
    <p>
      タイトルがはいります。タイトルがはいります。タイトルがはいります。タイトルがはいります。タイトルがはいります。
    </p>
  </li>
  <li>
    <img src="https://placehold.jp/200x200.png" />
    <p>
      タイトルがはいります。タイトルがはいります。タイトルがはいります。タイトルがはいります。タイトルがはいります。
    </p>
  </li>
</ul>
.flex {
  display: flex;
  flex-wrap: wrap;
  gap: 20px;

  > li {
    width: calc(100% / 4 - 60px / 4);
    outline: solid 1px;

    > img {
      width: 100%;
    }
  }
}
  • 4列の場合のgapの個数:3個 → 一つのgap値は20pxなので、20px × 3 = 60px。
  • gap値(60px)を1行における列数(今回は4)で割る。
  • 親要素全体の大きさ(100%)から、4分割分の大きさとgap分の差し引きをした値をwidthに指定する。親要素に対して100%となる。


処理の共通化

@mixin row-items($gap, $count) {
  display: flex;
  flex-wrap: wrap;
  gap: $gap;

  > li {
    width: calc(100% / $count - ($gap * ($count - 1) / $count));
  }
}

.flex {
  @include row-items(20px, 4);

  > li {
    outline: solid 1px;

    > img {
      width: 100%;
    }
  }
}
まさきちまさきち

z-indexベストプラクティス

  • z-indexの特性:z-index:99がz-index:1の要素内に入っている場合、たとえ99であってもz-index:3より下になる。
  • スタッキングコンテキストにより、コンテキスト内での強さが変わる。
  1. 重ね順はできる限り、コンテキスト内でのみ制御を行い、離れた場所にいる要素どうしの並び順の制御はできる限りしない → ひとつのコンポーネントの中で重ね順のコントロールを完結させる。
  2. コンポーネントをまたぐ場合には変数を使用する。
:root {
  --z-index-header: 100;
  --z-index-modal: 200;
}

.modal {
  position: relative;
  z-index: var(--z-index-modal);
}

.header {
  position: relative;
  z-index: var(--z-index-header);
}

ただし、変数を無闇に増やさないことが重要。

https://zenn.dev/catnose99/articles/2f1be29dd203c10dff01


z-indexの値は「無限」と「2147483647」どちらが強いか

z-indexの上限値は「2147483647」
どちらも同じ値の扱いで、calc(infinity)を指定しても上限値の2147483647でカンストする

https://zenn.dev/crayfisher_zari/articles/d98a0aef6326a8#fn-0da7-1


スタッキングコンテキストについて

z-indexの重なりの順序が必ずしもそのまま当てはまる訳ではなく、親要素にz-index: 1;を足すと、順序が変わってくる。これは親要素にスタッキングコンテキストが生成される為 = CSSで要素の重なりを表現する時はスタッキングコンテキストによって決められる。

https://ics.media/entry/200609/

まさきちまさきち

末尾の1文字を…で置き換える処理

以下の処理で可能。

.sample {
  -webkit-box-orient: vertical;
  display: -webkit-box;
  -webkit-line-clamp: N;
  overflow: hidden;
}
まさきちまさきち

FlexboxとCSS Grid

https://www.tak-dcxi.com/article/learning-by-example-flex-vs-grid-usage


clamp()はCSS関数で最大値、中央値、最小値を定義する。

https://developer.mozilla.org/ja/docs/Web/CSS/clamp

.container {
  container-type: inline-size;
}

.grid {
  display: block grid;
  grid-template-columns: repeat(auto-fill, minmax(min(360px, 100%), 1fr));
  gap: clamp(8px, 2cqi, 16px);
}

cqiはコンテナ要素に基づく、相対的な CSS の単位

https://azukiazusa.dev/blog/relative-css-units-based-on-container-elements/

まさきちまさきち

font-weightの話

デザインで100、600、900のウェイトを採用したとします。このときfont-weight: normalで適用される太さは100のものになります。ウェイト値のnormalは400と同じ意味ですが、400に一番近い600のウェイトが採用されるわけではありません。これは該当ウェイトがない場合の代替ウェイトの決定方法によるものです。
代替ウェイトの決め方は下記のようなルールにしたがって決まります。
A:ウェイトの指定が400以上500以下の場合
500から使用可能なウェイトを降順で探す。
なければ400未満の使用可能なウェイトを降順で探す。
それでもなければ500より大きいウェイトを昇順で探す。
B:ウェイト指定が500より大きい場合
指定した値から使用可能なウェイトを昇順で探す。
C:ウェイト指定が400より小さい場合
指定した値から使用可能なウェイトを降順で探す。
指定した値に一番近い値が採用されるわけでもないので注意が必要です。

CSS変数を使ったウェイト指定を行う。

:root {
  --font-weight-thin: 100;
  --font-weight-semi-bold: 600;
  --font-weight-black: 900;
}

p {
  font-weight: var(--font-weight-semi-bold);
}

https://ics.media/entry/230830/


ノーマライズCSS

まさきちまさきち
.container {
  container-type: inline-size;
}

.flex {
  --_column: 2;
  --_gap: clamp(8px, 2cqi, 16px);

  display: block flex;
  flex-wrap: wrap;
  gap: var(--_gap);

  @container (480px <= inline-size) {
    --_column: 3;
  }

  & > * {
    flex-basis: calc((100% - var(--_gap) * (var(--_column) - 1)) / var(--_column));
  }
}
  • --xxx で宣言:カスタムプロパティ、var(--xxx) で値を参照
  • 「_」 を付けることで「コンポーネント内でのみ使うプライベート変数」

gap を考慮した「要素幅」の計算式

部分 役割
100% 親コンテナの幅
var(--_gap) 要素間の余白(gap)
(var(--_column) - 1) 列の間にある gap の数
var(--_gap) * (var(--_column) - 1) 列間の gap の合計幅
100% - ... gap を除いた「実際に要素で埋めるべき合計幅」
/ var(--_column) それを列数で割ることで、1列あたりの幅を算出

camp()
最小 gap: 8px
推奨 gap: 2cqi(コンテナのインラインサイズに応じて相対的に変化)
最大 gap: 16px


.container {
  container-type: inline-size;
}

.grid {
  --_column: 2;

  display: block grid;
  grid-template-columns: repeat(var(--_column), 1fr);
  gap: clamp(8px, 2cqi, 16px);

  @container (480px <= inline-size) {
    --_column: 3;
  }
}


.grid {
  --_gap: clamp(8px, 2cqi, 16px);

  display: grid;
  gap: var(--_gap);
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
  • 要素は最低 200px を確保
  • 余裕があればカラム数が増える
  • gap も自動で考慮
  • repeat:グリッドの繰り返しの指定が可能
  • auto-fitでは、親要素にスペースが余る場合、グリッド・アイテムの幅が変わってスペースが埋められます

https://ascii.jp/elem/000/001/659/1659899/