文字サイズとか(実機で確認用)

12px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

13px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

14px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

15px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

16px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

17px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

18px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

19px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

20px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

22px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

24px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)

28px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)

32px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)

36px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)

CSS関数 min(),max(),clamp()

min(),max(),clamp()について

min(),max(),clamp()はプロパティに設定する値を自動で計算してくれるCSSの数学関数です。
calc()も同じく数学関数。

min()とは

カッコの中に2種類の値を設定し、どちらか小さいほうの値が適用されます。(=最大値を設定できる)

minなのに最大値?意味が分からないと思いますが、これまでmax-widthwidhで設定していたものを min() の一行で書けます。

box {
  width: 50%;
  max-width: 700px;
}
box {
  width: min(50%, 700px);
}

上の場合だと、ブラウザ幅が1000pxのとき50%の幅は500pxとなり700pxより小さいため、50%の値が適用されます。
ブラウザ幅が1400px以上になると50%の幅が700px以上になるため、値の小さい700pxの方が適用されます。

max()とは

カッコの中に2種類の値を設定し、どちらか大きいほうの値が適用されます。(=最小値を設定できる)

これはwidthとmin-widthを使っていた時と同じイメージです。

box {
  width: 50%;
  min-width: 300px;
}
box {
  width: max(50%, 300px);
}

上の場合だと、ブラウザ幅が600px以下の時は300pxが適用され、601px以上のとき50%の幅が300pxより大きくなるため、50%が適用されます。

clamp()とは

上記のmin(),max()を合わせたものです。これはカッコの中に「最小値」「推奨値」「最大値」の3つの値を入れるので、イメージしやすいと思います。

box {
  width: clamp(300px, 50%, 900px);
}

下のSAMPLEページに三種類のデモが置いてあります。ブラウザ幅を変えて確認してみてください。

つかいどころ

上記の説明では分かりやすいようwidthの値として使用しましたが、font-sizeやmargin、paddingの値としても使えます。

safariで効かないときは

safariにも対応していますが、うまく動かないときは以下の記述を追加してみてください。

* {
    min-height: 0vw;
}

設定する値に演算子が使える

上記の例で「%」で設定していた値には「vw」や演算子も使えます。ただし流動値でないといけないの固定される値は設定できません。

block {
  width: min(100vw - 50px, 700px);
}

CSSで変数(カスタムプロパティ)を使う

[outline]

記事にしてあるかと思ったのですがまだ書いてなかったので。

カスタムプロパティとは

javascriptやプログラミング言語で当たり前のように登場する変数。
cssで使うときは「カスタムプロパティ」という呼び方になるようです。が、自分は変数と呼んでいます。

変数になじみのない方に説明すると、あるキーワードにあらかじめスタイルを定義しておき、そのスタイルを使いたいときは代わりにキーワードを入力すれば呼び出せる、というものです。

これだけだとメリットが分かりづらいのですが、たとえば「main-color」というキーワードにカラーコードを指定しておき、サイトのメインカラーを使う箇所にカラーコードではなく「main-color」というキーワードを指定しておけば、メインカラーが変更になった場合に一つ一つカラーコードを変更する必要がなく、「main-color」に指定したカラーコードを変更すれば一気に変更することができます。

コンテナクエリ(2022年新機能)

コンテナクエリとは

これまでのレスポンシブデザインでは画面幅(ブラウザ幅)を基準にブレイクポイントを決め、それに応じてスタイルを定義するメディアクエリを使用していましたが、コンテナクエリでは指定した親コンテナをベースにして子要素のスタイルを定義できます。

これが使えるようになることで、ブラウザ幅に影響されることなく親コンテナのサイズに合わせて文字の大きさを変えるといったことなどができるようになり、より柔軟なレスポンシブデザインが作れます。

使用可能ブラウザとポリフィル

2022年10月現在、Chrome 105+(Edgeも105+)とSafari 16に対応。

ポリフィルもあり、Chrome/Edge 88+, Firefox 78+, Safari 14+をカバーしています。
Container Query Polyfill -GitHub

直接CDNを読み込んでもいいのですが、下のコードを記述すると、コンテナクエリ未対応のブラウザにのみポリフィルが読み込まれるようになるのでオススメ。

// 直接CDNを読み込む
<script src="https://cdn.jsdelivr.net/npm/container-query-polyfill@1/dist/container-query-polyfill.modern.js"></script>

// 未対応の時のみ読み込む
<script>
const supportsContainerQueries = "container" in document.documentElement.style;
 
if (!supportsContainerQueries) {
  import("https://cdn.skypack.dev/container-query-polyfill");
}
</script>

使い方

コンテナクエリの親コンテナとなる要素にはスタイルを定義してはいけないというルールがあります。そのため場合によってはコンテナクエリ用のラッパー要素を用意してから、親コンテナですよと定義します。

<div class="parent-wrap">
  <div class="container">
    <div class="child-content">
      <p>親譲りの無鉄砲で小供の時から損ばかりしている。</p>
    </div>
  </div>
</div>
.parent-wrap {
  container: inline-size / parent-wrap; /* ショートハンド */
  /* container-type: inline-size; */
  /* container-name: parent-wrapper; 個別にコンテナクエリを指定する場合は名前をつける */
}

そして、メディアクエリと同じような感じで子要素のスタイルを定義します。

.child-content p {
  color: red;
}

/* 個別にコンテナクエリを指定する場合 */
/* @conteiner [container-name] (max-width: [size]) */
@container parent-wrapper (max-width: 700px) {
  .child-content p {
    color: blue;
  }
}

/* まとめてコンテナクエリを指定する場合 */
/* @conteiner (max-width: [size]) */
@container (max-width: 700px) {
  .child-content p {
    color: blue;
  }
}

これを実行すると、親要素である .parent-wrap の幅が700px以下のときに文字色は青となり、701px以上で赤となります。
まとめてコンテナクエリを指定する場合は親要素の container-name を指定する必要はなく、自動的に子要素から一番近い container-type: inline-size; を指定した親要素がベースとなります。

コンテナクエリの新しい単位

親要素にコンテナさえ指定しておけば、コンテナベースの単位を使うことができます。
単位の最初にcontainer queryの「cq」がついてるので分かりやすい。

cqwコンテナの幅の1%
cqhコンテナの高さの1%
cqiコンテナのインラインサイズの1%
cqbコンテナのブロックサイズの1%
cqmincqiまたはcqbの小さい方の値
cqmaxcqiまたはcqbの大きい方の値

画像(インライン要素)の下に微妙な隙間があるとき

単純な話だけど、たびたびアレっ?てなるので忘備録。

<img src="画像ファイル">
<img src="画像ファイル"> 

たとえば、こんなかんじで画像を上下に2つ並べるとする。

marginやpaddingなどが入っていないのに、なぜか微妙な隙間が空いてしまうことがある。

原因はvertical-align。
インライン要素の場合、デフォルトでvertcal-align: baseline;となっていることが多いので、
vertical-align: top; としてあげると直る。

もしくは、画像自体をdisplay: block;でブロック要素にしてあげても直る。

iPhoneの解像度まとめ

いつも迷うiPhoneの画面解像度(デバイスピクセル)と実質解像度(CSSピクセル?)をまとめてみます。

デバイス名画面解像度実質解像度画面サイズ
 iPhone XS Max / 11 Pro Max1242 x 2688414 x 896 6.5 inch
 iPhone 11 Pro1125 x 2436375 x 812 5.8 inch
 iPhone XR/11828 x 1792414 x 896 6.1 inch
 iPhone X / XS1125 x 2436375 x 812 5.8 inch
 iPhone 8 Plus/ 7 Plus/ 6s Plus/ 6 Plus/1080 x 1920414 x 736 5.5 inch
 iPhone 8 / 7 /6s / 6750 x 1334375 x 667  4.7 inch
 iPhone5/5S/5c/SE 640 x 1136320 x 568 4 inch
pc-11920 x 1080
pc-21336 x 768

あと、レスポンシブなどで実質解像度を使う場合は以下のmetaタグをhtmlのhead内に入れます。

<meta name="viewport" content="width=device-width,initial-scale=1">

これを入れないと画面解像度で横幅計算されるのでブレイクポイントに引っかからず、PCの見た目がそのままキュッと縮まった感じでスマホに表示されることになります。

あとはユーザーエージェントでスマホとPCを判別して、スマホはスマホ用のコーディングに統一するとかかなあ。