Avatar ·

Как добавить CSS-класс к HTML-элементу с помощью JavaScript?

Всем привет! Я только начал изучать JavaScript и столкнулся с такой задачей: нужно динамически менять стиль элемента на странице при клике на кнопку. Я знаю, что это можно сделать через добавление CSS-класса, но никак не могу понять, как это правильно реализовать. У меня есть простая HTML-разметка: ```html
Этот блок должен изменить цвет
``` И CSS-класс, который я хочу добавить: ```css .highlight { background-color: yellow; font-weight: bold; } ``` Я пробовал писать такой код, но он не работает: ```javascript let div = document.getElementById('myDiv'); div.class = 'highlight'; // Не работает ``` Потом я нашел в интернете что-то про `className`, попробовал так: ```javascript div.className = 'highlight'; // Вроде работает, но если у элемента уже есть классы, они пропадают ``` Подскажите, пожалуйста, как правильно добавить класс к элементу, чтобы старые классы не удалялись? И есть ли способ проверять, есть ли уже такой класс у элемента? Буду благодарен за подробное объяснение с примерами. <<>>

Правильный способ добавления класса через classList

Современный и рекомендуемый способ работы с классами в JavaScript — это использование свойства classList. Оно предоставляет удобные методы для добавления, удаления и проверки классов без риска потерять существующие.

Вот как правильно решить вашу задачу:

// Получаем элемент
let div = document.getElementById('myDiv');

// Добавляем класс (старые классы сохраняются)
div.classList.add('highlight');

// Если нужно добавить несколько классов сразу
div.classList.add('highlight', 'animated', 'visible');

Почему className — это плохая практика?

Когда вы используете className, вы полностью перезаписываете атрибут class элемента. Если у элемента уже есть классы, они будут удалены. Например:

// Исходный элемент: <div class="old-class">
div.className = 'new-class';
// Результат: <div class="new-class"> — старый класс пропал!

Чтобы сохранить старые классы через className, пришлось бы делать так:

div.className = div.className + ' highlight'; // Громоздко и неудобно

Основные методы classList

  • add(класс1, класс2, ...) — добавляет один или несколько классов
  • remove(класс1, класс2, ...) — удаляет один или несколько классов
  • toggle(класс) — если класс есть, удаляет его; если нет — добавляет (как переключатель)
  • contains(класс) — проверяет, есть ли класс у элемента (возвращает true/false)
  • replace(старыйКласс, новыйКласс) — заменяет один класс на другой

Полный рабочий пример для вашей задачи

Давайте сделаем так, чтобы при клике на кнопку блок подсвечивался, а при повторном клике — подсветка убиралась:

// HTML
// <button id="myButton">Переключить подсветку</button>
// <div id="myDiv" class="box">Этот блок изменит цвет</div>

// JavaScript
let button = document.getElementById('myButton');
let div = document.getElementById('myDiv');

button.addEventListener('click', function() {
  // Проверяем, есть ли класс
  if (div.classList.contains('highlight')) {
    div.classList.remove('highlight');
  } else {
    div.classList.add('highlight');
  }
  
  // Или проще одной строкой:
  // div.classList.toggle('highlight');
});

Проверка наличия класса

Метод contains очень полезен, когда нужно выполнить разные действия в зависимости от того, есть класс или нет:

if (div.classList.contains('active')) {
  console.log('Элемент уже активен');
} else {
  div.classList.add('active');
}

Важные моменты

  • classList работает во всех современных браузерах (IE10+). Для очень старых браузеров (IE9 и ниже) используйте className с проверкой.
  • Имена классов чувствительны к регистру — 'Highlight' и 'highlight' это разные классы.
  • Методы add и remove игнорируют попытки добавить уже существующий класс или удалить отсутствующий — ошибки не будет.

Используйте classList — это современный, чистый и удобный способ управления классами в JavaScript.

<<>>

Альтернативный подход: работа через dataset и атрибуты

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

// Устанавливаем data-атрибут
div.dataset.state = 'highlighted';

// Проверяем состояние
if (div.dataset.state === 'highlighted') {
  div.style.backgroundColor = 'yellow';
}

// CSS можно использовать селектор по атрибуту
// [data-state="highlighted"] { background-color: yellow; }

Для старых браузеров (IE9 и ниже)

Если вам нужно поддерживать совсем старые браузеры, используйте className с аккуратной обработкой:

function addClass(element, className) {
  // Проверяем, есть ли уже такой класс
  if (element.className.indexOf(className) === -1) {
    element.className += ' ' + className;
  }
}

function removeClass(element, className) {
  element.className = element.className.replace(
    new RegExp('(^|\\s)' + className + '(\\s|$)', 'g'), 
    ' '
  ).trim();
}

Но в современных проектах всегда используйте classList — это проще, читаемее и надёжнее.