ChatGPT解决这个技术问题 Extra ChatGPT

使用 jQuery 使 DIV 在屏幕上居中

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

这更像是一个 CSS 问题而不是一个 jQuery 问题。您可以使用 jQuery 方法来帮助您找到跨浏览器定位并将正确的 CSS 样式应用于元素,但问题的本质是如何使用 CSS 使 div 在屏幕上居中。
这里还有一个插件。 alexandremagno.net/jquery/plugins/center
如果您在屏幕上将 div 居中,您可能正在使用 FIXED 定位。为什么不这样做:stackoverflow.com/questions/2005954/…。解决方案是纯 CSS,不需要 javascript。
同意,JavaScript 方法一点也不友好。尤其是跨浏览器。

8
8 revs, 6 users 61%

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

演示:Fiddle(添加参数)


我建议进行一项更改:您应该使用 this.outerHeight() 和 this.outerWidth() 而不仅仅是 this.height() 和 this.width()。否则,如果对象有边框或填充,它最终会稍微偏离中心。
为什么这不是 jQuery 功能的本机部分?
如果我不想在包含 <div> 而不是 <body> 中居中怎么办?也许您应该将 window 更改为 this.parent() 或为其添加一个参数。
答案中的代码应使用“位置:固定”,因为“绝对”是从第一个相对父级计算的,并且代码使用窗口来计算中心。
我还建议添加支持,以便在调整窗口大小时它会调整页面上的元素。目前它保持原始尺寸。
C
Community

我在这里放了一个jquery plugin

非常简短的版本

$('#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-Tricks

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

您的功能对于垂直中心非常有效。它似乎不适用于水平中心。
CSS 假设您知道居中 div 的大小(至少是百分比),而 jQuery 无论如何都可以工作。
我的投票是 CSS - 更直接,不需要任何花哨的 Java 脚本。如果您使用固定而不是绝对,即使用户滚动浏览器窗口,它也会留在页面中心
c
cetnar

我会推荐jQueryUI Position utility

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

这为您提供了比仅居中更多的可能性...


@Timwi - 你确定你的重点是窗口和文档吗?
TypeError: $(...).position 不是函数
@Michelangelo:您需要 jqueryUI 库才能使用 .position() 作为函数。查看:api.jqueryui.com/position/
那个片段是最好的:D。但请注意,该元素必须是“可见的”。
J
Juho Vepsäläinen

这是我的尝试。我最终将它用于我的 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;
}

我认为这很好用......由于使用响应式设计,在我的情况下它出错了:我的 div 的宽度随着屏幕宽度的变化而变化。完美的工作是 Tony L 的回答,然后添加:$(window).resize(function(){$('#mydiv').center()});(mydiv 是一个模式对话框,所以当它关闭时,我删除了 resize 事件处理程序。)
有时您可能希望使用 outerWidth()outerHeight() 来考虑填充和边框宽度。
这对我来说非常适合文档类型为 5 的遗留项目,其中 $(window).height() 给出 0。但我已将位置更改为“绝对”。
a
apaul

您可以单独使用 CSS 来居中,如下所示:

Working Example

.center{ 位置:绝对;高度:50px;宽度:50px;背景:红色;顶部:计算(50% - 50px/2); /* 高度除以 2*/ left:calc(50% - 50px/2); /* 宽度除以 2*/ }

calc() 允许您在 css 中进行基本计算。

MDN Documentation for calc()
Browser support table


请记住,如果您需要支持该浏览器使用 jquery center 策略,IE8 不支持 calc()。
V
Volomike

我正在扩展@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 的等效语句。同样,这提供了可能需要也可能不需要的不同行为。
a
atiquratik

我会使用 jQuery UI position 函数。

See working demo

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

a
atiquratik

我想纠正一个问题。

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


A
Andrew Hedges

这是未经测试的,但这样的事情应该可以工作。

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

F
Fred

如果您希望元素始终位于页面中间,我认为拥有绝对位置并不是最好的选择。你可能想要一个固定的元素。我找到了另一个使用固定定位的 jquery 居中插件。它被称为 fixed center


S
Solomon Ucko

编辑:

如果这个问题教会了我什么,那就是:不要改变已经有效的东西:)

我提供了一个(几乎)逐字记录在 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/

我已经通过 browsershots 运行了它,看起来还不错;如果没有别的原因,我将保留原件,以便 CSS 规范所规定的边距百分比处理得以实现。

原来的:

看来我迟到了!

上面有一些评论表明这是一个 CSS 问题 - 关注点分离和所有问题。让我先说 CSS 确实在这个问题上打了自己的脚。我的意思是,这样做有多容易:

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

正确的? Container 的左上角将位于屏幕的中心,并且带有负边距的内容将神奇地重新出现在页面的绝对中心! http://jsfiddle.net/rJPPc/

错了! 水平定位没问题,但垂直定位...哦,我明白了。显然在 css 中,当以 % 设置上边距时,该值计算为 a percentage always relative to the width of the containing block。像苹果和橘子!如果您不信任我或 Mozilla doco,请通过调整内容宽度来玩弄上面的小提琴并感到惊讶。

现在,CSS 是我的生计,我不会放弃。同时,我更喜欢简单的事情,所以我借用了 Czech CSS guru 的发现并把它变成了一个工作小提琴。长话短说,我们创建了一个表格,其中vertical-align 设置为middle:

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

并且内容的位置通过良好的旧边距进行微调:0 auto;:

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

按承诺工作小提琴:http://jsfiddle.net/teDQ2/


问题是没有居中。
@GlitchMr:我想明天再检查一下工作框,但第二个小提琴在 Chrome/Safari Mac 上运行良好
对,我检查了 Chrome、Firefox 和 Internet Explorer 8+(IE7 不工作)并且可以工作。但它在 Opera 中不起作用......考虑到它是简单的 CSS 并且它在其他浏览器中也适用,这很奇怪。
@GlitchMr:感谢您关注这么老的问题。我已经更新了上面的小提琴链接以显示一个“正确”的答案 - 让我知道它是否适合你(或者投票被遗忘。我有机会!:)
嘿,除非显示正确的答案,否则我要做的就是不投票(目前它在 Opera 中仍然不起作用,但我认为这是浏览器错误)......哦等等......如果我调整窗口大小而不是如果我将在 JSFiddle 本身中调整窗口大小。所以,它有效:)。对此我很抱歉。但是,您仍然应该警告它在 IE7 中不起作用。 +1。哦,我认为它适用于 IE6 ......
E
Eric D. Fields

这个函数的转换组件在 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);

D
Diego

要将元素相对于浏览器视口(窗口)居中,不要使用 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 以从宽度/高度中排除内容边距(因为我们使用的是固定位置,所以有边距没有意义)。根据使用 .outerWidth(true) 的 jQuery 文档应该包括边距,但是当我在 Chrome 中尝试时它没有按预期工作。

50*(1-ratio) 来自:

窗口宽度:W = 100%

元素宽度(%):w = 100 * elementWidthInPixels/windowWidthInPixels

他们计算居中的左边:

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

L
Leo the lion

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

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

R
Ryan

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

R
Rayees AC

CSS 解决方案 仅两行

它水平和垂直集中你的内部 div。

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

仅用于水平对齐,更改

margin: 0 auto;

对于垂直,改变

margin: auto 0;

h
holden

我用这个:

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

T
Tunaki

请使用这个:

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

D
David

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


A
Andrew

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

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

S
Sajitha Rathnayake

不需要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?
F
Fata1Err0r

我对 TONY L'S ANSWER 的更新 这是我现在虔诚地使用的他的答案的修改版本。我想我会分享它,因为它为您可能遇到的各种情况添加了更多功能,例如不同类型的 position 或只想要水平/垂直居中而不是两者兼而有之。

中心.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")

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

希望这对那里的人有用!享受。


i
i_a

有很多方法可以做到这一点。我的对象被 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;
    };

F
Fred K

您可以使用 CSS translate 属性:

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

阅读this post了解更多详情。


对于类似的事情,您需要设置 left: 50%top: 50%,然后您可以使用转换转换来正确移动其中心点。但是,使用这种方法,Chrome 等浏览器之后会扭曲/模糊您的文本,这通常是不可取的。最好抓住窗口的宽度/高度,然后根据它定位左侧/顶部,而不是弄乱变换。防止失真并在我测试过的每个浏览器上工作。
J
John Slegers

通常,我只会用 CSS 来做这件事......但是既然你问过你用 jQuery 做这个的方法......

以下代码将 div 在其容器内水平和垂直居中:

$("#target").addClass("centered-content") .wrap("

") .wrap("
");身体{边距:0;背景:#ccc; } .center-outer-container { 位置:绝对;显示:表格;宽度:100%;高度:100%; } .center-inner-container { 显示:表格单元;垂直对齐:中间;文本对齐:居中; } .centered-content { 显示:内联块;文本对齐:左;背景:#fff;填充:20px;边框:1px 实心#000; }
居中!< /div>

(另见this Fiddle


1
1.618

就说: $("#divID").html($('').html($("#divID").html()));


R
Rayees AC

它可以只用 CSS 来完成。但他们用 jQuery 或 JavaScript 询问

在这里,使用 CSS Flex box 属性来对齐 div 中心。

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

对齐项目:中心; - 用于垂直对齐。

证明内容:中心; - 用于水平对齐。

document.querySelector("body").classList.add("center");身体{边距:0;高度:100vh;宽度:100%;背景:#ccc; } #main{ 背景:#00cc00;宽度:100 像素;高度:100px; } body.center{ 显示:弹性;对齐项目:中心;证明内容:中心; }


Y
Yi Jiang

为什么不使用 CSS 使 div 居中?

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

在您的示例中,div 的顶部/左侧将是中心应该在的位置。