Странный гейзенбаг в макете CSS
Хорошо, у меня действительно странная проблема с CSS, и мне интересно, кто-нибудь может предложить объяснение.
Действия по воспроизведению:
Откройте Chrome и перейдите по http://www.mcwhinneys.com/media. Галерея фотографий должна быть выровнена, смещена вправо примерно на 50-70 пикселей. Откройте консоль разработчика в Chrome.
Ожидаемый результат:
Я делаю это, чтобы проверить CSS, ожидая увидеть, почему изображения смещены в сторону, исправить CSS и двигаться дальше.
Фактические результаты:
Галерея изображений выравнивается, когда открываются инструменты разработчика.
Кто-нибудь знает, почему это может произойти? Кажется, что css в порядке, когда я проверяю его, но он определенно не отображается правильно, пока консоль не была открыта.
2 ответа
Ну, настоящая причина неправильного расположения - это сочетание text-align: center
на ваше ngg-gallery-thumbnail-box
(Я буду называть эту коробку с этого момента) с position: absolute
+ display: inline-block
на внутренней ngg-gallery-thumbnail
(Я назову этот большой палец).
Это выглядит так:
Мы применяем
text-align: center
в коробку. Это заставит его центрировать своих встроенных детей. Он делает это (концептуально), помещая левый край каждого дочернего элемента в текущую позицию "текстового курсора" (который, что важно, начинается в центре поля), а затем перемещая его влево, чтобы "перецентрировать" его. Это - тоже важно - "работа" бокса.Мы объявляем большой палец как
inline-block
, Это (среди прочего) заставит его следоватьtext-align
его родителя, имея в виду, что - в данный момент - он центрирован.Затем мы объявляем большой палец
position: absolute
, Это выведет его из потока, поместив его левый край в ту же точку, в которой он был бы изначально - потому что мы не указываемleft
/right
,
"Наивным" толкованием этого было бы то, что он все еще находится в центре поля, и все было бы хорошо, но мы получаем "побочный эффект"...
Поскольку мы убрали большой палец из потока, у box больше нет встроенного содержимого, а это означает, что его текстовый курсор находится в центре, и ему не нужно ничего центрировать. Его "работа" выполнена.
Но так как thumb является inline-block, его исходная позиция по-прежнему основана на позиции курсора текста в центре (в центре), что означает, что, когда мы делаем его
position: absolute
его левый край будет расположен в этом центре. Он не центрирован по горизонтали внутри бокса, потому что с точки зрения бокса в его потоке нет дочерних элементов, которые нуждаются в центрировании.
Это на полпути к проблеме курицы и яйца, поэтому Chrome, похоже, запутывается, когда выполняет повторную визуализацию страницы для консоли.
Это объяснение также может быть немного запутанным, но вы можете увидеть результат здесь - и даже в этом простом примере консоль Chrome выполнит перекомпоновку, когда вы попытаетесь осмотреть его. В этом примере даже кажется достаточным изменить размер окна, не открывая консоль (v17.0.963.56):
Насколько я знаю, то, как он рендерится первым, это то, как он "должен быть" (в прошлый раз я проверял, рекомендации W3C были расплывчаты по этому поводу, но, по крайней мере, Firefox согласен с предварительным просмотром рендера).
Есть много способов обойти это, мое любимое существо, чтобы использовать только text-align: center
центрировать... текст и попытаться использовать, например, margin: auto
центрировать другой контент.
Это действительно трудно сказать, но похоже, что это может быть связано с взаимодействием стиля элементов с классом. ngg-gallery-thumbnail
, Я бы попробовал настроить / упростить это. Вам нужен display:inline-block
например, там?