2012-03-27 5 views
4

Ich versuche PrimeFaces commandButtons in verschiedenen Farben zu erstellen. In meinem Sheet habe ich so etwas wie dieses:PrimeFaces überschreibt meinen benutzerdefinierten CSS-Stil

.styleGreen {  
    background-color: #009900; 
    font-family: Arial,Helvetica,sans-serif; 
} 

und die Komponente wie folgt aus:

<p:commandButton value="Green Button" styleClass="styleGreen" ... 

Dies funktioniert, wenn die commandnicht innerhalb eines PrimeFaces ist Panel oder ein anderer Behälter . Aber wenn ich es in den Hauptteil meiner Seite verschiebe, werden alle benutzerdefinierten CSS-Regeln außer Kraft gesetzt.

Was ist der richtige Weg, um dies zu beheben?

+0

Was ist die tatsächliche HTML-Ausgabe für die Komponente?Gibt es auch ein Standard-Stylesheet für PrimeFaces, und wenn ja, was ist darin enthalten? – ScottS

+0

PrimeFaces basiert auf dem JQuery-System und ist ziemlich komplex. Firebug zeigt mir, dass mein Stil angewendet und dann außer Kraft gesetzt wird. Diese Frage wird wahrscheinlich von jemandem beantwortet, der weiß, wie PrimeFaces JQuery verwendet. – AlanObject

+0

Firebug sollte Ihnen auch sagen, welcher Selektor es überschreibt. Das wird der Schlüssel sein, um die Lösung für Ihr CSS-Problem zu finden. Höchstwahrscheinlich wird es durch einen Selektor mit höherer Priorität (includes und id oder eine andere Klasse, kombiniert mit etwas anderem) oder einer nach Ihrer class-Bezeichnung in der Seitenlade-Reihenfolge des css überschrieben. – ScottS

Antwort

8

Einfache Lösung für euch:

Wenn Sie ein Command in einem Gremium (oder eine Form) wie folgt aus:

<h:form .... > 
    <p:commandButton value="Green Button" styleClass="styleGreen" ... /> 
</h:form> 

definieren Sie einfach Ihre css wie dies:

form .styleGreen {  
    background-color: #009900; 
    font-family: Arial,Helvetica,sans-serif; 
} 

Es wird sehr gut funktionieren (Ich habe es gerade versucht)

2

Dieser Wert inherit arbeiten kann:

.styleGreen {  
    background-color: #009900 !important; 
    font-family: Arial,Helvetica,sans-serif !important; 
} 
+0

Interessant - Ich wusste nichts über das! Wichtige Keyword. Es scheint irgendwie hacky aber ich werde es versuchen. – AlanObject

+0

Ich habe das versucht und es hat funktioniert, also werde ich es als die Antwort für jetzt markieren. Aber es scheint immer noch ein bisschen restriktiv. Was ich suchte, ist die "JQuery/Primefaces" Art CSS zu machen. Dies ist ein Workaround, den ich nur verwenden werde, bis ich eine Chance habe, das herauszufinden. – AlanObject

+0

Wenn Sie nicht wichtig sind (und ich schlage vor, dass Sie dies nicht tun, da es zu einem Wartungs-Albtraum werden kann), versuchen Sie, spezifischer mit Ihren CSS-Klassen umzugehen. Schaut euch diesen Beitrag an: http://css-tricks.com/specifics-on-css-specificity/ wir überschreiben die eingebauten PF-Klassen die ganze Zeit ohne zu benutzen! – jjross

3

Während die wichtigen könnte es tun, sollten Sie vielleicht die Themebuilder CSS-Dateien überschreiben. Sehen Sie sich den Leitfaden zu Primefaces zur Verwendung eines benutzerdefinierten Stylesheets an. Primefaces ist grundsätzlich auf jQueryUI http://jqueryui.com/ aufgebaut, also überschreiben Sie es. (Sie können auch ein benutzerdefiniertes Thema erstellen, das oft die bessere Wahl ist).

Nehmen Sie sich einfach etwas Zeit und wenn Sie wirklich eine benutzerdefinierte Komponente benötigen, können Sie die Standardbibliothek erstellen und anpassen. Da Sie mit jQuery arbeiten, ist es ein einfaches Update.

Als Reaktion

Ich denke, der beste Weg einfach sein könnte, eine Standard-Schaltfläche verwenden und einen Verbundbauteil zu machen. Es hängt ganz davon ab, wie oft Sie es verwenden, wie wichtig es für die Website ist und was Sie tun müssen. Grundsätzlich rendert jQueryUI einen Button und einen Bereich, aber aufgrund der Art und Weise, wie die Flächen umhüllt sind, werden Sie Styles auf den OUTSIDE-Bereich anwenden, so dass die innere Regel nicht angewendet wird.

Als solches würde ich eine eigene Komponente entlang der Linien machen ->

<h:commandButton styleClass="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only ui-state-hover" style="${myOverridesHere}"> 
    <p:ajax event="click" ... etc... read the manual/> 
</h:commandButton> 

Das Nettoergebnis ist, dass Sie „Ajax“, um auf den Befehls über die Primefaces-API hinzugefügt (was lebt ontop der Standard-JSF2-API. Ich hatte nicht die Notwendigkeit, dies noch zu testen, aber ich bin mir sicher, dass einige Variationen das tun würden, was Sie brauchen, ohne eine wichtige Kaskade zu erzwingen, die in der Regel schlecht ist , Sie benötigen die jQueryUI Stylesheets auf der Seite, damit dies funktioniert (offensichtlich).

hoffe, das hilft

+1

Ich habe mir die Themen angesehen, aber ich möchte nicht alle Buttons aktualisieren, nur die, die ich bestimmt habe. So kann eine Seite eine grüne Taste, eine rote Taste, eine blaue Taste usw. haben. – AlanObject

+0

Viel Glück damit, ich habe die obige Lösung in meiner Umgebung nicht versucht, aber logisch sollte es funktionieren, um den Text/die Farbe etc ... zu überschreiben könnte immer nur eine "grüne" Version der anstößigen Klassen machen. –

+0

OK, ich werde Ihnen morgen einen Vorschlag geben. Die einzige Sache, auf die ich verzichten würde, ist, das Stilattribut mit einem EL-Ausdruck zu füllen - für mich ist das die Mischung der Präsentationsebene mit dem Modell. Ich bevorzuge es, alle meine Styles-Konstanten in der XHTML-Datei zu machen, aber wir werden sehen, wie das funktioniert. – AlanObject