J'essaie d'utiliser la bibliothèque interface utilisateur de la boîte de dialogue jQuery afin de positionner une boîte de dialogue à côté d'un texte lorsque celui-ci est survolé. La boîte de dialogue jQuery prend un paramètre de position qui est mesuré à partir du coin supérieur gauche de la fenêtre courante (autrement dit, [0, 0]
le placera toujours dans le coin supérieur gauche de la fenêtre de votre navigateur, quel que soit le lieu où vous vous trouvez actuellement. fait défiler jusqu'à). Cependant, le seul moyen que je connaisse pour récupérer l'emplacement est de l'élément par rapport à la page ENTIRE.
Ce qui suit est ce que j'ai actuellement. position.top
correspond à environ 1200 ou environ, ce qui place la boîte de dialogue bien en dessous du reste du contenu de la page.
$(".mytext").mouseover(function() {
position = $(this).position();
$("#dialog").dialog('option', 'position', [position.top, position.left]);
}
Comment puis-je trouver la bonne position?
Merci!
Découvrez quelques-uns des plugins jQuery pour d'autres implémentations d'une boîte de dialogue. Cluetip semble être un plug-in de style info-bulle/dialogue riche en fonctionnalités. La 4ème démo sonne de la même manière que ce que vous essayez de faire (même si je vois qu’elle n’a pas l’option de positionnement précise que vous cherchez.)
Vous pouvez également utiliser l’utilitaire jQuery UI Position
p. Ex.
$(".mytext").mouseover(function() {
var target = $(this);
$("#dialog").dialog("widget").position({
my: 'left',
at: 'right',
of: target
});
}
Grâce aux réponses ci-dessus, j'ai expérimenté et finalement constaté que tout ce que vous deviez faire était de modifier l'attribut "position" dans la définition de la boîte de dialogue Modal:
position:['middle',20],
JQuery n'a eu aucun problème avec le texte "du milieu" pour la valeur horizontale du "X" et ma boîte de dialogue est apparue au milieu, 20 pixels du haut.
Je cœur JQuery.
Après avoir lu toutes les réponses, cela a finalement fonctionné pour moi:
$(".mytext").mouseover(function() {
var x = jQuery(this).position().left + jQuery(this).outerWidth();
var y = jQuery(this).position().top - jQuery(document).scrollTop();
jQuery("#dialog").dialog('option', 'position', [x,y]);
});
Prenant l'exemple de Jaymin un peu plus loin, j'ai proposé ceci pour positionner un élément jQuery ui-dialog au-dessus de l'élément sur lequel vous venez de cliquer (pensez à "bulle"):
$('#myDialog').dialog( 'open' );
var myDialogX = $(this).position().left - $(this).outerWidth();
var myDialogY = $(this).position().top - ( $(document).scrollTop() + $('.ui-dialog').outerHeight() );
$('#myDialog').dialog( 'option', 'position', [myDialogX, myDialogY] );
Notez que je "ouvre" l'élément ui-dialog avant de calculer les décalages relatifs de largeur et de hauteur. En effet, jQuery ne peut pas évaluer outerWidth () ou outerHeight () sans que l'élément ui-dialog n'apparaisse physiquement dans la page.
Assurez-vous simplement de définir "modal" sur false dans vos options de dialogue et vous devriez être OK.
http://docs.jquery.com/UI/API/1.8/Dialog
Exemple de dialogue fixe dans le coin supérieur gauche:
$("#dialogId").dialog({
autoOpen: false,
modal: false,
draggable: false,
height: "auto",
width: "auto",
resizable: false,
position: [0,28],
create: function (event) { $(event.target).parent().css('position', 'fixed');},
open: function() {
//$('#object').load...
}
});
$("#dialogOpener").click(function() {
$("#dialogId").dialog("open");
});
Vérifiez votre <!DOCTYPE html>
J'ai remarqué que si vous manquez le <!DOCTYPE html>
du haut de votre fichier HTML, la boîte de dialogue est centrée dans le contenu du document, mais pas dans la fenêtre, même si vous spécifiez la position: {my: 'center', à: 'centre', de: fenêtre}
EG: http://jsfiddle.net/npbx4561/ - Copiez le contenu de la fenêtre d'exécution et supprimez le DocType. Enregistrez au format HTML et exécutez pour voir le problème.
Pour le mettre au-dessus du contrôle, vous pouvez utiliser ce code:
$("#dialog-edit").dialog({
...
position: {
my: 'top',
at: 'top',
of: $('#myControl')
},
...
});
$(".mytext").mouseover(function() {
var width = 250;
var height = 270;
var posX = $(this).offset().left - $(document).scrollLeft() - width + $(this).outerWidth();
var posY = $(this).offset().top - $(document).scrollTop() + $(this).outerHeight();
$("#dialog").dialog({width:width, height:height ,position:[posX, posY]});
}
Positionne un dialogue juste sous un élément. J'ai utilisé la fonction offset () simplement parce qu'elle calcule la position par rapport au coin supérieur gauche du navigateur, mais la fonction position () calcule la position par rapport à div parent ou iframe à ce parent de l'élément.
au lieu de faire du pur jquery, je ferais:
$(".mytext").mouseover(function() {
x= $(this).position().left - document.scrollLeft
y= $(this).position().top - document.scrollTop
$("#dialog").dialog('option', 'position', [y, x]);
}
si je comprends bien votre question, le code que vous avez est de positionner la boîte de dialogue comme si la page n'avait pas de défilement, mais vous voulez qu'elle prenne en compte le défilement. mon code devrait le faire.
Cette page montre comment déterminer votre décalage de défilement. jQuery peut avoir des fonctionnalités similaires mais je ne les ai pas trouvées. En utilisant la fonction getScrollXY indiquée sur la page, vous devriez pouvoir soustraire les coordonnées x et y des résultats .position ().
un peu tard, mais vous pouvez le faire maintenant en utilisant $ j (object) .offset (). left et .top en conséquence.
Je ne pense pas que la bulle est tout à fait raison. Je l'ai légèrement modifié pour que cela fonctionne et que l'élément s'ouvre juste sous le lien.
function PositionDialog(link) {
$('#myDialog').dialog('open');
var myDialogX = $(link).position().left;
var myDialogY = $(link).position().top + $(link).outerHeight();
$('#myDialog').dialog('option', 'position', [myDialogX, myDialogY]);
}
Pour fixer la position centrale, j'utilise:
open : function() {
var t = $(this).parent(), w = window;
t.offset({
top: (w.height() / 2) - (t.height() / 2),
left: (w.width() / 2) - (t.width() / 2)
});
}
Voici le code .., comment positionner la boîte de dialogue de l'interface utilisateur jQuery sur le centre ......
var $about = $("#about");
$("#about_button").click(function() {
$about.dialog({
modal: true,
title: "About the calendar",
width: 600,
close: function() {
$about.dialog("destroy");
$about.hide();
},
buttons: {
close : function() {
$about.dialog("close");
}
}
}).show();
$about.dialog("option", "position", 'center');
});
$("#myid").dialog({height:"auto",
width:"auto",
show: {effect: 'fade', speed: 1000},
hide: {effect: 'fade', speed: 1000},
open: function( event, ui ) {
$("#myid").closest("div[role='dialog']").css({top:100,left:100});
}
});
vous pouvez utiliser $(this).offset()
, la position est liée au parent
J'ai essayé toutes les solutions proposées, mais elles ne fonctionneront pas car le dialogue ne fait pas partie du document principal et aura sa propre couche (mais c'est ce que je suppose).
$("#dialog").dialog("option", "position", 'top')
$(dialog).dialog("open");
Ensuite, obtenez le x et le y de la boîte de dialogue affichée (pas n'importe quel autre noeud du document!)
var xcoord = $(dialog).position().left + ADD_MODIFIER_FOR_X_HERE;
var ycoord= $(dialog).position().top + ADD_MODIFIER_FOR_Y_HERE;
$(dialog).dialog('option', 'position', [xcoord , ycoord]);
De cette façon, les coordonnées proviennent du dialogue et non du document et la position est modifiée en fonction du calque du dialogue.
les solutions ci-dessus sont très vraies ... mais la boîte de dialogue de l'interface utilisateur ne conserve pas la position après le redimensionnement de la fenêtre. ci-dessous le code fait cela
$(document).ready(function(){
$(".test").click(function(){
var posX = $(".test").offset().left - $(document).scrollLeft() + $(".test").outerWidth();
var posY = $(".test").offset().top - $(document).scrollTop() + $(".test").outerHeight();
console.log("in click function");
$(".abc").dialog({
position:[posX,posY]
});
})
})
$(window).resize(function(){
var posX=$(".test").offset().left - $(document).scrollLeft() + $(".test").outerWidth();
var posY = $(".test").offset().top - $(document).scrollTop() + $(".test").outerHeight();
$(".abc").dialog({
position:[posX,posY]
});
})
J'ai essayé de nombreuses façons de centrer mon dialogue sur la page et j'ai vu que le code:
$("#dialog").dialog("option", "position", 'top')
ne changez jamais la position du dialogue lors de sa création.
Au lieu de, je change le niveau de sélecteur pour obtenir la totalité du dialogue.
$("#dialog").parent()
<- Il s'agit de l'objet parent que la fonction dialog () crée sur le DOM, car le sélecteur $ ("# dialog") n'applique pas les attributs, en haut à gauche.
Pour centrer mon dialogue, j'utilise le jQuery-Client-Centering-Plugin
$ ("# dialogue"). parent (). centerInClient ();
Vous pouvez définir la position supérieure dans le style pour l'affichage au centre, vu que le code:
.ui-dialog {top: 100px! important;}
Ce style doit afficher la boîte de dialogue ci-dessous 100px ci-dessous.