788 votes

Utilisation de jQuery pour centrer un DIV sur l'écran

Comment dois-je procéder pour établir un <div> au centre de l'écran en utilisant jQuery ?

21 votes

Il s'agit davantage d'une question de CSS que de jQuery. Vous pouvez utiliser des méthodes jQuery pour vous aider à trouver le positionnement inter-navigateurs et à appliquer les styles CSS appropriés à un élément, mais l'essentiel de la question est de savoir comment centrer un div à l'écran à l'aide de CSS.

0 votes

2 votes

Si vous centrez un div sur l'écran, vous utilisez peut-être un positionnement FIXE. Pourquoi ne pas simplement faire ceci : stackoverflow.com/questions/2005954/ . La solution est purement CSS, elle ne nécessite pas de javascript.

1085voto

Tony L. Points 7417

J'aime ajouter des fonctions à jQuery, donc cette fonction m'aiderait :

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

Maintenant on peut juste écrire :

$(element).center();

Démonstration : Violon (avec paramètre ajouté)

78 votes

Un changement que je suggérerais : Vous devriez utiliser this.outerHeight() et this.outerWidth() au lieu de simplement this.height() et this.width(). Sinon, si l'objet a une bordure ou un rembourrage, il se retrouvera légèrement décentré.

0 votes

J'ai constaté que cela fonctionnait très bien, sauf dans le mode de compatibilité IE7/IE8, où mon élément était déplacé vers la droite d'une bonne partie. La solution ci-dessous de molokoloco a fonctionné sur tous les navigateurs pour moi.

0 votes

Mais outherHeight et outerWidth ne sont supportés que par Firefox, non ?

151voto

molokoloco Points 1626

J'ai mis un plugin jquery ici

VERSION TRÈS COURTE

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

VERSION COURTE

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

Activé par ce code :

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

VERSION DU PLUGIN

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

Activé par ce code :

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

C'est bien ça ?

UPDATE :

De CSS-Tricks

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

0 votes

Votre fonction fonctionne parfaitement bien pour un centre vertical. Elle ne semble pas fonctionner pour un centre horizontal.

0 votes

Le CSS suppose que vous connaissez la taille (en pourcentage au moins) de la division centrée, alors que le jQuery fonctionne quoi qu'il en soit.

1 votes

Je vote pour les CSS, qui sont beaucoup plus simples et ne nécessitent aucun script Java fantaisiste. Si vous utilisez fixe au lieu d'absolu, il restera au centre de la page même si l'utilisateur fait défiler la fenêtre du navigateur.

63voto

cetnar Points 6170

Je recommande Utilitaire de positionnement jQueryUI

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

ce qui vous donne beaucoup plus de possibilités que le simple centrage ...

1 votes

@Timwi - Êtes-vous sûr de centrer sur la fenêtre et non sur le document ?

1 votes

TypeError : $(...).position n'est pas une fonction

3 votes

@Michelangelo : Vous avez besoin de la bibliothèque jqueryUI pour utiliser .position() comme fonction. Consultez : api.jqueryui.com/position/

40voto

bebraw Points 4356

Voici ce que j'ai fait. J'ai fini par l'utiliser pour mon clone de Lightbox. Le principal avantage de cette solution est que l'élément reste centré automatiquement, même si la fenêtre est redimensionnée, ce qui la rend idéale pour ce type d'utilisation.

$.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 votes

Je pense que cela fonctionne bien... cela n'a pas fonctionné dans mon cas à cause de l'utilisation du responsive design : la largeur de ma div change en fonction de la largeur de l'écran. Ce qui fonctionne parfaitement, c'est la réponse de Tony L, puis l'ajout de ceci : $(window).resize(function(){$('#mydiv').center()}); (mydiv est un dialogue modal, donc lorsqu'il est fermé, je supprime le gestionnaire d'événement de redimensionnement).

1 votes

Parfois, vous pouvez utiliser outerWidth() y outerHeight() pour prendre en compte le padding et la largeur de la bordure.

0 votes

Cela fonctionne parfaitement pour moi dans le cadre d'un projet patrimonial avec le type de document 5 où $(window).height() donne 0. Mais j'ai changé la position en 'absolue'.

27voto

apaul34208 Points 7818

Vous pouvez utiliser la CSS seule pour centrer comme suit :

Exemple de travail

.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() vous permet d'effectuer des calculs de base en css.

Documentation MDN pour calc()
Tableau de support des navigateurs

0 votes

Gardez à l'esprit que calc() n'est pas pris en charge par IE8 ; si vous devez prendre en charge ce navigateur, utilisez la stratégie jquery center.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X