Являются SMACSS, БЭМ и простые OOCSS селекторы не как портативный?
Так у меня проблема с простые OOCSS селекторы. Он должен быть более портативным, но по сравнению с тем как я обычно делаю вещи, я нахожу его меньше.
мой пример:
у меня есть свидетельство виджет. В основной части контента (которая имеет белый фон) отзыв имеет черный шрифт. Но в нижнем колонтитуле (который имеет синий фон) для отзыва нужен белый шрифт.
перед OOCSS я бы сделал что-то вроде этого:
#main-content .testominial {
color: #000000;
}
#footer .testominial {
color: #FFFFFF;
}
"старой" подход, я мог бы перетащить свой виджет из области содержимого в нижний колонтитул, и цвета просто работали бы - мне не нужно было бы менять классы CSS или DOM виджета.
С Новым OOCSS /BEM я не должен соединять.класс testimonial для ID (или для местоположения), но скорее я должен подкласс его так:
.testominial {
color: #000000;
}
.testominial--footer {
color: #FFFFFF;
}
проблема в том, что я больше не могу перетащить свой отзыв из области содержимого в нижний колонтитул, не заходя в DOM и изменение классов в виджете testimonial - он менее переносим, поскольку требует ручного вмешательства разработчика; тогда как раньше редактор мог просто перетащить его, и стиль был автоматическим.
Я что-то пропустила? Кажется, нет твердых реальных примеров?
2 ответов
вам нужно рассмотреть вопрос об удалении testimonial
наименования, а также footer
.
Рассмотрим пример:
.primary-box { }
.primary-box--reduced { }
.primary-box--standout { }
в Примере классы полностью независимы от контекста страницы. В результате классы полностью повторно используются. Любое поле на странице может принимать классы выше и ожидать, что будет стилизовано точно так, как определено.
например, вы могли бы иметь:
<header>
<div class='primary-box primary-box--reduced'></div>
</header>
<div class='content-box'>
<p class='primary-box primary-box--standout'></p>
</div>
<footer>
<div class='primary-box primary-box--reduced'></div>
</footer>
теперь, когда дизайнер вернется и настройки заполнения выдающихся полей вы можете перейти непосредственно к этим стилям и настроить их, уверенные, что единственными областями, которые будут осуществляться, будут области, имеющие эти классы в HTML.
кроме того, когда вы решите перейти .primary-box--reduced
С <header>
в строке меню, которая находится над ним, или в нижнем колонтитуле, вы можете быть уверены, что стили придут вместе, полностью.
когда вам нужен другой элемент где-то, возможно,primary-box--standout
, или просто по умолчанию primary-box
в заголовке вы просто создаете его и добавляете классы, их стили будут полностью следовать.
вы никогда не унаследуете неожиданные стили.
это очень реальный пример, сайт, который я недавно построил, был почти весь построен так, я говорю почти все, потому что я все еще учусь, но я могу гарантировать, что биты, с которыми у меня были наименьшие проблемы в быстро движущемся проекте с очень текучими конструкциями, были с неспецифическими контекст.
важно отсутствие контекста. В первом примере, .testimonial--footer
очень зависит от контекста, вам действительно нужно использовать его только для отзывов в нижнем колонтитуле.
и как по волшебству CSS Wizardry охватывают эту точную тему
EDIT:я добавил этот пример, чтобы помочь с комментарием, сделанным на мой ответ. Это не BEM или OOCSS, хотя это немного ближе к подход SMACSS. Это как я решение проблем с css и является гибридным bem / SMACSS подходом:
загружено по порядку:
- файлы модулей, такие как
.primary-box
- файлы раздела страницы, такие как
.header
или.call-to-action
- страница файлы, такие как
.about-us
или.contact
каждый файл становится все более и более конкретным, одновременно создавая все более сложные и модули. Основываясь на приведенных выше примерах и, надеюсь, помогая OP, вы могли видеть стили например:
.header {
.primary-box {
color: #000;
}
}
который будет перегружать стили модуля, используя более конкретную нотацию вложенного класса. Обратите внимание, что я все равно не буду использовать имя класса, например .header
- .banner-standout
было бы лучше, поскольку он повторно используется в любом месте без путаницы
Далее, вы даже могли видеть:
.about-us {
.header {
.primary-box {
color: #f00;
}
}
}
я считаю, что это очень хорошо работает в реальных проектах для контекста, сохраняя при этом контекстную свободную силу BEM, хотя я также настоятельно призываю как можно больше подталкивать это услуги в модули. Жизнь проще, если я узнаю новый общий раздел страницы или модуль и соответствующим образом упорядочу имена и файлы. В проекте, где код был переработан с осторожностью, у меня нет ничего в файлах страницы.
С помощью этого "старого" подхода я мог бы перетащить виджет из области содержимого в нижний колонтитул, и цвета просто работали бы - мне не нужно было бы менять классы CSS или DOM виджета.
если вы "перетащите" элемент .testominial
из контейнера .main-content
в контейнер .main-footer
, то есть вы меняете DOM. Таким образом, вы также можете обновить модификатор в классах CSS, нет никаких дополнительных затрат.
цель BEM-сделать классы CSS многократно используемый. Следующие модификаторы можно повторно использовать в различных средах.
CSS:
.testominial {
}
.testominial--darkFg {
color: #000;
}
.testominial--lightFg {
color: #FFF;
}
HTML-код:
<main class="main-content">
<div class="testominial testominial--darkFg">...</div>
</main>
<footer class="main-footer">
<div class="testominial testominial--lightFg">...</div>
</footer>
при старом подходе вам придется менять код CSS каждый раз, когда вам нужен новый блок .testominial
в новом контейнере. HTML и CSS сильно связаны, и некоторый код CSS будет дублироваться.
С подходом BEM вам придется добавлять некоторый код CSS каждый раз, когда дизайнер добавит новую вариацию внешнего вида блока. ФОРМАТ HTML и CSS менее связаны, и CSS лучше использовать повторно.