42 votes

dialogue de l'interface utilisateur jquery à positionnement fixe

J'avais besoin que le dialogue maintienne sa position fixe même si la page défilait, j'ai donc utilisé l'extension de l'extension http://forum.jquery.com/topic/dialog-position-fixed-12-1-2010 mais il y a 2 problèmes avec ça :

  • il clignote dans IE et Firefox lors du défilement de la page (dans Safari/Chrome, il n'y a pas de problème).

  • en fermant puis en rouvrant, il perd son adhérence et défile avec la page.

Voici le code que j'utilise pour créer le dialogue :

$('<div id="'+divpm_id+'"><div id="inner_'+divpm_id+'"></div><textarea class="msgTxt" id="txt'+divpm_id+'" rows="2"></textarea></div>')
                .dialog({
                autoOpen: true,
                title: user_str,
                height: 200,
                stack: true,
                sticky: true //uses ui dialog extension to keep it fixed
     });

Et voici le code que j'utilise pour le rouvrir :

jQuery('#'+divpm_id).parent().css('display','block');

Suggestions/solutions ?

Merci

0 votes

Si vous connaissez un autre plugin jquery pour un dialogue qui reste fixe et ne clignote pas, je suis également intéressé.

46voto

Scott Greenfield Points 1435

J'ai essayé certaines des solutions proposées ici, mais elles ne fonctionnent pas si la page a été déroulée avant l'ouverture de la boîte de dialogue. Le problème est qu'il calcule la position sans tenir compte de la position de défilement, car la position est absolue lors de ce calcul.

La solution que j'ai trouvée est de définir la CSS du parent de la boîte de dialogue comme étant fixe AVANT d'ouvrir la boîte de dialogue.

$('#my-dialog').parent().css({position:"fixed"}).end().dialog('open');

Cela suppose que vous avez déjà initialisé la boîte de dialogue avec la valeur false pour autoOpen.

Attention, cela ne fonctionne pas si la boîte de dialogue est redimensionnable. Elle doit être initialisée avec le redimensionnement désactivé pour que la position reste fixe.

$('#my-dialog').dialog({ autoOpen: false, resizable: false });

J'ai testé ce système de manière approfondie et je n'ai trouvé aucun bogue jusqu'à présent.

9 votes

Je trouve qu'il est préférable d'exécuter cette logique dans l'événement de création, de sorte que vous pouvez appeler le standard .dialog('open') ailleurs, sans avoir à exécuter ce hack à chaque fois... $('#metadata').dialog({ create: function (event) { $(event.target).parent().css('position', 'fixed'); });

2 votes

Définir dialogClass : à une classe avec position:fixed fonctionnait en 1.8.24, mais depuis la 1.9.0, il sort de l'écran si l'on fait défiler l'écran vers le bas avant de l'ouvrir

1 votes

La réponse écossaise fonctionne bien avec jQuery-UI 1.11. Juste une petite amélioration par rapport au commentaire de @Langdon : En utilisant $("selector").dialog("widget") vous rend un peu plus robuste aux changements futurs de la structure DOM du dialogue de jQuery. Donc ça devient : $('#metadata').dialog({ create: function(event) { $(event.target).dialog("widget").css({ "position": "fixed" }); });

33voto

msander Points 321

J'ai combiné quelques solutions suggérées au code suivant. Le défilement, le déplacement et le redimensionnement fonctionnent bien pour moi dans Chrome, FF et IE9.

$(dlg).dialog({
    create: function(event, ui) {
        $(event.target).parent().css('position', 'fixed');
    },
    resizeStop: function(event, ui) {
        var position = [(Math.floor(ui.position.left) - $(window).scrollLeft()),
                         (Math.floor(ui.position.top) - $(window).scrollTop())];
        $(event.target).parent().css('position', 'fixed');
        $(dlg).dialog('option','position',position);
    }
});

Mise à jour :

Si vous voulez le rendre par défaut pour toutes les boîtes de dialogue :

$.ui.dialog.prototype._oldinit = $.ui.dialog.prototype._init;
$.ui.dialog.prototype._init = function() {
    $(this.element).parent().css('position', 'fixed');
    $(this.element).dialog("option",{
        resizeStop: function(event,ui) {
            var position = [(Math.floor(ui.position.left) - $(window).scrollLeft()),
                            (Math.floor(ui.position.top) - $(window).scrollTop())];
            $(event.target).parent().css('position', 'fixed');
            // $(event.target).parent().dialog('option','position',position);
            // removed parent() according to hai's comment (I didn't test it)
            $(event.target).dialog('option','position',position);
            return true;
        }
    });
    this._oldinit();
};

0 votes

Cette solution me semble la plus complète, elle fonctionne parfaitement - merci.

0 votes

Veuillez retirer .parent() dans la section de mise à jour à la ligne : $(event.target).parent().dialog('option','position',position‌​);

0 votes

Cela m'a épargné tellement de peine ! Merci !

10voto

Dag Høidahl Points 923

Je n'ai pas réussi à faire fonctionner la réponse de Scott avec jQuery UI 1.9.1. Ma solution consiste à repositionner la boîte de dialogue dans un callback de la fonction open événement. D'abord, définissez la position css sur fixe. Ensuite, positionnez la boîte de dialogue où vous le souhaitez :

$('selector').dialog({
    autoOpen: false,
    open: function(event, ui) {
        $(event.target).dialog('widget')
            .css({ position: 'fixed' })
            .position({ my: 'center', at: 'center', of: window });
    },
    resizable: false
});

Remarque : comme indiqué dans une autre réponse, le redimensionnement de la boîte de dialogue entraîne la modification de sa position. absolu à nouveau, j'ai donc désactivé redimensionnable .

7voto

wolfmanx Points 56

Bsed on Langdons ci-dessus, j'ai essayé ce qui suit, qui fonctionne bien avec jQuery-UI 1.10.0 et les boîtes de dialogue redimensionnables :

$('#metadata').dialog(
{
    create: function (event) {
    $(event.target).parent().css('position', 'fixed'); 
    },
    resizeStart: function (event) {
    $(event.target).parent().css('position', 'fixed'); 
    },
    resizeStop: function (event) {
    $(event.target).parent().css('position', 'fixed'); 
    }
});

0 votes

C'est le seul moyen fiable

4voto

kingjeffrey Points 5822

Essayez :

$(document).ready(function() {
  $('#myDialog').dialog({dialogClass: "flora"});
  $('.flora.ui-dialog').css({position:"fixed"});
)};

(de http://dev.jqueryui.com/ticket/2848 )

0 votes

Cela suppose que vous utilisez la boîte de dialogue de jqueryui.com.

0 votes

Cela ne fonctionne pas si l'utilisateur ouvre la boîte de dialogue après le défilement. Le problème est que le dialogue de jQuery calcule la position du dialogue par rapport au décalage de défilement de la fenêtre, ce qui n'est pas nécessaire pour position:fixed. Je posterai une mise à jour quand j'aurai résolu ce problème (sans forker la source).

1 votes

Heh. J'ai cherché sur Google comment faire et j'ai trouvé ma propre réponse ! Étrange.

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