0

Safari でのみ発生する奇妙な問題に遭遇しました (Mac では 7 - Windows についてはわかりません)。

ユーザーが縮小すると、ヘッダーの上にスペースが表示されます。100% (ズームなし) またはズームインすると、スペースがありません。

過去の経験から、私は padding-top (うまくいきませんでした) と border-top を追加してみることにました。

だから - ここの誰かが私に説明してくれることを願っています:

  1. ボーダートップがこれを修正する理由を知っていますか?
  2. これは Safari のバグですか、それとも私が何か誤解しているのでしょうか?
  3. これを修正するより良い方法はありますか?この特定のクライアントにとって、ボーダートップは問題になるでしょう。よりクリーンな解決策を見つけたいと思います。

HTML:

<!DOCTYPE html>
<html>
    <head>
        <title>My Title</title>
    </head>
    <body>
        <div id="headerwrapper">
            <div id="headerliner">
                <header>
                    <nav class="menu">
                        <ul>
                            <li><a href="#">Top Level Menu Item</a>
                                <ul class="sub-menu"><li><a href="#" >Child Menu Item</a></li></ul>
                            </li>
                        </ul>
                    </nav>
                </header>
            </div>
        </div>
    </body>
</html>

CSS:

html, body {
    margin: 0;
    padding: 0;
}
#headerwrapper {
    margin: 0;
    padding: 0;
}
#headerliner {
    margin: 0;
    padding: 0;
}
header {
    background: black;
    margin: 0 auto;
    padding: 1px 0 0 0;
    /* Remove the below line, and the space appears in Safari */
    border-top: 1px solid black;
}
4

2 に答える 2

1

これを修正するより良い方法はありますか?

ハックを使用する以外にこれを修正する方法を見つけるborder-topために、要素を調べて問題の根本原因を見つけてみましょう。ズームアウトしたときに上にスペースがあるのは、Safari がデフォルトで要素にmargin-top: 16pxandmargin-bottom: 16pxを与えるためです。<ul>

ULマージン分析

したがって、それを修正するには、単に

ul {
    margin-top: 0;
}

全ページのデモを参照してください。(ここでフィドル

あなたのコメントによると:

このコードの完全な製品版で私が直面している問題は、nav がヘッダー/ラッパー要素の上から 36 ピクセル下にあると想定されているため、マージンが具体的で意図的で必要であるということです。

on ( demo )の代わりにいつでも要素で使用できpadding-topます。<nav>margin-top<ul>

nav.menu {
    padding-top: 36px;
}

ボーダートップがこれを修正するのはなぜですか? これはSafariのバグですか?

border-topなぜそれを修正するのかを知るために、マージンの崩壊に関する W3C 仕様を見てみましょう:

余白の縮小

CSS では、2 つ以上のボックス (兄弟である場合とそうでない場合があります) の隣接するマージンを結合して、1 つのマージンを形成できます。... 隣接する垂直マージンが崩壊する... 水平マージンが崩壊することはありません。

2 つのマージンが隣接しているのは... 両方が同じブロック整形コンテキストに参加するインフロー ブロック レベル ボックスに属している ライン ボックス、クリアランス、パディング、境界線がない これらを分離する ...

と に関する 2 つのケースの比較を次に示し<header>ます<ul>

比較

境界線がないとmargin-top<header>(親) と<ul>(子)の を分離するものは何もなく、折りたたまれたマージンは親の外側になり、空白が表示されます。しかし、border-topそれらを分離するために a を使用すると、余白が崩れなくなり、のmargin-top<ul>親の内側に収まり、スペースがなくなります。

于 2013-11-16T14:48:34.840 に答える
0

全体的な CSS リセットを使用していますか? 私はそれを強くお勧めし、すべての CSS ベースのテーマで使用しています。これで問題が解決するとは言いませんが、可能性は常にあります。デフォルトでは、すべてのブラウザが同じというわけではなく、長い道のりでエラーが発生します。

于 2013-11-16T05:45:46.033 に答える