display: grid でグリッドレイアウトにする際、各グリッドを同じ幅にするために grid-template-columns に「1fr」を使うことがあると思います。

(例)grid-template-columns: repeat(3, 1fr);

fr単位は余ったスペースを分割するものなのでこれで等幅になることも多いですが、例えばどれか1つのグリッドの中身がすごく長い場合、そのグリッドの幅が思いきり広がってしまって等幅になりません。

(幅を必要としているグリッドがある=スペースが余っていない なので均等に分割されない)

スペースが余っているときだけでなく、常に均等に分割したい場合は以下のようにします。

(例)grid-template-columns: repeat(3, minmax(0, 1fr));

1fr は「中身が収まる範囲以下には縮まない」性質がありますが、最小幅を0とすることで縮むことができるようになり、全カラムが同じ幅になります。

CSS:可変するフォントサイズ指定(改良版)

CSS:フォントサイズのvw指定を少し楽にする書き方 で書いた、ブラウザ幅に対して可変するフォントサイズの指定を少し改良したので覚書です。

font-size: clamp(
    calc(30px * 0.75), /* 最小0.75倍 */
    calc(100vw / (375 / 30)), /* 画面幅375pxのときに30px */
    calc(30px * 1.5) /* 最大1.5倍 */
);

変更点は最小/最大サイズを追加したことです。

ブラウザサイズによっては小さく/大きくなりすぎてしまったり、特にPCでは際限なく大きくなってしまうのを回避することができます。

ごちゃっとしていますが数字的には以下の2種類だけなので、対応する数字だけ変更すれば使うことができます。

・ブラウザ幅「375」pxのときに

・フォントサイズ「30」px相当になるように可変

最大最小の指定は計算しなくて良いように倍率にしていますが、固定値でももちろん良いと思います。

iOSでは要素内でのスクロールを端まで行った後、続けてスクロールしようとするとスクロール対象がページ本体に移ってしまいます。

ハンバーガーナビやモーダルなどfixedさせている要素でこれが起こってしまうと都合が悪いのですが、対策するにはJSなどを使ってやや面倒な処理をする必要がありました。

しかし、iOS16(2022年9月~)からは「overscroll-behavior」が使えるようになったことで簡単に解決できるようになりました。

●使い方

overflow-y などを指定している要素に以下を指定。

overscroll-behavior: contain;
 

注意点として、内容が短くてスクロールが発生しない場合は有効になりません。

その場合は内容を1pxだけはみ出るような高さに設定することで有効にできます。

●デモ

https://blog.gravity-works.jp/css_blog/demo/overscroll_behavior/

外部SVGファイルの色をCSSで変更する

imgタグでページに配置したSVGの色を、CSSで変更する方法です。
この方法は以下の条件を満たしている必要があります。

・SVG画像を黒一色で書き出せる
・指定した色と多少の誤差があってもよい

●手順
1. ページ内に配置するSVG画像は黒一色にしておく。

2. 以下のサイトにアクセスします。

3. 「Target color」に変更後のカラーを入力し、「Compute Filters」をクリック。

4. カラー変更用のCSS(filterプロパティ)が出力されるので、SVG画像に対して適用する。

filter: invert(57%) sepia(34%) saturate(6436%) hue-rotate(160deg) brightness(93%) contrast(101%);

以上でCSSによって色を変更することができます。

ただ、実際に変更後の色をカラーピッカーで取得してみると指定した色と多少誤差があるようでした。

※例えば、上記のCSSはTarget color「#00a4d6」で出力しているのですが、
 変更後の色は「#00a4d4」となっていました。
 微差なので厳密なカラー指定がなければ問題ないと思います。

●参考
Webページをキーボード操作で閲覧しやすくする施策になります。

Tabキーでページ内のリンク要素を選択していく際、<a>タグや<button>タグなどはデフォルトで選択できるようになっていますが、JavaScriptで<div>タグや<span>タグなどをボタンとして使用している場合はそのままでは選択されません。

●Tabキーで選択できるようにする
tabindex="0"
をつけることでTabキーで選択できるようになります。

(例)
<div> ... </div>
 ↓
<div tabindex="0"> ... </div>

●Tabキーで選択できないようにする
逆にTabキーで選択できないようにしたい場合は
tabindex="-1"
をつけます。


親gridの行や列を引き継いだ子gridの作り方

毎回忘れてしまうので見返せるようにメモします。

grid 内に grid を入れ子にしたとき、通常では子 grid は親 grid のグリッドラインに揃いませんが、subgrid を使うことで揃えることができます。

・grid の中に grid が入れ子になっている
・子 grid が親 grid のグリッドセルを複数個つかっている

上記のようなとき、子gridの grid-template-columns や grid-template-rows に "subgrid" を指定することで実装できます。

(例)
// 親
.parent {
    display: grid;
    grid-template-columns: 1fr 2fr;
    grid-template-rows: auto;
}
// 子
.child {
    grid-columns: span 2; // 親 grid のグリッドセル横2つ分のサイズ
    display: grid;
    grid-template-columns: subgrid;
}

CSSのプロパティの値を初期値に戻す

CSSですでに指定されている値をリセットしたい場合、「initial」「revert」「inherit」「unset」を使用します。

例えば
font-size: 20px;
と指定されている要素に対し、
font-size: revert;
のように上書きすることで文字サイズを初期値に戻すことができます。

では上記4つのどれを使うかというと、
リセットしてどのような状態にしたいかによって変わってきます。

●initial
仕様で決められたプロパティ自体の初期値にリセット

inherit
親要素からプロパティの値を継承

revert
ブラウザのデフォルトスタイルにリセット

●unset
親要素の値を継承できるプロパティには「inherit」を適用、
そうでないプロパティには「initial」を適用

div等のブロック要素は、そのままだと幅が横いっぱいまで広がってしまいます。
「width: fit-content;」を使用することで幅が中身に合わせて可変するようになります。

以前は「display: inline-block;」や「display: table;」などでやや無理やり実装することが多かったと思いますが、よりシンプルに実装できるようになりました。

IE11以上であれば対応しています。

●CSS property: width: fit-content

要素のアスペクト比を指定するaspect-ratio

CSSプロパティの「aspect-ratio」を使うと、要素のアスペクト比を指定することができます。
IE11では使えませんが、モダンブラウザであれば基本的に対応しています。
レスポンシブ対応の際に便利。

aspect-ratio: 4 / 3;

上記のように指定すると、その要素のアスペクト比が4:3になります。

これまでもwidthに対して高さをpaddingで%指定することで同じようなことができましたが、それがよりストレートに指定できることになります。
また、paddingを使う方法だと高さから幅を決めることができませんが、aspect-ratioであれば普通にheightを指定すればaspect-ratioの比率に沿って幅が決まります。
通常、CSSで :hover スタイルを設定するとスマホでも有効になってしまい、
タップしたときにホバースタイルが有効になりつづけてしまう問題があります。

メディアクエリでPCサイズのみ効くようにすることもできますが、
ピクセルではなく以下のように書くことでホバー可能なデバイスのみホバーのスタイルを有効にすることができます。

@media (hover: hover) {
  a:hover {
    opacity: 0.7;
  }
}

また、:any-link をつけることで href 属性の中身がある場合のみホバーを有効にすることができます。

@media (hover: hover) {
  a:any-link:hover {
    opacity: 0.7;
  }
}

●参考

最近のブログ記事

アイテム

  • 180314_oshi_01.jpg
  • 150121_oshi.gif
  • 150114_oshi_01.gif
  • 130814_oshi_01.jpg
  • 130115_oshi.gif
  • 110420.gif
  • 090811_02.gif
  • 090811_01.gif
  • 090810_02.gif
  • 090810_01.gif