OOCSS Разделение контейнера и содержимого?
Вопрос: действительно ли второй принцип OOCSS действительно?
Согласно второму принципу OOCSS, у вас не должно быть стилей, зависящих от местоположения:
Цитата с https://github.com/stubbornella/oocss/wiki
По сути, это означает "редко использовать стили, зависящие от местоположения". Объект должен выглядеть одинаково, независимо от того, где вы его положили. Таким образом, вместо стилизации определенного h2 с помощью.myObject h2 {...}, создайте и примените класс, который описывает рассматриваемый h2, например, h2 class="category".
Давайте возьмем практический пример этого. Скажем, у меня есть стандартная настройка 2.0 с нормальным телом (белый фон) и огромным нижним колонтитулом (черный фон). В теле у нас есть черные ссылки, а в нижнем колонтитуле, конечно, нам нужен белый. Это не самый простой и интуитивно понятный способ добиться этого просто:
a{ color: #000; }
.footer a{ color: #FFF; }
Если я буду следовать принципам OOCSS, мне придется сначала создать класс:
.inverted{ color: #FFF; }
Затем добавьте этот класс к каждой ссылке, которую я хочу перевернуть. Это похоже на стычку.
Не является ли целью всего языка то, что стили сделаны для Cascade? Я что-то здесь неправильно понимаю?
2 ответа
Я думаю, что вы правы в том смысле, что да, в вашем конкретном примере... возможно, сделать это по-своему будет проще. Но опять же, если вы посмотрите на первое предложение на странице OOCSS:
Как вы масштабируете CSS для тысяч страниц?
В этом контексте... второй принцип имеет смысл... поэтому, используя тот же пример (т.е. давайте предположим, что мы реализовали ваше решение)... скажем, что через год ваша компания решит создать светло-серые кнопки в черном нижнем колонтитуле, имея черный текст:
<!-- inside footer -->
<a class="button lightGrey">link</a>
в этом случае.. все a
теги будут белыми, потому что они покрыты вашим каскадом. Итак, нам нужно будет создать еще один sytle, чтобы отменить то, что сделал ваше решение:
.footer a.button.lightGrey {
color: #000; /* huh? but i thought we did this before with a {color: #000;} ?*/
}
где, как будто мы просто приняли решение, что все a
теги по умолчанию черные (см. последнее примечание):
a{ color: #000; }
затем в нижнем колонтитуле мы создадим специальный тип ссылки, которая должна быть белой:
.footerLinks { color: #FFF }
через год некоторые ссылки по-прежнему будут белыми... другие внутри кнопки greyLight будут черными:
<a class="button lightGrey">link</a>
тогда здесь нам не нужно беспокоиться о том, чтобы отменить что-либо.. a
теги имеют цвет по умолчанию.. и все. если через 2 года кто-то решит, что ссылки внутри кнопок lightGrey (в любом месте на сайте, а не только в нижнем колонтитуле... в этом вся суть OOCSS) должны быть красными... тогда это будет подход OOCSS:
.redLink {
color: red;
}
и HTML будет
<a class="button lightGrey redLink">link</a>
в этом случае не имеет значения, если мы уберем класс.lightGrey, или мы можем иметь этот код внутри или не в нижнем колонтитуле... это все то же самое... это приводит к более предсказуемому и повторно используемому коду... который это OOCSS (я очень рад, что они наконец формализовали это.. большое спасибо за пост кстати).
Последнее замечание: чтобы быть чистым OOCSS, нельзя менять цвет по умолчанию a
т.е. a {color: #000;}
это неправильно!, он должен быть оставлен на цвет по умолчанию (синий), когда кто-нибудь захочет изменить этот цвет, тогда он должен указать его, т.е.
<a class="redLink">..</a>
так что в этом случае это больше похоже на дефолт a
является родительским классом.. и все остальное подклассы это и переопределяет его поведение по умолчанию..
обновление - ответ на комментарии:
уважаемый аргумент сайта:
такие инициативы почти всегда инициируются сообществом, а затем принимаются авторитетными компаниями... и даже когда они принимаются более крупными компаниями, это обычно происходит снизу вверх через энтузиастов разработчиков, которые выступают за такие изменения. Я, например, был таким сторонником, когда Я работал в Амазоне. И даже когда это принято.. Обычно это в небольших масштабах, а не по всем подразделениям в организации. Гуглам, амазонкам, фейсбукам и т. д. даже не было бы хорошей идеей обеспечить соблюдение такого правила, потому что всегда будет различие во мнениях... не говоря уже о том, что такое микроуправление ограничит творческий потенциал инженера... в вики может быть руководство для команды (т.е. у нас было руководство для магазина приложений Amazon Kindle Touch), но применять это правило для 10000 инженеров, работающих в компании, было бы не практично и не желательно.
Короче говоря, если вы видите ценность в OOCSS и начинаете внедрять его на своем сайте, предлагая его своим коллегам-веб-разработчикам, и тогда это становится трендом, именно тогда он в конечном итоге становится лучшей отраслевой практикой, и именно тогда вы можете ожидать увидеть это на фейсбуке и т. д.
пример:
Взгляни на это:
просто: http://jsfiddle.net/64sBg/
немного более подробно: http://jsfiddle.net/64sBg/2/
не вдаваясь в подробности (я уверен, что вы увидите шаблон), вы можете видеть, что гранулярность в описаниях css допускает незначительные изменения без какой-либо избыточности в определении стиля. Так что обратите внимание на стрелку влево и стрелку вправо... также стили.red и.blue могут впоследствии применяться к таблицам и т. Д.
также обратите внимание, что в моем css нет ни одного каскада.. поэтому мои стили могут применяться совершенно независимо (т. е. реализация правила . Объект должен выглядеть одинаково, независимо от того, где вы его поместили)
наконец... все еще есть возможность для каскадирования... вы, безусловно, можете использовать его в своих селекторах jQuery, например... также каскадирование происходит по умолчанию (т.е. без необходимости явно устанавливать его в стилях CSS).. так что если вы посмотрите на CSS ниже.. вы заметите, что свойства шрифта тела каскадно ко всем кнопкам.
<a class="button blue dark">
<div class=" arrowDownWhite rightArrow">Analytics</div>
</a>
<a class="button red dark">
<div class=" arrowDownWhite leftArrow">Actions</div>
</a>
<a class="button grey light">
<div class=" arrowDownRed leftArrow">options</div>
</a>
и CSS:
body
{
font-family: Trebuchet MS,Liberation Sans,DejaVu Sans,sans-serif;
font-size: 15pt;
}
.button
{
padding: .5em 1em;
display: inline-block;
text-decoration: none;
}
.dark {
color: white;
}
.light{
color: #E40E62;
}
.blue
{
background-color: #51C8E8;
}
.red
{
background-color: #E40E62;
}
.grey
{
background-color: #E0E0E0 ;
}
.arrowDownWhite
{
background-image:url(http://s2.postimage.org/ywam7ec4l/small_Arrow_Down_White.png);
background-repeat:no-repeat;
}
.arrowDownRed
{
background-image:url(http://s2.postimage.org/je5743t2d/small_Arrow_Down_Red.png);
background-repeat:no-repeat;
}
.leftArrow
{
padding-left: 1em;
background-position: left center;
}
.rightArrow
{
padding-right: 1em;
background-position: right center;
}
Это стоит хлопот отделить вашу кожу от контейнера.
Давайте смотреть за пределы цветов. Я бы хотел, чтобы Николь Салливан привела лучшие примеры, чем она. У меня есть 23 веб-сайта, которые содержат
- меню
- Вкладки
- Панели инструментов
- Горизонтальные и вертикальные списки ссылок
Все они скины абстракции Nav
Я начал с создания класса абстракции для обработки общего кода между ними. Я добавил несколько модификаторов, чтобы изменить ориентацию с горизонтальной на вертикальную, а также ее плавающую позицию. Я сохранил все цвета вне абстракции, а также правила CSS, которые могут меняться в зависимости от скина, к которому я применяю.
/* Object */
.nav
{
margin-bottom: 1.5em; margin-left: 0; padding-left: 0; list-style: none;
}
/* Modifier */
.nav--stack .nav__item
{
display: block;
}
.nav--right
{
float: right;
}
/* Elements */
.nav__item
{
float:left
}
.nav__item__link
{
display:none;
}
Скин меню
Мне нужен был скин, который делал абстракцию.nav похожей на боковое меню. В случае, если вам интересно, я не поместил заполнение для.nav_item_link выше, потому что оно может меняться в зависимости от скина. Скин с вкладками имеет 2px.
/* Object */
.menu
{
}
/* Elements */
.menu .nav__item--current.nav__item__link
{
color: #fff; background: blue;
}
.menu .nav__item__link
{
padding: 4px; border-radius: 4px;
}
.menu .nav__item__link:hover
{
background: #eee
}
Обратите внимание, что вещи не зависят от местоположения - у меня 0 имен тегов. Я не разрабатываю li и детей на.nav, как это делает bootstrap. Этот код может использоваться на dls или даже div и имеет лучшую производительность в зависимости от того, как механизмы выбора читают правила.
Для меня польза от того, что мне нужно очистить объекты, которые у меня есть, для всех 23 сайтов, которые у меня есть, стоит хлопот.