Использование jQuery для центрирования DIV на экране

Как мне установить <div> в центре экрана с помощью jQuery?

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

Chris MacDonald 17.10.2008 04:20

Вот еще один плагин. alexandremagno.net/jquery/plugins/center

Ivailo Bardarov 01.02.2011 21:27

Если вы центрируете div на экране, возможно, вы используете ФИКСИРОВАННОЕ позиционирование. Почему бы просто не сделать это: stackoverflow.com/questions/2005954/…. Решение - чистый CSS, не требует javascript.

Ardee Aram 14.04.2011 06:00

Согласитесь, метод JavaScript совсем не дружелюбен. Особенно кроссбраузерность.

Simon Hayter 18.01.2013 02:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
774
4
519 841
28
Перейти к ответу Данный вопрос помечен как решенный

Ответы 28

Ответ принят как подходящий

Мне нравится добавлять функции в jQuery, поэтому эта функция поможет:

jQuery.fn.center = function () {
    this.css("position","absolute");
    this.css("top", Math.max(0, (($(window).height() - $(this).outerHeight()) / 2) + 
                                                $(window).scrollTop()) + "px");
    this.css("left", Math.max(0, (($(window).width() - $(this).outerWidth()) / 2) + 
                                                $(window).scrollLeft()) + "px");
    return this;
}

Теперь мы можем просто написать:

$(element).center();

Демо: Скрипка (с добавленным параметром)

Я бы предложил одно изменение: вы должны использовать this.outerHeight () и this.outerWidth () вместо только this.height () и this.width (). В противном случае, если у объекта есть граница или отступ, он будет немного смещен по центру.

Trevor Burnham 25.01.2010 23:52

Я обнаружил, что это отлично работает, за исключением режима совместимости IE7 / IE8, где мой элемент был немного смещен вправо. Приведенное ниже решение molokoloco работало для меня в кросс-браузере.

Rich 26.07.2010 19:09

Но outherHeight и outerWidth поддерживаются только Firefox, верно?

Max Kielland 06.07.2011 14:24

Почему это не встроенная часть функциональности jQuery?

Seth Carnegie 07.07.2011 01:54

Этот плагин / функция прекрасно работает. Однако мне интересно, можно ли также добавить параметры выравнивания углов, такие как .bottomRight () или .leftTop () или что-то подобное?

aalaap 06.12.2011 13:41

Что делать, если я не хочу центрироваться в содержащем <div> вместо <body>? Возможно, вам стоит изменить window на this.parent() или добавить для него параметр.

Derek 朕會功夫 21.02.2012 08:59

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

Zaptree 16.04.2012 19:23

Я считаю, что вам следует вычесть половину высоты div, который вы хотите центрировать, то есть добавить это к "верхнему" коду: - (this.outerHeight() / 2)

Muleskinner 25.04.2012 13:24

Код в ответе должен использовать "position: fixed", поскольку "absolute" вычисляется от первого относительного родителя, а код использует window для вычисления центра.

Diego 06.06.2012 19:43

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

Webnet 16.07.2012 16:27

Это отличный фрагмент кода, который я сейчас использую, чтобы помочь с моими пользовательскими исправлениями функциональности диалогового окна пользовательского интерфейса jQuery (автоматическая высота + максимальная высота = диалоговое окно пользовательского интерфейса jQuery не похоже). Я немного изменил код, чтобы, если центрируемый элемент не помещается во все окно, верхнее и левое значение устанавливаются на максимальные значения, необходимые для обеспечения того, чтобы верхняя и левая части элемента всегда были видны. Это отлично подходит для таких вещей, как диалоговые окна, поэтому пользователь всегда может получить доступ к строке заголовка диалогового окна, чтобы переместить и закрыть его. Форк его кода находится здесь: jsfiddle.net/m6D72

Alex Jorgenson 02.10.2012 05:32

Вместо this.outerHeight () должно быть $ (this) .outerHeight () sameas $ (this) .outerWidth (). В противном случае вы, вероятно, получите ошибку «outerHeight не является функцией». (stackoverflow.com/questions/947692/…)

Berkay Turancı 07.12.2012 16:37

В jQuery уже есть функция центра ... Почему бы вам не изменить имя!

Adam F 20.12.2012 21:21

Чтобы использовать фиксированное позиционирование вместо абсолютного, просто удалите + $(window).scrollTop() и + $(window).scrollLeft(). (И, конечно, поменять "absolute" на "fixed").

Katie Kilian 17.09.2013 23:06

спасибо, приятель, я объявляю свой собственный код для центрирования любого элемента, но сейчас, когда я читаю вашу функцию, это действительно очень приятно, легкость ... Мне это очень нравится, я буду использовать это Сейчас ^ _ ^ ... красиво ..

Anees Hikmat Abu Hmiad 16.07.2014 13:23

Однако это фантастика ... как мне сделать это переключателем? ... чтобы я мог восстановить центрирование в другом сценарии? иначе .. $ (элемент) .nocenter ();

josh.thomson 29.06.2015 12:17

Зачем использовать $ (this) .outerHeight () вместо this.outerHeight ()?

Silence Peace 06.02.2016 00:32

Как бы вы это оживили?

Nic Scozzaro 07.05.2019 00:17

Это не проверено, но что-то вроде этого должно работать.

var myElement = $('#myElement');
myElement.css({
    position: 'absolute',
    left: '50%',
    'margin-left': 0 - (myElement.width() / 2)
});

Я поставил здесь плагин jquery

ОЧЕНЬ КРАТКАЯ ВЕРСИЯ

$('#myDiv').css({top:'50%',left:'50%',margin:'-'+($('#myDiv').height() / 2)+'px 0 0 -'+($('#myDiv').width() / 2)+'px'});

УКОРОЧЕННАЯ ВЕРСИЯ

(function($){
    $.fn.extend({
        center: function () {
            return this.each(function() {
                var top = ($(window).height() - $(this).outerHeight()) / 2;
                var left = ($(window).width() - $(this).outerWidth()) / 2;
                $(this).css({position:'absolute', margin:0, top: (top > 0 ? top : 0)+'px', left: (left > 0 ? left : 0)+'px'});
            });
        }
    }); 
})(jQuery);

Активируется этим кодом:

$('#mainDiv').center();

ВЕРСИЯ ПЛАГИНА

(function($){
     $.fn.extend({
          center: function (options) {
               var options =  $.extend({ // Default values
                    inside:window, // element, center into window
                    transition: 0, // millisecond, transition time
                    minX:0, // pixel, minimum left element value
                    minY:0, // pixel, minimum top element value
                    withScrolling:true, // booleen, take care of the scrollbar (scrollTop)
                    vertical:true, // booleen, center vertical
                    horizontal:true // booleen, center horizontal
               }, options);
               return this.each(function() {
                    var props = {position:'absolute'};
                    if (options.vertical) {
                         var top = ($(options.inside).height() - $(this).outerHeight()) / 2;
                         if (options.withScrolling) top += $(options.inside).scrollTop() || 0;
                         top = (top > options.minY ? top : options.minY);
                         $.extend(props, {top: top+'px'});
                    }
                    if (options.horizontal) {
                          var left = ($(options.inside).width() - $(this).outerWidth()) / 2;
                          if (options.withScrolling) left += $(options.inside).scrollLeft() || 0;
                          left = (left > options.minX ? left : options.minX);
                          $.extend(props, {left: left+'px'});
                    }
                    if (options.transition > 0) $(this).animate(props, options.transition);
                    else $(this).css(props);
                    return $(this);
               });
          }
     });
})(jQuery);

Активируется этим кодом:

$(document).ready(function(){
    $('#mainDiv').center();
    $(window).bind('resize', function() {
        $('#mainDiv').center({transition:300});
    });
);

это правильно ?

ОБНОВИТЬ :

От CSS-хитрости

.center {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%); /* Yep! */
  width: 48%;
  height: 59%;
}

Ваша функция отлично работала для вертикального центра. Похоже, что это не работает для горизонтального центра.

Halsafar 01.06.2012 06:50

CSS предполагает, что вы знаете размер (по крайней мере, в процентах) центрированного div, тогда как jQuery работает как угодно.

Dunc 22.01.2014 13:16

Я голосую за CSS - гораздо более простой и не нуждающийся в причудливых Java-скриптах. Если вы используете фиксированный вместо абсолютного, он останется в центре страницы, даже когда пользователь прокручивает окно браузера.

user1616338 03.10.2019 19:35

Компонент перехода этой функции очень плохо работал у меня в Chrome (нигде не тестировал). Я бы немного изменил размер окна, и мой элемент как бы медленно перемещался, пытаясь наверстать упущенное.

Итак, следующая функция комментирует эту часть. Кроме того, я добавил параметры для передачи необязательных логических значений x и y, если вы хотите центрировать по вертикали, но не по горизонтали, например:

// Center an element on the screen
(function($){
  $.fn.extend({
    center: function (x,y) {
      // var options =  $.extend({transition:300, minX:0, minY:0}, options);
      return this.each(function() {
                if (x == undefined) {
                    x = true;
                }
                if (y == undefined) {
                    y = true;
                }
                var $this = $(this);
                var $window = $(window);
                $this.css({
                    position: "absolute",
                });
                if (x) {
                    var left = ($window.width() - $this.outerWidth())/2+$window.scrollLeft();
                    $this.css('left',left)
                }
                if (!y == false) {
            var top = ($window.height() - $this.outerHeight())/2+$window.scrollTop();   
                    $this.css('top',top);
                }
        // $(this).animate({
        //   top: (top > options.minY ? top : options.minY)+'px',
        //   left: (left > options.minX ? left : options.minX)+'px'
        // }, options.transition);
        return $(this);
      });
    }
  });
})(jQuery);

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

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

Я бы порекомендовал Утилита jQueryUI Position

$('your-selector').position({
    of: $(window)
});

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

@Timwi - Вы уверены, что ориентируетесь на окно или документ?

keithhackbarth 21.12.2012 03:48

TypeError: $ (...). Position не является функцией

Michelangelo 14.05.2013 10:51

@Michelangelo: вам нужна библиотека jqueryUI для использования .position () в качестве функции. Проверьте: api.jqueryui.com/position/

jake 15.06.2013 21:04

Этот фрагмент самый лучший: D. Но учтите, что элемент должен быть «видимым».

Cԃաԃ 21.11.2013 13:05

Хочу исправить одну проблему.

this.css("top", ( $(window).height() - this.height() ) / 2+$(window).scrollTop() + "px");

Приведенный выше код не будет работать в случаях, когда this.height (предположим, что пользователь изменяет размер экрана, а контент является динамическим) и scrollTop() = 0, например:

window.height - это 600
this.height - это 650

600 - 650 = -50  

-50 / 2 = -25

Теперь коробка -25 центрирована за кадром.

Отлично. Я добавил функцию обратного вызова

center: function (options, callback) {


if (options.transition > 0) {
   $(this).animate(props, options.transition, callback);
} else { 
    $(this).css(props);
   if (typeof callback == 'function') { // make sure the callback is a function
       callback.call(this); // brings the scope to the callback
   }
}

Почему вы не используете CSS для центрирования div?

#timer_wrap{  
  position: fixed;
  left: 50%;
  top: 50%;
} 

В вашем примере верхний / левый угол div будет там, где должен быть центр.

Cristi Mihai 03.03.2012 18:25

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

$.fn.center = function() {
    this.css({
        'position': 'fixed',
        'left': '50%',
        'top': '50%'
    });
    this.css({
        'margin-left': -this.outerWidth() / 2 + 'px',
        'margin-top': -this.outerHeight() / 2 + 'px'
    });

    return this;
}

Я думаю, что это работает хорошо ... в моем случае все пошло не так из-за использования адаптивного дизайна: ширина моего div изменяется по мере изменения ширины экрана. Что отлично работает, так это ответ Тони Л., а затем добавление этого: $(window).resize(function(){$('#mydiv').center()}); (mydiv - это модальный диалог, поэтому, когда он закрыт, я удаляю обработчик события изменения размера.)

Darren Cook 08.07.2012 12:46

Иногда вы можете использовать outerWidth() и outerHeight(), чтобы учесть отступы и ширину границы.

Philippe Gerber 16.05.2013 05:08

Это отлично работает для меня для устаревшего проекта с типом документа 5, где $(window).height() дает 0. Но я изменил позицию на «абсолютную».

Mike 19.12.2016 13:55

Редактировать:

Если вопрос меня чему-то научил, так это так: не меняйте то, что уже работает :)

Я предоставляю (почти) дословную копию того, как это было обработано на http://www.jakpsatweb.cz/css/css-vertical-center-solution.html - он сильно взломан для IE, но предоставляет чистый способ CSS для ответа на вопрос:

.container {display:table; height:100%; position:absolute; overflow:hidden; width:100%;}
.helper    {#position:absolute; #top:50%;
            display:table-cell; vertical-align:middle;}
.content   {#position:relative; #top:-50%;
            margin:0 auto; width:200px; border:1px solid orange;}

Рабочий пример: http://jsfiddle.net/S9upd/4/

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

Оригинал:

Похоже, я опаздываю на вечеринку!

Выше есть несколько комментариев, которые предполагают, что это вопрос CSS - разделение проблем и все такое. Позвольте мне предварить это, сказав, что CSS В самом деле выстрелил себе в ногу на этом. Я имею в виду, насколько легко это было бы сделать:

.container {
    position:absolute;
    left: 50%;
    top: 50%;
    overflow:visible;
}
.content {
    position:relative;
    margin:-50% 50% 50% -50%;
}

Верно? Верхний левый угол контейнера будет в центре экрана, а с отрицательными полями контент волшебным образом снова появится в абсолютном центре страницы! http://jsfiddle.net/rJPPc/

Неправильный! Горизонтальное позиционирование нормально, но вертикальное ... О, понятно. Видимо в css при установке верхнего поля в% значение рассчитывается как процент всегда относительно ширина содержащего блока. Как яблоки и апельсины! Если вы не доверяете мне или Mozilla doco, поиграйте со скрипкой выше, отрегулировав ширину контента, и вы будете поражены.


Теперь, когда CSS был моим хлебом с маслом, я не собирался сдаваться. В то же время я предпочитаю простые вещи, поэтому я позаимствовал результаты Чешский гуру CSS и превратил их в рабочую скрипку. Короче говоря, мы создаем таблицу, в которой vertical-align установлено на среднее значение:

<table class = "super-centered"><tr><td>
    <div class = "content">
        <p>I am centered like a boss!</p>
    </div>
</td></tr></table>

И чем положение контента точно настраивается с помощью старого доброго маржа: 0 авто;:

.super-centered {position:absolute; width:100%;height:100%;vertical-align:middle;}
.content {margin:0 auto;width:200px;}​

Рабочая рабочий пример, как и было обещано: http://jsfiddle.net/teDQ2/

Проблема в том, что не по центру.

Konrad Borowski 18.03.2012 17:10

@GlitchMr: я хотел бы завтра дважды проверить рабочее окно, но вторая рабочий пример отлично работала в Chrome / Safari Mac

o.v. 18.03.2012 17:50

Верно, я проверил Chrome, Firefox и Internet Explorer 8+ (IE7 не работает), и он работает. Но это не работает в Opera ... и это очень странно, учитывая, что это простой CSS и он работает в других браузерах.

Konrad Borowski 18.03.2012 18:23

@GlitchMr: спасибо, что следите за таким старым вопросом. Я обновил ссылку на скрипт выше, чтобы показать "правильный" ответ - дайте мне знать, работает ли он для вас (или оставьте свой голос до забвения. У меня был шанс! :)

o.v. 19.03.2012 02:25

Хех, все, что я сделаю, это не проголосовать, пока не появится правильный ответ (в настоящее время он все еще не работает в Opera, но я думаю, что это ошибка браузера) ... о, подождите ... это сработает, если я изменю размер окна, а не если я изменю размер окон в самом JSFiddle. Итак, работает :). Я сожалею об этом. Но все же следует поставить предупреждение, что в IE7 это не работает. +1. О, и я думаю, что это работает в IE6 ...

Konrad Borowski 19.03.2012 10:24

Собственно, моя ошибка. Я не читал и подумал, что вы обновили самую низкую скрипку (jsfiddle.net/teDQ2). Текущее решение отлично работает в IE7.

Konrad Borowski 19.03.2012 19:40

Я расширяю отличный ответ @TonyL. Я добавляю Math.abs () для обертывания значений, а также принимаю во внимание, что jQuery может находиться в режиме «без конфликтов», как, например, в WordPress.

Я рекомендую вам обернуть верхнее и левое значения с помощью Math.abs (), как я сделал ниже. Если окно слишком маленькое, а в вашем модальном диалоговом окне есть закрывающее окно вверху, это предотвратит проблему отсутствия закрывающего окна. Функция Тони могла иметь потенциально отрицательные значения. Хороший пример того, как вы получаете отрицательные значения, - это если у вас большой диалог по центру, но конечный пользователь установил несколько панелей инструментов и / или увеличил свой шрифт по умолчанию - в таком случае закрывающее окно в модальном диалоговом окне (если вверху) могут быть не видны и не доступны для просмотра.

Другое, что я делаю, - это немного ускоряю это, кэшируя объект $ (window), чтобы уменьшить лишние обходы DOM, и я использую кластерный CSS.

jQuery.fn.center = function ($) {
  var w = $(window);
  this.css({
    'position':'absolute',
    'top':Math.abs(((w.height() - this.outerHeight()) / 2) + w.scrollTop()),
    'left':Math.abs(((w.width() - this.outerWidth()) / 2) + w.scrollLeft())
  });
  return this;
}

Чтобы использовать, вы должны сделать что-то вроде:

jQuery(document).ready(function($){
  $('#myelem').center();
});

Мне нравятся твои улучшения; однако я все еще обнаружил одну проблему в зависимости от того, какое именно поведение вы ищете. Абс будет отлично работать, только если пользователь полностью прокручен вверх и влево, в противном случае пользователю придется прокручивать окно браузера, чтобы добраться до строки заголовка. Чтобы решить эту проблему, я решил сделать простой оператор if, например: if (top < w.scrollTop()) top = w.scrollTop(); вместе с эквивалентом для left. Опять же, это обеспечивает другое поведение, которое может быть или нежелательно.

Alex Jorgenson 02.10.2012 05:21

Вот моя версия. Я могу изменить это после того, как посмотрю на эти примеры.

$.fn.pixels = function(property){
    return parseInt(this.css(property));
};

$.fn.center = function(){
    var w = $($w);
    return this.each(function(){
        $(this).css("position","absolute");
        $(this).css("top",((w.height() - $(this).height()) / 2) - (($(this).pixels('padding-top') + $(this).pixels('padding-bottom')) / 2) + w.scrollTop() + "px");
        $(this).css("left",((w.width() - $(this).width()) / 2) - (($(this).pixels('padding-left') + $(this).pixels('padding-right')) / 2) + w.scrollLeft() + "px");
    });
};

Чтобы центрировать элемент относительно области просмотра (окна) браузера, не используйте position: absolute, правильное значение позиции должно быть fixed (абсолютное означает: «Элемент позиционируется относительно своего первого позиционированного (не статического) элемента-предка»).

В этой альтернативной версии предлагаемого центрального плагина вместо «px» используется «%», поэтому при изменении размера окна содержимое остается по центру:

$.fn.center = function () {
    var heightRatio = ($(window).height() != 0) 
            ? this.outerHeight() / $(window).height() : 1;
    var widthRatio = ($(window).width() != 0) 
            ? this.outerWidth() / $(window).width() : 1;

    this.css({
        position: 'fixed',
        margin: 0,
        top: (50*(1-heightRatio)) + "%",
        left: (50*(1-widthRatio))  + "%"
    });

    return this;
}

Вам нужно установить margin: 0, чтобы исключить поля содержимого из ширины / высоты (поскольку мы используем фиксированное положение, наличие полей не имеет смысла). Согласно документу jQuery, использование .outerWidth(true) должно включать поля, но он не работал должным образом, когда я пытался в Chrome.

50*(1-ratio) происходит от:

Ширина окна: W = 100%

Ширина элемента (в%): w = 100 * elementWidthInPixels/windowWidthInPixels

Их нужно вычислить по центру слева:

 left = W/2 - w/2 = 50 - 50 * elementWidthInPixels/windowWidthInPixels =
 = 50 * (1-elementWidthInPixels/windowWidthInPixels)

Вы можете использовать только CSS для центрирования следующим образом:

Рабочий пример

.center{
    position: absolute;
    height: 50px;
    width: 50px;
    background:red;
    top:calc(50% - 50px/2); /* height divided by 2*/
    left:calc(50% - 50px/2); /* width divided by 2*/
}
<div class = "center"></div>

calc() позволяет выполнять базовые вычисления в css.

Документация MDN для calc()
Таблица поддержки браузера

Имейте в виду, что calc () не поддерживается в IE8, если вам нужно поддерживать этот браузер, используя стратегию jquery center.

mbokil 26.08.2013 03:15

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

$.fn.center = function () {
        /// <summary>Centers a Fixed or Absolute positioned element relative to its parent</summary>

        var element = $(this),
            elementPos = element.css('position'),
            elementParent = $(element.parent()),
            elementWidth = element.outerWidth(),
            parentWidth = elementParent.width();

        if (parentWidth <= elementWidth) {
            elementParent = $(elementParent.parent());
            parentWidth = elementParent.width();
        }

        if (elementPos === "absolute" || elementPos === "fixed") {
            element.css('right', (parentWidth / 2) - elementWidth / 2 + 'px');
        }
    };

Для этого не нужен jquery

Я использовал это для центрирования элемента Div. Стиль CSS,

.black_overlay{
    display: none;
    position: absolute;
    top: 0%;
    left: 0%;
    width: 100%;
    height: 100%;
    background-color: black;
    z-index:1001;
    -moz-opacity: 0.8;
    opacity:.80;
    filter: alpha(opacity=80);
}

.white_content {
    display: none;
    position: absolute;
    top: 25%;
    left: 25%;
    width: 50%;
    height: 50%;
    padding: 16px;
    border: 16px solid orange;
    background-color: white;
    z-index:1002;
    overflow: auto;
}

Открытый элемент

$(document).ready(function(){
    $(".open").click(function(e){
      $(".black_overlay").fadeIn(200);
    });

});

Вы забыли добавить к своему ответу HTML-код?

Ben 04.08.2016 23:15

Вы можете использовать свойство CSS translate:

position: absolute;
transform: translate(-50%, -50%);

Подробнее читайте в эта почта.

Для чего-то подобного вам нужно установить свои left: 50% и top: 50%, тогда вы можете использовать преобразование translate, чтобы правильно сместить его центральную точку. Однако при использовании этого метода браузеры, такие как Chrome, впоследствии будут искажать / размывать ваш текст, что обычно нежелательно. Лучше взять ширину / высоту окна, а затем расположить левый / верхний на основе этого, вместо того, чтобы возиться с преобразованием. Предотвращает искажение и работает во всех браузерах, в которых я его тестировал.

Fata1Err0r 23.07.2015 18:44

Я бы использовал функцию jQuery UIposition.

См. Рабочую демонстрацию.

<div id = "test" style = "position:absolute;background-color:blue;color:white">
    test div to center in window
</div>

Если у меня есть div с идентификатором "test" для центрирования, то следующий скрипт центрирует div в окне на готовом документе. (значения по умолчанию для "my" и "at" в параметрах позиции - "center")

<script type = "text/javascript">
$(function(){
  $("#test").position({
     of: $(window)
  });
};
</script>

МОЕ ОБНОВЛЕНИЕ НА ОТВЕТ ТОНИ L Это модифицированная версия его ответа, которую я сейчас религиозно использую. Я подумал, что поделюсь им, так как он добавляет к нему немного больше функциональности для различных ситуаций, которые могут у вас возникнуть, например, для разных типов position или требуется только горизонтальное / вертикальное центрирование, а не то и другое.

center.js:

// We add a pos parameter so we can specify which position type we want

// Center it both horizontally and vertically (dead center)
jQuery.fn.center = function (pos) {
    this.css("position", pos);
    this.css("top", ($(window).height() / 2) - (this.outerHeight() / 2));
    this.css("left", ($(window).width() / 2) - (this.outerWidth() / 2));
    return this;
}

// Center it horizontally only
jQuery.fn.centerHor = function (pos) {
    this.css("position", pos);
    this.css("left", ($(window).width() / 2) - (this.outerWidth() / 2));
    return this;
}

// Center it vertically only
jQuery.fn.centerVer = function (pos) {
    this.css("position", pos);
    this.css("top", ($(window).height() / 2) - (this.outerHeight() / 2));
    return this;
}

В моем <head>:

<script src = "scripts/center.js"></script>

Примеры использования:

$("#example1").centerHor("absolute")
$("#example2").centerHor("fixed")

$("#example3").centerVer("absolute")
$("#example4").centerVer("fixed")

$("#example5").center("absolute")
$("#example6").center("fixed")

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

Надеюсь, это будет полезно для кого-то! Наслаждаться.

Есть много способов сделать это. Мой объект скрыт с помощью дисплей: нет внутри тега BODY, так что позиционирование выполняется относительно BODY. После использования $ ("# идентификатор_объекта"). show () я вызываю $ ("# идентификатор_объекта"). center ()

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

Вот мой вариант, основанный на ответах других и моих конкретных потребностях:

$.fn.center = function () {
        this.css("position","absolute");

        //use % so that modal window will adjust with browser resizing
        this.css("top","50%");
        this.css("left","50%");

        //use negative margin to center
        this.css("margin-left",(-1*this.outerWidth()/2)+($(window).scrollLeft())+"px");
        this.css("margin-top",(-1*this.outerHeight()/2)+($(window).scrollTop())+"px");

        //catch cases where object would be offscreen
        if (this.offset().top<0)this.css({"top":"5px","margin-top":"0"});
        if (this.offset().left<0)this.css({"left":"5px","margin-left":"0"});

        return this;
    };

я использую это:

$(function() {
   $('#divId').css({
    'left' : '50%',
    'top' : '50%',
    'position' : 'absolute',
    'margin-left' : -$('#divId').outerWidth()/2,
    'margin-top' : -$('#divId').outerHeight()/2
  });
});

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

Следующий код центрирует div как по горизонтали, так и по вертикали внутри своего контейнера:

$("#target").addClass("centered-content")
            .wrap("<div class='center-outer-container'></div>")
            .wrap("<div class='center-inner-container'></div>");
body {
    margin : 0;
    background: #ccc;
}

.center-outer-container {
    position : absolute;
    display: table;
    width: 100%;
    height: 100%;
}

.center-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;
}
<script type = "text/javascript" src = "https://code.jquery.com/jquery-1.12.1.min.js"></script>
<div id = "target">Center this!</div>

(см. также эта рабочий пример)

Пожалуйста, используйте это:

$(window).resize(function(){
    $('.className').css({
        position:'absolute',
        left: ($(window).width() - $('.className').outerWidth())/2,
        top: ($(window).height() - $('.className').outerHeight())/2
    });
});

// To initially run the function:
$(window).resize();

CSS решениеТолько в двух строках

Он централизует ваш внутренний div по горизонтали и вертикали.

#outer{
  display: flex;
}
#inner{
  margin: auto;
}

только для выравнивания по горизонтали, измените

margin: 0 auto;

а для вертикального измените

margin: auto 0;

Просто скажи: $ ("# divID"). html ($ (''). html ($ ("# divID"). html ()));

Это можно сделать только с помощью CSS. Но просили с jQuery или JavaScript

Здесь используйте свойство CSS Flex box, чтобы выровнять центр div.

body.center{
  display:flex;
  align-items:center; // Vertical alignment
  justify-content:center; // Horizontal alignment
}

align-items:center; - used to align vertically.

justify-content:center; - used to align horizontally.

document.querySelector("body").classList.add("center");
body {
  margin : 0;
  height:100vh;
  width:100%;
  background: #ccc;
}
#main{
  background:#00cc00;
  width:100px;
  height:100px;
}
body.center{
  display:flex;
  align-items:center;
  justify-content:center;
}
<body>
  <div id = "main"></div>
</body>

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