Разве SMACSS, BEM и OOCSS не так переносимы?

Итак, у меня проблема с OOCSS. Предполагается, что он более портативный, но по сравнению с тем, как я обычно это делаю, я нахожу его менее портативным.

Мой пример:

У меня есть отзыв о виджете. В основной части контента (с белым фоном) отзыв выделен черным шрифтом. Но в нижнем колонтитуле (с синим фоном) характеристика нуждается в белом шрифте.

До OOCSS я бы сделал что-то вроде этого:

#main-content .testominial {
  color: #000000;
}
#footer .testominial {
  color: #FFFFFF;
}

При таком «старом» подходе я мог перетаскивать свой виджет из области содержимого в нижний колонтитул, и цвета просто работали — мне не нужно было менять классы CSS или DOM виджета.

С новым OOCSS/BEM я НЕ должен связывать класс .testimonial с идентификатором (или с местоположением), а скорее должен подклассировать его следующим образом:

.testominial {
  color: #000000;
}
.testominial--footer {
  color: #FFFFFF;
}

Проблема в том, что я больше не могу перетаскивать свой отзыв из области содержимого в нижний колонтитул, не заходя в DOM и не изменяя классы в виджете отзыва. Он МЕНЕЕ переносим, ​​поскольку требует ручного вмешательства разработчика; тогда как раньше редактор мог просто перетащить его, и стиль был автоматическим.

Я что-то упускаю? Кажется, нет надежных примеров из реальной жизни?


person gjok    schedule 28.05.2015    source источник
comment
Да, именно поэтому у меня нет ничего общего с этими шаблонами. Они в основном идут вразрез с тем, как селекторы CSS предназначены для работы.   -  person Alohci    schedule 28.05.2015
comment
imo, цель BEM / OOCSS состоит в том, чтобы предотвратить «непреднамеренные последствия» внесения изменений в один «компонент» и «слома» отображения в другом месте. Он делает это, «ограничивая» «каскад» CSS именами классов. Тот факт, что это помогает повторно использовать, является бонусом. Это, безусловно, помогает в обслуживании. Это также облегчает понимание того, что делает CSS и на что он влияет. Я программист, а не дизайнер, а не эксперт по CSS.   -  person Ryan Vincent    schedule 28.05.2015
comment
@RyanVincent Повторное использование — это не просто бонус. Это сильный аргумент Николь Салливан в Наши лучшие практики убивают нас (OOCSS). И, БЭМ — это Технология создания веб-приложений, БЭМ помогает делать факторизацию кода, то есть повторное использование.   -  person Paleo    schedule 28.05.2015
comment
@Tarh, замечание принято - я подозревал, что добавление строки «повторное использование» в моем комментарии было ошибкой. Я использую «БЭМ», и это сделало использование CSS почти приятным. Это, конечно, более предсказуемо. :)   -  person Ryan Vincent    schedule 28.05.2015
comment
Оглядываясь назад, я должен был уделять больше внимания OOCSS, а не BEM. Я просто пытаюсь понять, как я могу повторно использовать виджет, чтобы он выглядел по-разному в зависимости от его родительского контейнера без а) добавления пользователем каких-либо классов или кода и б) использования концепций Николь Суливанс.   -  person gjok    schedule 01.06.2015


Ответы (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 покрывает именно это. тема

РЕДАКТИРОВАТЬ: Я добавил этот пример, чтобы помочь с комментарием к моему ответу. Это не 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;
    }
  }
}

Я считаю, что это очень хорошо работает в реальных проектах для контекста, сохраняя при этом свободную от контекста мощь БЭМ, хотя я также призываю как можно больше продвигать эту цепочку в модули. Жизнь станет проще, если я узнаю новый общий раздел страницы или модуль и соответствующим образом реорганизую имена и файлы. В проекте, где код был тщательно отрефакторен, в файлах подкачки ничего нет.

person Toni Leigh    schedule 30.06.2015
comment
Спасибо, Тони, очень приятно видеть дополнительные примеры, но, несмотря на попытку сделать мой вопрос кратким, я думаю, что моя главная проблема все еще упущена. Я хочу сказать, что мне НУЖНО, чтобы мои блоки зависели от контекста. Вы говорите, что куда бы я ни поместил свой html, стили появятся, но это то, чего я не хочу. В нижнем колонтитуле цвет шрифта должен быть белым, но основной текст должен быть черным, чтобы существовала зависимость от контекста. В настоящее время мы перетаскиваем виджеты по экрану, и в старом подходе (см. мой пример) нам не нужно было вручную изменять классы для виджетов, так как родительский идентификатор управлял этим. - person gjok; 09.07.2015
comment
Взгляните на ответ в этом сообщении: stackoverflow.com/questions/ 22566179/bem-block-naming-nesting демонстрирует прекрасный пример проблемы переносимости, с которой я сталкиваюсь. Если бы вы переместили «nav» из div «content» в div «sidebar», вам нужно было бы вручную заменить классы «nav--content» на «nav--sidebar» для всех дочерних элементов. - Это то, что я имею в виду, будучи не портативным. спасибо - помогите. - person gjok; 09.07.2015
comment
@gjok - пожалуйста, смотрите редактирование, я добавил практический пример, который я использовал, который может позволить использовать возможности БЭМ в ситуациях, когда важен контекст. - person Toni Leigh; 09.07.2015
comment
Спасибо. Таким образом, это в основном компилируется в формат, который я привел в качестве примера в своем исходном посте, верно? Это означает, что в основном нормально использовать контекст нижнего колонтитула, если контекст нижнего колонтитула важен. Другими словами, БЭМ не работает для такого рода проблем? Это правильно? - person gjok; 09.07.2015
comment
БЭМ на самом деле не имеет решения для этого без выполнения .box--footer и .box--header, что на самом деле ничем не отличается. - person Toni Leigh; 09.07.2015

При таком «старом» подходе я мог перетаскивать свой виджет из области содержимого в нижний колонтитул, и цвета просто работали — мне не нужно было менять классы CSS или DOM виджета.

Если вы «перетащите» элемент .testominial из контейнера .main-content в контейнер .main-footer, то есть вы измените DOM. Таким образом, вы также можете обновить модификатор в классах CSS без дополнительных затрат.

Цель БЭМ — сделать классы 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 будет дублироваться.

При БЭМ-подходе вам придется добавлять CSS-код каждый раз, когда дизайнер будет добавлять новый вариант внешнего вида блока. HTML и CSS менее связаны, а CSS лучше используется повторно.

person Paleo    schedule 28.05.2015
comment
Итак, @Tarh, глядя на ваш фрагмент HTML, вы должны ВРУЧНУЮ добавить классы testominial--darkFg или testominial--lightFg в список классов виджетов, когда вы перетаскиваете виджет по странице. Наши пользователи не смогут этого сделать. Нам нужно, чтобы они могли перетаскивать элементы без кодирования. - person gjok; 28.05.2015
comment
Если вы делаете CSS правильно, HTML и CSS полностью не связаны. Селекторы обеспечивают связь между двумя мирами, а каскадность и специфичность обеспечивают богатый язык связывания, который маскируется БЭМ. - person Alohci; 28.05.2015
comment
@gjok Может быть, БЭМ не адаптирован к вашему варианту использования? Если ваш виджет должен адаптировать свой внешний вид в зависимости от контейнера, то вы не можете использовать чистую методологию БЭМ. По определению в БЭМ блоки не зависят от контекста. - person Paleo; 28.05.2015
comment
Я не вижу никакого способа обойти это, кроме как использовать старый подход. OOCSS говорит нам не привязывать наши модули к родительским местоположениям, а также утверждает, что наши компоненты можно использовать повторно, но здесь есть серьезный конфликт, поскольку местоположение обычно определяет внешний вид, как в моем примере. Как OOCSS обеспечивает это? - person gjok; 28.05.2015
comment
@gjok Конфликта нет, потому что ваш вариант использования не является повторным использованием. OOCSS и BEM допускают повторное использование, освобождая объекты/блоки от контекста. Вам нужен объект/блок, который адаптирует свой внешний вид в зависимости от контейнера. Другими словами, вам нужно применить модификатор автоматически, в зависимости от родительского контейнера. Вы можете сделать это, добавив класс CSS (программно, с помощью JavaScript) или используя каскад CSS (но не способом OOCSS/BEM). - person Paleo; 28.05.2015
comment
В своих проектах я часто выбираю смешанное решение. Я использую БЭМ в качестве общего фрейма (с именами, вдохновленными подходом OOCSS). И у меня есть дифференцированный синтаксис для вариантов использования, которые не подходят для БЭМ. - person Paleo; 28.05.2015
comment
Это повторное использование; Я хочу повторно использовать свой виджет на боковой панели, в нижнем колонтитуле или где-либо еще, не дублируя свой код. Николь Суливан и сотни других людей пишут об этом в блоге, но никто из них не объясняет, как это делается. Как мне сделать так, чтобы мой отзыв в нижнем колонтитуле отображался белым шрифтом, если я не использую селектор потомков нижнего колонтитула (#footer .testimonial {}) Извините, но Я не понимаю. - person gjok; 28.05.2015
comment
Наличие темного и светлого внутри ваших имен классов является признаком того, что ваши имена классов являются маскарадными встроенными стилями, а также факторизованным макетом. - person recursive; 01.07.2015
comment
@recursive Я понимаю - очевидно, я бы никогда не использовал названия цветов, но они всегда будут темными или светлыми - это требование. Если это высечено в камне навсегда, то это не проблема. - person gjok; 23.07.2015