Являются 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 лучше использовать повторно.