Об'єктно-орієнтований CSS

02 жовтня 2014 21:13 comandante 891 2

Це звучить дуже дивно, але ідеї ООП можна реалізувати в CSS, зробивши його більш зручним та швидким.

 

Що таке OOCSS?

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

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

Припустимо, у Вас є H3:

<h3>Я H3</h3>

 

Без використання цього принципу Ви б виконували стилювання так:

h3 {
    padding: 10px;
    font-color: #9ac689;
    font-size: 16px;
    font-weight: bold;
}

 

Спочатку це все буде працювати, але проблема з'являється тоді, коли Ви створите інший H3 і Вам будуть потрібні такі ж характеристики, але інше позиціонування. Це призводить до повторення в CSS.

З допомогою OOCSS, Ви б просто розділити все на класи наступним чином:

<h3 class="padding aside-header">I am an H3</h3>
.padding {
    padding: 10px;
}
.aside-header {
    font-color: #9ac689;
    font-size: 16px;
    font-weight: bold;
}

 

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

Другий принцип полягає в тому, щоб відокремити контейнер від вмісту. Надалі Ви зможете використовувати стилі незалежно від того, де ці елементи в DOM.

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

Ідея полягає в тому, що Ви не повинні робити щось на кшталт:

.header .nav {
    background: #f1f1f1;
}

 

Краще зробити наступним способом:

.nav {
    background: #f1f1f1;
}


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

Переваги використання OOCSS

Як ви бачите, є великі переваги використання OOCSS у реалізації ваших проектів, а саме:

  • Швидші сайти: оскільки Ви не повторюєте код, ваш CSS-файл буде швидше завантажуватись.

  • Таблиці стилів з кращою підтримкою: немає сумнівів у тому, що використання такого підходу зробить Ваш код більш “ремонтопридатним”, якщо Ви захочете змінити колір усіх H3, буде потрібно змінити один рядок, а не десять.

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

Джерело

891 8

Схожі матеріали:

Коментарі:

volodymyr_koval

03 Жов 2014 13:06

Я вважаю, що правила потрібно компонувати та тримати окремі таблиці стилів для типографії, сітки та окремі для спеціальних стилів окремих блоків. При підході описаному в статті, html матиме приблизно наступний вигляд - <h1 class="dark-grey header padding-2em full-width">Caption</h1>. Колись так вже писали <h1 style="color:'#444'; font-weight:700: padding:2em; width:100% ">Caption</h1>.
Про швидкість завантаження я б теж посперечався - одна справа взяти з кеша css-файл, а зовсім інша - завантажувати великі сторінки де кожному елементові присвоєно кілька класів.
А щодо підтримки:
1) якщо для кількох елементів ми маємо клас padding-2em і тут з’являється елемент з полями в 2.5em то це означає новий клас.
2) якщо, раптом, для одного з елементів з класом padding-2em потрібно змінити це значення, то потрібно лізти в html та присвоювати новий клас. А що буде, якщо дані елементи присутні в кількох шаблонах? Всюди шукати та змінювати?

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

andreykko

03 Жов 2014 14:39

Я не прихильник OOCSS, але і не навпаки. Але проблема, що ти написав в пункті 2, існує і в звичайному підході. Да і в своєму прикладі ти приводиш: class="dark-grey header padding-2em full-width", але якщо притримуватися описаних принципів, повинно вийти щось подібне: class="styling-class some-positions-class". Один спільний клас для вигляду елемента, та інший, який може бути різним, з його позиціонуванням.

Авторизуйтесь, щоб залишити коментар.