Как сделать окно по центру экрана

Обновлено: 03.05.2024

Как сделать стопроцентно адаптивное модальное окно на чистом CSS, которое к тому же выводилось строго по центру, и одинаково хорошо, без видимой ломки, смотрелось на различных типах экранов пользовательских устройств?

Вопрос конечно интересный, а процесс реализации и вовсе увлекательнейший. Конечно, макет модального окна, о котором сегодня пойдёт речь, скорее резиновый, так как адаптивность, в навороченных кругах, подразумевает наличие, прописных мета-тегов для мобильных устройств, медиа-запросов в css и прочие установленные «трендованными буржуинами» и еже сними, стандартами.
К теме создания модальных окон, я возвращался много раз, описывал способы с использованием jQuery и исключительно на чистом CSS3. В представленном сегодня примере объединил некоторые концепции и получилось то, что получилось. Не стоит принимать этот метод, как руководство к действию, скорее это, рабочий материал, поиски оптимальных решений.

Смотрите живой пример, а далее разберём немного по-подробнее составляющие.

Адаптивное модальное окно на чистом CSS

Html разметка

Вызывается окно ударом по ссылке, адрес которой, должен соответствовать идентификатору того или иного модального блока. Объектом для ссылки может служить практически любой элемент, в примере использовал в виде более-менее оформленной кнопки:

Базовым контейнером, в который размещаем модальный блок с содержанием, является слой затемнения, чаще всего я выношу фон в отдельный div, в данном же случае, решил объединить в единую конструкцию все элементы. Тесты показали, что всё работает нормально, только вот с реализацией закрытия окна по клику вне зоны блока(по слою затемнения), возникают трудности.

Весь макет состоит из четырёх div-контейнеров с последовательной вложенностью, под формирование которых выделены отдельные классы в css, при использовании миниатюр или видео, добавляется ещё один блок. Ключевые свойства отвечающие за центрирование окна, оставляем как есть, экспериментируйте с формированием, как самого модального блока, так и внутренних элементов:

Наверное, для центрирования, вместо элементов блочной таблицы table-cell , проще было бы использовать трансформацию, свойство transform с отрицательными процентными значениями, но помимо того, что метод не работает в IE8 и необходимо использование префиксов, главное, он может мешать работе других эффектов с transform, а в некоторых случаях при рендеринге размываются края блока и текст. Хотя в случае с IE8, модальные окна на чистом CSS, так и так не срабатывают.

Для определения ширины модального блока, как вы видите, я использовал единицу измерения в em и установил максимальную ширину элемента max-width , так окно видоизменяется более корректно нежели при width: %;

Никаких дополнительных js-библиотек не подключал к работе, только магия CSS3. Модальный блок и слой затемнения, до поры до времени спрятал с газ долой(со страницы), с помощью display: block; . Прикрутил простенькую анимацию через @keyframes , с помощью свойства opacity , с небольшой задержкой, происходит плавный переход модального окна и слоя затемнения в открытое состояние. У кого появится желание, можете смело поэкспериментировать, благо примеров в сети предостаточно.

/* анимация при появлении затемнения и блоков с содержанием */ @-moz-keyframes fade < from < opacity: 0; >to < opacity: 1 >> @-webkit-keyframes fade < from < opacity: 0; >to < opacity: 1 >> @keyframes fade < from < opacity: 0; >to < opacity: 1 >>

Адаптивные изображения в модальном окне

Так и не найдя корректного, всех и вся удовлетворяющего способа остановки проигрывания видео при закрытии модального окна, собранного и работающего на CSS3, всё же включил в пример и вариант всплывающего блока с адаптивным видео. Решения по выключению видеоролика не то чтобы нет, есть, но оно не совсем кошерное, многих перекрученных веб-дел мастеров, просто переворачивает от использования пустующего атрибута href="/" в ссылке кнопки закрытия. Это и понятно, в таком случае видео останавливается посредством перезагрузки страницы, что не есть хорошо.
Видеоролики можете использовать как свои, размещённые у себя на сервере, так и с любого видеосервиса, предлагающего различные методы вставки видео на сайт через iframe, object или embed. Подробно о модальном блоке видео на css3, мы рассматривали ранее, в отдельном уроке, кому интересно, можете освежить память.


Адаптивное видео в модальном окне

Все ключевые, функциональные элементы, используемые в формировании модального блока с содержанием, мы рассмотрели, мне остаётся показать весь код css, который получился в итоге, небольшие комментарии помогут вам разобраться что к чему и зачем:

На этом всё. Не буду утверждать, что всё без ошибок, тестировал во многих браузерах, про IE8 и ниже, сразу надо забыть, это что касается модального окна, центрирование и адаптивность элементов кроссбраузерные, вёрстка не едет при большом количестве текста в блоке, высота изменяемая.
Если что-то пропустил или же обнаружится ошибка, пишите в комментариях. Исходники упаковал в архив и выложил в облако на Яндекс, при возникшем вдруг желании, всегда можете их скачать.

С Уважением, Андрей .

Буду всем признателен, если поддержите проект — добавив блог в исключения AdBlock и поделитесь ссылкой на запись в своих соц-сетях:

Всего комментариев: 81

Здравствуйте!
Спасибо, классно!
Единственное замечание. Если страница большая (с вертикальной полосой прокрутки) а «кнопка», активирующая модальное окно, расположена в подвале, то при клике по ней, одновременно с открытием модального окна страница прокручивается вверх к самому началу. Можно ли сделать как-то так, что бы сама страница оставалась на месте?

Здравствуйте.
В селекторе .dm-overlay замените абсолютное позиционирование на фиксированное: position: fixed;

Ура! 🙂
И, если можно, ещё один вопрос…
Возможно ли сделать так, что бы модальное закрывалось не только по кнопке закрытия, расположенном в нём самом, но и при клике по любому месту на странице вне границ модального окна.

Подскажите пожалуйста, как прописать чтобы Модальное окно открывалось при загрузке страницы

Используйте js:

В этом случае окно с идентификатором win1 будет появляться по истечению 5 секунд после загрузки страницы. ID конечно же может быть любым главное чтобы соответствовал id модального окна
Так же, кнопке «закрыть» необходимо прописать событие onclick , иначе пользователь не сможет закрыть окно:

Всё! Более подробно можете прочитать у меня же на блоге, в этой статье: Тынц

Радуюсь как ребенок…
Спасибо Вам большое, все получилось и работает!
Как у Вас все просто и оригинально, Вы не представляете, что я у себя писал и пробовал, пока вы не подсказали.
Если не затруднит, подскажите, чтобы скролл работал под модальным окном, если это возможно.
Большое спасибо!

В селекторе .dm-overlay смените абсолютное позиционирование на фиксированное position: fixed;
Затем, у меня в демо для body прописано свойство overflow: hidden; , если вы используете такую же конструкцию, просто исключите это свойство и содержание под модальным окном будет прокручиваться.

Еще раз спасибо, все работает

Не могу найти причину почему в разных модальных окнах отображается одно и тоже изображение, хотя должны быть разные. Пути ведь прописаны разные…

Ты просто Бог идентификаторов! От меня — величайшая благодарность! Крепко жму руку!

Все отлично, но у меня также…нет кнопки закрытия окна(
Не пойму что зделала не так.
Пожалуйста, подскажите как добавить кнопку закрытия окна.
Заранее спасибо.

И все-таки! Как сделать, чтобы окно закрывалось при клике на темный фон? Пользователи нынче нервные — могут и ноутбук поломать.

Ну, раз так всё серьёзно, то самое простое, это использовать событие onclick для div-контейнера с модальным окном:

остаётся только следить чтобы идентификатор соответствовал тому или иному окошку. Всё!
Как поведёт себя данное решение на мобильных устройствах, не проверял, так как задача была немного другая ))).

Приветствую!
Подскажите, что делаю не так, скопировал так как указано в материале выше.
Задача: при нажатии на ссылку должно появляться модальное окно на весь экран с текстом.
Результат: окно с необходимым содержимым отображается постоянно, без «Х» для закрытия.
Заранее благодарю!

Вячеслав, доброго времени суток!
В статье всё разложено по полочкам, не один раз уже объяснял дополнительно, весь код с пояснениями, даже расписал в комментах вариант появления окна при загрузке сайта, хотя статья изначально совсем о другом))).
Мне трудно разглядеть, что вы делаете с исходниками, ещё труднее уловить полёт вашей фантазии.
Кидайте результаты своих экспериментов (исходники) мне на мыло, или же воспользуйтесь Jsfiddle, и я вам обязательно помогу.

Благодарю за такую оперативность! (like)
насколько связанно это с решением моего вопроса даже не представляю, вы как Профи может объясните:
Прочитав в очередной раз комменты, попробовал это X И о Чудо, все заработало )
p.s. Блог у Вас правильный, много чего почерпнул, думаю буду сюда захаживать в гости!

Замечательное решение. Просто нет слов.

Помогите пожалуйста! У меня есть кино сайт на движке DLE 10.2 настроен все работает но нету вкладки Трейлеры так вот я хочу сделать кнопку (Просмотреть трейлер) что бы когда на нее нажимали всплывало окно и видео с ютуба воспроизводилось. Но это не все мне нужно что бы было все просто то есть в создоном дополнительном поле мне нужно было бы вставить только ссылку на трейлер с ютуба и все. Я перепробовал кучу скриптов и модулей но они либо нарушали структуру сайта либо не работали. Не могли бы вы мне объяснить подробно как мне осуществить мою идею??

Могу помочь установить на ДЛЕ

Добрый день!
Вставил туда галерею адаптивную
не работает нормально ваша форма и галерея
подскажите что нуно делать для вставки туда различных плагинов

Добрый день, в примере у Вас на сайте, четвертое окно с видео, при закрытии окна — видео перестает воспроизводится. В исходниках, которые предлагается скачать, при закрытии окна видео продолжает воспроизводится. Что нужно добавить, чтобы корректно работало?

Да, поправила код, все работает, но если видеогалерея большая, как у меня, перезагрузка страницы при просмотре каждого видео, наверно, не очень хорошо. Нет ли возможности добавить маленький скрипт для закрытия окна? Я понимаю, что чистый CSS, но может быть как вариант?

Почитал коменты, разобрался. Спасибо за отличное решение.

Я так и не понял из коментов. Как этот вариант модального окна можно использовать на сайте, когда вы добавляете
html,
body overflow: hidden;
>
.

Понятно, что при overflow: hidden; для body, будет проблематично)) Не нужно смотреть на весь фарш демо-страницы, стили базовых элементов (html,body) исключительно для демо, просто не используйте это свойство, или же пропишите значение auto , .dm-overlay зафиксируйте. Про скролинг и варианты позиционирования, отвечал ранее в комментах.

Мне кажется нужно сразу писать так
.dm-overlay position:fixed;
z-index:1000;
overflow:auto;
top: 0;
left: 0;
display: none;
overflow: auto;
width: 100%;
height: 100%;
background: rgba (0, 0, 0, 0.65);
>
Это подойдет для 99% пользователей.

Алексей, полностью с вами согласен.
Спасибо за дополнение.

В ie работать не будет…

Спасибо что просветили, а то всё гадаю будет или не будет))) В 10,11 и Edge, всё работает прекрасно, в 9-й версии отсутствует лишь анимация, ну а на 8 и ниже пора бы уже подзабить…

Добрый вечер!
Редактирую ваш пример для использования, выбрал его именно за отсутствие скрипта. Ваш пример очень удачный 🙂
Но столкнулся с проблемой, в окне пытаюсь вывести iframe со своей страницей. На странице ссылки на похожие записи. При клике по ссылке пользователь переходит на 2 страницу target=”_blank. Не подскажите, как закрыть попап окно через время на 1 странице?
Спасибо!

Можно сделать несколько иначе
Внутри блока dm-modal рядом с блоком wrap вставляешь

И для него добавляешь стили
.close_1 position: absolute;
width: 100%;
height: 100%;
top: 0;
display: block;
left: 0;
>

Здравствуйте,
Использовал Ваши исходники для сайта, всё отлично, только после заполнения модальных окон своей информацией, после обновления страницы происходит видимая загрузка информации данных окон, и только после этого всё работает нормально…
Я пока что новичок, подскажите, возможно это можно убрать js, а именно Ajax? Тогда уберу позже, когда изучу js)))

Здравствуйте.
В моей демке, такого косяка не просматривается, по крайней мере, я не замечал.
Могу предположить, что баг связан с анимацией. Чтобы проверить исключите свойства анимации из селектора .dm-overlay:target , просто закомментируйте:
/* -webkit-animation: fade .6s;
-moz-animation: fade .6s;
animation: fade .6s;
*/
Хотя мало вероятно, что дело именно в анимации, если так, то будем глубже копать.

Гораздо лучше)) Спасибо огромное)))
Правда блики идут небольшие)) Может ещё что-нибудь можно сделать?

Здравствуйте, Андрей! Просто счастье, что я нашла Ваш сайт, три дня билась с модальным окном, и спасение нашла только тут:) А вопрос был серьезный, могла подвести людей. Огромное спасибо Вам за множество полезностей!
С Наступающим Новым Годом! Я желаю Вам счастья!

Это лучшее из того, что я посмотрел в Топе Яндекса по выдаче «адаптивные модальные окна». Особый респект за комменты в CSS, поскольку чаще всего именно там непонятно. Побольше бы таких, как Вы и мир станет бесплатным)))

То, что доктор прописал! Спасибо за труды!

В CSS сделал всплывающее окошко. Активируется по клику на ссылку. Деактивируется по клику.
Вот после клика, страничка убегает вверх.
Как сделать, что бы после display: none; страничка не позиционировалась вверх?
CSS:

Спасибо за совет.
Утро вечера мудренее!
Решил вопрос, с помощью ссылки внутри документа.

Это руководство по проектированию было создано для Windows 7 и не было обновлено для более новых версий Windows. Большая часть рекомендаций по-прежнему применяется в принципе, но презентация и примеры не отражают наше текущее руководство по проектированию.

В этой статье рассматривается размещение окон по умолчанию при первоначальном отображении на экране, их порядок размещения относительно других окон (Z), их начальный размер и влияние их отображения на фокус ввода.

Для выполнения следующих рекомендаций:

  • Окно верхнего уровня не имеет окна владельца и отображается на панели задач. Примеры: окна приложений. В Windows Vista и более поздних версиях диалоговые окна без окон владельцев и листов свойств также считаются верхним уровнем.
  • В окне владельца нет окна владельца и не отображается на панели задач. Примеры: модальные диалоговые окна, немодальные диалоговые окна.
  • Окно, инициированное пользователем, отображается в качестве прямого результата действия пользователя. В противном случае программа инициируется, если она инициируется программой или системой, инициированной корпорацией Майкрософт Windows. Например, диалоговое окно "Параметры" инициируется пользователем, но инициируется напоминание о собрании.
  • Контекстное окно — это окно, инициируемое пользователем, которое имеет сильную связь с объектом, из которого он был запущен. Например, окна, отображаемые контекстными меню или значками области уведомлений, являются контекстными, но окна, отображаемые в строках меню, не являются.
  • Активный монитор — это монитор, в котором выполняется активная программа.
  • Монитор по умолчанию — это монитор с меню , панелью задач и областью уведомлений.

Принципы проектирования

Управление окнами является одной из самых фундаментальных действий пользователей. До Windows Vista окна часто получают небольшие размеры по умолчанию и помещаются в середину экрана. Этот подход хорошо подходит для старых мониторов с низким разрешением, но не для современного видеоустройства.

Windows предназначена для поддержки современного видеоустройства, которое часто выполняется с разрешениями значительно выше минимально поддерживаемого разрешения экрана и может иметь несколько мониторов. Это:

  • Позволяет пользователям полностью воспользоваться своим расширенным оборудованием.
  • Требует меньше усилий от пользователей для перемещения мыши на большее расстояние.
  • Делает размещение окна более предсказуемым и, следовательно, упрощает поиск.

Минимальное поддерживаемая разрешение экрана

Минимальное эффективное разрешение экрана, поддерживаемого Windows, составляет 800 x 600 пикселей. Это означает, что окна фиксированного размера должны полностью отображаться в минимальном разрешении (при резервируемом пространстве для панели задач), но размеры окон можно оптимизировать для эффективного разрешения 1024 x 768 пикселей, если они работают с минимальным разрешением.

Хотя в настоящее время наиболее распространенные физические разрешения экрана для Windows пк — 1024 x 768 пикселей или больше, то для 800 x 600 пикселей можно Windows:

  • Хорошо работает со всеми современными аппаратными устройствами, включая небольшие компьютеры с записными книжками.
  • Поддержка параметров с высоким разрешением (точек на дюйм).
  • Поддержка более крупных шрифтов для специальных возможностей.
  • Поддержка оборудования, используемого на глобальной основе.

Выбор минимального разрешения для поддержки требует удара по правильному балансу. Ориентация на более высокое разрешение приведет к неоптимальному взаимодействию со значительным процентом современного оборудования, в то время как назначение более низкого разрешения не позволит конструкторам воспользоваться всеми преимуществами доступного пространства экрана.

Если вы считаете, что целевые пользователи используют значительно более высокие разрешения, чем минимальный Windows, вы можете разработать программу, чтобы воспользоваться всеми преимуществами дополнительного пространства экрана с помощью масштабируемых окон с возможностью изменения размера.

Рекомендации

Общие сведения

  • Поддержка минимального Windows эффективного разрешения 800 x 600 пикселей. Для критически важных пользовательских интерфейсов (UIs), которые должны работать в безопасном режиме, поддерживайте эффективное разрешение 640 x 480 пикселей. Обязательно учитывайте пространство, используемое панелью задач, зарезервировав 48 вертикальных относительных пикселей для окон, отображаемых с помощью панели задач.
  • Оптимизируйте изменяемые макеты окон для эффективного разрешения 1024x768 пикселей. Автоматическое изменение размера этих окон для более низкого разрешения экрана таким образом, который по-прежнему работает.
  • Обязательно протестируйте окна в 96 точек на дюйм (100 процентов) на 800 x 600 пикселей, 120 точек на дюйм (125 процентов) на 1024 x 768 пикселей и 144 точек на дюйм (150 процентов) на 1200 x900 пикселей. Проверьте наличие проблем с макетом, таких как обрезка элементов управления, текст и окна, а также растяжение значков и растровых изображений.
  • Для программ с сценариями использования сенсорного и мобильного устройства оптимизируйте для 120 точек на дюйм. Экраны с высоким разрешением на дюйм в настоящее время распространены на сенсорных и мобильных пк.
  • Изменяемые окна больше не должны отображать глиф изменения размера в правом нижнем углу, так как:
    • Все стороны и края окна могут изменяться, а не только в правом нижнем углу.
    • Для глифа требуется отобразить строку состояния, но многие окна с изменяемыми размерами не предоставляют строки состояния.
    • Изменяемые границы окна и указатели изменения размера более эффективны при взаимодействии с изменением размера окна, чем глиф изменения размера.

    Элементы управления заголовком

    Используйте элементы управления заголовка строки следующим образом:

    • Близко. Все основные и вторичные окна со стандартной рамкой окна должны иметь кнопку "Закрыть" в заголовке строки. Нажатие кнопки "Закрыть" влияет на отмену или закрытие окна.

    screen shot of dialog box with no close button

    В этом примере диалоговое окно не имеет кнопку "Закрыть" в строке заголовка.

    • Минимизация. Все основные окна и длительные немодерные вторичные окна (например, диалоги хода выполнения) должны иметь кнопку "Свернуть". При нажатии кнопки "Свернуть" окно уменьшается до кнопки панели задач. Следовательно, окна, которые могут быть свернуты, требуют значка строки заголовка.
    • Развернуть или восстановить вниз. Все окна с изменяемыми размерами должны иметь кнопку "Развернуть или восстановить вниз". При нажатии кнопки "Развернуть" окно отображается в самом большом размере, которое для большинства окон является полноэкранным; в то время как при нажатии кнопки "Восстановить" окно отображается в предыдущем размере. Однако некоторые окна не получают преимуществ от использования полноэкранного экрана, поэтому эти окна должны максимально увеличить их максимальный полезный размер.

    Размер окна

    • Выберите размер окна по умолчанию, соответствующий его содержимому. Не бойтесь использовать более крупные начальные размеры окон, если вы можете эффективно использовать пространство.
    • Используйте изменяемые окна всякий раз, чтобы избежать полос прокрутки и усеченных данных. Windows с динамическим содержимым и списками пользуются наибольшим преимуществом в окнах с изменяемыми размерами.
    • Для текстовых документов рекомендуется использовать максимальную длину строки в 65 символов , чтобы упростить чтение текста. (Символы включают буквы, знаки препинания и пробелы.)
    • Окна фиксированного размера:
      • Должен быть полностью видимым и размером, чтобы поместиться в рабочую область.
      • Можно оптимизировать для более высоких разрешений, но при необходимости уменьшить размер во время отображения до фактического разрешения экрана.
      • Для постепенно большего размера окна должен отображаться постепенно больше информации. Убедитесь, что по крайней мере одна часть окна или элемент управления содержит изменяемое содержимое.
      • Следует избегать максимальных или близких к максимальному размеру размеров по умолчанию. Вместо этого выберите размер по умолчанию, который обычно является наиболее полезным без полноэкранного отображения. Предположим, что пользователи будут разворачивать окно вместо изменения размера, чтобы сделать его полноэкранным.
      • Следует задать минимальный размер окна, если размер содержимого больше не подходит для использования. Для элементов управления с изменяемыми размерами задайте минимальные размеры элементов с изменяемыми размерами, например минимальные функциональные ширины столбцов в представлениях списка.
      • Если это делает содержимое пригодным для использования с меньшим размером, следует изменить презентацию.

      screen shot of media player buttons

      В этом примере Медиаплеер Windows изменяет его формат, когда окно становится слишком маленьким для стандартного формата.

      Расположение окна

      Для следующих рекомендаций "центрирование" означает смещение вертикального размещения немного в сторону верхней части монитора, а не размещения точно в середине. Поместите 45 процентов пространства между верхней частью монитора или владельца и верхней частью окна и 55 процентов между нижней частью монитора или владельца и нижней частью окна. Сделайте это, потому что глаз, естественно, предвзято к верхней части экрана.

      figure of window placed slightly above center

      "Центрирование" означает смещение вертикального размещения немного в сторону верхней части монитора.

      Если окно является контекстным, всегда отображает его рядом с объектом, с которым он был запущен. Поместите его вне пути, чтобы исходный объект не был охвачен окном.

      • Если оно отображается с помощью мыши, по возможности поместите его смещение вниз и справа.

      figure of contextual window placed right of object

      Отображение контекстных окон рядом с объектом, с которым он был запущен.

      figure of notification area window

      Windows, запущенные из значков области уведомлений, отображаются рядом с областью уведомлений.

      Если он отображается с помощью пера, когда это возможно, чтобы оно не было покрыто рукой пользователя. Для пользователей с правой рукой отображается слева; в противном случае отображается справа.

      figure of contextual window placed left of object

      При использовании пера также отображаются контекстные окна, чтобы они не охватывались рукой пользователя.

      Разработчики: События мыши и события пера можно различать с помощью API GetMessageExtraInfo . Вы можете определить передачу пользователя с помощью API SystemParametersInfo с SPI_GETMENUDROPALIGNMENT.

      Поместите диалоги хода выполнения в правый нижний угол активного монитора.

      figure of progress bar in lower-right corner

      Поместите диалоги хода выполнения в правый нижний угол.

      Если окно не связано с текущим контекстом или действием пользователя, поместите его подальше от текущего расположения указателя. Это предотвращает случайное взаимодействие.

      Если окно является приложением верхнего уровня или документом, всегда каскадно его происхождение от левого верхнего угла монитора. При создании активной программой используйте активный монитор; в противном случае используйте монитор по умолчанию.

      figure of three windows cascading from upper left

      Каскадное приложение верхнего уровня или окна документов с левого верхнего угла монитора.

      Если окно является служебной программой верхнего уровня, всегда отображает ее по центру в мониторе. При создании активной программой используйте активный монитор; в противном случае используйте монитор по умолчанию.

      figure of utility window centered in the monitor

      Центр окон служебной программы верхнего уровня.

      Если окно является принадлежащим окну, сначала отобразите его по центру в верхней части окна владельца. Для последующего отображения рекомендуется отобразить его в последнем расположении (относительно окна владельца), если это, скорее всего, будет удобнее.

      figure of owned window centered over owner window

      Изначально центральные окна принадлежат верхней части окна владельца.

      Для диалоговых окон без режима всегда отображается в верхней части окна владельца, чтобы упростить поиск. Однако если пользователь активирует окно владельца, это может скрыть немодерное диалоговое окно.

      figure of modeless dialog box over owner window

      Отображайте бессерверные диалоги в верхней части окна владельца, чтобы упростить их поиск.

      При необходимости настройте начальное расположение, чтобы все окно отображалось в целевом мониторе. Если размер окна превышает размер целевого монитора, уменьшите его в соответствии с размерами.

      Мой первый пост.
      Центрирование блока относительно другого блока относительно часто-попадающаяся задача, это очередное ее решение. Для меня оно стало самым универсальным и покрывающим все кейсы, с которыми я когда-либо сталкивался.

      Формулировка
      Центрировать модальное окно по горизонтали и вертикали.

      • Габариты модалки могут быть указаны в любых единицах измерения. Или же могут быть не указаны вовсе.
      • Отзывчивость. При ресайзе окна, модалка подстраивается под текущий размер.
      • Если модалка сверстана так, что у нее еcть min-height/min-width, то при ресайзе окна до меньших размеров должен появляться скролл.
      • IE 9+.
      • Позиционирование должны быть реализовано на CSS, без применения JS.

      Работает прекрасно, нареканий нет. Но нам такой способ не подходит, ибо мы не хотим зависеть от размеров модального окна.

      Первый способ, который удовлетворяет всем перечисленным требованиям я увидел у Jabher. Речь идет об использовании свойства transform и его значения translate вместо margin. Вот как это работает:


      Магия! Теперь мы не зависим от габаритов .modal_container. Все потому что translate отталкивается от размеров элемента, к которому применятся свойство. Напомню, что процентные значения свойства margin будут вычисляться относительно размеров родителя, что нам явно не подходит.

      Теперь о минусах. Используя свойство transform, мы столкнемся с субпиксельным рендерингом. Проще говоря, контент при ресайзе начнет замыливаться, результат выглядит скверно, особенно это заметно при рендере текста и тонких линий, вроде однопиксельных бордеров. Я не смог найти решений этой проблемы, если у вас они есть — пожалуйста, поделитесь в комментариях.

      Тадаам

      Не так давно я нашел изумительный по своей простоте способ. На помощь спешат инлайн блоки. Их легко центрировать по-горизонтали, навесив text-align: center на родителя. Немного подумав, я вспомнил про замечательное свойство vertical-align. Как оно работает? Если этому свойству задать значение middle, то элементы с этим свойством будут центрироваться по-вертикали друг относительно друга. А это значит, что помимо элемента .modal, в .fixed-overlay должен быть еще кто-то, кто поможет нашей модалке встать по-центру окна. Высота этого кого-то должна быть равна высоте .fixed-overlay. На роль этого помощника напрашивается псевдоэлемент:

      Очень часто стоит задача выровнять блок по центру страницы / экрана, да ещё и так, чтобы без ява-скрипта, без задания жёстких размеров или отрицательных отступов, ещё чтобы и скроллбары работали у родителя, если блок превышает его размеры. В сети ходят достаточно много однообразных примеров как выровнять блок по центру экрана. Как правило большинство из них основаны на одних принципах.

      Ниже представлены основные способы решения задачи, их плюсы и минусы. Чтобы понимать суть примеров, рекомендую уменьшить высоту / ширину окошка Result в примерах по указанным ссылкам.

      Вариант 1. Отрицательный отступ.

      Позиционируем блок атрибутами top и left на 50%, и заранее зная высоту и ширину блока, задаём отрицательный margin, который равен половине размера блока. Огромным минусом данного варианта является то, что нужно подсчитывать отрицательные отступы. Так же блок не совсем корректно ведёт себя в окружении скроллбаров — он попросту обрезается так как имеет отрицательные отступы.

      Вариант 2. Автоматический отступ.

      Менее распространённый, но схожий с первым. Для блока задаём ширину и высоту, позиционируем атрибутами top right bottom left на 0, и задаём margin auto. Плюсом данного варианта являются рабочие скроллбары у родителя, если у последнего задана 100% ширина и высота. Минусом данного способ является жёсткое задание размеров.

      Вариант 3. Таблица.

      Задаём родителю табличные стили, ячейке родителя устанавливаем выравнивание текста по центру. А блоку задаём модель строчного блока. Минусами мы получаем не рабочие скроллбары, и в целом не эстетичность «эмуляции» таблицы.

      Вариант 4. Псевдо-элемент.

      Данный вариант лишён всех проблем, перечисленных у предыдущих способов, а так же решает первоначально поставленные задачи. Суть состоит в том, чтобы у родителя задать стили псевдо-элементу before, а именно 100% высоту, выравнивание по центру и модель строчного блока. Так же само и у блока ставится модель строчного блока, выравнивание по центру. Чтобы блок не «падал» под псевдо-элемент, когда размеры первого больше чем родителя, указываем родителю white-space: nowrap и font-size: 0, после чего у блока отменяем эти стили следующими — white-space: normal. В данном примере font-size: 0 нужен для того, чтобы убрать образовавшийся пробел между родителем и блоком в связи с форматированием кода. Пробел можно убрать и иными способами, но лучшим считается просто его не допускать.

      либо, если вам нужно, чтобы родитель занимал только высоту и ширину окна, а не всей страницы:

      Вариант 5. Flexbox.

      Одним из самых простых и элегантных способов является использования flexbox. Но имейте ввиду, что центральное позиционирование сохраняется даже если родительский блок меньше дочернего, последний будет выходить за рамки и обрезаться.

      В случае, если при уменьшении родительского блока дочерний не должен обрезаться по краям, используйте авто маржины:

      Вариант 6. Transform.

      Подходит в случае если мы ограничены структурой, и нет возможности манипулировать родительским элементом, а блок выровнять как-то нужно. На помощь придёт css функция translate() . При значение 50% абсолютное позиционирование расположит верхний левый угол блока точно по центру, затем отрицательное значение translate сдвинет блок относительно своих собственных размеров. Учтите, что могут всплыть негативные эффекты в виде размытых граней или начертания шрифта. Также подобный способ может привести к проблемах с вычислением положения блока с помощью java-script'а. Иногда для компенсации потери 50% ширины из-за использования css свойства left может помочь заданное у блока правило: margin-right: -50%; .

      Вариант 7. Кнопка.

      Пользователь azproduction предложил вариант, где блок обрамляется в тег button. Кнопка имеет свойство центрировать всё, что находится у неё внутри, а именно элементы строчной и блочно-строчной (inline-block) модели. На практике использовать не рекомендую.

      Бонус

      Здравствуйте, как же бесит уже отсутствие такой удобной мелочи как открытие окон по центру экрана, особенно на моём 30 дюймовом мониторе! Да можно открыть перетащить и закрыть. Но! есть много окно которые открываются по умолчанию в левом верхнем углу с небольшим отступом и это не изменить даже перетаскиванием. Например при выборе очистки диска. Маленькое окно настроек открывается не по центру, перетаскиваю, закрываю, выбираю опять очистка и опять оно на том же месте где отрылось первый раз. Совсем неудобно лазить по большому монитору за этими окнами. Пробовал установить скрипт постоянной очистки настроек папок, но по умолчанию папки открываются как хотят и то же не по центру, пришлось оставить как есть, чтобы те что могут запомнить своё место, запомнили. Скорее всего Windows не оптимизирована под такие большие мониторы, раз она открывает папки не в центре. Провёл эксперимент попутно с работой. Установил новый Windows и на вновь установленной ОС, где ни разу еще не открывалось ни одно приложение открыл папку проводник и она открылась в левом верхнем углу с небольшим отступом. вот так вот (((((

      Эта цепочка заблокирована. Вы можете просмотреть вопрос или оставить свой голос, если сведения окажутся полезными, но вы не можете написать ответ в этой цепочке.

      Оскорбление — это любое поведение, которое беспокоит или расстраивает человека или группу лиц. К угрозам относятся любые угрозы самоубийством, насилием, нанесением ущерба и др. Любое содержимое для взрослых или недопустимое на веб-сайте сообщества. Любое изображение, обсуждение наготы или ссылка на подобные материалы. Оскорбительное, грубое или вульгарное поведение и другие проявления неуважения. Любое поведение, нарушающее лицензионные соглашения, в том числе предоставление ключей продуктов или ссылок на пиратское ПО. Незатребованная массовая рассылка или реклама. Любые ссылки или пропаганда сайтов с вирусным, шпионским, вредоносным или фишинговым ПО. Любое другое неуместное содержимое или поведение в соответствии с правилами использования и кодексом поведения. Любое изображение, ссылка или обсуждение, связанные с детской порнографией, детской наготой или другими вариантами оскорбления или эксплуатации детей.

      Читайте также: