Работа со стилями при помощи JS

Суть вопроса заключается в следующем: Может я ошибаюсь, но пропись стилей внутри атрибута (style) внутри тега не является хорошей практикой, особенно когда имеется необходимость в добавлении относительно большого количества стилей. Так вот изменение стилей при помощи JS производится "именно таким образом" - стили прописываются внутри тега, это нормально или стоит пользоваться чем то другим для форматирования стилей?


Ответы (2 шт):

Автор решения: Vadim

Ты можешь вкинуть(inject), свои стили, так:

(()=>{
    const bg_color = '#232323';
    $('body').append(`<style>
        body{
            background:${bg_color}!important;
        }
    </style>`);
})();

После, изменить bg_color, и нажать inject еще раз

Так же, рекомендую обратить внимание на .css из jquery

Например:

$('input').css({
    background: '#232323',
    color: 'white'
});
→ Ссылка
Автор решения: Михаил Камахин

Можно в css прописать класс какой-то и создавать блок с определённым классом и вставлять этот блок куда вам нужно

const div = document.createElement('div');
div.classList.add('myclass');
document.body.append(div);
.myclass {
  background-color: red;
  width: 100px;
  height: 100px;
  border: 2px solid black;
  border-radius: 50px;
}

Элементам при клике, наведении или ещё каком либо событии можно просто добавлять/удалять класс .active, пример:

const cards = document.querySelectorAll('.card'); // Получаем все элементы на странице с .card
cards.forEach((elem, i) => { // проходимся по элементам в цикле
  elem.addEventListener('click', () => { // каждому элементу ставим слушатель
    elem.classList.toggle('active'); // при клике на элемент добавлять/удалять класс active
  });
});
@import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800&display=swap');
*,
*::before,
*::after {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  font-family: 'Poppins', sans-serif;
  font-size: 2vw;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  -o-user-select: none;
  user-select: none;
}

img {
  max-width: 100%;
  display: block;
}

.container {
  max-width: 900px;
  margin: 0 auto;
}

:root {
  --time: 0.25s linear;
}

.card__wrapper {
  display: -webkit-flex;
  display: -moz-flex;
  display: -ms-flex;
  display: -o-flex;
  display: flex;
  margin-top: 20px;
}

.card {
  position: relative;
  display: -webkit-flex;
  display: -moz-flex;
  display: -ms-flex;
  display: -o-flex;
  display: flex;
  flex-direction: column;
  text-align: center;
  margin: 0 1%;
  transition: background-color var(--time);
  padding: 10px 0;
}

.card::before {
  position: absolute;
  content: '';
  display: block;
  width: 100%;
  height: 100%;
  left: 0;
  top: 0;
  background-color: transparent;
  border: 2px solid black;
  z-index: 1;
  opacity: 0;
  transition: opacity var(--time);
}

.card *:not(.card__img) {
  z-index: 2;
}

.card .card__img img {
  z-index: -1;
  transition: filter var(--time);
  padding: 10px;
}


/* Стили, которые применяются для .card с классом .active */

.card.active {
  background-color: yellow;
}

.card.active .card__img img {
  filter: grayscale(1);
}

.card.active::before {
  opacity: 1;
}
<div class="container">
  <div class="card__wrapper">
    <div class="card">
      <div class="card__title">
        Заголовок
      </div>
      <div class="card__description">
        Описание Описание
      </div>
      <div class="card__img">
        <img src="https://picsum.photos/300/250">
      </div>
    </div>
    <div class="card">
      <div class="card__title">
        Заголовок
      </div>
      <div class="card__description">
        Описание Описание
      </div>
      <div class="card__img">
        <img src="https://picsum.photos/300/250">
      </div>
    </div>
    <div class="card">
      <div class="card__title">
        Заголовок
      </div>
      <div class="card__description">
        Описание Описание
      </div>
      <div class="card__img">
        <img src="https://picsum.photos/300/250">
      </div>
    </div>
  </div>
</div>

→ Ссылка