Перейти к основному содержимому

Условные классы CSS в Thymeleaf

· 3 мин. чтения

1. Обзор

В этом кратком руководстве мы изучим несколько различных способов условного добавления классов CSS в Thymeleaf.

Если вы не знакомы с Thymeleaf, мы рекомендуем ознакомиться с нашим введением в него.

2. Использование th:if

Предположим, что наша цель — сгенерировать <span> , классы которого определяются сервером:

<span class="base condition-true">
I have two classes: "base" and either "condition-true" or "condition-false" depending on a server-side condition.
</span>

Прежде чем этот HTML-код будет обслужен, нам нужен хороший способ для сервера оценить условие и включить либо класс условие-истина , либо класс условие-ложь , а также базовый класс.

При создании шаблонов HTML довольно часто требуется добавить некоторую условную логику для динамического поведения.

Во-первых, давайте воспользуемся th:if для демонстрации простейшей формы условной логики:

<span th:if="${condition}" class="base condition-true">
This HTML is duplicated. We probably want a better solution.
</span>
<span th:if="${!condition}" class="base condition-false">
This HTML is duplicated. We probably want a better solution.
</span>

Здесь мы видим, что это логически приведет к тому, что правильный класс CSS будет присоединен к нашему HTML-элементу, но это решение нарушает принцип DRY, поскольку требует дублирования всего блока кода.

Использование th:if , безусловно, может быть полезным в некоторых случаях, но мы должны искать другой способ динамического добавления класса CSS.

3. Использование th:attr

Thymeleaf предлагает нам атрибут, который позволит нам определить другие атрибуты, называемые th:attr .

Используем его для решения нашей задачи:

<span th:attr="class=${condition ? 'base condition-true' : 'base condition-false'}">
This HTML is consolidated, which is good, but the Thymeleaf attribute still has some redundancy in it.
</span>

Вы могли заметить, что базовый класс все еще дублируется. Кроме того, есть более специфический атрибут Thymeleaf, который мы можем использовать при определении классов.

4. Использование th:class

Атрибут th:class является сокращением для th:attr="class=..." , поэтому давайте воспользуемся им, а также отделим базовый класс от результата условия:

<span th:class="'base '+${condition ? 'condition-true' : 'condition-false'}">
The base CSS class still has to be appended with String concatenation. We can do a little bit better.
</span>

Это решение довольно хорошее, потому что оно соответствует нашим потребностям и является СУХИМ. Однако есть еще один атрибут Thymeleaf, который нам может пригодиться.

5. Использование th:classappend

Не было бы неплохо полностью отделить наш базовый класс от условной логики? Мы можем статически определить наш базовый класс и сократить условную логику только до соответствующих частей:

<span class="base" th:classappend="${condition ? 'condition-true' : 'condition-false'}">
This HTML is consolidated, and the conditional class is appended separately from the static base class.
</span>

6. Заключение

С каждой итерацией нашего кода Thymeleaf мы узнавали о полезной условной технике, которая может пригодиться позже. В конечном итоге мы обнаружили, что использование th:classappend обеспечивает наилучшее сочетание DRY-кода и разделения ответственности, а также удовлетворяет нашей цели.

Все эти примеры можно увидеть в рабочем проекте Thymeleaf, доступном на GitHub .