Приветствую,
Используем React, а BEM как CSS методологию.
Есть следующая проблема связанная с адаптивным дизайном.
Допустим есть сущность, которая имеет следующие состояния (модификаторы) small
, medium
и large
.
Бывает так, что на всех разрешениях он имеет одно состояние (к примеру, small
), но и так, что на одном разрешении одно, а на другом еще какое-нибудь (к примеру, small
по умолчанию, а medium
на разрешении > 1280px)
У меня пока два способа решения этой проблемы:
- по подобию адаптивных CSS фреймворков - использовать постпрефиксы, например,
-xs
,-md
,-lg
. Получается, что если мне нужно, чтобы на разрешении > 1280px сущность имела состояниеmedium
, я задаю емуmedium-lg
. То есть такая некая надстройка у состояния. Также есть мысли использовать вместо-
символ@
(как обозначение, что это именноmedia query
), то естьmedium@lg
; - использовать JS - через
window.mathMedia
рендерить нужное состояние. Именно всю страницу рендерить с нужными состояниями с учетом разрешения, а не конкретно компонент.
Спасибо.
Еще можно в стилях указывать разные значения для одного и того же модификатора для разных MQ.
Это будет не совсем правильно, так как тогда сущность будет менять состояние тогда, когда этого не нужно. На примере выше, если я хочу, чтобы
small
менялось на разрешении > 1280px наmedium
и укажу MQ уsmall
, то все моиsmall
будут модифицироваться вmedium
, когда как мне нужно такое поведение только в конкретных случаях, а то естьsmall
должен оставатьсяsmall
на всех разрешениях.Если на необходимость учитывать MQ влияет контекст, то можно из него и исходить: примиксовать к таким компанентам дополнительные элементы (либо применить вложенные селекторы, если это оправданно), которые и будут задавать размеры в зависимости от разрешения.
Контекстом разве что может быть сама страница. Изменение кнопки происходит по UI Kit'у (из
small
вmedium
) и не хотелось бы как-то привязывать это к миксованию. Как я понял предлагается вариант, что если у нас есть кнопкаИ мы хотим, чтобы на разрешении > 1280px он был не
button_small
, аbutton_medium
, мы должны задать стилизациюbutton_medium
через микс, к примеру:Так, кажется, нагляднее:
Костыль ли это? Возможно :)
Я не согласен в этим тезисом сразу в двух местах.
В общем, это mq для очень мелких/крупных экранов это единственно правильное решение, и лучше всего стремиться именно к нему. Всё остальное костыли.
Если говорить про кнопки, то лучше, чтобы они все были одного размера, и не было giant-button, micro-button, и всей этой ереси.
Если вам хочется, чтобы пользователи в некоторые кнопки попадали с трудом, а в другие — с комфортом, то сделайте для первых модификатор
_size_uncomfortable
и задайте жестко высоту36px
или меньше, а для второй сделайте_size_comfortable
и задайте высоту36px
для мышки,44px
для тачей (черезmq(width < 1024px)
), и вторым пользуйтесь, когда кнопка должна быть адаптивной, а первым — когда нет.p.s. See also: https://ux.stackexchange.com/questions/39023/what-is-the-optimum-button-size-of-touch-screen-applications
Если говорить не про адаптивный подход, то более менее с этим согласен, иначе этого не избежать.
Хотим сейчас подстраиваться под вьюпорт: учитывая размер устройства грузить разный лэйаут.
Это подойдет тогда, когда кнопка по UI киту только одного размера, а если же разная, то это либо мерж CSS'ом (
button_size_medium.button_size_comfortable
), либо созданиеbutton_size_medium-comfortable
, что равносильно подходуbutton_medium@lg
.