絶対はみ出さない画像!自動でサイズ調節するスタイルシート

画面サイズに合わせて画像の大きさを自動で変え、スマホで見ても絶対にはみ出さないスタイルシートの設定方法を説明します。読んで分からない場合は初心者用「画像が枠からはみ出さない、簡易的なスタイルシート」で対応してください。

今回も、ちぎり絵作家NARUさんの、作品「NARUシカ」をお借りして、スタイルシートで画面サイズに合わせて画像の大きさを自動で変え、スマホで見ても絶対にはみ出さない方法を説明します。

この記事はHTMLのimgタグの使い方が分かることを前提にしています。この記事を読んで分からない場合は、imgタグが分からない人向けに書いた、別の記事「画像が枠からはみ出さない、簡易的なスタイルシート」で対応してください。

NARUシカ

画像の大きさを画面サイズに合わせて自動で変える

意味がわからない方は、試しに今開いているこのページのサイズを色々と変えてみてください。常に横幅いっぱいの大きさで、はみ出すことなく、フルサイズ「NARUシカ」が表示されていると思います。

ブラウザのサイズ変更ボタン

ブラウザのドラッグ

自動で大きさを変える時はwidthをパーセントで指定する

このページの「NARUシカ」のソースコードは以下の通りです。

<img src="画像のURL" alt="画像の説明" style="width:100%;height:auto;" />

スタイルシートのwidth100%を指定した結果、画面のサイズを変えても常にフルサイズになります。パーセンテージの基準は自分が入っている場所(node)の大きさです。基準の場所(node)の広さが1000ピクセルのところでwidth:100%を指定すれば、1000ピクセルの横幅で表示されます。

ですから、画像の親nodeが画面全体の50パーセントしかないところで、width:100%を指定しても、親nodeの幅いっぱいまでしか広がりません。

<div style="width:50%;"><!-- 親nodeの横幅が50% -->
<img src="画像のURL" alt="画像の説明" style="width:100%;height:auto;" />
</div>

上のソースの表示結果

NARUシカ

高さの調節はheightでおこなう

さらに、heightautoに指定することで、高さは横幅に合わせた自動調整となります。

縦横比が正しくないと、表示もおかしくなるので注意しましょう。

NARUシカ
NARUシカ

heightを指定して、横幅を自動調整することも出来ます。

サイズの違う2つのちぎり絵を高さ200ピクセルに合わせて表示

NARUシカ シータとパズー

ソースコード

<p>
<img src="NARUシカのURL" alt="NARUシカ" style="width:auto;height:200px;" /> 
<img src="シータとパズーのURL" alt="シータとパズー" style="width:auto;height:200px;" /> 
</p>

シータとパズー

こちらも、ちぎり絵作家NARUさんの作品「シータとパズー」です。元々は小さな画像なのですが、フルサイズに拡大して表示しています。紙という素材を生かした、作品の繊細な表面がよくわかります。けど、曲がっています。拡大すると曲がっています。

シータとパズー

この作品の元の横幅は、320ピクセルです。

元のサイズで表示
シータとパズー

普段は自動でサイズを変更するが、表示画面が320ピクセル以上の場合は横幅320ピクセルで固定したい!という時はどうしましょ?

max-widthで最大幅を指定する

max-widthというのは、そんな時に使えるスタイルシートです。

<img src="URL" alt="説明" style="width:100%;height:auto;max-width:320px;" />

こうすると、横幅が320ピクセルまでは自動調整、ただし320ピクセル以上には広がらなくなります。320ピクセルだと小さいので、下はmax-width:500pxで設定しています。ブラウザのサイズを変えても500ピクセル以上には広がらないのがわかると思います。

シータとパズー

また、それ以上小さくなって欲しくない時にはmin-widthというものもあります。min-widthを指定すると、その値よりは小さくならなくなります。

max-width min-width と同じ事を高さに適用させる、 max-height min-height というのもありますが、使い方は同じです。


画像のサイズ変更はアフィリエイトでも出来ますが、規約をよく読んだ上、自己責任で行なって下さい。トラブルが起きても当サイトは関知しません。

上の画像は下のようなソースで表示しています。

<style type="text/css">
p.dolls img{
 float:left;
 width:19%;
 margin-right:1%;
}
</style>

<p class="dolls">
<img src="画像1のURL" alt="画像1の説明" />
<img src="画像2のURL" alt="画像2の説明" />
<img src="画像3のURL" alt="画像3の説明" />
<img src="画像4のURL" alt="画像4の説明" />
<img src="画像5のURL" alt="画像5の説明" />
</p>

CSSで作る楽天のRで目立たせよう!

だからどうした?と言われると困るんですが、楽天の

をスタイルシートだけで作ってみました。

<style type=”text/css”>
.rakuten{
 padding:0.1em 0.15em 0.2em 0.15em;
 width:1em;
 height:1em;
 line-height:1em;
 text-align:center;
 color:#ffffff;
 background:#bd0000;
 font-weight:bold;
 font-family:’メイリオ’,Meiryo,’MS Pゴシック’,’ヒラギノ角ゴ Pro W3′,’Hiragino Kaku Gothic Pro’,sans-serif;
 border-radius:1.3em;
 -webkit-border-radius:1.3em;
 -moz-border-radius:1.3em;
}
</style>

block要素でないと左右の余白がおかしくなります。

inline要素で使用

<p><span class=”rakuten”>R</span>&nbsp;<a href=””>楽天</a></p>

表示結果

 楽天

block要素で使用

<p class=”rakuten” style=”float:left;margin-right:0.5em;”>R</p>
<p><a href=””>楽天</a></p>
<br style=”clear:left;” />

表示結果

楽天


楽天で探す

楽天で探す

表示がおかしいなどのご指摘はコメントいただけると助かります。

文字を読みやすくしてアクセスUP

ブログの内容以前に、小さすぎる文字や、くっつきすぎる文字というのは読みづらい!

読みづらいページというのは、最後まで読んでもらえないんじゃないだろうか?だから、次のページへ進んで、もっとたくさん読んでもらうということが出来ない。

例としてTomさんの、まだ発売されていない小説「キャサリンの瞳」の冒頭を例に見てみます。


通常表示

キャサリンの働く店は本牧にある。店の名は「エンジェル」、スナックだ。七月の午後五時はまだ明るい。酒を飲むには早すぎる。しかし、店を開ける前に話を済ませたいというのがキャサリンの希望だった。店のネオンはついていなかったが、ドアを押すと開いた。中にいるのはひとり。薄暗い灯りの中でキャサリンがカウンターを片付けていた。

「いらっしゃい。待ってたわ」

キャサリンの髪は茶色、瞳は黒。名古屋出身の十九歳。本名は知らないが日本人だ。私は黙ってカウンターに座った。キャサリンは置いてあったバッグの中を探すと封筒を取り出し、私の前に置いた。

「男を捜して欲しいの」キャサリンは言った。
私は封筒を手に取り、中を見た。一万円札が束になっている。(つづく)


この小説はそのうち大手出版社より発売されると思いますが、まだここまでしか書いていないので、いつ発売されるかは未定です。

文字の大きさは font-size で変更する

こんな名作でも、文字が小さくなるだけで読みにくくなります。


文字を60パーセントの大きさで表示

キャサリンの働く店は本牧にある。店の名は「エンジェル」、スナックだ。七月の午後五時はまだ明るい。酒を飲むには早すぎる。しかし、店を開ける前に話を済ませたいというのがキャサリンの希望だった。店のネオンはついていなかったが、ドアを押すと開いた。中にいるのはひとり。薄暗い灯りの中でキャサリンがカウンターを片付けていた。

「いらっしゃい。待ってたわ」

キャサリンの髪は茶色、瞳は黒。名古屋出身の十九歳。本名は知らないが日本人だ。私は黙ってカウンターに座った。キャサリンは置いてあったバッグの中を探すと封筒を取り出し、私の前に置いた。

「男を捜して欲しいの」キャサリンは言った。
私は封筒を手に取り、中を見た。一万円札が束になっている。(つづく)


この文字サイズで何十行もあったら、途中で読むのがイヤになってしまうと思います。

文字を大きくするにはスタイルシートの font-size を変更します。

ページ全体の文字サイズを2倍にする場合

body{
	font-size:200%;
}

記事の文字だけ2倍の大きさにする場合

div#entries{
	font-size:200%;
}

詳しい記入場所、記入方法は次の記事にあります。

適切な場所で空行を入れよう

そして、こんな名作でも空行をなくすだけで読みにくくなってしまいます。


空行なし

キャサリンの働く店は本牧にある。店の名は「エンジェル」、スナックだ。七月の午後五時はまだ明るい。酒を飲むには早すぎる。しかし、店を開ける前に話を済ませたいというのがキャサリンの希望だった。店のネオンはついていなかったが、ドアを押すと開いた。中にいるのはひとり。薄暗い灯りの中でキャサリンがカウンターを片付けていた。
「いらっしゃい。待ってたわ」
キャサリンの髪は茶色、瞳は黒。名古屋出身の十九歳。本名は知らないが日本人だ。私は黙ってカウンターに座った。キャサリンは置いてあったバッグの中を探すと封筒を取り出し、私の前に置いた。
「男を捜して欲しいの」キャサリンは言った。
私は封筒を手に取り、中を見た。一万円札が束になっている。(つづく)


適切な場所で改行を追加するだけで読みやすくなるのではないでしょうか?

行と行の間は line-height で調節

1行の文字数が長いと、改行を入れなくても複数行で表示されますが、その場合の行間は line-height で調整します。

line-height:100% だと行間の隙間なし、line-height:120% だと、文字の上と下に10%ずつ隙間が出来ます。


line-heightを100%で表示

キャサリンの働く店は本牧にある。店の名は「エンジェル」、スナックだ。七月の午後五時はまだ明るい。酒を飲むには早すぎる。しかし、店を開ける前に話を済ませたいというのがキャサリンの希望だった。店のネオンはついていなかったが、ドアを押すと開いた。中にいるのはひとり。薄暗い灯りの中でキャサリンがカウンターを片付けていた。「いらっしゃい。待ってたわ」キャサリンの髪は茶色、瞳は黒。名古屋出身の十九歳。本名は知らないが日本人だ。私は黙ってカウンターに座った。キャサリンは置いてあったバッグの中を探すと封筒を取り出し、私の前に置いた。「男を捜して欲しいの」キャサリンは言った。私は封筒を手に取り、中を見た。一万円札が束になっている。(つづく)


line-heightを120%で表示

キャサリンの働く店は本牧にある。店の名は「エンジェル」、スナックだ。七月の午後五時はまだ明るい。酒を飲むには早すぎる。しかし、店を開ける前に話を済ませたいというのがキャサリンの希望だった。店のネオンはついていなかったが、ドアを押すと開いた。中にいるのはひとり。薄暗い灯りの中でキャサリンがカウンターを片付けていた。「いらっしゃい。待ってたわ」キャサリンの髪は茶色、瞳は黒。名古屋出身の十九歳。本名は知らないが日本人だ。私は黙ってカウンターに座った。キャサリンは置いてあったバッグの中を探すと封筒を取り出し、私の前に置いた。「男を捜して欲しいの」キャサリンは言った。私は封筒を手に取り、中を見た。一万円札が束になっている。(つづく)


line-heightを140%で表示

キャサリンの働く店は本牧にある。店の名は「エンジェル」、スナックだ。七月の午後五時はまだ明るい。酒を飲むには早すぎる。しかし、店を開ける前に話を済ませたいというのがキャサリンの希望だった。店のネオンはついていなかったが、ドアを押すと開いた。中にいるのはひとり。薄暗い灯りの中でキャサリンがカウンターを片付けていた。「いらっしゃい。待ってたわ」キャサリンの髪は茶色、瞳は黒。名古屋出身の十九歳。本名は知らないが日本人だ。私は黙ってカウンターに座った。キャサリンは置いてあったバッグの中を探すと封筒を取り出し、私の前に置いた。「男を捜して欲しいの」キャサリンは言った。私は封筒を手に取り、中を見た。一万円札が束になっている。(つづく)


line-heightを160%で表示

キャサリンの働く店は本牧にある。店の名は「エンジェル」、スナックだ。七月の午後五時はまだ明るい。酒を飲むには早すぎる。しかし、店を開ける前に話を済ませたいというのがキャサリンの希望だった。店のネオンはついていなかったが、ドアを押すと開いた。中にいるのはひとり。薄暗い灯りの中でキャサリンがカウンターを片付けていた。「いらっしゃい。待ってたわ」キャサリンの髪は茶色、瞳は黒。名古屋出身の十九歳。本名は知らないが日本人だ。私は黙ってカウンターに座った。キャサリンは置いてあったバッグの中を探すと封筒を取り出し、私の前に置いた。「男を捜して欲しいの」キャサリンは言った。私は封筒を手に取り、中を見た。一万円札が束になっている。(つづく)

ページ全体の文字サイズを2倍にする、かつ記事の行間だけを160%にする場合

body{
	font-size:200%;
}

div#entries{
	line-height:160%;
}

サイドバーのカレンダーだけ文字を小さくする方法

ブログの文字サイズを大きくしたら、カレンダーの数字が2行になってしまって、表示が崩れた!
そんな時の対処方法です。

    これを        こう修正します

レイアウトの崩れたカレンダー  →  レイアウトが修正されたカレンダー

[事前注意]以下の修正はすべて、半角で記入します。全角だと直りません。

スタイルシートの修正

ファンブログの場合の修正方法を先に書いておきます。
ファンブログの場合、大抵はスタイルシートの最後に次の1行を追加すれば直ります。

スタイルシートは読み込んだ順に上書きされるので、下の1行を書いた後に、別の指定が書かれていると書いたものは上書きされ、消えてしまって無効になります。だから、どこを直せばいいのかわからないなら、一番最後に追加してください。

td.calendar{font-size:80%;}

80%の数字は文字のサイズを80%に縮小するという指示です。
80で表示しておかしければ、この数字を変えてください。

この場合、曜日の「日 月 火 水 木 金 土」の漢字7文字の大きさは変更されません。
それも変更するには以下のようにtdの文字を削除します。

.calendar{font-size:80%;}

  td.calendar{font-size:80%;} → .calendar{font-size:80%;}

   レイアウトが修正されたカレンダー    →    曜日も小さくしたカレンダー

この記事が必要になるということはスタイルシートをすでに書き換えているわけですが、念のため、ファンブログのスタイルシートはどこで設定するのかを書いた記事へのリンクを貼っておきます。

で、スタイルシートはどこに書くのか?

ここまでのやり方で直らなければ「解説」を読んでください。

もし .calendar{font-size:80%;} と書いてサイズが修正されないときは、クラスの名前が違う可能性が高いと思います。HTMLのソースでclass=”calendar”の部分を確認して、クラス名を訂正してください。

解説

ブログのサービスや、スキンで細かいところは違いますが、サイドバーのカレンダー部分は次のようなHTMLになっています。

<table cellpadding="0" cellspacing="0" border="0" width="100%" class="calendar_bg">
<tr>

<th align="center" valign="middle" class="calendar">日</th>
<th align="center" valign="middle" class="calendar">月</th>
<th align="center" valign="middle" class="calendar">火</th>
<th align="center" valign="middle" class="calendar">水</th>
<th align="center" valign="middle" class="calendar">木</th>
<th align="center" valign="middle" class="calendar">金</th>
<th align="center" valign="middle" class="calendar">土</th>

</tr>
<tr>

<td align="center" valign="middle" class="calendar">1</td>
<td align="center" valign="middle" class="calendar">2</td>
<td align="center" valign="middle" class="calendar">3</td>
<td align="center" valign="middle" class="calendar">4</td>
<td align="center" valign="middle" class="calendar">5</td>
<td align="center" valign="middle" class="calendar">6</td>
<td align="center" valign="middle" class="calendar">7</td>

</tr>

(中略)

</table>

上のHTMLでthという部分は「見出し」という意味、tdというのが「内容」という意味、この場合は日付です。

この中で class=”calendar” と書かれた要素だけ、
文字のサイズを80%の大きさで表示しなさい」という命令が.calendar{font-size:80%;}です。

.calendar{font-size:80%;} の一番左の . (ドット)の前にtdをつけて

td.calendar{font-size:80%;}

とした場合、「要素がtdのもので、かつ、クラスがカレンダー(class=”calendar”)の場合だけ、文字の大きさを80%にしなさい」という指示になります。

. (ドット)の前に何もつけなければ、すべてのcalendarクラス(class=”calendar”)にスタイルシートは適用されます。

長いタイトルでも重ならないナビゲーション

口で説明すると難しいんですが、今回やりたいことは下の図のように横幅が広いときには1行で、横幅が足りない時には2行で、「前の記事」を左端に、「次の記事」を右端に表示することです。

横幅の広い状態

横幅の狭い状態

このブログは「ここにブログの名前を入れます」というタイトルですが、長いので以下「ナマ入れ」と省略表記します。

先日、ナマ入れのスキンを変えました。まだスキンの名前を発表していなかったので、ここで発表させていただきます。スキンには「薄いけど破れない」という名前をつけました。

話は戻ります。このスキン(テンプレート)は画面の幅に応じて左右の幅が伸縮するように作っています。よく伸びるスキンです。実際にブラウザのサイズを変えて見ていただくと、お分かりいただけると思います。

ただし、あまりにも狭いと見づらいので、800ピクセルより小さいときは固定幅になり、それより小さくならないようにしてあります。

問題は、画面の幅が足りている時と、足りていない時の2つのパターンがあって、その両方に対応しないといけないということです。今回の場合、横幅に応じて文字の大きさを変えるというアプローチもあるにはあります。

しかし、文字が小さくなるのは読みづらさにつながると思うので文字サイズは固定したまま、幅が足りない時は改行させるようにしました。

ソースコード

HTML

<div class="navi">

  <span class="left">
    <a href="URL" title="前の記事名">&laquo; 前の記事「記事名」</a>
  </span>

  <span class="right">
    <a href="URL" title="次の記事名">次の記事「記事名」 &raquo;</a>
  </span>

</div>

<br class="clear" />

スタイルシート(CSS)

div.navi{
 width:100%;
}
div.navi span.left{
 float:left;
 text-align:left;
}
div.navi span.right{
 float:right;
 text-align:right;
}
br.clear{
 clear:both;
}

&laquo; と &raquo; の2つはエンティティです。

実際には「&laquo;」は「«」、「&raquo;」は「»」と表示されます。

参考記事:ハートマークを表示するの巻 エンティティの説明をしています

英語ではないらしいのですが、私はleft(左)の「&laquo;」と
right(右)の「&raquo;」と覚えました。

ナビゲーションの表示領域はクラス名「navi」のdivエレメントです。

HTML5で書く場合は「div」ではなく、新しいエレメント「nav」が使えますが、今回の話題から逸れるので割愛します。

今回、もっとも重要なのは float です。

float の説明は以前の記事で説明しています。

参考記事:画像の隣に文章を配置したい floatの説明をしています

float:left;の指定で « 前の記事「記事名」 全体を左に寄せます。同様に float:right;の指定で 次の記事「記事名」 » 全体を右に寄せます。

これで上の図のように、領域が足りている時は1行で、領域が足りない時は2行で表示されるようになります。

float を指定した後は忘れずに clear を指定しないとレイアウトがグチャグチャになるので注意が必要です。

text-align の指定はなくてもいいかもしれません。

ただ、 <div class=”navi”> ~ </div> の領域にtext-align:center を指定したら、表示が汚くなったので書き込んだままにしています。

参考記事:枠の中の背景に画像を使いたい! 記事中の「文字位置の指定」でtext-alignを説明しています。

ファンブログのスキンに適用する場合

このブログを書いているサービス「ファンブログ」のスキン用オリジナルタグは「ファンブログのオリジナルタグ一覧 - ファンブログ!![無料]」で調べることが出来ます。そのオリジナルタグを適用して上のHTMLを、1記事ページのスキンに書き込むと下のようになります。

<div class="navi">
<BlogArchivePrevious>
<span class="left"><a href="{$BlogArchiveLink$}" title="{$BlogArchiveTitle$}">&laquo; 前の記事「{$BlogArchiveTitle$}」</a></span>
</BlogArchivePrevious>
<BlogArchiveNext>
<span class="right"><a href="{$BlogArchiveLink$}" title="{$BlogArchiveTitle$}">次の記事「{$BlogArchiveTitle$}」 &raquo;</a></span>
</BlogArchiveNext>
</div>

<BlogArchivePrevious> と </BlogArchivePrevious> の間に書いてあることは、前の記事があるときだけ表示されます。つまり、前の記事がない場合に « 前の記事「」 とカッコの中が空の状態で表示されてしまう心配はありません。

同様に <BlogArchiveNext> から </BlogArchiveNext> の間は、次の記事があるときにだけ表示されます。