imgタグの勉強
freshでサイトを作っていると、twindのpreflightが刺さって画像が伸びたりすることがあったので調べているのである。
そもそもimgタグのことをよく知らない。
関連Issue
imgというのは置換要素で、読み込まれたタイミングで内在的寸法の三つが決まる。この内在的寸法はautoに指定されていたら使われる。
いろいろ実験。placekittenで200*300の画像を読み込む。

min-widthは0, max-widthはnoneがデフォルトになっている。
CSSの初期値一覧。widthとheightはauto。
widthのautoは親要素の内部幅いっぱいであるのに対して、heightのautoは内部のコンテンツの高さが採用される。
preflightでは下記のCSSが適用される。
img, video {
max-width: 100%;
height: auto;
}
これはコンテンツ幅(多くは端末のビューポート幅)を超える大きさの画像をリサイズし、heightがautoになっていることでintrinsicRatioから計算されるようになっているということかな。
しかしこのheightをautoに上書きすることで画像サイズがぶっ壊れるというのがこのissueなのである。
<!DOCTYPE html>
<html>
<head>
<style>
img {
max-width: 100%;
height: auto;
}
</style>
</head>
<body>
<img align="center" src="https://github.com/crayon-js/crayon/raw/main/docs/logo.svg" height="256px" width="100%">
</body>
</html>

確かに再現はするんだが、これはwidth=100%にしていたらそうなるのでは?
このケースはちょっと特殊かもしれない。SVG芸で作られているので、width: 100%にしても破綻せずに画像幅だけを伸ばせるのである。

いや違うか。CSSの指定がattributeのheightに勝っちゃうのか。勝つんだ…
GitHubのレンダリングの場合はautoを指定していない。height: autoってなんで必要なんだっけ?
これ本当だろうか?heightはデフォルトでautoなのでは。

なったわ。

なるほど…!imgにheight属性を指定してしまうと、デフォルトのheight: autoを上書きしてしまうのか!
レイアウトシフト対策でimgにはheight, widthを指定することが多いので、そもそもautoであることを期待できないのか。となるとmax-widthが効くようなケースでは、アスペクト比が崩れてしまうのでheight: autoを再指定しないといけない。
え~…
まだ理解しきれてないけど、自分がコントロールできるコンテンツであればpreflightを一括適用でも問題ないのでは。おそらくUGCがありユーザ自身がプロパティか属性経由で置換要素の幅と高さを指定できてしまうと刺さるのかなあ。