独自のテーマを別のMavenプロジェクトとして作成しましたが、正しくロードされています。
次に、コンポーネントのサイズを変更します。たとえば、 <p:orderList>
。 ui-orderlist-list
というクラスがあり、primefaces.css
で200x200の固定ディメンションで定義されています。 theme.css
で何を実行しても、この属性によって上書きされ、<p:orderList>
のコンテンツ部分をより広くする方法はありません。
他のコンポーネントについては、すべてではなく、コンポーネントの1つのインスタンスのみをオーバーライドしたい場合があります。
誰も私にこれをすべて行う方法を教えてもらえますか?
特定のケースに関連する可能性のあるものを考慮に入れる必要があることがいくつかあります
CSSが読み込まれていることを確認する必要がありますafter PrimeFacesの1つ。これは、CSSファイルを参照する<h:outputStylesheet>
を<h:body>
ではなく<h:head>
内に配置することで実現できます。
<h:head>
...
</h:head>
<h:body>
<h:outputStylesheet name="style.css" />
...
</h:body>
JSFは、生成されたHTMLの[end]にスタイルシートを自動的に再配置します<head>
。これにより、スタイルシートが読み込まれますafter PrimeFacesのデフォルトスタイル。これにより、PrimeFaces CSSファイルとまったく同じCSSファイルのセレクターがPrimeFacesのセレクターよりも優先されます。
また、PrimeFaces固有のHeadRenderer
によって理解される<f:facet name="last">
の<h:head>
に配置する提案も表示されますが、これは不必要に不器用であり、独自のHeadRenderer
があると壊れます。
また、CSSセレクターが少なくとも特定の要素のPrimeFacesのデフォルトCSSセレクターと同じくらい固有であることを確認する必要があります。 CSS Specificity および Cascading and Inheritance rules を理解する必要があります。たとえば、PrimeFacesがデフォルトで次のようにスタイルを宣言する場合
.ui-foo .ui-bar {
color: pink;
}
そしてあなたはそれを
.ui-bar {
color: purple;
}
そして、class="ui-bar"
を持つ特定の要素には、class="ui-foo"
を持つ親要素がありますが、PrimeFacesの要素は、最も具体的な一致であるため、引き続き優先されます!
Webbrowser開発者ツールを使用して、正確なCSSセレクターを見つけることができます。 Webブラウザーで問題の要素(IE9/Chrome/Firefox + Firebug)を右クリックし、Inspect Elementを選択して表示します。
同じコンポーネントのすべてのインスタンスではなく、コンポーネントの特定のインスタンスのみのスタイルをオーバーライドする必要がある場合は、代わりにカスタムstyleClass
を追加して、フックします。特異性が使用/適用される別のケースです。例えば:
<p:dataTable styleClass="borderless">
.ui-datatable.borderless tbody,
.ui-datatable.borderless th
.ui-datatable.borderless td {
border-style: none;
}
コンポーネントがstyleClass
をサポートしておらず、jsf 2.2以降を使用している場合は、 passtrough attributes を使用してpt:class
を追加し、出力に含めることもできます。
<p:clock pt:class="borderless" />
CSSファイルを適切にロードするのに失敗した場合、または正しいCSSセレクターを見つけられなかった場合、おそらく!important
回避策をつかむでしょう。これは明白な間違いです。これはい回避策であり、実際の解決策ではありません。それはあなたのスタイルルールとあなた自身を長期的に混乱させるだけです。 !important
は、CSSスタイルシートファイルからHTML要素のstyle
属性にハードコーディングされた値をオーバーライドするためにonlyを使用する必要があります(これは悪い習慣ですが、まれに残念ながらやむを得ない)。
たとえば、cssOverrides.cssなどの新しいcssファイルを作成できます。
そして、あなたが望むすべてのオーバーライドをその中に配置します。そうすれば、primefacesバージョンのアップグレードはあなたに影響を与えません、
あなたのh:headにそのようなものを追加してください
<link href="../../css/cssOverrides.css" rel="stylesheet" type="text/css" />
うまくいかない場合は、h:bodyに追加してみてください
その動作を確認するには、cssファイル内でこの簡単な例を試してください
.ui-widget {
font-size: 90% !important;
}
これにより、すべてのprimefacesコンポーネント/ textのサイズが小さくなります
PrimeFaces 6.0を使用しています。これに関して私が望んでいた情報がいくつかあります。
<h:outputStylesheet/>
を使用すると機能しますが、<h:head></h:head>
タグの最後にある場合でもCSSは最後にロードされません(他のCSSファイルは後で含まれます)。 here から学んだあなたができるトリックは、<f:facet name="last"></f:facet>
、をbodyの内部に配置することです:
<h:body>
<f:facet name="last">
<h:outputStylesheet name="css/MyCSS.css" />
</f:facet>
...
次に、CSSが最後にロードされます。注:BalusCに概説されているように、あなたはまだ特異性ルールを順守する必要があります。
WebContent/resources/css /に「MyCSS.css」を配置しました。
リソースの読み込み順序の詳細: http://www.mkyong.com/jsf2/primefaces/resource-ordering-in-primefaces
PrimeFacesで使用されるスタイルルールは非常に複雑になる場合があります。要素は、複数のCSSルールからスタイルを受け取ることができます。 DOMインスペクタの[スタイル]タブでフィルタリングを使用して、カスタマイズするプロパティを検索できることを知っておくと便利です。
このスクリーンショットはChromeを使用して撮影されましたが、フィルタリングはFirefoxおよびSafariでも利用できます。
カスタマイズするルールが見つかったら、html
を前に付けることで、より具体的なルールを簡単に作成できます。たとえば、.ui-corner-all
好む:
html .ui-corner-all {
border-radius: 10px;
}
ResourceHandler
を使用してテーマの値を置き換えます私は通常、ある色を別の値に置き換えたいだけです。色はさまざまなルールで使用できるため、 ResourceHandler
を作成すると便利です。
PrimeFacesテーマのハンドラーチェックで:
@Override
public Resource createResource(String resourceName,
String libraryName) {
if (isPrimeFacesTheme(resourceName, libraryName)) {
return new MyResource(super.createResource(resourceName, libraryName), this);
}
else {
return getWrapped().createResource(resourceName, libraryName);
}
}
protected boolean isPrimeFacesTheme(final String resourceName,
final String libraryName) {
return libraryName != null
&& libraryName.startsWith("primefaces-")
&& "theme.css".equals(resourceName);
}
リソースで、色を置き換えます。
public MyResource(Resource wrapped, ResourceHandler handler) {
this.wrapped = wrapped;
this.handler = handler;
this.charset = Charset.forName(FacesContext.getCurrentInstance().getExternalContext().getResponseCharacterEncoding());
}
@Override
public InputStream getInputStream() throws IOException {
if (cache == null) {
cache = readInputStream(getWrapped().getInputStream());
// Replace values
cache = cache.replace("#007ad9", "#11dd99");
}
return new ByteArrayInputStream(cache.getBytes(charset));
}
そして、faces-config.xmlに次のように登録します。
<application>
<resource-handler>com.example.MyResourceHandler</resource-handler>
</application>
リソースハンドラの詳細については、以下を参照してください。