Всем привет! Тут с утра написал код, который навешивает модификаторы на блок в зависимости от величина экрана. Всего три модификатора. Все работает, только прошу экспертного мнения, может так делать не стоит для продакшена, или есть другие варианты реализации (быстрее, менее ресурсоемкие и т.п.).
modules.define('main', ['i-bem__dom'], function(provide, BEMDOM) {
provide(BEMDOM.decl(this.name, {
onSetMod: {
'js': {
'inited': function() {
if (BEMDOM.win.width() >= 840) {
this.setMod('desktop');
} else if (BEMDOM.win.width() >= 480 && BEMDOM.win.width() <= 839) {
this.setMod('touch-pad');
} else if (BEMDOM.win.width() <= 479) {
this.setMod('touch-phone');
}
this.bindToWin('resize', function(e) {
if (BEMDOM.win.width() <= 479 && this.hasMod('touch-pad')) {
this.delMod('touch-pad');
this.setMod('touch-phone');
} else if (BEMDOM.win.width() >= 480 && BEMDOM.win.width() <= 839 && this.hasMod('touch-phone')) {
this.delMod('touch-phone');
this.setMod('touch-pad');
} else if (BEMDOM.win.width() >= 480 && BEMDOM.win.width() <= 839 && this.hasMod('desktop')) {
this.delMod('desktop');
this.setMod('touch-pad');
} else if (BEMDOM.win.width() >= 840 && this.hasMod('touch-pad')) {
this.delMod('touch-pad');
this.setMod('desktop', true);
}
});
}
}
}
}));
});
А почему не медиа кверис?
потому что у меня планируется небольшой каскад, который будет разный для этих модификаторов.
@Sergei-b84 может стоит сделать подписку в live, чтобы ресайз обрабатывался только один раз? Например, если таких блоков
main
несколькоБезотносительно самой идеи, это можно записать чуть компактнее
несколько блоков
main
это прям класс =)На события типа ресайза есть смысл вешать коллбеки через throttle: https://ru.bem.info/libs/bem-core/v2.8.0/desktop/functions/#elems-throttle
Спасибо всем.
@Sergei-b84 а часто сайт будет ресайзится? Возможно стоит просто расширить блок
ua
или создать свой и определить пару методов, которые будут определять тип устройства по разрешению. На основе этого уже при ините блока выполнять тот или иной код. Думаю при портретной ориентации блок не сильно должен меняться, чтобы на ресайз событие реагировать.Я бы еще брейкпоинты в константы вынес. Но это чисто стилистика.
@voischev у меня есть блок, который на мобилках слайдер со свайпом, а на десктопе обычный список. Так что такой подход думаю оправдан.
@JiLiZART Нет не часто. Про блок ua почитаю, пока с ним не знаком совсем. Спасибо.
@JiLiZART твой вариант оправдан. И то можно подумать как это сделать на css