Thymeleaf:条件文を使用してCSSクラスを動的に追加/削除する方法


99

使用してThymeleafのテンプレートエンジンとして、それは単純なものから動的に/へのCSSクラスを追加/削除することが可能であるdivとのth:if句?

通常、次のように条件句を使用できます。

<a href="lorem-ipsum.html" th:if="${condition}">Lorem Ipsum</a> 

lorem ipsumページへのリンクを作成しますが、条件句がtrueの場合のみです。

何か別のものを探しています。ブロックを常に表示したいのですが、状況に応じてクラスを変更できます。


回答:


243

もありth:classappendます。

<a href="" class="baseclass" th:classappend="${isAdmin} ? adminclass : userclass"></a>

場合isAdmintrue、これはになります。

<a href="" class="baseclass adminclass"></a>

3
これは受け入れられる答えだと思います。th:classクラス属性を置換/書き換えます。th:classappendあなたが欲しいものです。
Aboodz 2016年

または、コントローラからモデルに目的のクラスを挿入して、次のようにすることもできますth:classappend="${theRightClass}"
demaniak

1
もう1つ覚えておかなければならないのは、残念ながら複数のth:classappend属性を持つことはできないということです。最大1つが許可されます。 Fatal error during parsing org.xml.sax.SAXParseException: Attribute "th:classappend" was already specified for element "img".
user1053510 2017

th:classremove他に影響を与えたり、バインディングxmlのクラスリスト全体をハードコーディングしたりせずに、単一のクラスを削除する方法はありませんか?または、動的クラスをオフにして、条件付きで追加する唯一の方法を追加していますか?
Drazen Bjelovuk、

方法、3つ以上のクラスを変更する必要がある場合
Sineth Lakshitha

34

はい、状況に応じてCSSクラスを動的に変更できますが、ではできませんth:if。これはelvis演算子を使用して行われます。

<a href="lorem-ipsum.html" th:class="${isAdmin}? adminclass : userclass">Lorem Ipsum</a> 

リンク切れ。エルビスのことは聞いたことがない。あなたは作りましたか
localhoost 2018

@atilkan:単にGoogle Elvisオペレーターをググって、それがTernaryオペレーターのバリアントであることを確認できます。ウィキペディアでさえ、最初の数行でそれを説明しています:en.wikipedia.org/wiki/Elvis_operator
Kenny

6

この目的で、ブール変数がない場合は、以下を使用します。

<li th:class="${#strings.contains(content.language,'CZ')} ? active : ''">

5

別の非常によく似た答えは、「含む」の代わりに「等しい」を使用することです。

<li th:class="${#strings.equals(pageTitle,'How It Works')} ? active : ''">

4

エラーが発生した場合にクラスを追加するだけの場合は、ドキュメントでth:errorclass="my-error-class"言及されているものを使用できます。

<input type="text" th:field="*{datePlanted}" class="small" th:errorclass="fieldError" />

フォームフィールドタグ(input、select、textarea…)に適用すると、同じタグ内の既存の名前またはth:field属性から検査するフィールドの名前を読み取り、指定したCSSクラスをタグに追加しますそのようなフィールドに関連するエラーがある場合


2

誰かに役立つかもしれない場合に備えて、私の意見を追加します。これは私が使用したものです。

<div th:class="${request.read ? 'mdl-color-text--grey-800 w500' : ''}"> </div>

2

@NewbLeechおよび@Charlesと同じth:classのさらに別の使用法が投稿されていますが、「else」のケースがない場合は最大化されています。

<input th:class="${#fields.hasErrors('password')} ? formFieldHasError" />

#fields.hasErrors( 'password')がfalseの場合、クラス属性は含まれません。


1

@Nilsiが述べたことは完全に正しい。ただし、管理クラスとユーザークラスは一重引用符で囲む必要があります。これは、Thymeleafが文字列である必要があるadminClass変数またはユーザークラス変数を探すために失敗する可能性があるためです。それは言った、

そのはず: -

 <a href="" class="baseclass" th:classappend="${isAdmin} ? 'adminclass' : 
 'userclass'"> 
 </a>

あるいは単に:

<a href="" th:class="${isAdmin} ? 'newclass' : 
  'baseclass'"> 
 </a>

0

URLに特定のパラメータが含まれているかどうかに応じて、それに応じてクラスを追加または削除しようとしています。これはあなたができることです

<a th:href="@{/admin/home}"  th:class="${#httpServletRequest.requestURI.contains('home')} ? 'nav-link active' : 'nav-link'"  >

URLに 'home'が含まれている場合、アクティブなクラスが追加され、逆も同様です。


0

誰かがブートストラップを使用している場合に備えて、私は複数のクラスを追加することができました。

<a href="" class="baseclass" th:classappend="${isAdmin} ?: 'text-danger font-italic' "></a>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.