カテゴリ: Thymeleaf 更新日: 2026/02/21

Thymeleafのth:styleでCSSを動的に設定する方法を初心者向けに解説!

Thymeleaf th:styleでCSSを動的に設定する方法
Thymeleaf th:styleでCSSを動的に設定する方法

新人と先輩の会話形式で理解しよう

新人

「先輩、Thymeleafでボタンの色を変えたいんですけど、style属性って動的にできますか?」

先輩

「できるよ。Thymeleafのth:styleを使えば、値によって動的にCSSを変更できるんだ。」

新人

「へぇ!style属性とどう違うんですか?」

先輩

「まずはHTMLの静的なstyle属性から説明しよう。そのあとで、Thymeleafのth:styleでどうやって動的に設定するのかも見ていこう!」

1. HTMLのstyle属性とは?(静的なCSS指定)

1. HTMLのstyle属性とは?(静的なCSS指定)
1. HTMLのstyle属性とは?(静的なCSS指定)

HTMLのstyle属性は、特定の要素に対して直接CSSを適用するために使われます。たとえば、ボタンの背景色を赤にしたいときは以下のように記述します。


<button style="background-color: red;">赤いボタン</button>

このように、style属性にCSSプロパティを直接記述することで、HTML要素に装飾を与えることができます。ただし、これは静的な指定なので、条件によって色を変えたりすることはできません。

たとえば、「ステータスがエラーなら赤、成功なら緑」といった処理はできません。そこで登場するのが、Thymeleafのth:styleという属性です。

2. Thymeleafのth:styleとは?(基本構文と目的)

2. Thymeleafのth:styleとは?(基本構文と目的)
2. Thymeleafのth:styleとは?(基本構文と目的)

Thymeleafのth:styleは、HTMLのstyle属性を動的に生成するための属性です。Spring Bootのアプリケーションで、テンプレート側で動的にCSSを切り替えたいときに便利です。

例えば、以下のように使います。


<button th:style="'background-color:' + ${status == 'error' ? 'red' : 'green'}">ステータスボタン</button>

この例では、変数statusの値によって、背景色が赤か緑に切り替わります。これは、Springの@Controllerでモデルにstatusを追加することで機能します。

コントローラ側は以下のように実装します。


@Controller
public class SampleController {

    @GetMapping("/status")
    public String showStatus(Model model) {
        String status = "error"; // 条件によって変更
        model.addAttribute("status", status);
        return "status-view";
    }
}

このように、Springの@Controllerで動的に値を設定して、Thymeleafのテンプレート側でth:styleを使って反映させることで、CSSのスタイルを条件に応じて動的に切り替えることができます。

なお、th:stylestyle属性と同時に記述することも可能ですが、th:styleが優先されます。テンプレートファイルでは基本的にth:styleだけを使うようにしましょう。

また、色だけでなく、文字サイズやフォント、マージンやパディングなども動的に制御可能です。


<p th:style="'font-size:' + (${isLarge} ? '24px' : '14px')">テキストのサイズ変更</p>

このように、Thymeleafのth:styleを使えば、Java側の条件に応じて細かいスタイル変更が可能になります。初心者でも比較的簡単に使えるため、静的なstyle属性しか使っていなかった方はぜひチャレンジしてみましょう。

実際のアプリケーションでも、「ユーザーの状態によって色を変える」「期限が切れていたら強調する」など、動的なCSS指定はよく利用されます。

3. th:styleで条件によって色やサイズを変更する

3. th:styleで条件によって色やサイズを変更する
3. th:styleで条件によって色やサイズを変更する

Thymeleafのth:styleを使うことで、変数の値に応じて背景色や文字サイズを動的に変更することができます。たとえば、ユーザーのステータスによってボタンの背景色を切り替えるといった処理が簡単にできます。

以下は、ステータスが「success」のときは緑色、「error」のときは赤色、それ以外はグレーになる例です。


<button th:style="'background-color:' + 
                  (${status} == 'success' ? 'green' : 
                   (${status} == 'error' ? 'red' : 'gray'))">
    状態によるボタン
</button>

このように、th:style属性内で三項演算子をネストすることで、複数の条件に対応できます。また、文字サイズや太さなども同様に制御可能です。


<p th:style="'font-size:' + (${isImportant} ? '20px' : '14px') + '; font-weight:' + (${isImportant} ? 'bold' : 'normal')">
    重要なメッセージ
</p>

この例では、変数isImportanttrueならフォントサイズが大きく太字になり、そうでなければ標準のサイズと太さになります。複数のスタイルを連結するには、文字列同士を+でつなぐことを忘れないようにしましょう。

4. th:styleとth:if/th:classとの違いや使い分け

4. th:styleとth:if/th:classとの違いや使い分け
4. th:styleとth:if/th:classとの違いや使い分け

Thymeleafにはth:styleの他にも、条件によって要素を制御するためのth:ifや、CSSクラスを動的に付けるth:classがあります。これらの違いを理解して、適切に使い分けることが大切です。

th:style:特定のCSSプロパティだけを変える

あるHTML要素に対して、背景色や文字サイズなど特定のスタイルだけを動的に変更したい場合に使います。style属性と同じ書き方で、値の部分に式を使って指定できます。

th:class:CSSクラスを動的に設定

スタイル全体をクラスとして切り替えたい場合にはth:classを使います。たとえば、CSSで事前にスタイルを定義しておいて、条件に応じて適用するクラス名を変更できます。


<div th:class="${status == 'error'} ? 'text-danger' : 'text-normal'">
    ステータスメッセージ
</div>

th:if:要素ごと表示・非表示を切り替える

要素自体を表示したり非表示にしたい場合はth:ifを使用します。スタイルを変えるのではなく、HTMLの出力そのものを制御する用途に向いています。


<p th:if="${isVisible}">この文章は表示されます</p>

このように、Thymeleafではスタイル変更だけでなく、表示制御やクラスの切り替えなど、さまざまな方法で条件に応じた見た目を調整できます。使い分けを理解することで、より柔軟なテンプレート設計が可能になります。

5. よくあるミス(クォート忘れ、セミコロン不足、null対策など)

5. よくあるミス(クォート忘れ、セミコロン不足、null対策など)
5. よくあるミス(クォート忘れ、セミコロン不足、null対策など)

初心者がth:styleを使う際によく遭遇するエラーや注意点を紹介します。これらを知っておくだけで、トラブルを未然に防ぐことができます。

① クォート(引用符)の忘れ

CSSプロパティは文字列として扱うため、必ずシングルクォート'で囲みます。たとえば以下のように記述する必要があります。


<p th:style="'color:' + 'blue'">青文字</p>

クォートが無いと、Thymeleafのパーサーが式として解釈できず、テンプレートエラーになります。

② セミコロン(;)の付け忘れ

複数のスタイルを連結するとき、各プロパティの末尾にセミコロンを付けるのを忘れがちです。


<p th:style="'color:' + 'blue' + '; font-weight:bold;'">青くて太字</p>

セミコロンが無いと、CSSが正しく認識されず、スタイルが反映されないことがあります。

③ null値への対処

コントローラ側から渡された変数がnullになる可能性がある場合、式評価時にエラーになることがあります。${変数 ?: 'デフォルト値'}のように、Elvis演算子でデフォルトを指定すると安全です。


<p th:style="'color:' + (${color} ?: 'black')">色指定</p>

このようにしておけば、colornullでも「black」が適用され、例外を防ぐことができます。

④ 式展開の記述ミス

th:styleでは、${ }内の論理式を間違えやすいです。たとえば、以下は構文エラーになります。


<!-- 間違い -->
<p th:style="'color:' + ${isError ? 'red' : 'black'}">メッセージ</p>

isError ? ...のようにJava的な三項演算子を直接記述するのはNGです。正しくは、EL式内で完結させる必要があります。


<!-- 正しい -->
<p th:style="'color:' + (${isError} ? 'red' : 'black')">メッセージ</p>

Thymeleafの式展開では、${...}内はJavaのコードに近い構文ですが、完全に同じではないため、括弧の付け忘れや構文ルールの違いに注意が必要です。

このような初歩的なミスは、最初のうちはつまずきやすいポイントです。テンプレートがうまく表示されないときは、まずth:styleの式構文やクォート・セミコロンの有無を見直してみましょう。

6. 実務で役立つ動的スタイルの活用例(エラー時の赤色表示など)

6. 実務で役立つ動的スタイルの活用例(エラー時の赤色表示など)
6. 実務で役立つ動的スタイルの活用例(エラー時の赤色表示など)

Thymeleafのth:styleは、実務でも非常によく使われる便利な機能です。特に、入力フォームのバリデーション結果やステータス表示などで、CSSを動的に変更するケースは多くあります。

たとえば、入力チェックでエラーが発生したときに、該当項目の背景色を赤にしてユーザーにわかりやすく表示することが可能です。


<input type="text" name="email"
       th:style="'background-color:' + (${hasError} ? 'pink' : 'white')"
       placeholder="メールアドレスを入力してください" />

この例では、hasErrortrueのときに背景色がピンクになり、そうでない場合は白に設定されます。視覚的なフィードバックを与えることで、ユーザー体験を向上させることができます。

また、進捗状況や優先度によって表示色を変えるケースもあります。たとえば、「重要」な項目は赤、「普通」は青、「低優先」は灰色というように分けると視認性が高まります。


<span th:style="'color:' + (
    ${priority} == 'high' ? 'red' :
    (${priority} == 'normal' ? 'blue' : 'gray'))">
    優先度表示
</span>

このように、業務アプリケーションでの条件付きスタイル切り替えにth:styleを活用することで、UIの改善や誤入力の防止につながります。

7. コントローラとの連携でスタイルを切り替える(Model属性とth:style)

7. コントローラとの連携でスタイルを切り替える(Model属性とth:style)
7. コントローラとの連携でスタイルを切り替える(Model属性とth:style)

ThymeleafでCSSスタイルを動的に切り替えるには、Java側の@Controllerクラスとテンプレートとの連携が重要です。モデルに条件に応じた値を渡し、それをテンプレート側のth:styleで利用する形になります。

例えば、以下のようなコントローラを定義します。


@Controller
public class MessageController {

    @GetMapping("/message")
    public String showMessage(Model model) {
        String message = "エラーが発生しました";
        boolean isError = true;
        model.addAttribute("message", message);
        model.addAttribute("isError", isError);
        return "message-view";
    }
}

このコントローラでは、messageisErrorをテンプレートに渡しています。テンプレート側では、isErrorの値に応じて表示スタイルを変更できます。


<p th:text="${message}"
   th:style="'color:' + (${isError} ? 'red' : 'black')">
</p>

このように、コントローラ側で値を制御し、テンプレートで反映させる構成は非常に汎用性があります。条件によってスタイルを細かく変えることができ、アプリケーションの品質向上につながります。

また、ステータスコードやログインユーザーのロールなどに応じてスタイルを切り替える場面にも応用可能です。

8. 他のth属性との組み合わせで見やすいUIを実現するコツ

8. 他のth属性との組み合わせで見やすいUIを実現するコツ
8. 他のth属性との組み合わせで見やすいUIを実現するコツ

th:styleは単体でも便利ですが、th:ifth:textなど他のThymeleaf属性と組み合わせることで、より柔軟なUI設計が可能になります。以下では、実際の業務で使える例とコツを紹介します。

条件によって表示非表示+スタイル切り替え

ある条件に該当するときだけ表示し、かつその表示に特別なスタイルを当てたいときは、th:ifth:styleを併用します。


<div th:if="${showWarning}"
     th:style="'background-color:yellow; border:1px solid red; padding:8px;'">
    注意:入力内容をご確認ください
</div>

このようにすると、showWarningtrueのときだけ黄色い背景で注意メッセージが表示されます。見た目にも明確な警告を表現できます。

動的テキスト+スタイル切り替え

動的に表示するテキストと、スタイルを一緒に制御することで、内容に応じた見た目を簡単に作成できます。


<p th:text="${alertMessage}"
   th:style="'color:' + (${alertLevel} == 'critical' ? 'red' :
                         (${alertLevel} == 'warning' ? 'orange' : 'black'))">
</p>

このように、メッセージの重要度に応じて色を変更すれば、ユーザーは直感的に内容の深刻度を理解できます。th:textth:styleの組み合わせはとても相性が良いです。

スタイルに優先順位をつける

th:classth:styleを同時に使うことも可能ですが、style属性はクラスよりも優先度が高いため、明示的な変更が必要なときに使うと効果的です。


<span th:class="'alert-box'"
      th:style="${forceHighlight} ? 'background-color:orange;' : ''">
    ハイライト表示
</span>

このように、クラスで基本スタイルを定義し、th:styleで一時的に上書きするという使い方もおすすめです。スタイルの柔軟性を活かしつつ、CSS設計もスッキリさせることができます。

このように、th:styleを中心にth:ifth:textth:classなどと組み合わせることで、視覚的にわかりやすく、メンテナンス性の高いUIが実現できます。初心者の方も、まずは簡単な条件分岐から始めて、徐々に複雑なスタイル制御にチャレンジしてみましょう。

まとめ

まとめ
まとめ

ここまで、Spring Bootの開発現場で欠かせないテンプレートエンジン、Thymeleaf(タイムリーフ)の「th:style」属性について詳しく解説してきました。Webアプリケーションにおいて、状況に応じてデザインを変化させることは、ユーザー体験(UX)を向上させるために非常に重要です。

静的なHTMLのstyle属性だけでは、画面が表示される瞬間のデータの状態を反映させることはできません。しかし、th:styleを活用すれば、Java側のコントローラから渡されたModelの値を参照し、「エラーなら赤色にする」「重要度が高いものは文字を大きくする」といった動的なスタイル適用が驚くほど簡単に実現できます。

th:styleをマスターするためのポイント

本記事で学んだ内容の要点を、改めて整理してみましょう。

  • 基本の書き方: th:style="'property:' + ${variable}" のように、CSSプロパティ名をシングルクォートで囲み、変数と結合します。
  • 三項演算子の活用: ${condition ? 'trueValue' : 'falseValue'} を使うことで、条件分岐によるスタイルの切り替えが可能です。
  • th:classとの使い分け: 複雑なデザイン変更は外部CSS(th:class)で行い、特定の値に基づく微調整にはth:styleを使うのがベストプラクティスです。
  • 構文エラーに注意: セミコロン(;)の忘れや、クォートの閉じ忘れは初心者が最もつまずきやすいポイントです。

応用:複数条件とnull安全な記述

実際のプロジェクトでは、より複雑な条件設定が求められることもあります。例えば、リスト表示の中で特定の行だけ色を変える場合や、変数がnullの際のエラーを防ぐ書き方などです。


<div th:each="item : ${items}" 
     th:style="'border-left: 5px solid ' + (${item.priority == 'high'} ? '#ff0000' : '#cccccc') + 
               '; padding: 10px; margin-bottom: 5px; background-color: ' + (${item.completed} ? '#f8f8f8' : '#ffffff')">
    <span th:text="${item.name}">タスク名</span>
</div>

<p th:style="'color:' + (${customColor} ?: 'black')">
    カラー設定がない場合はデフォルトの黒になります
</p>

このように、th:styleは文字列を連結する感覚で、複数のCSSプロパティを1つの属性内で制御できます。ただし、あまりに詰め込みすぎるとHTMLが見づらくなるため、可読性とのバランスを考えることが大切です。

Thymeleafは、Spring Bootとの親和性が非常に高く、サーバーサイドのロジックをフロントエンドの見た目に直結させることができる強力なツールです。今回学んだth:styleのテクニックを駆使して、ユーザーにとって分かりやすく、使い勝手の良いモダンなWebサイト制作に役立ててください。

先生と生徒の振り返り会話

生徒

先生、ありがとうございました!th:styleのおかげで、Javaの変数をそのままデザインに反映できる仕組みがよくわかりました。三項演算子を使うと、コードがスッキリして見やすいですね。

先生

そうだね。特に、ユーザーの入力ミスを指摘するバリデーションエラーの表示なんかでは、この動的なスタイル設定がすごく重宝されるんだよ。実際に現場で書くときは、どんなミスに気をつければいいか覚えているかな?

生徒

はい!「シングルクォートでCSSプロパティを囲むこと」と「複数のスタイルを書くときはセミコロンを忘れないこと」ですね。あと、変数がnullのときに画面が真っ白にならないように、デフォルト値を決めておく?:(Elvis演算子)も便利だと思いました。

先生

その通り!よく理解できているね。補足として、もしデザインが複雑になってきたら、無理にth:styleだけで解決しようとせず、CSSファイルに定義したクラスを切り替えるth:classへの移行も検討してみて。状況に応じた使い分けができるようになれば、一人前のエンジニアだよ。

生徒

わかりました!まずは簡単な色変えから実践して、徐々に複雑なレイアウトの動的制御にも挑戦してみます。Thymeleafがもっと楽しくなってきました!

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Thymeleaf(タイムリーフ)の「th:style」属性とは具体的にどのような機能ですか?初心者のエンジニア向けにメリットを教えてください。

Thymeleaf(タイムリーフ)の「th:style」属性は、HTMLの標準的な「style属性(インラインスタイル)」を、サーバーサイドのプログラム(Java/Spring Boot)側の値に基づいて動的に生成・上書きするための特別な属性です。最大のメリットは、プログラムの処理結果やデータの状態に応じて、CSSプロパティをリアルタイムで切り替えられる点にあります。例えば、計算結果がマイナスなら文字色を赤にする、エラーが発生していれば背景をピンクにするといった制御が、テンプレートエンジン側で完結します。静的なHTMLでは実現できない「条件付きの装飾」が可能になるため、ユーザーインターフェース(UI)の表現力が格段に向上します。
コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

カテゴリの一覧へ
新着記事
New1
Springの基本
Spring Bootの@ConfigurationPropertiesScanとは?設定クラス自動検出の仕組みを解説
New2
SpringのAPI開発(REST & GraphQL)
Spring Boot GraphQLでResolverを理解しよう!初心者でもわかるデータ取得の基本
New3
SpringのAPI開発(REST & GraphQL)
Spring Boot GraphQL入門!Query・Mutation・Subscriptionの基本を初心者向けに解説
New4
SpringのDB操作
JPQLのパラメータバインド(:name / ?1)の使い方を完全解説!初心者でも迷わない基本の考え方
人気記事
No.1
Java&Spring記事人気No1
Thymeleaf
Thymeleaf とは?初心者向けにThymeleafの基本を徹底解説
No.2
Java&Spring記事人気No2
SpringのWeb開発(Spring MVC)
DispatcherServletの仕組みを理解する!初心者向け完全ガイド
No.3
Java&Spring記事人気No3
Springの基本
Spring Bootのデフォルトログ設定を徹底解説(Logback / SLF4J)
No.4
Java&Spring記事人気No4
SpringのDB操作
JPAの標準クエリメソッド(findById, findAll)を完全解説!初心者でもわかるデータ取得の基本
No.5
Java&Spring記事人気No5
SpringのWeb開発(Spring MVC)
Spring Bootでの@GetMappingと@PostMappingの基本を完全解説!初心者でも理解できる使い方
No.6
Java&Spring記事人気No6
Spring認証(Spring Security)
セッション管理の基本(@SessionAttributes)を完全解説!初心者でもわかるセッションの仕組み
No.7
Java&Spring記事人気No7
SpringのWeb開発(Spring MVC)
@Controller と @RestController の違いを完全解説!初心者向けSpring MVC入門
No.8
Java&Spring記事人気No8
SpringのWeb開発(Spring MVC)
ループ処理(th:each)の基本を完全ガイド!Thymeafの繰り返し処理の使い方