2016-02-25 3 views
7

Что такое хороший способ динамического применения стилей (т. Е. Значения стилей во время выполнения) к элементам HTML с JavaScript?Применить CSS динамически с помощью JavaScript

Я ищу способ упаковки виджета JavaScript (JS, CSS и разметки) в одном компоненте (в основном, в объекте). Идея заключалась бы в том, чтобы компонент инкапсулировал стилизацию (так что у пользователей есть хороший API, чтобы изменить его, а не более тесно связанный подход для изменения CSS напрямую и с косвенными изменениями). Проблема в том, что один вызов API может означать изменения нескольких элементов стиля.

Как я могу это сделать, это построить CSS и установить атрибут style в соответствующие элементы (скорее всего, используя идентификатор, чтобы избежать внесения изменений в другие области разметки). Это хорошее решение? Есть ли лучший способ сделать это?

+1

Я бы создал css-правила с JS, встроенное решение стиля подразумевает, что вам нужно изменить все атрибуты стилей, когда вам нужно внести изменения для набора элементов. – Hacketo

ответ

4

Как я могу это сделать, это построить CSS и установить атрибут стиля в соответствующие элементы. Например:

var div = document.createElement('div'); 
div.setAttribute("style", "color: blue, margin-top:5px"); 
document.body.appendChild(div); 

Этот код будет создан новый элемент DIV со стилем color: blue, margin-top:5px и добавить его на страницу.

+1

«Я бы сделал это, чтобы построить CSS и установить стиль atrribute в соответствующие элементы» – Hacketo

+1

Я предпочел бы использовать свойство 'style' элемента DOM вместо' setAttribute() ', что-то вроде:' div.style = 'color: blue, margin-top: 5px'' –

+0

Разве это не все? –

5

Использование Jquery

Используйте функцию CSS(), чтобы применить стиль к существующим элементам, где вы передаете объект, содержащий стили:

var styles = { 
    backgroundColor : "#ddd", 
    fontWeight: "" 
}; 
$("#myId").css(styles); 

Можно также применить один стиль в то время с:

$("#myId").css("border-color", "#FFFFFF"); 

Vanil л JS:

var myDiv = document.getElementById("#myId"); 
myDiv.setAttribute("style", "border-color:#FFFFFF;"); 

С Css:

Вы также можете использовать отдельный файл CSS, содержащий различные стили, необходимые внутри классов, и в зависимости от контекста, вы добавляете или удалить эти классы для ваших элементов ,

в файле CSS вы можете иметь классы, как

.myClass { 
    background-color: red; 
} 

.myOtherClass { 
    background-color: blue; 
} 

Опять же с помощью JQuery, чтобы добавить или удалить класс к элементу, вы можете использовать

$("#myDiv").addClass('myClass'); 

или

$("#myDiv").removeClass('myClass'); 

Я думаю, что это более чистый способ, поскольку он отделяет ваш стиль от вашей логики. Но если значения вашего css зависят от того, что возвращается сервером, это решение может быть сложно применить.

+0

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

0

Я мог бы неправильно истолковать ваш вопрос, но похоже, что вы просите простую архитектурную схему. Вам нужно что-то, что облегчает тем, кто использует ваш виджет, чтобы изменить его на свои характеристики?

Если это так, то я не знаю какого-либо специального шаблона для этого, не используя CSS.

Я могу сказать вам, что «виджеты», которые я нашел наиболее удобными в использовании, имеют отдельные файлы CSS. Я нашел довольно простым изменить их в соответствии с моими потребностями. Я думаю, это связано с тем, что структура использования CSS с HTML и Javascript уже является хорошим и простым шаблоном. Я не знаю, что есть что-то лучше, особенно учитывая, что люди уже очень хорошо знакомы с отношениями HTML/CSS.

+0

Вопрос идет о строках создания компонентов с JS, которые могут быть независимы друг от друга. Хотя то, что вы говорите о стандарте HTML и CSS, абсолютно верно, это больше касается упаковки вещей таким образом, чтобы улучшить сцепление и уменьшить сцепление. Упакованные таким образом, пользователи виджета не должны знать, что такое стилизация, чтобы построить виджет, который имеет дополнительное преимущество, не требуя, чтобы они знали больше, чем один API, чтобы взаимодействовать с ним. –

+0

Я думаю, что вы хотите использовать .attr ('style', '...') или .css ('width, etc', '0px и т. Д.'). –

Смежные вопросы