Приветствую,
Используем 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.