Firefoxで縮小した際に表示がズレる問題

1pt

Firefox で縮小した際に表示がズレる問題の概要


pixel単位で指定するタイトなデザインを作っていると、Firefoxで縮小表示した際にfloat段組が下にズレる。
※「文字サイズだけ変更」ではなく、フルページズームの縮小です。

原因をググって先頭100件で出てこなかったので、ここに書くことにした。

ズレの発生条件


pixel指定した float 要素を、同じくpixel指定した、ピッタリの幅で囲っている場合に顕著に発生。(ピッタリでなくても、発生する可能性あり)

ズレの発生原因


Firefoxの縮小は、「小数点以下繰上げ」の為。

検証に基づいた推測です。

  • 67pxのものを縮小すると下記のようになる。
    • 67 * 90% = 60.3 繰り上げて 61px
    • 67 * 80% = 53.6 繰り上げて 54px
    • 67 * 67% = 44.89 繰り上げて 45px
    • 67 * 50% = 33.5 繰り上げて 34px
    • 67 * 30% = 20.1 繰り上げて 21px
  • 272pxのものを縮小すると下記のようになる。
    • 272 * 90% = 244.8 繰り上げて 245px
    • 272 * 80% = 217.6 繰り上げて 218px
    • 272 * 67% = 182.24 繰り上げて 183px
    • 272 * 50% = 136
    • 272 * 30% = 81.6 繰り上げて 82px
  • 1pxのものはどんなに縮小しても1pxで表示される。


さて、67pxのタブに右だけ1pxの枠をつけたものを4つ並べたレイアウトを、272pxのdivで囲んだレイアウトを考えてみる。

  • 100%時は、(67 + 1) * 4 = 272px で、ピッタリだ。


これを縮小した時、パーセンテージ毎に計算してみる。

  • 90%時、(61 + 1) * 4 > 245px で、ズレる。
  • 80%時、(54 + 1) * 4 > 218px で、ズレる。
  • 67%時、(45 + 1) * 4 > 183px で、ズレる。
  • 50%時、(34 + 1) * 4 > 136px で、ズレる。
  • 30%時、(21 + 1) * 4 > 82px で、ズレる。


要するに、全部はみ出してしまい、下にズレる事になる。これは一例だけれど、特に幅1pxのボーダーを付けた時は、発現しやすい。

対策

ぱっと思いつく限りで、下記のようにすれば解決できると思う。
100% ÷ 並べる要素数 を、並べる要素の幅に指定して、その中に枠線などが入ったdivを作る。
→ 例えば4つ並べるならば、幅25% を各要素に指定する。


下記、検証用html。(こういうのを、気になったものの数だけ、ポコポコ作ってます。)

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <title>CSS Float For Firefox</title>
<style type="text/css">
ul#f1{width: 272px;}
ul#f1 li {
    display: block;
    float: left;
    width: 25%;
    background-color:green;
}
ul#f1 li div{
    width: 67px;
    border-left: 1px solid black;
    background-color: yellow;
    text-align: center;
}

ul#f2{width: 272px;}
ul#f2 li {
    display: block;
    float: left;
    width: 25%;
    width: 67px;
    border-left: 1px solid black;
    background-color:yellowgreen;
    text-align:center;
}
.example ul{margin:0; padding:0;}
.w272{clear:both; width:272px; border-top:1px solid red; margin-bottom:10px; color:red;}
#comment{margin: 20px; padding: 1em; background-color: #CCCCCC; border:1px solid #333333;}
div div{margin: 0;}
hr {clear: both;}
</style>
</head>
<body>
<h1>Firefoxでfloatを縮小表示する際の対策テスト</h1>
<div id ="comment">
<p>
Firefox の縮小は、幅の数値を「小数点以下を繰り上げ」するようです。
</p>
<p>
つまり、<br />
<ul>
<li>幅67pxならば、90%の時 67×0.9 = 60.2px。繰り上げるので表示は61pxです。</li>
<li>幅1pxならば、縮小してもずっと1pxです。</li>
</ul>
</p>
<p>
全体の幅が指定してあり、かつその中の各要素を幅ギリギリまで取ってFloatしてあるものを縮小すると、「全体の幅 < 各要素の幅合計」になる瞬間がやってきます。そして、ズレます。
(特に、幅1pxの枠を使う場合は、ズレやすいです。)
</p>

<p>
ぱっと思いつく限りで、下記のようにすれば解決できると思います。<br />
100% ÷ タブ数 を、タブの幅に指定して、その中に枠線などが入ったdivを作る</br />
→ 例えばタブが4つならば、幅25% を各タブに指定する
</p>
</div>

<hr />

<div class="example">
<h2>%指定divで囲む対策</h2>
<ul id="f1">
<li><div>67px</div></li>
<li><div>67px</div></li>
<li><div>67px</div></li>
<li><div>67px</div></li>
</ul>
<p class="w272">272px</p>
</div>
<hr />
<div class="example">
<h2>対策なし</h2>
<ul id="f2">
<li><div>67px</div></li>
<li><div>67px</div></li>
<li><div>67px</div></li>
<li><div>67px</div></li>
</ul>
<p class="w272">272px</p>
<hr />
</div>
</body>
</html>


参考 Firefoxの縮小率
http://mozlinks-jp.blogspot.com/2008/06/firefox-3.html

「Firefoxで縮小した際に表示がズレる問題」について友人に書いてもらう。

あなたにとって「Firefoxで縮小した際に表示がズレる問題」とは?

ログインするとワンクリックでキーワードを投稿できます

ログインする 新規登録する

他の人の「Firefoxで縮小した際に表示がズレる問題」を見る