2009-08-20 9 views
34

Je cherche à créer une boîte de dialogue modale (en utilisant la boîte de dialogue UI) avec un CSS unique, distinct du dialogue traditionnel, donc deux boîtes de dialogue jQuery différentes.jQuery UI Dialog style CSS individuel

J'ai Styled un, par exemple,

<div id="dialog_style1" class="dialog1 hidden">One content</div> 

et un autre

<div id="dialog_style2" class="dialog2 hidden">Another content</div> 

Malheureusement, je l'ai remarqué que l'utilisation de CSS séparée aux parties de style de la boîte de dialogue, comme

.dialog1 .ui-dialog-titlebar { display:none; } 
.dialog2 .ui-dialog-titlebar { color:#aaa; } 

ne fonctionne pas parce que .ui-dialog-titlebar n'a pas la classe .dialog1, et je ne peux pas faire un addClass soit sans casser dans le plugin.

Une alternative serait d'avoir un élément comme body avoir une classe/id unique (selon celui que je veux), mais cela empêcherait d'avoir les deux boîtes de dialogue dans la même page.

Comment est-ce que je peux faire ceci?

Répondre

23

Exécutez la commande suivante immédiatement après la boîte de dialogue est appelé dans le Ajax:

$(".ui-dialog-titlebar").hide(); 
    $(".ui-dialog").addClass("customclass"); 

Cela vaut pour la boîte de dialogue qui est ouvert, de sorte qu'il peut être changé pour chacun utilisé.

(Cette réponse rapide est basée sur une autre réponse sur la pile   débordement.)

+1

Dans mon cas, j'ai aussi dû ajouter $ (". Ui-dialog-titlebar"). RemoveClass ("ui-widget-header") car il écrasait ma couleur de fond. – maxivis

+0

Dans mon cas, ui-dialog-content a fait l'affaire. $ (". ui-dialog-content"). addClass ("customclass"); –

1

Vous pouvez ajouter la classe au titre comme celui-ci:

$('#dialog_style1').siblings('div.ui-dialog-titlebar').addClass('dialog1'); 
+0

droite, mais '.ui-dialog-titlebar' n'a pas la classe' .dialog1' .dialog1 {display: none;} w Mal cacher tout le contenu de la boîte de dialogue, que je ne veux pas. – Rio

+0

Où est .ui-dialog-titlebar? –

+0

Cela fait partie de la boîte de dialogue jQuery (http://docs.jquery.com/UI/Dialog/Theming) – Rio

0

Essayez:

#dialog_style1 .ui-dialog-titlebar { display:none; } 
#dialog_style2 .ui-dialog-titlebar { color:#aaa; } 

La meilleure recommandation que je peux donner pour vous est de charger la page dans Firefox, ouvrez le dialogue et inspectez-le avec Firebug, puis essayez différents sélecteurs dans la console, et voyez ce qui fonctionne. Vous devrez peut-être utiliser certains des autres descendant selectors.

+0

Yup. Ça ne marche pas, j'ai essayé, en utilisant Firebug aussi. C'est pourquoi j'ai posté ;-) – Rio

+0

L'ensemble du problème est .ui-dialog-titlebar enveloppe * autour de * # dialog_style1, donc alors que # dialog_style1 s'applique bien au contenu de la boîte de dialogue, il ne s'applique pas au titre lui-même. – Rio

2

La méthode standard pour le faire est avec CSS Scopes de jQuery UI:

<div class="myCssScope"> 
    <!-- dialog goes here --> 
</div> 

Malheureusement, la boîte de dialogue jQuery UI déplace le dialogue les éléments DOM à la fin du document, pour corriger les problèmes potentiels liés à l'index z. Cela signifie que le scoping ne fonctionnera pas (il n'aura plus d'ancêtre ".myCssScope").

Christoph Herold designed a workaround que j'ai implemented as a jQuery plugin, peut-être que cela va aider.

3

Selon le UI dialog documentation, le plugin de dialogue génère quelque chose comme ceci:

<div class="ui-dialog ui-widget ui-widget-content ui-corner-all ui-draggable ui-resizable"> 
    <div class="ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix"> 
     <span id="ui-dialog-title-dialog" class="ui-dialog-title">Dialog title</span> 
     <a class="ui-dialog-titlebar-close ui-corner-all" href="#"><span class="ui-icon ui-icon-closethick">close</span></a> 
    </div> 
    <div class="ui-dialog-content ui-widget-content" id="dialog_style1"> 
     <p>One content</p> 
    </div> 
</div> 

Cela signifie que vous pouvez ajouter à une classe exactement à la première ou deuxième boîte de dialogue en utilisant la méthode la plus proche de jQuery ().Par exemple:

$('#dialog_style1').closest('.ui-dialog').addClass('dialog_style1'); 

$('#dialog_style2').closest('.ui-dialog').addClass('dialog_style2'); 

puis CSS il.

+0

J'aime la solution la plus proche – gigi

61

La version actuelle de la boîte de dialogue a l'option "dialogClass" que vous pouvez utiliser avec vos identifiants. Par exemple,

$('foo').dialog({dialogClass:'dialog_style1'}); 

Alors le CSS serait

.dialog_style1 {color:#aaa;} 
+4

Cela m'a aidé plus que la réponse. En définissant mon propre style personnalisé, je peux ensuite redéfinir tous les éléments de l'interface utilisateur en tant que classes chaînées. C'est-à-dire .dialog_style1 .ui-dialog-title -etc. La réponse sélectionnée redéfinit le contenu principal de la boîte de dialogue, mais pas l'en-tête et le pied de page. –

+2

Il est préférable de ne pas utiliser javascript si vous avez la possibilité d'utiliser la classe CSS statique. Cette réponse est meilleure que celle acceptée. – RomanKapitonov

+1

woot fourni le 40ème upvote. Bonne réponse! – Loktar

4

Cette question se pour moi quand je tentais de trouver une réponse similaire. Tenir compte:

$('.ui-dialog').wrap('<div class="abc" />'); 
    $('.ui-widget-overlay').wrap('<div class="abc" />'); 

abc est le nom de votre 'emballage CSS' - voir Stack Overflow question Custom CSS scope and jQuery UI dialog themes où j'ai trouvé la réponse de Evgeni Nabokov. Pour plus d'informations sur l'encapsuleur CSS utilisé avec une boîte de dialogue jQuery UI - voir ce qui suit (mais notez qu'ils ne résolvent PAS vraiment le problème de l'encapsuleur CSS avec la boîte de dialogue - vous avez besoin des commentaires ci-dessus pour aider, Using Multiple jQuery UI Themes on a Single Page . (blog Filament)

+0

Merci d'avoir ajouté cette réponse même si la question date de quelques années. Cela m'a aidé! =) –

3

Je créé des styles personnalisés simplement en remplaçant les classes jQuery dans le style en ligne donc, en haut de la page, vous avez le CSS jQuery lié et juste après que passer outre les classes que vous devez modifier.

<head> 
    <link href="/Content/theme/base/jquery.ui.all.css" rel="stylesheet"/> 

    <style type="text/css"> 
     .ui-dialog .ui-dialog-content 
     { 
      position: relative; 
      border: 0; 
      padding: .5em 1em; 
      background: none; 
      overflow: auto; 
      zoom: 1; 
      background-color: #ffd; 
      border: solid 1px #ea7; 
     } 

     .ui-dialog .ui-dialog-titlebar 
     { 
      display:none; 
     } 

     .ui-widget-content 
     { 
      border:none; 
     } 
    </style> 
</head> 
+0

Eh bien, merci! Trop de gobbly pour trouver mon chemin. 4 fichiers CSS une tonne de fichiers jquery js. J'ai fait votre chemin. J'ai trouvé le fichier css le plus bas dans ma mise en page et j'ai mis tout votre tag juste en dessous! toi! Je voulais le titre, je voulais que ça fonctionne, mais je voudrais un "x" au lieu d'un bouton de fermeture. Je sais que c'est là-bas qui m'attend. – JustJohn