Управління CSS Explosion


682

Я сильно покладався на CSS для веб-сайту, над яким я працюю. Зараз усі стилі CSS застосовуються на основі тегу, і тепер я намагаюся перенести його на більшу частину зовнішнього стилю, щоб допомогти в будь-яких майбутніх змінах.

Але тепер проблема полягає в тому, що я помітив, що отримую "CSS-вибух". Мені стає важко вирішити, як найкраще організувати та абстрагувати дані у файлі CSS.

Я використовую велику кількість divтегів на веб-сайті, переходячи з веб-сайту, що базується на таблицях. Тому я отримую багато CSS-селекторів, які виглядають приблизно так:

div.title {
  background-color: blue;
  color: white;
  text-align: center;
}

div.footer {
  /* Styles Here */
}

div.body {
  /* Styles Here */
}

/* And many more */

Це ще не так вже й погано, але, як я початківець, мені було цікаво, чи можна дати рекомендації щодо того, як найкраще організувати різні частини файлу CSS. Я не хочу мати окремий атрибут CSS для кожного елемента на своєму веб-сайті, і я завжди хочу, щоб файл CSS був досить інтуїтивним та легким для читання.

Моя кінцева мета - полегшити використання файлів CSS та продемонструвати їх силу для збільшення швидкості веб-розробки. Таким чином, інші люди, які в майбутньому можуть працювати на цьому веб-сайті, також отримають практику використання хороших методів кодування, а не підбирати його так, як я це зробив.


122
Це велике запитання, але для багатьох компаній справді нерозв'язна проблема. Головним чином тому , що CSS в даний час є автор і керується графічними дизайнерами , які можуть не знати про умови simplicity, complexity, maintenance, structureі refactoring.
cherouvim

8
@cherouvim - Смішно, що ви повинні це сказати, тому що вся моя причина, щоб задати це питання, почалася з того, що я бачив якийсь страшний CSS, розроблений графіком. Може, нам потрібна якась краща підготовка для них?
JasCav

13
Моє рішення (в ідеальному світі) - присвятити людей у ​​вашій команді розрізати PSD на html + css та підтримувати їх згодом. Ці люди повинні бути близькими до програмістів і дизайнерів.
cherouvim

@cherouvim Прийміться погодитись - це так багато шляхів агентств, тим більше, що CSS стає складнішим.
Джон Паркер

27
@JasCav, графіки не повинні торкатися CSS. Веб-дизайнери та передові веб-розробники повинні мати справу з CSS. Завдання графічного дизайнера - це зробити графіку.
zzzzBov

Відповіді:


566

Це дуже гарне запитання. Куди б я не глянув, CSS-файли, як правило, виходять з-під контролю через деякий час - особливо, але не тільки під час роботи в команді.

Нижче наведені правила, яких я сам намагаюся дотримуватися (не те, що мені завжди вдається.)

  • Рефактор рано, рефактор часто. Часто очищайте файли CSS, сплавляйте разом декілька визначень одного класу. Видаліть застарілі визначення негайно .

  • Додаючи CSS під час виправлення помилок, залиште коментар щодо того, що робить зміна ("Це потрібно, щоб поле залишалося вирівняним у IE <7")

  • Уникайте надмірностей, наприклад, визначаючи те саме в .classnameі .classname:hover.

  • Використовуйте коментарі /** Head **/для побудови чіткої структури.

  • Скористайтеся засобом, який підтримує постійний стиль. Я використовую Polystyle , з яким я цілком задоволений (коштує 15 доларів, але гроші добре витрачені). Навколо є і безкоштовні (наприклад, Код-красник на основі CSS Tidy , інструмент з відкритим кодом).

  • Побудувати розумні класи. Дивіться нижче кілька приміток до цього.

  • Використовуйте семантику, уникайте супу DIV - використовуйте, наприклад, <ul>s для меню.

  • Визначте все на максимально низькому рівні (наприклад, сімейство шрифтів за замовчуванням, колір та розмір у body) та використовуйте, inheritде це можливо

  • Якщо у вас дуже складний CSS, можливо, попередній компілятор CSS допоможе. Я скоро планую заглянути в xCSS з тієї самої причини. Навколо є кілька інших.

  • Якщо ви працюєте в команді, підкресліть необхідність якості та стандартів для файлів CSS. Кожен великий у стандартах кодування у своїх мовах програмування, але мало усвідомлення того, що це потрібно і для CSS.

  • Якщо ви працюєте в команді, не забудьте скористатися контролем версій. Це робить речі, які набагато простіше відстежувати, і редагування конфліктів, які набагато простіше вирішити. Це дійсно того варто, навіть якщо ви "просто" в HTML і CSS.

  • Не працюйте !important. Не тільки тому, що IE = <7 не може з цим впоратися. У складній структурі використання !importantчасто спокушає змінити поведінку, джерела якої неможливо знайти, але це отрута для тривалого утримання.

Побудова розумних занять

Ось так я люблю будувати розважливі заняття.

Я спочатку застосовую глобальні налаштування:

body { font-family: .... font-size ... color ... }
a { text-decoration: none; }

Потім я визначаю основні розділи макета сторінки - наприклад, верхню область, меню, вміст та колонтитул. Якщо я написав хорошу розмітку, ці області будуть ідентичними структурі HTML.

Потім я починаю створювати CSS-класи, вказуючи якомога більше походження, наскільки це розумно, і групувати пов'язані класи як можна ближче.

div.content ul.table_of_contents 
div.content ul.table_of_contents li 
div.content ul.table_of_contents li h1
div.content ul.table_of_contents li h2
div.content ul.table_of_contents li span.pagenumber

Подумайте про всю структуру CSS як дерево з дедалі більш конкретними визначеннями, чим далі ви знаходитесь від кореня. Ви хочете, щоб кількість занять була якомога нижчою, і ви хочете повторити себе якомога рідше.

Наприклад, скажімо, що у вас є три рівні меню навігації. Ці три меню виглядають по-різному, але вони також мають певні характеристики. Наприклад, всі <ul>вони мають однаковий розмір шрифту, і всі елементи знаходяться поруч (на відміну від відображення за замовчуванням ul). Також жодне меню не має жодних пунктів ( list-style-type).

Спочатку визначте загальні характеристики у класі з назвою menu:

div.navi ul.menu { display: ...; list-style-type: none; list-style-image: none; }
div.navi ul.menu li { float: left }

потім визначте конкретні характеристики кожного з трьох меню. Рівень 1 - 40 пікселів; рівні 2 та 3, 20 пікселів.

Примітка: ви також можете використовувати для цього кілька класів, але Internet Explorer 6 має проблеми з кількома класами , тому в цьому прикладі використовується ids.

div.navi ul.menu#level1 { height: 40px; }
div.navi ul.menu#level2 { height: 20px; }
div.navi ul.menu#level3 { height: 16px; }

Розмітка для меню буде виглядати приблизно так:

<ul id="level1" class="menu"><li> ...... </li></ul>
<ul id="level2" class="menu"><li> ...... </li></ul>
<ul id="level3" class="menu"><li> ...... </li></ul>

Якщо у вас на сторінці є семантично схожі елементи, як-от ці три меню, спробуйте спочатку розробити спільність і ввести їх у клас; потім опрацюйте конкретні властивості та застосуйте їх до класів або, якщо вам потрібно підтримувати Internet Explorer 6, ідентифікатори.

Різні HTML-поради

Якщо ви додасте ці семантики до свого виводу HTML, дизайнери можуть пізніше налаштувати вигляд веб-сайтів та / або додатків за допомогою чистого CSS, що є великою перевагою та економією часу.

  • Якщо можливо, надайте тілу кожної сторінки унікальний клас: <body class='contactpage'>це дозволяє легко додавати налаштування для сторінки до таблиці стилів:

    body.contactpage div.container ul.mainmenu li { color: green }
  • Створюючи меню автоматично, додайте якомога більше контексту CSS, щоб пізніше дозволити широкий стиль. Наприклад:

    <ul class="mainmenu">
     <li class="item_first item_active item_1"> First item </li> 
     <li class="item_2"> Second item </li> 
     <li class="item_3"> Third item </li> 
     <li class="item_last item_4"> Fourth item </li> 
    </ul>

    Таким чином, будь-який пункт меню можна отримати для стилізації відповідно до його семантичного контексту: чи це перший, чи останній пункт у списку; Незалежно від того, що це активний предмет; і за номером.

Зауважте, що таке призначення декількох класів, як зазначено у наведеному вище прикладі , не працює належним чином в IE6 . Існує рішення, щоб IE6 міг працювати з кількома класами. Якщо вирішення не є варіантом, вам доведеться встановити найбільш важливий для вас клас (номер елемента, активний або перший / останній), або вдатися до використання ідентифікаторів.


3
@Andrew головним чином тому, що в динамічному середовищі (наприклад, CMS) використання ідентифікатора може легко призвести до зіткнень (скажімо, користувач перейменував сторінку на "контакт", що призведе до того, що це ім'я використовується як ідентифікатор тіла, зіштовхуючись з контактною формою також названий "контактом"). Зазвичай я рекомендую використовувати ідентифікатори якомога рідше з цієї причини.
Pekka

4
@Pekka, ви повинні перевірити сайт www.oocss.org, багато чого йде проти того, що ви згадали тут, але це найкращий спосіб, який я бачив, щоб керувати CSS bloat. Дивіться також мою відповідь нижче: stackoverflow.com/questions/2253110/how-to-manage-css-explosion/…
Moin Zaman

2
@Sam дякую! Мені це подобається досить добре, хоча я час від часу мені дуже важко слідувати цим настановам . Аркуші стилів CSS так просто викручуються з часом - зміна кольору тут, font-weight: boldтам .... дисципліна - єдине ліки :)
Pekka

1
Виступаючи як хтось новий у вивченні вибуху css, фраза "унікальний клас" є заплутаною. У мене виникає відчуття, що це не так, idале це впевнено звучить як один. Може, концепцію можна було б уточнити?
арі золото

2
@ari ти правий, що технічно це idтеж може бути .
Pekka

89

Ось лише 4 приклади:

З усіх 4 моїх відповідей включена порада завантажити та прочитати PDF CSS системи Наталі Дауне . (PDF включає тонни приміток, які не є на слайдах, тому читайте PDF!). Візьміть до уваги її пропозиції щодо організації.

EDIT (2014/02/05) через чотири роки, я б сказав:

  • Використовуйте попередній процесор CSS і керуйте своїми файлами як партії (я особисто віддаю перевагу Sass з Compass, але менше є також непоганим, а є й інші)
  • Прочитайте такі поняття, як OOCSS , SMACSS та BEM або getbem .
  • Погляньте, наскільки структуровані такі популярні рамки CSS, як Bootstrap та Zurb Foundation . І не варто знижувати менш популярні рамки - Inuit цікавий, але є багато інших.
  • Поєднайте / мінімізуйте свої файли кроком збірки на сервері безперервної інтеграції та / або запуску завдань, таких як Grunt або Gulp.

Попередні процесори CSS є причиною проблеми, а не рішенням. Освоюйте каскадну концепцію по-справжньому, і ви зменшите набряк.
Даніель Соколовський

@DanielSokolowski будь-який неправильно використаний інструмент може бути проблемою, а не рішенням. Але на 100% погоджуються питання освоєння каскаду.
Енді Форд

73

Не пишіть заголовки в CSS

Просто розділіть розділи на файли. Будь-які коментарі CSS, повинні бути саме такими, коментарі.

reset.css
base.css
somepage.css
someotherpage.css
some_abstract_component.css

Використовуйте сценарій для об'єднання їх в одне ціле; якщо необхідно. Ви навіть можете мати гарну структуру каталогів і просто вимагати, щоб ваш скрипт рекурсивно сканував .cssфайли.

Якщо ви повинні написати заголовки, майте TOC на початку файлу

Заголовки в TOC повинні бути абсолютно рівними заголовкам, які ви пишете пізніше. Боліти пошуки рубрик. Щоб додати проблему, як саме хто припускає знати, що ви маєте ще один заголовок після першого заголовка? пс. не додайте док-подібний * (зірочку) на початку кожного рядка під час написання TOC-кодів, це просто робить більш прикрою вибір тексту.

/* Table of Contents
   - - - - - - - - -
   Header stuff
   Body Stuff
   Some other junk
   - - - - - - - - -
 */
...
/* Header Stuff 
 */
...
/* Body Stuff 
 */

Пишіть коментарі за правилами чи в межах, а не за межами блоку

По-перше, коли ви редагуєте сценарій, є шанс 50/50, ви звернете увагу на те, що знаходиться поза блоком правил (особливо, якщо це великий глобус тексту;)). По-друге, немає (майже) жодного випадку, коли б вам не знадобився "коментар" зовні. Якщо вона знаходиться поза, це 99% часу назви, тому зберігайте це так.

Розділіть сторінку на компоненти

Компоненти повинні мати position:relative, ні paddingі ні margin, більшість часу. Це спрощує% правила багато, а також дозволяють набагато простіше absolute:position«Інги елементів, так як якщо є абсолютний позиційований контейнер абсолютний позиціонується буде використовувати контейнер при обчисленні top, right, bottom, leftвластивості.

Більшість DIV-файлів у документі HTML5 зазвичай є компонентом.

Компонент - це також те, що можна вважати самостійною одиницею на сторінці. Зрозуміло, миряни ставляться до чогось, як до компонента, якщо є сенс ставитися до чогось, як до чорного поля .

Перейдемо з прикладом сторінки QA знову:

#navigation
#question
#answers
#answers .answer
etc.

Розбивши сторінку на компоненти, ви розділили свою роботу на керовані одиниці.

Поставте правила з кумулятивним ефектом в один рядок.

Наприклад border, marginта padding(але не outlineвсі) додають розміри та розмір елемента, який ви стилюєте.

position: absolute; top: 10px; right: 10px;

Якщо вони просто не такі читабельні на одній лінії, принаймні розмістіть їх у безпосередній близькості:

padding: 10px; margin: 20px;
border: 1px solid black;

Використовуйте скорочення, коли це можливо:

/* the following... */
padding-left: 10px;
padding-right: 10px;
/* can simply be written as */
padding: 0 10px;

Ніколи не повторюйте селектор

Якщо у вас є більше примірників одного і того ж селектора, є велика ймовірність, що у вас неминуче опиняться кілька примірників одних і тих же правил. Наприклад:

#some .selector {
    margin: 0;
    font-size: 11px;
}
...
#some .selector {
    border: 1px solid #000;
    margin: 0;
}

Уникайте використання TAG в якості селекторів, коли ви можете використовувати id / класи

По-перше, теги DIV і SPAN - виняток: ви ніколи не повинні їх використовувати! ;) Використовуйте їх лише для приєднання класу / id.

Цей ...

div#answers div.answer table.statistics {
    border-collapse: collapsed;
    color: pink;
    border: 1px solid #000;
}
div#answers div.answer table.statistics thead {
    outline: 3px solid #000;
}

Слід писати так:

#answers .answer .statistics {
    border-collapse: collapsed;
    color: pink;
    border: 1px solid #000;
}
#answers .answer .statistics thead {
    outline: 3px solid #000;
}

Тому що додаткові звисаючі DIV там нічого не додають селектору. Вони також змушують зайве тег-правило. Якби ви змінили, наприклад, .answerз "a" divна " articleваш стиль" порушився б.

Або якщо ви віддаєте перевагу більш чіткості:

#answers .answer .statistics {
    color: pink;
    border: 1px solid #000;
}
#answers .answer table.statistics {
    border-collapse: collapsed;
}
#answers .answer .statistics thead {
    outline: 3px solid #000;
}

Причина, що є border-collapseвласністю, - це особлива властивість, яка має сенс лише при застосуванні до а table. Якщо .statisticsні, tableце не слід застосовувати.

Загальні правила - це зло!

  • уникайте писати загальних / магічних правил, якщо можете
  • якщо це не для CSS-скидання / скидання, всі ваші загальні чари повинні стосуватися принаймні одного кореневого компонента

Вони не економить ваш час, вони змушують голову вибухнути; а також зробити технічне обслуговування кошмаром. Коли ви пишете правило, ви можете знати, де вони застосовуються, однак це не має гарантії, що ваше правило згодом не буде з вами.

Додавання до цього загальних правил є заплутаним і важко читається, навіть якщо ви маєте уявлення про документ, який ви стилюєте. Це не означає, що ви не повинні писати загальних правил, просто не використовуйте їх, якщо ви дійсно не маєте намір зробити їх загальними, і навіть вони додають стільки інформації обсягу в селектор, скільки можете.

Такі речі ...

.badges {
    width: 100%;
    white-space: nowrap;
}

address {
    padding: 5px 10px;
    border: 1px solid #ccc;
}

... має таку ж проблему, що і використання глобальних змінних у мові програмування. Вам потрібно надати їм розмах!

#question .userinfo .badges {
    width: 100%;
    white-space: nowrap;
}

#answers .answer .userinfo address {
    padding: 5px 10px;
    border: 1px solid #ccc;
}

В основному це звучить як:

components                   target
---------------------------- --------
#answers .answer   .userinfo address
-------- --------- --------- --------
domain   component component selector 

Мені подобається використовувати ідентифікатори кожного разу, коли компонент, про який я знаю, є однотонним на сторінці; ваші потреби можуть бути різними.

Примітка. В ідеалі вам слід написати досить просто. Згадування більшої кількості компонентів у селекторі, однак, є більш прощальною помилкою, порівняно із зазначенням менше компонентів.

Припустимо, у вас є paginationкомпонент. Ви використовуєте його в багатьох місцях на своєму сайті. Це був би хороший приклад, коли ви пишете загальне правило. Скажімо, ви display:blockпосилаєтеся на окремі посилання на номер сторінки та надаєте їм темно-сірий фон. Щоб вони були видимими, ви повинні мати такі правила:

.pagination .pagelist a {
    color: #fff;
}

Тепер давайте скажемо, що ви використовуєте свою пагінацію для списку відповідей, можливо, ви натрапите на щось подібне

#answers .header a {
    color: #000;
}
...
.pagination .pagelist a {
    color: #fff;
}

Це зробить ваші білі посилання чорними, чого ви не хочете.

Неправильний спосіб виправити це:

.pagination .pagelist a {
    color: #fff !important;
}

Правильний спосіб виправити це:

#answers .header .pagination .pagelist a {
    color: #fff;
}

Складні "логічні" коментарі не працюють :)

Якщо ви напишете щось на кшталт: "ця величина залежить від бла-бла в поєднанні з висотою бла-бла", це просто неминуче ви помилитесь, і все це впаде, як будинок карт.

Зберігайте свої коментарі простими; якщо вам потрібні "логічні операції", розгляньте одну з таких мов шаблонів CSS, як SASS або LESS .

Як вам написати кольорову піддону?

Залиште це для кінця. Майте файл для всієї палітри кольорів. З цього файлу у вашому стилі все-таки має бути використана кольорова палітра в правилах. Ваша кольорова палітра повинна перезаписатись. Ви ланцюжкові селектори використовують батьківський компонент дуже високого рівня (напр. #page), А потім записуєте свій стиль як самодостатній блок правил. Це може бути просто колір або щось більше.

напр.

#page #header .description,
#page #categories .description,
#page #answers .answer .body
{
    color: #222; background: #fff; 
    border-radius: 10px;
    padding: 1em;
}

Ідея проста, ваш кольоровий піддон - це таблиця стилів, незалежна від базового стилю, який ви каскадуєте .

Менше імен, потрібно менше пам’яті, що полегшує читання коду

Використання меншої кількості імен краще. В ідеалі використовуйте дуже прості (і короткі!) Слова: текст, тіло, заголовок.

Я також знаходжу, що поєднання простих слів легше зрозуміти, тоді, як мати суп із довгих "відповідних" слів: postbody, posthead, userinfo тощо.

Зберігайте словниковий запас невеликим, таким чином, навіть якщо незнайомий чоловік, який приходить читати ваш суп стилів (як ви через кілька тижнів;)), повинен розуміти, де вживаються слова, а не там, де використовується кожен вибір. Наприклад, я використовую.this коли елемент нібито є "обраним елементом" або "поточним елементом" тощо.

Прибирайте за собою

Писати CSS - це як їсти, іноді ти залишаєш безлад. Переконайтеся, що ви прибираєте цей безлад, інакше код сміття просто накопичиться. Видаліть класи / ідентифікатори, які ви не використовуєте. Видаліть правила CSS, якими ви не користуєтесь. Переконайтесь, що все добре, і немає у вас суперечливих чи дублюваних правил.

Якщо ви, як я запропонував, ставились до деяких контейнерів як до чорних ящиків (компонентів) у вашому стилі, використовували ці компоненти у ваших селекторах і зберігали все в одному виділеному файлі (або належним чином розділили файл із TOC та заголовками), то ваш працювати істотно простіше ...

Ви можете скористатися таким інструментом, як розширення Firefox Dust-Me Selectors (порада: вкажіть його на файл sitemap.xml), щоб допомогти вам знайти частину сміття, прихованого у ваших ядрах css та кані.

Зберігайте unsorted.cssфайл

Скажімо, ви створюєте сайт із забезпечення якості, і у вас вже є таблиця стилів для "сторінки відповідей", яку ми зателефонуємо answers.css. Якщо вам зараз потрібно додати багато нового CSS, додайте його до unsorted.cssтаблиці стилів, а потім рефактор у вашу answers.cssтаблицю стилів.

Для цього є кілька причин:

  • швидше зробити рефактор після того, як ви закінчите, тоді це пошук правил (яких, мабуть, не існує) та введення коду
  • ви будете писати речі, які ви видалите, введення коду просто ускладнить видалення цього коду
  • додавання до вихідного файлу легко призводить до дублювання правил / селектора

1
селектори, що не мають тегів, набагато повільніше, ніж ті, що базуються на тегах. Усі веб-переглядачі мають вбудовані методи, щоб отримати "div", наприклад (або будь-який інший тег). Якщо ви дозволите, що це занадто загальне (".class"), двигун візуалізації повинен буде обходити всі елементи DOM, щоб побачити, чи існує відповідність.
Мігель Пінг

@Miguel Чому двигун візуалізації не повинен ходити по всіх елементах у DOM, щоб побачити, чи є вони DIV? Якщо є якась спеціальна оптимізація, чому вона не застосовується до класів / ідентифікаторів? У вас є джерело? Єдиний помітний вбивця продуктивності, який я помітив у CSS, був через плаваючий спам - це може спричинити, що двигун візуалізації жахливо відстає в деяких браузерах при прокрутуванні сторінки (напевно, занадто багато розрахунків).
srcspider

3
Я збирався проголосувати за те, щоб сказати, що не націлювати на тегиNames (так!), Але тоді була частина про те, щоб не бути загальним (бу!)
mwilcox

1
@ Мігель, це не працює так. Веб-переглядачі читають рядок CSS назад, тому знадобиться: "div .myclass" і знайдуть усі ".myclass" класи, а потім перевіряють, чи це родоначальник діва.
mwilcox

5
Порівняння загальних правил із глобальними змінними - це найбільша помилка, яку я коли-небудь чув про CSS.
gblazex

55

Погляньте на 1. SASS 2. Компас


11
Мільйон разів це. Використання Sass зробило мене більш організованим і потужнішим css wrangler як ніколи. Це дозволяє мені організовувати стилі для декількох файлів, стилів гнізд, використовувати змінні тощо, тощо, тощо, тощо
Алан Х.

2
sass, compass і все менше виробляють звичайний CSS в кінці дня, який все ще може бути негарним і вибухнутим. Це не є рішенням, як CSS процвітає сам по собі.
Мойн Заман

8
@Moin_Zaman На мою скромну думку, сер, ваше твердження є чистою хамбу. ви пишете в sass / compass / менше і впорядковуєте свій код у своїх файлах. Вас не хвилює, як виглядає вихідний CSS. Крім того, принаймні менше (за допомогою меншої кількості додатків) може зменшити велику кількість результатів.
bzx

1
@bzx ти доводиш мою думку :) Браузер не розуміє sass / compass / менше. все це потрібно скласти до звичайного старого CSS або на стороні клієнта, або як частина вашої збірки. Використання таких інструментів, не знаючи, що вони створюють як CSS, врешті-решт, дуже легко зловживати ними несвідомо і в кінцевому підсумку отримати більші, ніж оптимальні файли CSS.
Moin Zaman

Ось де стискається gzip-компресія… Більшість веб-серверів та браузерів спілкуватимуться із вмістом gzip, коли це можливо. Якщо ви в кінцевому підсумку повторите фрагмент селектора кілька разів, це буде зіпсовано в одну таблицю хеш-таблиці. Єдиною реальною проблемою є кількість оперативної пам’яті, необхідної для розбору правил CSS у браузері.
третій

31

Найкращий спосіб, який я бачив, щоб протистояти дії CSS, використовуючи об'єктно-орієнтовані принципи CSS.

Навіть там є система OOCSS , яка дуже добре.

Деякі з ідеологій суперечать багатьом сказаним тут у головних відповідях, але як тільки ви дізнаєтесь, як архітектувати CSSоб'єктно-орієнтованим способом, ви побачите, що це фактично працює при збереженні коду "lean & mean".

Тут головне - визначити "Об'єкти" або структури будівельних блоків на вашому сайті та архітектувати їх.

Facebook найняв творця OOCSS Ніколь Салліван, щоб отримати багато заощаджень на їхньому першому кінцевому коді (HTML / CSS). Так , ви дійсно можете отримати економію не тільки в вашому CSS, але в вашому HTML теж, що по звуку, дуже можливо для вас , як ви згадуєте перетворення tableмакета , заснованого на багато div

Ще один чудовий підхід, який у деяких аспектах схожий на OOCSS, полягає в плануванні та написанні CSS, щоб він був масштабованим та модульним з самого початку. Джонатан Снук створив блискуче написання та книгу / електронну книгу про SMACSS - масштабована та модульна архітектура для CSS

Дозвольте підключити вас до кількох посилань:
5 помилок масивного CSS - (відео)
5 помилок масивного CSS - (слайди)
CSS Bloat - (слайди)


16

Ви також повинні зрозуміти і каскад, і вагу, і як вони працюють.

Зауважую, ви використовуєте лише ідентифікатори класів (div.title). Чи знали ви, що ви також можете використовувати ідентифікатори, і що ідентифікатор має більшу вагу, ніж клас?

Наприклад,

#page1 div.title, #page1 ul, #page1 span {
  // rules
}

змусить усі ці елементи поділити розмір шрифту, скажімо, або колір, або будь-які ваші правила. Ви навіть можете змусити всі DIV, які є нащадками # page1, отримати певні правила.

Щодо ваги, пам’ятайте, що осі CSS переміщуються від найбільш загальних / найлегших до найбільш специфічних / найважчих. Тобто, у селекторі CSS специфікатор елемента переосмислюється специфікатором класу, який перевизначається специфікатором ідентифікатора. Кількість рахується, тому селектор з двома специфікаторами елементів (ul li) матиме більшу вагу, ніж один із лише одним специфікатором (li).

Думай про це як цифри. А 9 у стовпці "ті" все ще менше, ніж один у десятках. Селектор із специфікатором ідентифікатора, специфікатором класу та двома специфікаторами елементів матиме більше ваги, ніж селектор без ідентифікатора, 500 специфікаторів класу та 1000 специфікаторів елементів. Це, безумовно, абсурдний приклад, але ви розумієте. Справа в тому, що застосування цієї концепції допоможе вам очистити багато CSS.

BTW, додавати специфікатор елемента до класу (div.title) не потрібно, якщо ви не зіткнетесь з іншими елементами, які мають class = "title". Не додайте зайвої ваги, тому що вам, можливо, доведеться скористатися вагою пізніше.


Використання ідентифікаторів погано, як і використання глобальних змінних у коді Visual Basic.
alpav

2
@alpav: Вибачте, це неправильно. Ідентифікатори - це надзвичайний спосіб зробити так, щоб подібні елементи з’являлися по-різному в різних частинах сторінки, не створюючи гайок, створюючи нові імена класів.
Робусто

@Robusto: Чому створити нове ім’я ідентифікатора важче, ніж створити нове ім’я класу?
alpav

@Robusto: створювати нові імена класів насправді простіше, ніж імена ідентифікаторів, тому що з ідентифікаторами ви повинні турбуватися про глобальну сферу дії, а з іменами класів потрібно турбуватися лише про унікальність у локальному масштабі, таку ж вигоду, як і для локальних змінних.
alpav

1
@alpav "Це перемагає мета інкапсуляції - мати можливість називати локально, не думаючи глобально". Правильно, але селектори CSS за своєю суттю глобальні: коли ви пишете .myclass, ви вибираєте все з класом myclass. У CSS класи в цьому відношенні ідентичні ідентифікаторам.
Пол Д. Уейт

12

Чи можу я запропонувати менше CSS Dynamic Framework

Він схожий на SASS, як згадувалося раніше.

Це допомагає підтримувати CSS для батьківського класу.

Напр

 #parent{     
  width: 100%;

    #child1
    {    
     background: #E1E8F2;    
     padding: 5px;    
    }

    #child2
   {
     background: #F1F8E2;
     padding: 15px
   }
 }

Що це робить: Застосовує ширину: 100% як для # child1, так і для # child2.

Також # child1 специфічний CSS належить до #parent.

Це призведе до

#parent #child1
{
 width: 100%;
 background: #E1E8F2;
 padding: 5px;
}

#parent #child2
{
 width: 100%;
 background: #F1F8E2;
 padding: 15px;
}

1
я використовую sass, і може бути, що це різниця між sass і менше, але я впевнений, що він складе як `#parent {width: 100%; } #parent # child1 {фон: # E1E8F2; підкладка: 5px; } #parent # child2 {фон: # F1F8E2; підкладка: 15px; } `
емік

12

Мені важко - перекласти необхідний дизайн сайту на низку правил. Якщо дизайн сайту чіткий і заснований на правилах, то назви вашого класу та структура CSS можуть випливати з цього. Але якщо люди з часом випадковим чином додають невеликі шматочки на сайт, які не мають особливого сенсу, у CSS ви не можете цього зробити.

Я прагну організовувати свої файли CSS приблизно так:

  1. Скидання CSS, заснований на Еріка Мейєра . (Оскільки в іншому випадку я вважаю, що для більшості елементів у мене є щонайменше одне-два правила, які просто скидають стилі браузера за замовчуванням - наприклад, більшість моїх списків не схожі на стиль HTML за замовчуванням для списків.)

  2. Grid system CSS, якщо сайт вимагає. (Я базую шахту на 960.gs )

  3. Стилі для компонентів, які відображаються на кожній сторінці (колонтитули, колонтитули тощо)

  4. Стилі для компонентів, які використовуються в різних місцях сайту

  5. Стилі, що стосуються лише окремих сторінок

Як бачите, більша частина цього залежить від дизайну сайту. Якщо дизайн чіткий і організований, ваш CSS може бути. Якщо ні, то вас накрутили.


7

Моя відповідь - це високий рівень, щоб вирішити проблеми, які виникли у вашому питанні. Можливо, існують організаційні хитрощі низького рівня, і ви можете зробити їх красивішими, але жоден з них не може виправити методологічні недоліки. Є кілька речей, які впливають на вибух CSS. Очевидно, загальна складність сайту, але також такі речі, як іменування семантики, ефективність CSS, організація файлів CSS та встановлення / прийнятність.

Ви, здається, знаходитесь на правильному шляху з іменуванням семантики, але це можна зробити на крок далі. Розділи HTML, які неодноразово з’являються на сайті без структурних модифікацій (відомі як «модулі»), можна вважати коріньми селектора, а звідти ви можете використовувати область внутрішнього макета відносно цього кореня. Це основний принцип об’єктно-орієнтованого CSS , і ви можете прочитати / переглянути більше про це в цій розмові інженера Yahoo .

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

І нарешті, чи будете мати один CSS-файл для всього сайту або декілька файлів (один базовий файл, що використовується для сторінок або -секційних файлів)? Один файл кращий для продуктивності, але може бути складніше зрозуміти / підтримувати з кількома членами команди, а може бути складніше перевірити. Для тестування рекомендую мати одну сторінку CSS-тесту, яка включає кожен підтримуваний модуль CSS для тестування зіткнень та ненавмисного каскадування.

Крім того, ви можете мати декілька файлових підходів , щоб застосувати правила CSS до сторінки чи розділу. Для цього браузер вимагає завантаження декількох файлів, що є проблемою продуктивності. Ви можете використовувати програмування на стороні сервера, щоб динамічно вказати та об'єднати (і мінімізувати) файли CSS в один файл. Але оскільки ці файли є окремими і тестування для них було б окремим, ви вводите можливість невідповідності зовнішнього вигляду на сторінках / розділах. Таким чином тестування стає складніше.

Вам належить проаналізувати конкретні потреби замовника, збалансувати ці проблеми відповідно.


5

Як говорилося раніше: Потрапте в OOCSS. Sass / Less / Compass спокусливо використовувати, але поки ванільний CSS не буде використаний правильним способом, Sass / Less / Compass тільки погіршить.

Перш за все, прочитайте про ефективний css. спробуйте Google Page Speed ​​і прочитайте, що Souders написали про ефективний css.

Потім введіть OOCSS.

  • Навчіться працювати з каскадом. (Зрештою, ми називаємо це каскадними таблицями стилів).
  • Дізнайтеся, як правильно отримати деталізацію (знизу вгору, а не зверху вниз)
  • Дізнайтеся, як розділити структуру та шкіру (що є унікальним та які варіації цих об’єктів?)
  • Дізнайтеся, як розділити контейнер і вміст.
  • Навчіться любити сітки.

Це призведе до революції кожного шрифту щодо написання CSS. Я повністю оновлений і люблю це.

ОНОВЛЕННЯ: SMACSS схожий на OOCSS, але його легше адаптувати.


2
"Sass / Mess / Compass тільки погіршиться" - це досить суб'єктивно та залежно від проекту. Я хотів би зазначити, що використання одного з них спільно з OOCSS справді принесе користь у підтримці багатьох великих проектів (особливо тих, стилі яких часто можна змінювати)
Zach Lysobey

Zach L: OOCSS (або з цього приводу SMACSS) правильно використовується Compass / Less / Sass, необхідний лише для префіксів постачальника.
мадр

Я не буду намагатися це сперечатися занадто багато (особливо, оскільки я зараз не використовую попередній процесор), але я впевнений, що є купа людей, які дійсно вважають такі речі корисними навіть у поєднанні з OOCSS / SMACSS поза питаннями префіксів постачальника
Zach Lysobey

4

Основні принципи для розумного CSS, витягнутого з CSS Refactoring: від додавання лише до модульного CSS

Пишіть у SASS. Вам було б божевільно відмовлятися від переваг змінних, міксин тощо.

Ніколи не використовуйте HTML-код для стилізації; завжди використовуйте заняття . При правильному використанні HTML-ідентифікаторів на всій сторінці відображаються лише один раз, що є повною протилежністю повторного використання - одного з найпростіших товарів у розумній техніці. Крім того, важко перемогти селекторів, що містять ідентифікатори, і часто єдиний спосіб перемогти один HTML ID - це створити інший ідентифікатор, змусивши розповсюдження ідентифікаторів у кодовій базі, як шкідників. Краще залишити HTML-ідентифікатори для незмінного JavaScript або інтеграційних тестових гаків.

Назвіть свої класи CSS за їх візуальною функцією, а не за спеціальною функцією. Наприклад, скажіть ".highlight-box" замість ".bundle-product-знижка-box". Кодування таким чином означає, що ви можете повторно використовувати наявні таблиці стилів, коли займаєтесь сторонніми компаніями. Наприклад, ми розпочали продаж юридичних записок, але нещодавно перейшли до юридичних викладачів. Наші старі класи CSS мали такі назви, як ".download_document_box", ім'я класу, яке має сенс під час розмови про цифрові документи, але буде заплутане лише при застосуванні до нового домену приватних репетиторів. Краще ім'я, яке відповідає як існуючим службам, так і будь-яким майбутнім, буде ".pretty_callout_box".

Уникайте іменування класів CSS після конкретної інформації в сітці. У спільнотах CSS був (і досі є) жахливий антидіапазон, згідно з яким дизайнери та творці фреймворків CSS (кашлюють Twitter Bootstrap ) вважають, що "span-2" або "cols-8" є розумними назвами для класів CSS. Сенс CSS полягає в наданні вам можливості змінити дизайн, не впливаючи на розмітку (багато). Розмір сітки жорсткого кодування в HTML перешкоджає цій цілі, тому не рекомендується в будь-якому проекті, який триватиме довше вихідних. Докладніше про те, як ми пізніше уникали сіткових класів.

Розділіть свій CSS по файлах . В ідеалі ви розділите все на "компоненти" / "віджети", а потім складете сторінки з цих атомів дизайну. Однак реально ви помітите, що на деяких сторінках вашого веб-сайту є ідіосинкразії (наприклад, спеціальний макет або дивна фотогалерея, що з’являється лише в одній статті). У цих випадках ви можете створити файл, пов’язаний із цією певною сторінкою, лише переробляючи його на повнорозмірний віджет, коли стане зрозуміло, що елемент буде повторно використаний в іншому місці. Це компроміс, який мотивується практичними проблемами з бюджету.

Мінімізуйте гніздування. Введіть нові класи замість гнізд селекторів. Те, що SASS знімає біль повторюваних селекторів під час гніздування, не означає, що вам потрібно гніздо на п’яти рівнях. Ніколи не перевищуйте кваліфікацію селектора (наприклад, не використовуйте "ul.nav", де ".nav" може виконати ту саму роботу.) Та не вказуйте елементи HTML поряд із назвою спеціального класу (наприклад, "h2.highlight"). Замість цього просто використовуйте назву класу та опустіть селектор базування (наприклад, попередній приклад повинен бути ".highlight"). Перебір кваліфікованих селекторів не додає значення.

Створюйте стилі для елементів HTML (наприклад, "h1") лише тоді, коли ви створюєте базові компоненти, які повинні відповідати всій програмі. Уникайте широких селекторів, таких як "header ul", тому що, ймовірно, у будь-якому місці вам доведеться їх перекрити. Як ми говоримо, більшу частину часу ти хочеш використовувати певний, добре названий клас, коли хочеш певного стилю.

Отримайте основи модифікатора блоку-елемента. Ви можете прочитати про це, наприклад, тут. Ми використовували його досить легко, але все-таки це нам дуже допомогло в організації стилів CSS.


2

Багато разів я бачу, як люди розбивають файл на розділи, із коментарями до заголовка між розділами.

Щось на зразок

/* Headings and General Text */

.... stuff here for H1, etc..

/* Main page layout */

.... stuff here for layout page setup etc.

Це працює досить добре і може полегшити повернення пізніше і пошук того, над чим ви працюєте.


Це нічого не говорить про занепокоєння запитувача щодо наявності "окремого атрибута CSS для кожної речі".
G-Wiz

1

Ви повинні подивитися на BEM .

Теорія

BEM - це спроба надати набір інструкцій щодо організації та іменування css-селекторів, намагаючись зробити речі більш корисними та модульнішими та уникнути сутичок між селекторами, що часто призводить до коду спагетті та головних болів специфіки.

При правильному використанні це насправді має дуже позитивні наслідки.

  • Стилі роблять те, що ви очікуєте, коли вони додаються до елемента
  • Стилі не протікають і діють лише на те, що вони додані
  • Стилі повністю відокремлені від структури документа
  • Стилі не потрібно змушувати перевтомлювати один одного

BEM добре співпрацює з SASS, щоб принести майже об’єктно-орієнтований стиль до CSS. Ви можете створювати модульні файли, які керують відображенням одного елемента інтерфейсу і містять змінні, наприклад кольори та "методи", такі як обробка внутрішніх елементів. Незважаючи на те, що хардкор OO-програміст може змиритися з цією ідеєю, насправді застосовані концепції приносять багато приємніших частин структур OO, таких як модульність, слабке з'єднання та щільна згуртованість та вільна повторна зручність використання. Ви навіть можете побудувати таким чином, що схожий на інкапсульований об'єкт, використовуючи Сасс та &оперу r.

Більш глибоку статтю журналу Smashing можна знайти тут ; і один із Гаррі Робертса з WS Wizardry (у кого хтось, хто бере участь у css, мусить прочитати) тут .

На практиці

Я використовував це кілька разів, поряд із тим, що використовував SMACSS та OOCSS, тобто маю щось порівняти. Я також працював у деяких великих помилках, часто власних, недосвідчених творінь.

Коли я використовую BEM в реальному світі, я доповнюю техніку двома додатковими принципами. Я використовую класи класів - хороший приклад - клас обгортки:

.page-section {
    width: 100%;
}
@media screen and (min-width: 1200px) {
    margin: 0 auto;
    width: 1200px;
}

І я також дещо покладаюся на каскад та специфіку. Тут модуль BEM був би, .primary-boxі це .headerбув би контекст для конкретного перебігу

.header {
  .primary-box {
    color: #000;
  }
}

(Я намагаюся зробити все можливе, щоб все було максимально універсальним і контекстом вільним, тобто хороший проект майже все є в модулях, які можна повторно використовувати)

Останнє зауваження, що я хотів би зазначити, що хоч як невеликий і не складний ваш проект може здатися, ви повинні зробити це з самого початку з двох причин:

  • проекти збільшують складність, тому важлива закладка хороших основ, включаючи css
  • навіть проект, який здається простим, тому що він побудований на WordPress має мало JavaScript, все ще може бути дуже складним у CSS - ОК, вам не потрібно робити кодування на стороні сервера, щоб ця частина була простою, але передній кінець брошури має двадцять модулів і три варіанти кожного: у вас там дуже складний css!

Веб-компоненти

У 2015 році ми починаємо розглядати веб-компоненти. Я ще не знаю величезної кількості про них, але вони намагаються об'єднати всі функціональні можливості переднього кінця в самостійні модулі, ефективно намагаючись застосовувати всілякі принципи від BEM до переднього кінця в цілому і розбиватися на компоненти, але повністю поєднані. такі елементи, як фрагменти DOM, Js (MVC) та CSS, які створюють один і той же віджет інтерфейсу.

Роблячи це, вони вирішуватимуть деякі оригінальні проблеми, що існують із css, які ми намагалися вирішити з такими речами, як BEM, одночасно роблячи деякі з інших архітектур лицьових сторін більш охайними.

Там яке - то подальше читання тут , а також рамкову Polymer тут що варто подивитися

Нарешті

Я також думаю, що це чудовий, сучасний посібник з найкращих практик css - розроблений спеціально для того, щоб зупинити великі проекти css від безладу. Я намагаюся дотримуватися більшості з них.



0

тут є чудовий матеріал, і дехто зайняв багато часу, щоб відповісти на це питання, однак, якщо мова йде про окремі або окремі таблиці стилів, я б пішов з окремими файлами для розробки, а потім перейшов би до того, щоб усі ваші загальні CSS використовувались на сайті. в один файл при розгортанні.

Таким чином, ви маєте найкраще в обох сферах, підвищує продуктивність (менше HTTP-запитів, що запитуються у браузері) та відокремлює проблеми з кодом під час розробки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.