Некоторое время я был в тупике, мои центрированные фоновые изображения не были выровнены по пикселям в их контейнерах. У меня даже были разные результаты в одном браузере, но в разных окнахCSS-центрирование изображений в центрированном контейнере дает непредсказуемые результаты
Наконец-то я узнал, что происходит, но у меня все еще не хватает надежного кросс-браузерного решения.
Корпус: Я работаю над сворачиваемым древовидным представлением в javascript. Все работает нормально, но в некоторых случаях кнопки свернуть/развернуть с одного пикселя влево.
Изображения для этих кнопок определяются пользователем, а также размер (ширина) контейнера, в котором они находятся. Изображения рисуются в центре этих контейнеров с помощью background-position: center center;
. Теперь есть случаи, когда изображение не может быть установлено точно в центре контейнера (например, центрируя изображение 9px в контейнере 20px, с каждой стороны есть разница в 1 пиксель). Это не должно быть проблемой, если у нас есть последовательное поведение в отношении того, как браузер справляется с этим.
Но вот где это становится грязным: я реализовал этот древовидный вид внутри обертки с центром margin:0 auto;
на основе окна просмотра браузеров. И вот когда я получаю разные результаты, когда центрирование и фокусное центрирование не подходят точно в пределах границ пикселей.
Это, вероятно, трудно следовать, поэтому я нажал на проблему в скрипкой: http://jsfiddle.net/3y65wgu8/1/
CSS:
#wrapper1 {
width:400px;
}
#inner1 { /* perfect center */
margin:0 auto;
width:200px;
height:50px;
}
#wrapper2 {
width:399px;
}
#inner2 { /* 1px-offcenter */
margin:0 auto;
width:200px;
height:50px;
}
#container { /* image 1px-offcenter (9px centered in 12px container) */
width:12px;
height:12px;
background:url(data:image/gif;base64,R0lGODlhCQAJALMAANLNve/s58a7rd7Vznuatf////f39wAAALXD1vfz7+fj3tbTxsa6pdbPxt7b0sa2pSH5BAAAAAAALAAAAAAJAAkAAAQoEJFJiSw4l6mxmUYYJgp4nKczJUngKsOkOMOyNMAECALDPAJLhYKIAAA7) no-repeat center center #444;
}
HTML:
<div id="wrapper1">
<div id="inner1">
<div id="container"></div>
</div>
</div>
<div id="wrapper2">
<div id="inner2">
<div id="container"></div>
</div>
</div>
Два разных оберток центрирования их содержащего два идентичных контейнера, имеющих небольшую кнопку, выполненную в виде фона. Chrome, похоже, единственный браузер, который последовательно выравнивает кнопки выравнивания, но firefox и IE показывают проблему, которую я описал. Попробуйте изменить размер окна браузера и увидите, как кнопки отскакивают с одной стороны на другую.
Мой вопрос: как я могу получить хотя бы идентичные результаты, не теряя при этом гибкость при калибровке и стилизации кнопок/контейнера/обертки.
EDIT: Вот картина, которая иллюстрирует мою потребительной случай:
область отмечена синим цветом, является контейнером, который удерживает кнопку сворачивания. Эта область всегда квадратная, но может отличаться по размеру. Кнопка может быть любым изображением, меньшим, чем этот контейнер, и размещается непосредственно сверху, где встречаются линии. На изображении не должно быть растяжения или масштабирования. В этом примере кнопка слишком далеко влево. Изменение размера окна моего браузера приводит к тому, что изображение переходит в правильное положение и выходит из него, как описано выше.
Является ли контейнер для изображения фиксированным? Если это так, то если вы храните метаданные для изображения в базе данных (например, местоположение, подпись), возможно, вы также можете сохранить размеры изображения. Учитывая размеры изображения, вы можете рассчитать, на стороне сервера (Math.Floor), целочисленное значение для желаемого смещения для фонового положения для каждого изображения, а затем вы не будете во власти нежелательного округления браузера. –
@AndrewMorton нет, это не так, внешний вид древовидной структуры в значительной степени настраиваемый и может быть практически любого размера. Однако этот контейнер всегда квадратный. Размер изображения также является переменной. Извлечение метаданных изображения и их использование должны работать в большинстве случаев, но я считаю, что должно быть более простое решение :) – Pantalaimon
При добавлении JsFiddle приятно, пожалуйста, также разместите соответствующий раздел кода в вопросе. JsFiddle может перестать работать в один прекрасный день, и вопрос должен оставаться понятным без внешних ресурсов. – k0pernikus