Комментарии 49
Забавные способы, но можно и проще, используя calc и единицы vh/vw.
Если уж и использовать современные фичи, то с flexbox это делается куда проще. А главное — результат получится гораздо гибче.
IE9…
Ну а для IE9 костыль jsfiddle.net/zzmm8481/
Этот вариант не решает проблемы, когда нужен скролл у родителя, если блок больше его.
И про это есть порно костыль jsfiddle.net/zzmm8481/3/
Ну так для чего это всё, если можно взять просто 4й вариант )
Чтобы не терять размер шрифта при каждом центрировании блока.
Вы можете не ставить font-size: 0, он нужен для того, чтобы убрать пробел между родителем и блоком, допущенный при форматировании кода. Можно сделать вёрстку без пробела, либо убрать его другим способом. jsfiddle.net/serdidg/nfqg9rza/29/
font-size: 0 — самое плохое, что тут можно придумать. Верстка без пробела лучше, но не очень удобно. Самый приятный вариант, на мой взгляд — закоментировать пробелы:
<div class="parent"><!--
--><div class="block">
<img src="http://habrastorage.org/files/50f/7b2/1cc/" alt=""/>
</div>
</div>
Где-то даже был спор как у инлайновых элементов лучше убирать отступ. Так что я не буду рекомендовать вообще ничего по этому поводу. Пусть каждый делает как ему больше нравится. ) Ваш вариант приму на заметку.
ПС. На больших проектах не использую наследования шрифтов, так что не испытываю проблем с font-size: 0. Всё разбито на модули, стили шрифтов в миксинах и тд.
ПС. На больших проектах не использую наследования шрифтов, так что не испытываю проблем с font-size: 0. Всё разбито на модули, стили шрифтов в миксинах и тд.
Есть еще CSS3 метод в три строки:
.v-align {
position: absolute;
top: 50%;
transfrom: translateY(-50%);
}
Устанавливаем позиционирование относитель родительского элемента, устанавливаем положение посередине (50%) и затем translateY (2D преобразование) поднимает элемент на 50% от высоты оного вверх.
И, чтобы избежать размытия из-за расположения на «half-pixel», родительскому элементу устанавливаем параметр сохранения размеров: .parent { transform-style: preserve-3d; }
.v-align {
position: absolute;
top: 50%;
transfrom: translateY(-50%);
}
Устанавливаем позиционирование относитель родительского элемента, устанавливаем положение посередине (50%) и затем translateY (2D преобразование) поднимает элемент на 50% от высоты оного вверх.
И, чтобы избежать размытия из-за расположения на «half-pixel», родительскому элементу устанавливаем параметр сохранения размеров: .parent { transform-style: preserve-3d; }
А как потом считать координаты внутри такого блока, например drag'n'drop и тд? На них ведь сдвиг не влияет?
НЛО прилетело и опубликовало эту надпись здесь
Верно, при анимации может быть размытие. Но мы же не собираемся анимировать то, как мы центрируем блок? Это же «хак». :)
НЛО прилетело и опубликовало эту надпись здесь
Хм, я понял что вы имеете ввиду. Если не сложно, то не могли бы поделиться более подробной информацией насчет этого бага? Буду премного благодарен.
Я вот попытался воспроизвести описанную вами проблему (в меру своего понимания оной) и у меня все вроде бы ок — jsfiddle.net/nick_v6/d05deaw9/1/
Я вот попытался воспроизвести описанную вами проблему (в меру своего понимания оной) и у меня все вроде бы ок — jsfiddle.net/nick_v6/d05deaw9/1/
НЛО прилетело и опубликовало эту надпись здесь
Да, можно. Мне просто не нравится вариант с эмуляцией таблицы в принцыпе.
Дополнил статью примером.
НЛО прилетело и опубликовало эту надпись здесь
Кому как. Из варианта 4 делается отличный миксин, и применяет по всему проекту если нужно. А таблица требует уже нужное количество нодов. К тому же часто нужно сделать вот так — jsfiddle.net/serdidg/nfqg9rza/3/, когда картинка масштабируется при уменьшении родительского блока.
А какого из вышепредставленных способов ещё не было на Хабре?
(про интернет (рунет) даже спрашивать стесняюсь)
habrahabr.ru/sandbox/62257/
habrahabr.ru/post/189696/
habrahabr.ru/post/73113/
habrahabr.ru/post/71236/
(про интернет (рунет) даже спрашивать стесняюсь)
habrahabr.ru/sandbox/62257/
habrahabr.ru/post/189696/
habrahabr.ru/post/73113/
habrahabr.ru/post/71236/
Варианта #4, больше всего на него похож habrahabr.ru/sandbox/62257/, вот только не задача, он абсолютно не ищется по поиску.
Странно, а я именно в поисковике (в гугле) нашел (скрин).
Перефразирую вопрос: Зачем плодить то, чего уже 100500 раз писалось в сети и даже на текущем ресурсе? Вот описал бы варианты из комментариев про flex, calc или transfrom, их вроде не было на Хабре.
Перефразирую вопрос: Зачем плодить то, чего уже 100500 раз писалось в сети и даже на текущем ресурсе? Вот описал бы варианты из комментариев про flex, calc или transfrom, их вроде не было на Хабре.
Представленный вариант семантически лучше и правильнее, чем пример из песочницы.
Плюс, здесь как-никак разжеваны стили в общих чертах, а не как в примере из песочницы: «Используем эти стили xxx:yyy.», а затем: «Та да! Магия!»
Скажете, что знающий человек разберется — полностью соглашусь, но такие пояснения в двух словах лишними не будут.
Плюс, здесь как-никак разжеваны стили в общих чертах, а не как в примере из песочницы: «Используем эти стили xxx:yyy.», а затем: «Та да! Магия!»
Скажете, что знающий человек разберется — полностью соглашусь, но такие пояснения в двух словах лишними не будут.
Поэтому надо писать целую статью дублей, вместо простого коммита в комментариях?
Если рассматривать отдельно 4й вариант, то статья, увы, в песочнице и там нет комментариев, чтобы довести решение до ума.
Варианты 1, 2, 3 добавлены для сравнения, как я понимаю.
Я фанат дублей, но порой обсуждение тех или иных вопросов в старых статьях затухает на неопределенных моментах, а подобные дубли возобновляют обсуждение вопросов с учетом новых появившихся технологий и подходов.
Варианты 1, 2, 3 добавлены для сравнения, как я понимаю.
Я фанат дублей, но порой обсуждение тех или иных вопросов в старых статьях затухает на неопределенных моментах, а подобные дубли возобновляют обсуждение вопросов с учетом новых появившихся технологий и подходов.
css-tricks.com/centering-css-complete-guide/ — вот этой ссылки должно хватит всем. Если нет, шлите Крису PR.
Думаю, будет недостаточно.
Вот обсуждение примера такого же как на css-tricks (3 вариант с неизвестными размерами) и его последствия.
Вот обсуждение примера такого же как на css-tricks (3 вариант с неизвестными размерами) и его последствия.
На css-tricks в комментариях тоже упоминается данная проблема, и есть ссылка на возможное решение: zerosixthree.se/vertical-align-anything-with-just-3-lines-of-css/.
И вот что будет, если по такому принципу сделано диалоговое окно, в котором, например, есть кастомные селекты или дейтпикеры. screencloud.net/v/cp6P
Добро пожаловать в интернет.
Думал будет что то новое, но и не все старое есть.
И даже со скроллом )
jsfiddle.net/serdidg/m8kr4o8w/1/
jsfiddle.net/serdidg/m8kr4o8w/1/
оффтоп:
Вот от этого «Минусом данного способ есть ...» плачу кровью. Есть можно руками или ложкой, но не минусом.
Вот от этого «Минусом данного способ есть ...» плачу кровью. Есть можно руками или ложкой, но не минусом.
Так же можно выравнивать картинку по центру, и в случае если картинка больше родителя, масштабировать её по размеру родителя. Пример: jsfiddle.net/serdidg/nfqg9rza/3/.
Странный пример. Во-первых, там картинка не больше родителя (width: auto; max-width: 100%;). Во-вторых, там почему-то у родителя стоит position: absolute; в итоге он на реальной странице оказывается наверху, а не там где надо.
И самое печальное, попытался сделать чтобы картинка была больше родителя, но выравнять по центру не удалось. Она выравнивается по левому краю.
Можно этот пример подправить? Чтобы посмотреть, как выравниваться, если картинка больше родителя? Например при условии, что родитель будет обрезать картинку.
Странный пример. Во-первых, там картинка не больше родителя (width: auto; max-width: 100%;).
Можно уменьшить область просмотра, чтобы увидеть эффект. Начальное состояние — screencloud.net/v/7F6u, уменьшенное — screencloud.net/v/h7Wz. Обновил статью и добавил ещё пример с большой картинкой — jsfiddle.net/serdidg/nfqg9rza/386.
Во-вторых, там почему-то у родителя стоит position: absolute; в итоге он на реальной странице оказывается наверху, а не там где надо.
Да, примеры сделаны не для начинающих. Если нужно на всю страницу растягивать — нужно ставить min-height: 100% на body, либо position: fixed на контейнер выравниваемого блока, тогда родитель будет занимать только область окна, а не страницы.
И самое печальное, попытался сделать чтобы картинка была больше родителя, но выравнять по центру не удалось. Она выравнивается по левому краю.
Если использовать стили с этого примера, любые прописанные размеры в стилях / аттрибутах для картинки могут лишить её правильных пропорций при масштабировании родителя — jsfiddle.net/serdidg/nfqg9rza/387, попробуйте окошко просмотра уменьшить по высоте и поймёте о чём я.
Можно этот пример подправить? Чтобы посмотреть, как выравниваться, если картинка больше родителя? Например при условии, что родитель будет обрезать картинку.
Сделал другой пример — jsfiddle.net/serdidg/nfqg9rza/386, родитель в данном примере картинку не обрезает, картинка будет пропорционально масштабироваться. А с обрезаниями, это уже совсем другая история, где используется object-fit: cover и тд.
Живой пример использования — serdidg.github.io/MagpieUI/docs/content/components/GalleryPopup.html#examples
Спасибо за ответ! Буду думать, как сделать не 100%, а больше и чтобы оно обрезалось родителем.
а так не проще ли:
<div id='loading' style='width: 100%; height: 100%;'>
<div style='width: 100px; height: 40px; overflow:visible; position:absolute; left:50%; top:50%; margin-left:-50px; margin-top:-20px; text-align: center;'>
<img src='load.gif' width='100px' height='100px'><br />Загрузка...
</div>
</div>
Источник: bashev.ru/articles/vyravnivaem_blok_div_po_centru_ekranaЗарегистрируйтесь на Хабре, чтобы оставить комментарий
Выравниваем блок по центру страницы