使用jQuery在屏幕上居中放置DIV


760

如何<div>使用jQuery在屏幕中央设置a ?


20
这比jQuery问题更多是CSS问题。您可以使用jQuery方法来帮助您找到跨浏览器的位置,并将正确的CSS样式应用于元素,但问题的实质是如何使用CSS在屏幕上居中显示div。
克里斯·麦克唐纳


2
如果将div在屏幕上居中,则可能是在使用FIXED定位。为什么不这样做:stackoverflow.com/questions/2005954/…。解决方案是纯CSS,不需要javascript。
Ardee Aram

同意,JavaScript方法一点也不友好。尤其是跨浏览器。
西蒙·海特

Answers:


1070

我喜欢向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();

演示:小提琴(带有添加的参数)


78
我建议进行以下更改:您应该使用this.outerHeight()和this.outerWidth()而不是this.height()和this.width()。否则,如果对象具有边框或填充,它将最终稍微偏离中心。
Trevor Burnham

82
为什么这不是jQuery功能的本机部分?
塞斯·卡内基

14
如果我不想居中<div>而不是居中<body>怎么办?也许您应该更改windowthis.parent()或为其添加参数。
德里克·朕会功夫2012年

13
答案中的代码应使用“ position:fixed”,因为“ absolute”是从第一个相对父对象计算得出的,并且代码使用window来计算中心。
迭戈

2
我还建议增加支持,以便在调整窗口大小时能够调整页面上的元素。目前,它保持原始尺寸。
网络

143

我在这里放了一个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

CSS假定您知道居中div的大小(至少为百分比),而jQuery可以执行任何操作。
Dunc 2014年

我的投票是CSS-简单得多,不需要任何精美的Java脚本。如果您使用固定而不是绝对值,则即使用户滚动浏览器窗口,它也将停留在页面中心
user1616338 '19

60

我会推荐jQueryUI Position Utility

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

这给您带来了更多的可能性,而不仅仅是居中...


1
@Timwi-确定要以窗口和文档为中心吗?
keithhackbarth

1
TypeError:$(...)。position不是函数
Michelangelo

3
@Michelangelo:您需要jqueryUI库才能使用.position()作为函数。检出:api.jqueryui.com/position/
jake

那段代码是最好的:D。但是要警告该元素必须是“可见的”。
2013年

39

这是我的努力。我最终将其用于Lightbox克隆。此解决方案的主要优点是,即使调整了窗口大小,元素也将自动保持居中状态,使其非常适合此类用法。

$.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;
}

3
我认为这很好用...由于使用了响应式设计,在我的案例中出现了错误:随着屏幕宽度的变化,div的宽度也会变化。完美的工作是Tony L的答案,然后加上以下内容:($(window).resize(function(){$('#mydiv').center()}); mydiv是一个模式对话框,因此当它关闭时,我将删除调整大小的事件处理程序。)
Darren Cook

1
有时您可能需要使用outerWidth()outerHeight()考虑填充和边框宽度。
菲利普·格柏

对于文档类型为5的遗留项目,这非常适合我,其中$(window).height()给出0。但是我将位置更改为“绝对”。
Mykhaylo Adamovych '16

26

您可以单独使用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中进行基本计算。

calc()浏览器支持表的MDN文档


请记住,如果您需要支持该浏览器使用jquery中心策略,则IE8不支持calc()。
mbokil

14

我在扩展@TonyL给出的好答案。我要添加Math.abs()来包装值,并且还要考虑到jQuery可能处于“无冲突”模式,例如WordPress。

我建议您使用Math.abs()包装顶部和左侧的值,如下所示。如果窗口太小,并且模式对话框的顶部有一个关闭框,则可以防止看不到关闭框的问题。Tony的函数可能具有负值。关于如何以负值结束的一个很好的例子是,如果您有一个大的居中对话框,但最终用户已安装了多个工具栏和/或增加了其默认字体-在这种情况下,将出现在模式对话框中的关闭框(如果在顶部)可能不可见且不可点击。

我要做的另一件事是通过缓存$(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();
});

我喜欢你的进步;但是,仍然存在一个问题,具体取决于您要查找的行为。仅当用户完全滚动到顶部和左侧时,abs才有效,否则用户将不得不滚动浏览器窗口才能到达标题栏。为了解决该问题,我选择执行一个简单的if语句,例如:if (top < w.scrollTop()) top = w.scrollTop();和left的等效语句。同样,这提供了可能或不希望的不同行为。
亚历克斯·乔根森

11

我将使用jQuery UI position函数。

请参阅工作演示

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

如果我有一个id为“ test”的div居中,则以下脚本会将div居中显示在文档中的窗口中。(位置选项中“ my”和“ at”的默认值为“ center”)

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

8

我想纠正一个问题。

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

上面的代码在以下情况下this.height(例如,假设用户调整屏幕大小并且内容是动态的)不起作用scrollTop() = 0,例如:

window.height600
this.height650

600 - 650 = -50  

-50 / 2 = -25

现在,该框位于-25屏幕中央。


6

这未经测试,但类似的东西应该起作用。

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

6

我不认为如果您希望元素始终位于页面中间居中,则绝对位置绝对不是最好的选择。您可能需要固定的元素。我找到了另一个使用固定定位的jQuery居中插件。它称为固定中心


4

此功能的过渡组件在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);

4

要将元素相对于浏览器视口(窗口)居中,请不要使用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)

4

这很棒。我添加了一个回调函数

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
   }
}

4

编辑:

如果这个问题教了我什么,那就是:不要更改已经起作用的东西:)

我在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/


1
问题是那不是居中的。
Konrad Borowski 2012年

@GlitchMr:我想在工作盒明天仔细检查,但第二小提琴的罚款在Chrome / Safari浏览器的Mac
OV

是的,我已经检查了Chrome,Firefox和Internet Explorer 8+(IE7不起作用),并且可以正常工作。但这在Opera中不起作用...考虑到它是简单的CSS并且可以在其他浏览器中使用,这非常奇怪。
Konrad Borowski 2012年

@GlitchMr:感谢您关注这个老问题。我已经更新了上面的小提琴链接,以显示“正确”的答案-让我知道它是否对您有用(或者贬低为遗忘。我有机会!:)
2012年

呵呵,除非能给出正确的答案,否则我不会做的(当前在Opera中仍然无法使用,但我认为这是浏览器错误)...哦,等等...如果我调整窗口大小而不是正常工作如果我要在JSFiddle中调整窗口大小。因此,它有效:)。对此我感到抱歉。但是,您仍然应该警告它在IE7中不起作用。+1。哦,我认为它可以在IE6中使用...
Konrad Borowski

3

我在这里拥有的是一种“居中”方法,该方法可确保您尝试居中的元素不仅处于“固定”或“绝对”位置,而且还确保您居中的元素小于其父元素,即居中并且相对于的元素是父元素,如果元素的父元素小于元素本身,则会将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');
        }
    };

2

我用这个:

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

2

请使用此:

$(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();

0

您得到的过渡效果不佳,因为每次滚动文档时都要调整元素的位置。您要使用固定位置。我尝试了上面列出的固定中心插件,看来确实可以很好地解决问题。固定位置允许您将元素居中一次,并且CSS属性将在每次滚动时为您维护该位置。


0

这是我的版本。在查看这些示例后,我可能会更改它。

$.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");
    });
};

0

不需要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?
2016年

0

我对托尼·洛斯答案的更新 这是我现在认真使用的答案的修改后的版本。我想我会分享一下,因为它可以为您可能遇到的各种情况添加更多功能,例如,不同类型的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")

它可以与任何定位类型一起使用,并且可以轻松地在整个站点中使用,也可以轻松地移植到您创建的任何其他站点。没有其他烦人的解决方法,可以正确地使内容居中。

希望这对外面的人有用!请享用。


0

有很多方法可以做到这一点。我的对象通过display:none隐藏在BODY标记内,因此相对于BODY定位。使用$(“#object_id”)。show()之后,我调用$(“#object_id”)。center()

我使用position:absolute,因为模态窗口可能大于设备窗口,尤其是在小型移动设备上,在这种情况下,如果定位固定,则某些模态内容可能无法访问。

这是我根据其他人的回答和我的具体需求而设计的口味:

$.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;
    };

0

您可以使用CSS translate属性:

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

阅读这篇文章以获取更多详细信息。


1
对于类似的事情,您需要设置您的left: 50%top: 50%然后可以使用转换平移将其中心点正确地移到上方。但是,通过这种方法,Chrome之类的浏览器之后会扭曲/模糊您的文本,这通常是不希望的。最好抓住窗口的宽度/高度,然后根据该位置放置左/上,而不是弄乱转换。防止失真,并且可以在我测试过的所有浏览器上使用。
Fata1Err0r 2015年

0

通常,我只会使用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>

(另请参阅此小提琴


0

CSS解决方案 仅两行

它将您的内部div水平和垂直居中。

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

}

仅用于水平对齐,更改

margin: 0 auto;

对于垂直方向,变化

margin: auto 0;

0

只需说:$(“#divID”)。html($('')。html($(“#divID”)。html()));;


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.