Лучший способ центрировать <div> на странице по вертикали и горизонтали?

Лучший способ центрировать элемент <div> на странице как по вертикали, так и по горизонтали?

Я знаю, что margin-left: auto; margin-right: auto; будет центрироваться по горизонтали, но как лучше всего сделать это и по вертикали?

Вот простой, чистый и стабильный способ центрировать div в контейнере, используя только CSS. stackoverflow.com/a/31977476/3597276

Michael Benjamin 13.08.2015 03:19

Проверьте какой-нибудь последний метод с использованием CSS Flex, Margin auto, 2D transform freakyjolly.com/…

Code Spy 12.02.2019 18:21

Этот вопрос отмечен как дубликат вопроса, заданного 5 лет спустя. О, StackOverflow.

user9123 20.03.2021 21:05
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
560
3
999 455
30

Ответы 30

Вот сценарий, который я написал некоторое время назад (он написан с использованием библиотеки jQuery):

var centerIt = function (el /* (jQuery element) Element to center */) {
    if (!el) {
        return;
    }
    var moveIt = function () {
        var winWidth = $(window).width();
        var winHeight = $(window).height();
        el.css("position","absolute").css("left", ((winWidth / 2) - (el.width() / 2)) + "px").css("top", ((winHeight / 2) - (el.height() / 2)) + "px");
    }; 
    $(window).resize(moveIt);
    moveIt();
};

К сожалению, OP не запрашивал решение JavaScript / jQuery.

Blazemonger 01.07.2014 17:31

Разве не лучше использовать outerHeight (true) и outerWidth (true) вместо height () и width (), поскольку «внешний» учитывает все возможные поля и отступы

Maria 06.09.2014 20:42

Очень удобно, когда вы заранее не знаете высоту / ширину div. : o)

Miros 06.01.2015 15:44

Это решение сработало для меня

    .middleDiv{
        position : absolute;
        height : 90%;
        bottom: 5%;
    }

(или высота: 70% / низ: 15%

высота: 40% / низ: 30% ...)

Нет, это не так - он не центрирует элемент по горизонтали. Это наполовину решение проблемы.

robjez 16.01.2015 19:16

Самый лучший и самый гибкий способ

Мой демо на dabblet.com

Основная хитрость в этой демонстрации заключается в том, что в нормальном потоке элементы идут сверху вниз, поэтому margin-top: auto установлен в ноль. Однако абсолютно позиционированный элемент действует одинаково для распределения свободного пространства и аналогичным образом может быть центрирован по вертикали в указанных top и bottom (не работает в IE7).

Этот трюк будет работать с div любого размера.

div {
	width: 100px;
	height: 100px;
	background-color: red;
	
	position: absolute;
	top:0;
	bottom: 0;
	left: 0;
	right: 0;
  	
	margin: auto;
}
<div></div>

Это круто. Я так долго задавался вопросом, как это сделать. Я пробовал это с top: 0; и осталось: 0 ;, но кажется, что добавление дна: 0; и справа: 0; иметь значение. Спасибо.

user981178 11.01.2013 07:45

Уловка @Prembo работает везде, кроме IE7

Vladimir Starkov 12.01.2013 00:27

Это решение работает только в том случае, если ваш элемент имеет фиксированную высоту. См. ответ Томбула для двух решений, которые не изменяют естественную высоту элемента.

Stuart P. Bentley 09.10.2013 01:50

Чтобы избежать эффектов вложенности от любых других элементов DOM, вы должны использовать position: fixed;

alias51 26.11.2013 15:41

@ alias51 ват? Вы можете объяснить?

Vladimir Starkov 27.11.2013 13:46

Не работает с динамическим контентом

user2889419 07.09.2014 03:04

Я собирался сказать, что это лучший вариант, но меня раздражает то, что вам нужно устанавливать фиксированные размеры div. Вы всегда можете использовать фиксированные поля, чтобы сделать его центром (плохая идея !!!). Это решение (даже думал, что он мой) вроде намного лучше. Я просто пытаюсь быть честным и привести других пользователей к лучшему решению, а не к тому, которое имеет больше всего очков из-за времени. Извините, но -1 ... и я бы дал ему -100, если бы мог, потому что грустно, что не лучший ответ имеет примерно 200+ баллов. Приводит к недоразумениям.

Flash Thunder 10.01.2015 00:38

@FlashThunder вы предлагаете таблицы для нестабличных данных, не так ли?

Vladimir Starkov 10.01.2015 06:17

@FlashThunder также мое решение не о фиксированной позиции, а о фиксированном размере коробки

Vladimir Starkov 10.01.2015 06:17

Отлично! Я даже не знал, что bottom: и right: существуют в css ...

Louis van Tonder 14.06.2017 13:29

цвет фона здесь не место

hanshenrik 24.10.2017 04:18

Если ваша страница прокручивается (выше или шире окна), div может скрыться из поля зрения position: fixed, чтобы убедиться, что он остается по центру порта просмотра.

bavo 02.12.2017 00:43

Не забудьте записать margin:auto, иначе это не подействует.

Stephen.W 12.09.2019 12:30

Также можно использовать position: fixed. Он работает и с этим.,

hrabinowitz 12.02.2021 22:58

Я думаю, что есть два способа выровнять центр div с помощью CSS.

.middleDiv {
    position : absolute;    
    width    : 200px;
    height   : 200px;
    left     : 50%;
    top      : 50%;
    margin-left : -100px; /* half of the width  */
    margin-top  : -100px; /* half of the height */
}

Это самый простой и лучший способ. для демонстрации перейдите по ссылке ниже:

http://w3webpro.blogspot.in/2013/07/how-to-make-div-horizontally-and.html

Хотя это не сработало, когда OP задал этот вопрос, я думаю, по крайней мере, для современных браузеров лучшим решением является использование дисплей: гибкий или псевдоклассы.

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

Для псевдоклассы примером может быть:

.centerPseudo {
    display:inline-block;
    text-align:center;
}

.centerPseudo::before{
    content:'';
    display:inline-block;
    height:100%;
    vertical-align:middle;
    width:0px;
}

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

.centerFlex {
  align-items: center;
  display: flex;
  justify-content: center;
}

Существуют и другие атрибуты, доступные для flex, которые описаны в вышеупомянутых ссылках с дополнительными примерами.

Если вам нужно поддерживать старые браузеры, которые не поддерживают css3, вам, вероятно, следует использовать javascript или решение с фиксированной шириной / высотой, показанное в других ответах.

Все браузеры начиная с 2012–2013 гг. Поддерживают гибкие боксы. С сегодняшней точки зрения он должен быть достаточно безопасным, чтобы использовать его для новых приложений в большинстве случаев. Единственная ситуация, в которой я могу придумать, где предпочтительнее использовать старую модель, - это бизнес-клиенты, которые полагаются на старую инфраструктуру и не могут обновиться.

Rafael Bugajewski 23.08.2015 18:56

Если вы, ребята, используете JQuery, вы можете сделать это с помощью .position();

<div class = "positionthis"></div>

CSS

.positionthis {
    width:100px;
    height:100px;
    position: absolute;
    background:blue;
}

Javascript (JQuery)

$(document).ready(function () {
    $('.positionthis').position({
        of: $(document),
        my: 'center center',
        at: 'center center',
        collision: 'flip flip'
    });
});

JSFiddle: http://jsfiddle.net/vx9gV/

OP запросил решение CSS.

Blazemonger 01.07.2014 17:33

Извините за поздний ответ лучший способ это

  div {
      position: fixed;
      top: 50%;
      left: 50%;
      margin-top: -50px;
      margin-left: -100px;
    }

margin-top и margin-left должны соответствовать размеру вашего блока div.

Разве маржа не должна быть в процентах и ​​в обоих случаях 25%? Извините, но это решение, похоже, не работает (по крайней мере, на данный момент), -1

Flash Thunder 10.01.2015 00:28
div {
    border-style: solid;
    position: fixed;
    width: 80%;
    height: 80%;
    left: 10%;
    top: 10%;
}

Отрегулируйте левый и верхний угол по ширине и высоте, то есть (100% - 80%) / 2 = 10%.

Я знаю, что опаздываю на вечеринку, но вот способ центрировать div с неизвестным измерением внутри родителя с неизвестным измерением.

стиль:

<style>

    .table {
      display: table;
      height: 100%;
      margin: 0 auto;
    }
    .table-cell {
      display: table-cell;
      vertical-align: middle;      
    }
    .centered {
      background-color: red;
    }
  </style>

HTML:

<div class = "table">
    <div class = "table-cell"><div class = "centered">centered</div></div>
</div>

ДЕМО:

Обратите внимание на этот демонстрация.

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

Flash Thunder 10.01.2015 00:27

На самом деле существует решение, использующее css3, которое может вертикально центрировать div неизвестной высоты. Хитрость заключается в том, чтобы переместить div вниз на 50%, а затем использовать transformY, чтобы вернуть его в середину. Единственным условием является наличие у центрируемого элемента родителя. Пример:

<div class = "parent">
    <div class = "center-me">
        Text, images, whatever suits you.
    </div>
</div>

.parent { 
    /* height can be whatever you want, also auto if you want a child 
       div to be responsible for the sizing */ 
    height: 200px;
}

.center-me { 
    position: relative;
    top: 50%;
    transform: translateY(-50%);
    /* prefixes needed for cross-browser support */
    -ms-transform: translateY(-50%);
    -webkit-transform: translateY(-50%);
}

Поддерживается всеми основными браузерами, а также IE 9 и выше (не беспокойтесь об IE 8, так как он умер вместе с win xp этой осенью. Слава богу).

Демо JS Fiddle

Большинство браузеров не поддерживают полностью новые версии модулей, поэтому это решение (по крайней мере, на мой взгляд) совершенно бесполезно, извините.

Flash Thunder 10.01.2015 00:32

Эээ ... Я вообще-то не понимаю, о чем вы говорите. Поскольку браузеры "не" полностью поддерживают, это был (не полностью) имо бесполезно. Поскольку текущие браузеры (все основные и IE9 +) делать полностью поддерживают его, это жизнеспособное решение прямо сейчас, не так ли? Также проверьте Могу ли я использовать.

giorgio 12.01.2015 11:48

Это элегантное решение, которое работает с содержимым любого размера, даже если размеры элемента DIV меняются динамически (например, если вы используете jQuery для изменения содержимого, а высоту DIV необходимо перенастроить). ОДНАКО, в некоторых средах все еще есть ошибки, в которых использование преобразования приводит к размытости текста. Будьте осторожны при использовании этого раствора.

baohouse 27.01.2015 20:55

Спасибо @BaoNgo, ценное дополнение. Возможно, вы знаете, в какой среде (браузер? ОС? Устройство?) Возникает эта проблема? Соответственно изменю ответ!

giorgio 28.01.2015 15:43

Еще один метод (пуленепробиваемый) взят из здесь с использованием правила display: table:

Разметка

<div class = "container">
  <div class = "outer">
    <div class = "inner">
      <div class = "centered">
        ...
      </div>
    </div>
  </div>
</div>

CSS:

.outer {
  display: table;
  width: 100%;
  height: 100%;
}
.inner {
  display: table-cell;
  vertical-align: middle;
  text-align: center;
}
.centered {
  position: relative;
  display: inline-block;

  width: 50%;
  padding: 1em;
  background: orange;
  color: white;
}

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

Flash Thunder 10.01.2015 00:30

@FlashThunder - обновите свои знания (я получил второй ответ с новой техникой, использующей преобразования, внизу) и в конечном итоге прекратите использовать таблицы для макета;)

robjez 16.01.2015 19:05

Альтернативный ответ - это.

<div id = "container"> 
    <div id = "centered"> </div>
</div>

и css:

#container {
    height: 400px;
    width: 400px;
    background-color: lightblue;
    text-align: center;
}

#container:before {
    height: 100%;
    content: '';
    display: inline-block;
    vertical-align: middle;
}

#centered {
    width: 100px;
    height: 100px;
    background-color: blue;
    display: inline-block;
    vertical-align: middle;
    margin: 0 auto;
}

Решение только для IE9 + ... не очень хорошее ... +0

Flash Thunder 10.01.2015 00:24

@FlashThunder «Решение только для IE9 + ... не очень хорошее ...» - только если вы настаиваете на поддержке менее 1% явно устаревших - и по большей части явно невежественные - пользователей. Люди, которые так долго отказываются обновляться, уже привыкли к бесконечно ломающемуся веб-опыту.

John Weisz 17.10.2016 16:23

Простое решение с использованием Flex Display

 <div style = 'display:flex; position:absolute; top:0; bottom:0; right:0; left:0; '>
      <div id = 'div_you_want_centered' style = 'margin:auto;'> 
           This will be Centered 
      </div>
 </div>

Проверить http://css-tricks.com/snippets/css/a-guide-to-flexbox/

Первый div занимает весь экран и имеет набор display: flex для каждого браузера. Второй div (по центру) использует div display: flex, где margin: auto работает блестяще.

Примечание IE11 + совместимость. (IE10 с префиксом).

Ого ... IE11+! Нет, спасибо!

Flash Thunder 10.01.2015 00:17

Я бы посоветовал использовать автоматический префикс, когда в css много -webkit- :)

Radex 25.10.2016 22:54

Простота этой техники поражает воображение:
(Этот метод имеет свои последствия, но если вам нужно только центрировать элемент независимо от потока остального содержимого, это нормально. Используйте с осторожностью)

Разметка:

<div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum accumsan tellus purus, et mollis nulla consectetur ac. Quisque id elit at diam convallis venenatis eget sed justo. Nunc egestas enim mauris, sit amet tempor risus ultricies in. Sed dignissim magna erat, vel laoreet tortor bibendum vitae. Ut porttitor tincidunt est imperdiet vestibulum. Vivamus id nibh tellus. Integer massa orci, gravida non imperdiet sed, consectetur ac quam. Nunc dignissim felis id tortor tincidunt, a eleifend nulla molestie. Phasellus eleifend leo purus, vel facilisis massa dignissim vitae. Pellentesque libero sapien, tincidunt ut lorem non, porta accumsan risus. Morbi tempus pharetra ex, vel luctus turpis tempus eu. Integer vitae sagittis massa, id gravida erat. Maecenas sed purus et magna tincidunt faucibus nec eget erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nec mollis sem.</div>

И CSS:

div {
  color: white;
  background: red;
  padding: 15px;
  position: absolute;
  top: 50%;
  left: 50%;
  -ms-transform: translateX(-50%) translateY(-50%);
  -webkit-transform: translate(-50%,-50%);
  transform: translate(-50%,-50%);
}   

Это также центрирует элемент по горизонтали и вертикали. Никаких отрицательных полей, только сила трансформаций. Также мы должны уже забыть об IE8, не так ли?

Да, я часто использовал этот метод ... но проблема возникает, если элемент намного выше, чем высота экрана (где height неизвестен) ... верхняя часть центрированного элемента будет обрезана. Даже если элемент помещен в родительский элемент, где для overflow установлено значение auto или scroll. Та же проблема с flex. К сожалению, в крайнем случае я использую table, чтобы обойти эту проблему. Только когда центрированный элемент будет намного, намного выше (динамически заполняется).

nelek 27.10.2015 09:59

Мне пришлось установить относительную позицию, вероятно, потому, что мой div плавает правильно.

Souradeep Nanda 28.02.2016 06:22

Nelek - если родительский элемент имеет фиксированную ширину и высоту, вы можете добавить max-width: 100% и max-height: 100% к изображению и предотвратить его расширение родительского элемента.

jan199674 09.01.2017 03:16

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

Sarbasish Mishra 02.09.2020 09:52

Я смотрел файл представления Laravel и заметил, что они идеально центрировали текст по центру. Я сразу вспомнил об этом вопросе. Вот как они это сделали:

<html>
<head>
    <title>Laravel</title>

    <!--<link href='//fonts.googleapis.com/css?family=Lato:100' rel='stylesheet' type='text/css'>-->

    <style>
        .container {
            margin: 0;
            padding: 0;
            width: 100%;
            height: 100%;
            display: table;

        }

        .inside {
            text-align: center;
            display: table-cell;
            vertical-align: middle;
        }


    </style>
</head>
<body>
    <div class = "container">
            <div class = "inside">This text is centered</div>
    </div>
</body>

Результат выглядит так:

Я думаю, это работает только тогда, когда это единственное. Добавьте еще div и другой контент, и он, похоже, больше не работает.

ADTC 25.08.2015 19:17

Если вы ищете новые браузеры (IE10 +),

тогда вы можете использовать свойство transform для выравнивания div по центру.

<div class = "center-block">this is any div</div>

И css для этого должен быть:

.center-block {
  top:50%;
  left: 50%;
  transform: translate3d(-50%,-50%, 0);
  position: absolute;
}

Уловка здесь в том, что вам даже не нужно указывать высоту и ширину div, так как он заботится сам по себе.

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

Как это работает:

Когда вы указываете left и top на уровне 50%, div располагается в правой нижней четверти страницы, а его верхний левый конец закрепляется в центре страницы. Это связано с тем, что свойства left / top (если указаны в%) рассчитываются на основе высоты внешнего div (в вашем случае окна).

Но преобразование использует высоту / ширину элемента для определения перевода, поэтому вы будете перемещать div влево (50% ширины) и вверху (50% его высоты), поскольку они указаны в отрицательных значениях, таким образом выравнивая его по центру страницы.

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

Поддерживает ли это браузер, использование translate - это мощное средство.

position: absolute;
background-color: red;

width: 70%;     
height: 30%; 

/* The translate % is relative to the size of the div and not the container*/ 
/* 21.42% = ( (100%-70%/2) / 0.7 ) */
/* 116.666% = ( (100%-30%/2) / 0.3 ) */
transform: translate3d( 21.42%, 116.666%, 0);

Я предпочитаю центрировать прямоугольник как по вертикали, так и по горизонтали следующим образом:

Внешний контейнер

  • должен иметь display: table;

Внутренний контейнер

  • должен иметь display: table-cell;
  • должен иметь vertical-align: middle;
  • должен иметь text-align: center;

Поле содержимого

  • должен иметь display: inline-block;
  • следует повторно отрегулировать горизонтальное выравнивание текста, например. text-align: left; или text-align: right;, если вы не хотите, чтобы текст был по центру

Элегантность этой техники в том, что вы можете добавить свой контент в поле содержимого, не беспокоясь о его высоте или ширине!

Демо

body {
    margin : 0;
}

.outer-container {
    position : absolute;
    display: table;
    width: 100%; /* This could be ANY width */
    height: 100%; /* This could be ANY height */
    background: #ccc;
}

.inner-container {
    display: table-cell;
    vertical-align: middle;
    text-align: center;
}

.centered-content {
    display: inline-block;
    text-align: left;
    background: #fff;
    padding : 20px;
    border : 1px solid #000;
}
<div class = "outer-container">
   <div class = "inner-container">
     <div class = "centered-content">
        You can put anything here!
     </div>
   </div>
</div>

См. Также эта рабочий пример!


РЕДАКТИРОВАТЬ

Да, я знаю, что вы можете достичь более или менее такой же гибкости с transform: translate(-50%, -50%); или transform: translate3d(-50%,-50%, 0);, метод, который я предлагаю, имеет гораздо лучшую поддержку браузера. Даже с такими префиксами браузеров, как -webkit, -ms или -moz, transform не предлагает такую ​​же поддержку браузера.

Поэтому, если вам важны старые браузеры (например, IE9 и ниже), вам не следует использовать transform для позиционирования.

Это работает только в том случае, если на странице есть контейнерный div и она намного сложнее, чем translate.

MDTech.us_MAN 25.10.2016 20:37

@ MDTech.us_MAN: Хотя это правда, что вам нужно больше разметки HTML, этот подход работает даже в довольно старых браузерах! Даже с такими префиксами браузеров, как -webkit, -ms или -moz, transform: translate(-50%, -50%); не имеет почти такой же поддержки браузером! → Я добавил эту информацию внизу своего ответа

John Slegers 26.10.2016 11:48

Я знаю, но сейчас 2017 год, и на самом деле не должно быть особых проблем ... IE9 был выпущен еще в 2011 году. caniuse.com/#search=translate говорит, что 95% Интернета должны поддерживать transform.

MDTech.us_MAN 30.05.2017 03:29

Я бы использовал translate:

Сначала поместите верхний левый угол div в центре страницы (используя position: fixed; top: 50%; left: 50%). Затем translate перемещает его вверх на 50% от высоты div, чтобы центрировать его по вертикали на странице. Наконец, translate также перемещает div вправо на 50% от его ширины, чтобы центрировать его по горизонтали.

Я действительно считаю, что этот метод лучше многих других, поскольку он не требует никаких изменений в родительском элементе.

translate лучше, чем translate3d в некоторых сценариях, поскольку он поддерживается большим количеством браузеров. https://caniuse.com/#feat=transforms2d

Подводя итог, этот метод поддерживается во всех версиях Chrome, Firefox 3.5+, Opera 11.5+, всех версиях Safari, IE 9+ и Edge.

.centered {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  -webkit-transform: translate(-50%, -50%);
  -moz-transform: translate(-50%, -50%);
  -o-transform: translate(-50%, -50%);
  -ms-transform: translate(-50%, -50%);
  
  font-size: 20px;
  background-color: cyan;
  border: darkgreen 5px solid;
  padding: 5px;
  z-index: 100;
}

table {
    position: absolute;
    top: 0;
    left: 0;
}

td {
    position: relative;
    top: 0;
    left: 0;
}
<table>
<tr>
    <td>
        <div class = "centered">This div<br />is centered</div>
        <p>
            Lorem ipsum dolor sit amet, nam sint laoreet at, his ne sumo causae, simul decore deterruisset ne mel. Exerci atomorum est ut. At choro vituperatoribus usu. Dico epicurei persequeris quo ex, ea ius zril phaedrum eloquentiam, duo in aperiam admodum fuisset. No quidam consequuntur usu, in amet hinc simul eos. Ex soleat meliore percipitur mea, nihil omittam salutandi ut eos. Mea et impedit facilisi pertinax, ea viris graeci fierent pri, te sonet intellegebat his. Vis denique albucius instructior ad, ex eum iudicabit elaboraret. Sit ea intellegam liberavisse. Nusquam quaestio maiestatis ut qui, eam decore altera te. Unum cibo aliquip ut qui, te mea doming prompta. Ex rebum interesset nam, te nam zril suscipit, qui suavitate explicari appellantur te. Usu brute corpora mandamus eu. Dicit soluta his eu. In sint consequat sed, quo ea tota petentium. Adhuc prompta splendide mel ad, soluta delenit nec cu.
        </p>
    </td>
    <td>
        <p>
            Lorem ipsum dolor sit amet, dico choro recteque te cum, ex omnesque consectetuer sed, alii esse utinam et has. An qualisque democritum usu. Ea has habeo labores, laoreet intellegat te mea. Eius equidem inermis vel ne. Ne eum sonet labitur, nec id natum munere. Primis graecis est cu, quis dictas eu mea, eu quem offendit forensibus nec. Id animal mandamus his, vis in sonet tempor luptatum. Ne civibus oporteat comprehensam vix, per facete discere atomorum eu. Mucius probatus volutpat sit an, sumo nominavi democritum eam ut. Ea sit choro graece debitis, per ex verear voluptua epicurei. Id eum wisi dicat, ea sit velit doming cotidieque, eu sea amet delenit. Populo tacimates dissentiunt has cu. Has wisi hendrerit at, et quo doming putent docendi. Ea nibh vide omnium usu.
        </p>
    </td>
</tr>
</table>

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


Теперь, если мы попробуем тот же CSS, но с абсолютной позицией, он будет в центре последнего родителя, имеющего абсолютную позицию.

.centered {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  -webkit-transform: translate(-50%, -50%);
  -moz-transform: translate(-50%, -50%);
  -o-transform: translate(-50%, -50%);
  -ms-transform: translate(-50%, -50%);

  font-size: 20px;
  background-color: cyan;
  border: darkgreen 5px solid;
  padding: 5px;
  z-index: 100;
}

table {
    position: absolute;
    top: 0;
    left: 0;
}

td {
    position: relative;
    top: 0;
    left: 0;
}
<table>
<tr>
    <td>
        <div class = "centered">This div<br />is centered</div>
        <p>
            Lorem ipsum dolor sit amet, nam sint laoreet at, his ne sumo causae, simul decore deterruisset ne mel. Exerci atomorum est ut. At choro vituperatoribus usu. Dico epicurei persequeris quo ex, ea ius zril phaedrum eloquentiam, duo in aperiam admodum fuisset. No quidam consequuntur usu, in amet hinc simul eos. Ex soleat meliore percipitur mea, nihil omittam salutandi ut eos. Mea et impedit facilisi pertinax, ea viris graeci fierent pri, te sonet intellegebat his. Vis denique albucius instructior ad, ex eum iudicabit elaboraret. Sit ea intellegam liberavisse. Nusquam quaestio maiestatis ut qui, eam decore altera te. Unum cibo aliquip ut qui, te mea doming prompta. Ex rebum interesset nam, te nam zril suscipit, qui suavitate explicari appellantur te. Usu brute corpora mandamus eu. Dicit soluta his eu. In sint consequat sed, quo ea tota petentium. Adhuc prompta splendide mel ad, soluta delenit nec cu.
        </p>
    </td>
    <td>
        <p>
            Lorem ipsum dolor sit amet, dico choro recteque te cum, ex omnesque consectetuer sed, alii esse utinam et has. An qualisque democritum usu. Ea has habeo labores, laoreet intellegat te mea. Eius equidem inermis vel ne. Ne eum sonet labitur, nec id natum munere. Primis graecis est cu, quis dictas eu mea, eu quem offendit forensibus nec. Id animal mandamus his, vis in sonet tempor luptatum. Ne civibus oporteat comprehensam vix, per facete discere atomorum eu. Mucius probatus volutpat sit an, sumo nominavi democritum eam ut. Ea sit choro graece debitis, per ex verear voluptua epicurei. Id eum wisi dicat, ea sit velit doming cotidieque, eu sea amet delenit. Populo tacimates dissentiunt has cu. Has wisi hendrerit at, et quo doming putent docendi. Ea nibh vide omnium usu.
        </p>
    </td>
</tr>
</table>

Это имеет неприятные побочные эффекты, когда поле, которое вы хотите центрировать, имеет ширину или высоту больше половины области просмотра.

Noldorin 25.04.2019 00:29

Если вам известен размер вашего div, вы можете использовать calc.

Живой пример: https://jsfiddle.net/o8416eq3/

Примечания: это работает, только если вы жестко указали ширину и высоту своего div в CSS.

#target {
  position:fixed;
  top: calc(50vh - 100px/2);
  left: calc(50vw - 200px/2);
  width:200px;
  height:100px;
  background-color:red;
}
<div id='target'></div>

Слишком сложно. использовать translate просто проще. Нет причин использовать дополнительные calc и vw / vh.

MDTech.us_MAN 25.10.2016 20:35
position: absolute;
left: 50%;
top: 50%;
-webkit-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);

Объяснение:

Дайте ему абсолютное позиционирование (у родителя должно быть относительное позиционирование). Затем левый верхний угол перемещается в центр. Поскольку вы еще не знаете ширину / высоту, вы используете преобразование css для перевода позиции относительно середины. translate (-50%, -50%) уменьшает положение x и y левого верхнего угла на 50% ширины и высоты.

Хотя этот код может помочь решить проблему, предоставляя дополнительный контекст относительно Зачем и / или как, он отвечает на вопрос, что значительно улучшит его долгосрочное значение. Пожалуйста, редактировать свой ответ, чтобы добавить некоторые пояснения.

Toby Speight 25.07.2016 19:06

Но если мы также добавим ширина: 100%, тогда ширина этого div также сохранится.

Akshay Pratap Singh 04.09.2016 14:03

При использовании этой техники я сталкиваюсь с проблемой размытия на некоторых экранах. есть ли решение для этого?

kapil 22.12.2016 07:41

Это лучший код для центрирования бота div по горизонтали и вертикали.

div
{
  position:absolute;
  top:50%;
  left:50%;
  transform:translate(-50%,-50%);
}

Решение

Используя всего две строки CSS, используя волшебную силу Flexbox

.parent { display: flex; }
.child { margin: auto }

Какая версия CSS была добавлена ​​для отображения типа flex?

Omnifarious 15.08.2017 02:57

Использование display:grid на родительском элементе и установка margin:auto на центральный элемент сделает трюк:

Смотрите ниже фрагмент:

html,body {
  width :100%;
  height:100%;
  margin:0;
  padding:0;
}

.container {
  display:grid;
  height:90%;
  background-color:blue;
}

.content {
  margin:auto;
  color:white;
}
<div class = "container">
  <div class = "content"> cented div  here</div>
</div>

div {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    -ms-transform: translate(-50%, -50%); /* IE 9 */
    -webkit-transform: translate(-50%, -50%); /* Chrome, Safari, Opera */	    
}
<body>
    <div>Div to be aligned vertically</div>
</body>

позиция: абсолютная div в основном документе

Элемент с положением: absolute; позиционируется относительно ближайшего позиционированного предка (вместо расположен относительно в области просмотра (тег тела), как фиксированный).

Тем не мение; если элемент с абсолютным позиционированием не имеет позиционированных предков, он использует тело документа и перемещается вместе с прокруткой страницы.

источник: Позиция CSS

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

div {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0px;
  margin: auto;
  width: 100px;
  height: 100px;
}

Это почти то же самое, что и самый популярный ответ пятилетней давности. Главное отличие в том, что этот ответ не имеет объяснения.

Olaf Dietsche 06.10.2017 12:32

2018 способ использования CSS Grid:

.parent{
    display: grid;
    place-items: center center;
}

Проверьте поддержку браузера, Могу ли я использовать предполагает, что он работает в Chrome 57, FF 52, Opera 44, Safari 10.1, Edge 16. Я не проверял себя.

См. Фрагмент ниже:

.parent{
    display: grid;
    place-items: center center;
    /*place-items is a shorthand for align-items and justify-items*/
    
    height: 200px;
    border: 1px solid black;
    background: gainsboro;
}

.child{
    background: white;
}
<div class = "parent">
    <div class = "child">Centered!</div>
</div>

который совсем не отцентрован по краю

JFFIGK 21.10.2018 02:28

Я удивлен, что об этом еще не упоминалось, но самый простой способ сделать это - установить высоту, поля (и ширину, если хотите) с использованием размеров области просмотра.
Как вы, возможно, знаете, общая высота области просмотра = 100vh.
Допустим, вы хотите, чтобы height вашего контейнера занимал 60% (60vh) экрана, вы можете разделить оставшееся (40vh) поровну между верхним и нижним полями, чтобы элемент автоматически выровнялся по центру. Установка margin-left и margin-right на auto обеспечит центрирование контейнера по горизонтали.

.container {
         width: 60vw; /*optional*/
         height: 60vh;
         margin: 20vh auto;
         background: #333;
 }
<div class = "container">
</div>

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

1valdis 25.02.2018 19:10

Хоть я и опоздал, но это очень легко и просто. Центр страницы всегда оставляет 50%, а верхний - 50%. Итак, минус ширина и высота div 50% и установите левое поле и правое поле. Надеюсь, это сработает везде -

body{
  background: #EEE;
}
.center-div{
  position: absolute;
  width: 200px;
  height: 60px;
  left: 50%;  
  margin-left: -100px;
  top: 50%;
  margin-top: -30px;
  background: #CCC;
  color: #000;
  text-align: center;
}
<div class = "center-div">
  <h3>This is center div</h3>
</div>

На мой взгляд, использование Flex-бокса:

#parent {
  display: flex;
  justify-content: center;
  align-items: center;
}
<div id = "parent">
  <div id = "child">Hello World!</div>
</div>

Вы видите, что есть только три свойства CSS, которые вы должны использовать для центрирования дочернего элемента по вертикали и горизонтали. display: center; Сделайте основную часть, просто активировав дисплей Flex-box, justify-content: center; центрирует дочерний элемент по вертикали, а align-items: center; центрирует его по горизонтали. Чтобы добиться наилучшего результата, я просто добавляю несколько дополнительных стилей:

#parent {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 500px;
  width: 500px;
  background: yellow;
}

#child {
  width: 100px;
  height: 100px;
  background: silver;
}
<div id = "parent">
  <div id = "child">Hello World!</div>
</div>

Если вы хотите узнать больше о Flex-box, вы можете посетить W3Школы, MDN или CSS-хитрости для получения дополнительной информации.

Другие вопросы по теме