У меня есть основное меню, сделанные из горизонтально выровненного списка (<li>
), каждый из которых содержит значок изображение и текст:Элемент с дисплеем CSS: нет; разрывные расположение - вызывают перекосы
Один из <li>
содержит дополнительное изображение с display: none;
, так что значок может быть переключен (от зеленого до красного перца, в этом примере). Проблема заключается в том, что он не выравнивается правильно в некоторых браузерах, как показано на рисунке выше. Мое понимание было то, что в отличие от visibilty: hidden;
, элемент с display: none;
не должен влиять на положение любого другого элемента и должен быть как будто его там нет?
браузеры, где не делают правильно в Google Chrome и Safari - но только на MacOS и IE7 (я знаю, я знаю ...) на Windows, (!?). Каждая другая комбинация браузера/ОС, которую я тестировал, отлично работает.
Вот 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;
}
Я также должен был включать в себя браузер взломать для IE7, поскольку он не распознает встроенный блок, исходящий из отдельной таблицы стилей на основе условного импорта (<!--[if lte IE 7]>
):
.menu li {
zoom: 1;
display: inline;
}
Хотя, очевидно, что стиль не загружен на Chrome и Safari независимо от операционной системы, поэтому не может быть причиной моего вопроса на Маках.
Я знаю, что самым быстрым решением было бы рефакторинг HTML и JavaScript манипуляции с отображением/скрытием значков, но мне очень хотелось бы знать, что вызывает эту проблему и как ее решить.
Update
Я отслеживал дело вниз. В принципе, стиль элемента display: none;
на элементе <img>
переопределяет inline
из правила .menu img
. Снимая это, затем переключение между block
и inline
позволяет воспроизвести проблему. Очевидно, это ошибка браузера, и пока элемент не отображается, поскольку элемент в строке или блоке не должен влиять на макет.
jsFiddles
Issue with Chrome and Safari on Macs only
Issue with extra CSS for IE7 only
Примечание!Для меня страница Fiddle не загружалась должным образом с использованием IE7, но прямая ссылка для результата iFrame равна http://fiddle.jshell.net/z4dU7/3/show/
Bounty update !!!
Я разместил одно исправление ниже, но на самом деле он вводит ту же самую проблему размещения в IE9! Пожалуйста, не стесняйтесь меняться или улучшать свой ответ - или приходите к столу с чем-то совершенно другим! :)
Думаю, нам нужно увидеть это в действии, чтобы быть в состоянии помочь вам. Я сделал быструю скрипку и не смог воспроизвести это поведение - отображение: ни один из них не удалил изображение из макета (как и должно быть). Может быть, '# change' использует некоторые другие стили? – David
Эта демонстрация демонстрирует это в IE7: http://jsfiddle.net/z4dU7/3/ Чтобы увидеть проблему на Mac, просто удалите последнее правило стиля (которое вытащили из специальной таблицы стилей IE в моей системе). – Mikaveli
@David Я обновил свой вопрос со ссылками на оба сценария. – Mikaveli