17

水平方向に配置されたリスト ( <li>) から作成された基本的なメニューがあり、それぞれにアイコン イメージといくつかのテキストが含まれています。

メニューバー

の 1 つには、アイコンを切り替えることができるように (この例では緑から赤唐辛子に)<li>の追加の画像が含まれdisplay: none;ています。問題は、上の画像に示すように、一部のブラウザーで正しく配置されないことです。とは対照的にvisibilty: hidden;、 を持つ要素はdisplay: none;他の要素の位置に影響を与えてはならず、存在しないかのようにレンダリングする必要があることを理解していましたか?

正しく表示されないブラウザは Google ChromeSafariですが、Windowsでは MacOS (!?) とIE7 (わかっています...)のみです。私がテストした他のすべてのブラウザーと OS の組み合わせは正常に動作します。

HTMLは次のとおりです。

<ul class="menu">
    <li><img alt="Green Pepper" src="/green.png">li</li>
    <li><img alt="Green Pepper" src="/green.png">li</li>
    <li><img alt="Green Pepper" src="/green.png">li</li>
    <li id="change">
        <img alt="Red Pepper" src="/red.png" style="display: none;">
        <img alt="Green Pepper" src="/green.png"> 
        li
    </li>
    <li><img alt="Green Pepper" src="/green.png">li</li>
</ul>

CSSは次のとおりです。

.menu li {
    cursor: default;
    font-family: Verdana, Arial, Helvetica, sans-serif;
    font-size: 10pt;
    list-style-type: none; 
    position: relative; 
    text-align:center; 
    margin: 0 0 0 -25px; 
    padding: 8px 0 0 0;
    width: 144px;
    height: 35px;
    display: inline-block;
    background-image: url(../bct-white.png);
    background-repeat: no-repeat;
    color: #0091c1;
}

アイコン画像の場合:

.menu img {
    display: inline;
    vertical-align: -25%;
    padding-right: 6px;
}

<!--[if lte IE 7]>また、条件付きインポート ( )に基づく別のスタイルシートからのインライン ブロックを認識しないため、IE7 のブラウザー ハックを含める必要がありました。

.menu li {
    zoom: 1;
    display: inline;
}

ただし、明らかにそのスタイルは OS に関係なく Chrome と Safari に読み込まれないため、Mac で問題が発生することはありません。

HTML とアイコンの表示/非表示の JavaScript 操作をリファクタリングするのが最も簡単な解決策であることはわかっていますが、この問題の原因と解決方法を知りたいです。


アップデート

原因を突き止めました。基本的に、要素の要素スタイルはルールのdisplay: none;要素を<img>オーバーライドします。それを削除してから、 と を切り替えると、問題を再現できます。これは明らかにブラウザのバグであり、要素が表示されていない間は、インライン要素またはブロック要素であってもレイアウトには影響しません。inline.menu imgblockinline


jsFiddles

Mac のみの Chrome と Safari の問題

IE7 のみの追加 CSS に関する問題

ノート!私の場合、IE7 を使用すると Fiddle ページが正しく読み込まれませんでしたが、結果の iFrame への直接リンクはhttp://fiddle.jshell.net/z4dU7/3/show/です。

バウンティアップデート!!!

以下に 1 つの修正を投稿しましたが、実際には IE9 で同じレイアウトの問題が発生します。私の答えを進化させたり、改善したりしてください - または、まったく違うものを持ってテーブルに来てください! :)

4

6 に答える 6

11

スクラップアプローチと背景画像の使用

http://jsfiddle.net/P5CKC/2/

<ul class="menu">
    <li><span>Li</span></li>
    <li><span>Li</span></li>
    <li><span>Li</span></li>
    <li class="change"><span>Li</span></li>
    <li><span>Li</span></li>
</ul>

CSS

ul.menu {
    overlflow: hidden;
}
ul.menu li {
    float: left;
    font-family: Verdana, Arial, Helvetica, sans-serif;
    font-size: 10pt;
    text-align:center; 
    margin: 0 0 0 -25px; 
    width: 152px;
    line-height: 35px;
    height: 35px;
    background: url(../bct-white.png) no-repeat;
    color: #0091c1;
}
ul.menu li span {
    background: url(/green.png) no-repeat 5px 6px;
    display: block;
}
ul.menu li.change span {
    background-image: url(/red.png);
}

CSS2.0 とブラウザの互換性

私が提供したコード アプリケーションは Css2.0 で、IE7 以降で簡単に動作するはずです。

  1. タグを削除imgし、背景として美学 (画像) を実装しました。
  2. spanCSS2 では要素ごとに 1 つの背景画像しか許可されないため、エクストラを追加する必要がありました
  3. Li タグは矢印の背景を保持します。span タグはコショウの背景を保持します
  4. に更新さid="change"れましたclass="change"。#change 要素が 1 つしかないことが 100% 確実でない限り、クラスを使用してください。これは純粋にスタイリングであり、同じページに 2 つのメニュー リストを表示することを防ぎます。
  5. 次のように、CSS スタイルを少し調整しました。

上部のパディングを削除し、高さを増やしました。したがって、li要素は同じ高さですが、追加されますline-height: 35px->これは、テキストを垂直方向に中央揃えする最良の方法です。トップ パディングの使用は機能しますが、ブラウザーの不整合が発生しやすくなります。

li要素を float に変更します。浮動要素は、最も IE7 に適した方法です! IE6 でさえバグ アウトしませんが、Web ページをテストするための古いバージョンはありません。参考までに、ul.menu はoverflow: hiddenフロートをクリアする必要があります。

position: relative; 
cursor: default;

デフォルトを変更しない限り、これら 2 つのプロパティは除外できます。カーソルはデフォルトである必要があります。位置: 相対は不要です - 絶対位置またはその必要性を保証するものを使用していません。これで、これらを宣言に含めることができます。私は、コードができるだけ「スリム」であることが好きです。

最後の言葉:

私のCSSを見てください。ul.menuすべての宣言でどのように使用したかに注目してください。同じことをする習慣をつけたいと思うかもしれません。<div class=menu>これにより、開発者は HTML がどのように見えるかについての洞察を得ることができ、さらに重要なことに、後で追加することにした場合でも、CSS がオーバーライドされません。具体的.menu imgには、メニュー div 内のイメージ タグに適用されます。

わかりました-それだけです。明確な説明がある場合はお知らせください。

参考までに-この質問には報奨金があるため、背景画像を提供していただければ、ニーズに100%合うようにコードを磨くことができます-おそらく、回答の編集でそれらをアップロードしてください。

于 2013-07-18T16:16:58.300 に答える
2

これは奇妙な問題ですが、Firefox v22 で問題を再現できました。本当に奇妙な部分は、jsFiddleで "Tidy Up" を押してから "Run" を押すだけで問題が解決したことです。Matthew R が述べたように、これは追加の空白が削除されたことが原因である可能性があります。

壊れた: ここに画像の説明を入力

片付け、実行、修正 ここに画像の説明を入力

背景画像を使用する別の方法を次に示します。

実施例

.menu li {
  cursor: default;
  font-family: Verdana, Arial, Helvetica, sans-serif;
  font-size: 10pt;
  list-style-type: none;
  position: relative;
  text-align: center;
  margin: 0 0 0 -25px;
  padding: 8px 0 0 10px;
  width: 118px;
  height: 20px;
  display: inline-block;
  background-image: url(http://modmyi.com/attachments/forums/iphone-4-4s-new-skins-themes-launches/465481d1282224308-classified-hd-cydia-released-goldborder.png), url(http://i.stack.imgur.com/dmHl0.png);
  background-position: 0% 0%, 44% 75%;
  background-size: 128px, 18px;
  background-repeat: no-repeat;
  color: #0091c1;
}

.menu img {
  display: inline;
  vertical-align: -25%;
  padding-right: 6px;
}

#change:hover {
  background-image: url(http://modmyi.com/attachments/forums/iphone-4-4s-new-skins-themes-launches/465481d1282224308-classified-hd-cydia-released-goldborder.png), url(http://www.chiletownhotsauce.com/images/stories/Red%20bell%20pepper.jpg);
  background-repeat: no-repeat;
  background-position: 0% 0%, 44% 75%;
  background-size: 128px, 18px;
}
<ul class="menu">
  <li>li</li>
  <li>li</li>
  <li>li</li>
  <li id="change">li</li>
  <li>li</li>
</ul>
于 2013-07-17T21:54:11.430 に答える
0

35px の代わりに line-height を間違えた 23px を与える

<ul class="menu">
  <li><span>Li</span></li>
  <li><span>Li</span></li>
  <li><span>Li</span></li>
  <li class="change"><span>Li</span></li>
  <li><span>Li</span></li>
</ul>
ul.menu {
  overlflow: hidden;
}
ul.menu li {
  float: left;
  font-family: Verdana, Arial, Helvetica, sans-serif;
  font-size: 10pt;
  text-align: center;
  margin: 0 0 0 -25px;
  width: 152px;
  line-height: 23px;
  list-style: none;
  height: 35px;
  background: #ccc;
  color: #0091c1;
}
ul.menu li span {
  background: url(http://i.stack.imgur.com/dmHl0.png) no-repeat 5px 6px;
  display: block;
}
ul.menu li.change span {
  background-image: url(/red.png);
}

出力を確認する

jsfiddle リンク

ここに画像の説明を入力

于 2013-07-23T13:19:33.360 に答える
0

この問題 (の外観) を解決するには、メニューに含まれるアイコン イメージの垂直方向の配置を変更します。

.menu img {
    display: inline;
    vertical-align: top;
    margin-top: 2px;
    padding-right: 6px;
}

影響を受けるブラウザーでは、追加の画像 ( 付きdisplay: none;) が含まれている要素の高さを変更していました。を に設定<img>するdisplay: none;と、display: inline;設定が適用されなくなり、最初の画像の下に配置されました。

追加<img>のインライン表示を行うだけで垂直方向の配置が修正されますが、テキストの位置を変更せずに画像を非表示にする必要があるため、明らかに問題は修正されません。

この修正により、垂直方向の配置がパーセンテージ (-25%) から固定位置に変更され、含まれている要素の高さの (誤った) 違いが回避されます。次に、画像の上マージンを設定して、要素の上端から必要な間隔を取得しました。

アップデート

この修正により、IE9 の表示が壊れます。この修正を適用しない場合、IE7 と同じ外観になります。

于 2013-07-12T10:17:22.170 に答える