add
метод classList
принимает только строки, а не массив (String [, String [, ...]]
), поэтому мне интересно, есть ли элегантный способ преобразования массива в список строк без очевидного зацикливания:
var breakpoints = {
"extraSmall" : [ "only screen and (max-width: 575px)" ],
"small" : [ "only screen and (min-width: 576px) and (max-width: 767px)" ],
"medium" : [ "only screen and (min-width: 768px) and (max-width: 991px)" ],
"large" : [ "only screen and (min-width: 992px) and (max-width: 1199px)" ],
"extraLarge" : [ "only screen and (min-width: 1200px)" ],
}
Object.keys(breakpoints).map(feature => document.documentElement.classList.add(feature));
По сути, я хочу добавить несколько классов за один вызов.
2 ответа
Поскольку метод add
принимает несколько классов в качестве параметров, вы можете использовать распространенный синтаксис ...
для ключей объекта, чтобы передать каждый элемент из ключей как класс.
var breakpoints = { "extraSmall" : [ "only screen and (max-width: 575px)" ], "small" : [ "only screen and (min-width: 576px) and (max-width: 767px)" ], "medium" : [ "only screen and (min-width: 768px) and (max-width: 991px)" ], "large" : [ "only screen and (min-width: 992px) and (max-width: 1199px)" ], "extraLarge" : [ "only screen and (min-width: 1200px)" ],}
const div = document.querySelector('div');
const classes = Object.keys(breakpoints);
div.classList.add(...classes);
<div>Div</div>
Для более старых версий браузеров, которые не поддерживают распространенный синтаксис, вы можете использовать метод apply
.
var breakpoints = { "extraSmall" : [ "only screen and (max-width: 575px)" ], "small" : [ "only screen and (min-width: 576px) and (max-width: 767px)" ], "medium" : [ "only screen and (min-width: 768px) and (max-width: 991px)" ], "large" : [ "only screen and (min-width: 992px) and (max-width: 1199px)" ], "extraLarge" : [ "only screen and (min-width: 1200px)" ],}
const div = document.querySelector('div');
const classes = Object.keys(breakpoints);
div.classList.add.apply(div.classList, classes)
<div>Div</div>
Поскольку вы не хотите создавать новый массив, не используйте .map
. Скорее, вы хотите выполнять побочные эффекты, поэтому вы должны использовать вместо этого forEach
или цикл for
:
for (const newClass of Object.keys(breakpoints)) {
document.documentElement.classList.add(newClass)
}
Чтобы полностью избежать зацикливания, вы могли бы (не элегантно) объединить с существующим className
:
document.documentElement.className += ` ${Object.keys(breakpoints).join(' ')}`;
Если у тега <html>
еще нет имени класса, начальный пробел не нужен. Если заранее неизвестно, будет ли у него имя класса или нет, вместо него будет проще использовать classList.add
.
Похожие вопросы
Новые вопросы
javascript
Для вопросов, касающихся программирования в ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (исключая ActionScript). Этот тег редко используется отдельно, но чаще всего ассоциируется с тегами [node.js], [jquery], [json] и [html].