質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

949閲覧

サイズがバラバラな画像の縦横を揃える方法

退会済みユーザー

退会済みユーザー

総合スコア0

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2020/05/10 10:37

模写で、コーディングの練習をしていて、バラバラなサイズを持った画像達を適切な大きさに揃えることが必要になりました。
模写元のサイトを検証ツールで見たところ、下記の記述でバラバラの画像を綺麗に揃えていました。
**知りたいのはなぜこの記述でこうなるのか、という根本的な考え方です。
positionの記述は「ああ絶対位置で配置するやつかー」くらいの感じの知識しかないですし、一番???となったのはAAAに記述した、 padding-top: 133.333%;です。これがないと画像がぶっ飛ぶことが分かりました。paddingって余白を作るためのものじゃないの?何でこんな動きになるの?という状態です。
**
大事なことは何なのか、どういう仕組みでこういう動きになるのかということが分かりません。
また、調べてみて、下記のサイトも似たような感じでサイズを揃える方法を紹介しています。
https://qiita.com/becolomochi/items/265a7f940a1c809f5ba7?fbclid=IwAR1LHtZwVCTBxQBZmxVAymVRK52BkhjsM06POD0QmeBbytt5FeD1eIYhiKc

模写元のサイトも同じ方法でやっているのだろうと思いますが、この原理を知りたいです。
よろしくお願いします。

<div class="AAA"> <img src="https://cdn.shopify.com/s/files/1/1070/4650/files/IMG_1057_10 class="BBB"> </div> コード
.AAA{ height: 0px; padding-top: 133.333%; overflow: hidden; position: relative; } .BBB{ position: absolute; max-width: none; max-height: none; top: 0px; left: -3.80711%; width: auto; height: 100%; } コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

https://jsfiddle.net/26fv3zj9/

適当に作ったのですが、padding-topをAAAに設定しないとこうなります。
画像のpositionがabsoluteなので、次の要素CCCが重なっています。
これを回避するためにどうすればいいかというと、padding-topで画像分のスペースを確保してやるのです。
質問者様はpaddingは余白を作るとおっしゃいましたが、その通りです。画像分の余白をpaddingで作っているのです。

なぜこのようにするかというと、おそらく、画像の読み込み遅延によって表示が崩れるのを防ぐためだと思います。
画像は文字に比べると重いので、読み込みが遅いです。そのため遅延して読み込んだりします。

すると、一旦画像はなかったものとしてレンダリングされ、その後画像が読み込まれるとページがズレたりします。Webページ読んでて、途中で読んでたとこと違うところに飛ばされた経験ありませんか、、、?

そこで、これを回避するために画像分の余白を最初から作っとくのです。
padding-topで!

画像が読み込まれるまでは余白として働き、画像が読み込まれた後は画像の下に隠れて役目を終えます。

では、なぜpadding-topは133.33333...%なのかという説明に移ります。

先ほども述べましたように、画像分の余白を作るのが目的ですので、高さは画像と同じにしたいのです。正直幅はあまり問題になりません。普通サイトは縦に進むので。

paddingを%で指定するときには、親要素の横幅が基準になります。

ここで、親要素の幅いっぱいに画像を表示するように設定したとします。

では、paddingの高さをどのように指定すればいいのでしょう。

画像が親要素の幅いっぱいに表示されること、paddingが親要素の幅が基準になることを前提にすると、後一つ必要な情報があります。

それが、「画像の縦横比」です。

例えば、正方形ならば
画像の高さ(paddingの高さ)=画像の幅=親要素の幅で100%になります。

4:3の画像(横長)ならば、高さは幅の75%なので、
画像の高さ(paddingの高さ)=画像の幅75%=親要素の幅75%で、75%と指定すればいいことになります。

最後に、4:3の縦長の画像の場合を考えます。この場合、高さは幅の、(4÷3で)133.33333....%になります。
ここで133.3333...%が登場します。
なので、おそらく表示する画像の縦横比が3:4(縦長)だったのだと思います。

非常に長くわかりにくい文章だと思います。申し訳ありません。

今ご理解いただけないかもしれませんが、ゆっくり時間をかけて読んでいただけると幸いです。また時間が経ったときに読み返してみるのもいいかもしれません。
いろいろな内容が詰まったいい教材だと思います。

長文失礼しました。

投稿2020/05/10 10:54

編集2020/05/10 12:21
okina

総合スコア471

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/10 11:17

うむむ、すみませんすごく難しいです。 ありがとうございます。
okina

2020/05/10 11:26

postion:absoluteにしたら、画像の大きさが無視されて画面がレンダリングされるのはご理解いただけますか? 画像に関わらずabsoluteな要素は幅的にも高さ的にもなかったものとして、次の要素の上とか下に重なります。
退会済みユーザー

退会済みユーザー

2020/05/10 11:39

postion:absoluteが親要素、つまり今回の場合.AAAの範囲内で位置指定される。ということは分かります。(すみません、レンダリングという言葉を知りません。) 絶対配置なので、配置先に何があろうが強制的にその場所に配置されるということは理解しているつもりです。
okina

2020/05/10 12:21

僕の説明力の限りで回答を修正しました。ご一読お願いします。
退会済みユーザー

退会済みユーザー

2020/05/10 12:49

そう、確かに今回の模写元は縦長の画像でした。これで133%の意味が分かりました。ちょっと僕の理解力がなさすぎて、全てを理解したわけではないですが色々検証してみて完璧に理解したいと思います。 こんなに丁寧に解説していただいてありがたい限りです。 いいヒントがえられました。感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問