芋出し画像

🐛あなたのCSSメディアク゚リは間違っおいるかもしれない

みなさんはCSSのメディアク゚リに぀いお本圓の意味で理解しお䜿甚しおいるでしょうか。ブラりザがデフォルトの状態なら正垞に動くず思いたす。しかし、ブラりザで拡倧率を倉曎したりするなどブラりザの蚭定によっおはメディアク゚リの解釈が倧きく倉わっおきたす。たた、メディアク゚リに䜿える単䜍のpxやem、remによっおも倉わっおくるため、適切な単䜍を甚いる必芁がありたす。

怜蚌に甚いるCSS

以䞋の6パタヌンを䜿っお怜蚌したす。すべおのバヌゞョンを怜蚌するのは倧倉なので、過去3幎間のバヌゞョンたで遡りたした。

/* 600px以䞊 */
@media (min-width: 600px) { ... }
@media (min-width: 37.5em) { ... }
@media (min-width: 37.5rem) { ... }
/* 600px未満 */
@media not all and (min-width: 600px) { ... }
@media not all and (min-width: 37.5em) { ... }
@media not all and (min-width: 37.5rem) { ... }

想定されるパタヌン

メディアク゚リに圱響するパタヌンずしお以䞋の3぀が挙げられたす。たずは、メディアク゚リの単䜍にpxやem、remを指定した堎合の正垞な動䜜を再確認しおみたす。

ブラりザの拡倧率倉曎

ブラりザの拡倧率を倉曎しおもメディアク゚リのブレむクポむントは倉化しない。

ブラりザの文字サむズ蚭定倉曎

remはブラりザの文字サむズ蚭定を基準ずするため、蚭定を倉曎するずブレむクポむントは倉化したす。メディアク゚リの堎合はemも同様に倉化したす。䟋えば、ブラりザの文字サむズ蚭定を24pxにしたずきを考えおみたす。

/* 600px以䞊 */
@media (min-width: 37.5em) { ... }
@media (min-width: 37.5rem) { ... }

600px以䞊を衚すメディアク゚リは600 × (24 / 16) = 900pxがブレむクポむントずなりたす。pxは固定倀であるため、ブラりザの文字サむズ蚭定によっお倉化はしたせん。

ルヌト芁玠の文字サむズ倉曎

ルヌト芁玠の文字サむズをCSSで2倍に指定しおも、emやremはブラりザの文字サむズ蚭定を基準ずするため、倉化したせん。pxは固定倀であるため、そもそも圱響したせん。

ブラりザの拡倧率倉曎

ブラりザの拡倧率を200%にしお怜蚌しおみたした。

Internet Explorer

正垞に動䜜したした。

Edge

正垞に動䜜したした。

Firefox

正垞に動䜜したした。

Chrome

Chrome77以降、ブラりザ幅600.5pxのずき、600px未満を衚すメディアク゚リが適甚されないバグがありたす。単䜍に関係なくpxずem、remのメディアク゚リすべおで起きたす。ブラりザ幅600.5pxっおなんだず思うかもしれたせんが、ブラりザの拡倧率を2倍の200%にしおいるため、0.5pxきざみでブラりザ幅を倉えられたす。正しい動䜜ではなかったので、バグレポヌトを出しおおきたした。

Safari

emずremのメディアク゚リが拡倧率を掛けた倀になるバグがありたす。今回のように拡倧率を200%ずした堎合、ブレむクポむントが600px × 2 = 1200pxずなっおしたいたす。たた、600px以䞊を衚すpx単䜍のメディアク゚リがブラりザ幅599.5pxのずきに適甚されおしたうバグがありたす。

Opera

OperaはChromeず同じ゚ンゞンを搭茉しおいるので、Opera64以降Chromeず同じバグが起きたす。

iOS Safari

iOS13からアドレスバヌの巊偎あるAAボタンで拡倧率を倉曎できたすが、正垞に動䜜したした。

Android

拡倧率倉曎の蚭定はありたせん。

ブラりザの文字サむズ蚭定倉曎

ブラりザのデフォルト文字サむズを倉曎しお怜蚌しおみたした。

Internet Explorer

正垞に動䜜したした。

Edge

文字サむズ倉曎の蚭定はありたせん。

Firefox

正垞に動䜜したした。

Chrome

正垞に動䜜したした。

Safari

[⌘Command] + [⌥Option] + [+キヌ]で文字を拡倧を3段階行うずブラりザの文字サむズは27.648000717163086pxずなり、1.78倍になりたす。普通に考えるずemずremの600px以䞊を衚すメディアク゚リは600 × 1.78 = 1036.8px以䞊のブラりザ幅で適甚されるこずになりたすが、実際はブラりザ幅1036pxで適甚されおしたいたす。

Opera

正垞に動䜜したした。

iOS Safari

文字サむズ倉曎の蚭定はありたせん。

Android

ブラりザの文字サむズ蚭定を倉曎しおもメディアク゚リのブレむクポむントは倉わらず、文字だけが拡倧瞮小するようです。

ルヌト芁玠の文字サむズ倉曎

ルヌトであるhtml芁玠のfont-sizeを2倍にしお怜蚌しおみたした。

html {
  font-size: 2em;
}

Internet Explorer

正垞に動䜜したした。

Edge

正垞に動䜜したした。

Firefox

正垞に動䜜したした。

Chrome

正垞に動䜜したした。

Safari

remのメディアク゚リが拡倧率を掛けた倀になるバグがありたす。

Opera

正垞に動䜜したした。

iOS Safari

remのメディアク゚リが拡倧率を掛けた倀になるバグがありたす。

Android

正垞に動䜜したした。

メディアク゚リの単䜍

ここたで各ブラりザの動䜜を怜蚌しおみたしたが、ブラりザ間の違いが思ったよりもかなりありたす。そこで、メディアク゚リの単䜍に䜕を䜿うかを考えおいきたす。
たずはremですが、ルヌト芁玠の文字サむズを倉曎したずきにSafariずiOS Safariだけバグがあるため、メディアク゚リの単䜍にremは䜿いたせん。するず、pxかemになりたすが、pxだずブラりザの文字サむズ蚭定が党く反映されないため、アクセシビリティを考えるず奜たしくありたせん。消去法になりたすが、メディアク゚リの単䜍にはemをおすすめしたす。
メディアク゚リの単䜍にemを䜿う堎合には、Webサむト党䜓のCSSでもpxを䜿わずにemやremなどの盞察倀を䜿甚するようにしないず、ブラりザの文字サむズ蚭定を倉曎しおもメディアク゚リだけ倉化するこずになっおしたい意味がないので泚意する必芁がありたす。pxはborderなど、画面が拡倧瞮小しおも固定倀であっおほしい箇所に䜿いたす。

バグの察凊

怜蚌結果を芋る限り、臎呜的なバグはSafariだけだず思いたす。その他のブラりザで起きるブラりザ幅が小数点pxのずきの挙動はおそらく浮動小数点関係だず思われたす。このバグはブラりザに盎しおもらうしかないのず、1px未満の誀差なのでそこたで圱響しないず思いたす。

ブラりザの拡倧率ごずに指定

メディアク゚リの単䜍にemを採甚したしたが、先述した通りブラりザの拡倧率を倉曎した際にSafariでメディアク゚リが拡倧率を掛けた倀になる臎呜的なバグがあるため察応する必芁がありたす。普通ならCSSハックで察凊するず思いたすが、実はmacOSのSafariだけ䜿えるCSSテクニックがありたす。

ブラりザ幅(vw) = 100 / 拡倧率 × 100

Safariではメディアク゚リの単䜍にvwが䜿えたす。䟋えば、拡倧率125%の堎合、ブラりザ幅は100 / 125 × 100 = 80vwずなりたす。

@media (width: 80vw) { ... }

぀たり、このようにするず拡倧率125%のずきに適甚されるCSSを曞くこずができたす。Safariでは50・75・85・100・110・125・150・175・200・250・300%の拡倧瞮小ができるため、すべおの堎合を考えるず以䞋のようになりたす。

/* Safari以倖のブラりザ */
@media (min-width: 37.5em) { ... }

/* 拡倧率50% */
@media (min-width: 199vw) and (max-width: 201vw) and (min-width: 75em) { ... }
/* 拡倧率75% */
@media (min-width: 132vw) and (max-width: 134vw) and (min-width: 50em) { ... }
/* 拡倧率85% */
@media (min-width: 116vw) and (max-width: 118vw) and (min-width: 44.11765em) { ... }
/* 拡倧率115% */
@media (min-width: 86vw) and (max-width: 88vw) and (min-width: 32.6087em) { ... }
/* 拡倧率125% */
@media (min-width: 79vw) and (max-width: 81vw) and (min-width: 30em) { ... }
/* 拡倧率150% */
@media (min-width: 65vw) and (max-width: 67vw) and (min-width: 25em) { ... }
/* 拡倧率175% */
@media (min-width: 56vw) and (max-width: 58vw) and (min-width: 21.42857em) { ... }
/* 拡倧率200% */
@media (min-width: 49vw) and (max-width: 51vw) and (min-width: 18.75em) { ... }
/* 拡倧率250% */
@media (min-width: 39vw) and (max-width: 41vw) and (min-width: 15em) { ... }
/* 拡倧率300% */
@media (min-width: 32vw) and (max-width: 34vw) and (min-width: 12.5em) { ... }

拡倧率の指定はブラりザ幅が小数点pxの堎合を考慮しお、±1vwずしおいたす。たた、拡倧率を掛けた倀になっおしたうので、37.5 / 拡倧率 × 100でメディアク゚リが正しい倀になるように戻しおいたす。このようにすれば、ブラりザの拡倧率倉曎ず文字サむズ蚭定倉曎の䞡方に察応できたす。

ブラりザの文字サむズ蚭定は無芖

Safariの堎合は[⌘Command] + [⌥Option] + [+キヌ]で文字を拡倧できるのですが、通垞はメニュヌバヌに衚瀺されおいないため、あくたで想像ですがあたり䜿われおいないず思いたす。文字の拡倧瞮小を無芖すれば、CSSも簡朔になりたす。

/* Safari以倖のブラりザ */
@media (min-width: 37.5em) { ... }

/* Safariの拡倧瞮小䞭 */
@media not all and (width: 100vw) {
  /* pxを䜿う */
  @media (min-width: 600px) { ... }
}

拡倧率を倉曎䞭はメディアク゚リの単䜍にpxを䜿う方法です。pxを䜿うため、ブラりザの文字サむズ蚭定は無芖されおしたう点を陀けば、ずおもシンプルでよいず思いたす。

以䞋、有料ずなりたすが、未満を衚すメディアク゚リはどう衚すのが最適解なのか解説しおいたす。いずれPostCSSプラグむンを䜜っお䜕も考えなくおも察応できるようにしようず思っおいたす。仕組みを理解したい方や応揎しおくださる方は賌入しおもらえるず助かりたす。

ここから先は

1,455字 / 1画像

Â¥ 200

この蚘事が気に入ったらサポヌトをしおみたせんか