Що такого поганого в інтерфейсі CSS?


170

Коли я бачу код і приклади початкового веб-сайту, CSS завжди знаходиться в окремому файлі, названому як-то "main.css", "default.css" або "Site.css". Однак, коли я кодую сторінку, я часто спокушаюся перекинути CSS у відповідність із елементом DOM, наприклад, встановивши на зображення "float: right". У мене виникає відчуття, що це "погане кодування", оскільки це так рідко робиться на прикладах.

Я розумію, що якщо стиль буде застосовано до декількох об'єктів, розумно дотримуватися "Не повторювати себе" (DRY) та призначати його до класу CSS, на який посилається кожен елемент. Однак якщо я не повторюватиму CSS на іншому елементі, то чому б не ввести рядок CSS під час написання HTML?

Питання: Чи вважається використання вбудованого CSS поганим, навіть якщо воно буде використовуватися лише для цього елемента? Якщо так, то чому?

Приклад (це погано?):

<img src="myimage.gif" style="float:right" />

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

3
Я думаю, що стилі інлайнеру ліниві. Я говорю це тому, що я так часто це роблю сам, тому я знаю-чому- я це роблю, тому що не маю уявлення, чи залишиться стиль, тому я раніше це робив прямо біля html. У наші дні, використовуючи html5 та прагматичну підтримку для <style> </style> де завгодно, я використовую поруч тег <style>, поруч із тим, що псуюся з макетом, а потім переміщую його до основного / головного файлу css після. Однакові переваги швидкості та безпосередності, майже жодного з недоліків (побічні ефекти на сторонніх елементах через специфіку).
Kzqai

3
@yu_ominae - майте на увазі, що "комерційні сайти" не завжди дотримуються кращих практик; насправді це досить рідко. Вирішальним фактором є те, якщо розробник знає, піклується і має час; або якщо керівник готовий виділити час і скерувати персонал на виконання. Коли пріоритет роботи полягає у дотриманні граничного терміну, якість зазвичай знижується.
BryanH

1
Варто зауважити, що, хоча видається, що "комерційні сайти" використовують вбудовані стилі, це може бути результатом використання певних дзвінків jQuery (наприклад css()), які застосовують вбудовані стилі.
Дейв Беккер

Відповіді:


203

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

<div style ="font-size:larger; text-align:center; font-weight:bold">

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

<div class="pageheader">  

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

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


18
Ви говорите, що мій приклад не є проблемою, але ви також визнаєте, що ви єретик. Мені подобається такий підхід.
ChessWhiz

8
Якби у мене був нікель кожен раз, коли мені доводилося змінювати поплавок зображення або якийсь інший css, який спочатку мав би бути "лише для одного елемента" ... ... ну, я б вийшов на вечерю в приємному ресторані.
Kzqai

8
Ще один сценарій, коли використовувати не просто вбудований стиль, але й єдиний спосіб що-небудь стилювати: HTML-повідомлення електронної пошти.
Крістоф Маруа

Але і htmlсам файл кешований.

У відповідь на user663031: Веб-сайт з декількома сторінками має багато різних HTML-сторінок, але може поєднувати всі їх стилі лише в одному файлі CSS, який легко кешувати.
Сінторіон

68

Перевага в тому, що інший файл css є

  1. Легко підтримувати вашу html-сторінку
  2. Змінити зовнішній вигляд буде легко, і ви можете мати підтримку багатьох тем на своїх сторінках.
  3. Ваш файл css буде кешований на стороні браузера. Таким чином, ви зробите невеликий внесок у інтернет-трафік, не завантажуючи кілька кілограмів даних щоразу, коли сторінка оновлюється або користувач переходить на ваш сайт.

2
Я задаю собі це питання щомісяця (досить нове для веб-програмування), і це перший раз, коли я прочитав щось про кешований файл css. Це робить це для мене прямо там!
Ґандерс

Я також думав про кеш-пам'ять, але в моєму випадку мені доводиться мати справу з об'єднаними CSS, що є 15-кратними рядками, неможливо зберегти всю велику порцію мотлоху, яка мала бути використана лише один раз на одній сторінці, яка не робить ' t вже існувати. Таким чином, ви кидаєте CSS-код усім під час кожного відвідування по одній тимчасовій сторінці, яку переглядає лише 1% вашого трафіку. Я не впевнений, що трафічний аргумент в Інтернеті справедливий у всіх випадках. На щастя, веб-компоненти збираються змінити речі!
Shadoweb

@Shadowbob - чи не було б краще мати менші файли css замість великих? Майте один загальний, можливо, який використовується для всіх сторінок, але тоді мати невеликі окремі таблиці стилів для інших сторінок. Слід легше обслуговувати. І якщо трафік є проблематичним, то виробництво, ймовірно, може об'єднатися в одне, в процесі збирання.
Дарій.V

26

Підхід html5 до швидкого прототипу CSS

або: <style>теги вже не просто для голови!

Злому CSS

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

Немає атрибута стилю вбудованого типу

Ніколи не створюйте свій css inline, під яким я маю на увазі: <element style='color:red'>або навіть <img style='float:right'>Це дуже зручно, але не відображає фактичної специфіки селектора в реальному файлі css пізніше, і якщо ви збережете його, ви пошкодуєте про завантаження технічного обслуговування пізніше.

Прототип з <style>замість цього

Там, де ви використовували б вбудований css, замість цього використовуйте вбудовані <style> елементи. Спробуйте це! Він прекрасно працює у всіх браузерах, тому чудово підходить для тестування, але дозволяє витончено переміщувати такий css у ваші глобальні файли css, коли вам потрібно / потрібно! (* тільки майте на увазі, що селектори матимуть лише специфіку на рівні сторінки, а не специфіку на рівні сайту, тому будьте обережні, щоб бути занадто загальним) Так само чисто, як у ваших файлах css:

<style>
.avatar-image{
    float:right
}
.faq .warning{
    color:crimson;
}
p{
    border-left:thin medium blue;
    // this general of a selector would be very bad, though.
    // so be aware of what'll happen to general selectors if they go
    // global
}
</style>

Рефакторинг inss css інших людей

Іноді ти навіть не проблема, і ти маєш справу з чужим вбудованим css, і тобі доведеться його рефакторировать. Це ще одне чудове використання для <style>сторінки in, так що ви можете безпосередньо знімати вбудований css та негайно розміщувати його прямо на сторінці в класах, ідентифікаторах чи селекторах під час рефакторингу. Якщо ви будете достатньо обережні з вашими селекторами, тоді ви можете перенести остаточний результат у глобальний файл css наприкінці, просто скопіювавши та вставити.

Кожен біт css негайно перенести відразу у глобальний файл css, але з <style>елементами на сторінці , у нас є альтернативи.


23

Крім інших відповідей .... Інтернаціоналізація .

Залежно від мови вмісту - вам часто потрібно адаптувати стилізацію елемента.

Одним із очевидних прикладів можуть бути мови справа наліво.

Скажімо, ви використовували свій код:

<img src="myimage.gif" style="float:right" />

Тепер скажіть, що ви хочете, щоб ваш веб-сайт підтримував мови rtl - вам знадобиться:

<img src="myimage.gif" style="float:left" />

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

З CSS це легко вирішити за допомогою атрибута lang

Отже, ви можете зробити щось подібне:

img {
  float:right;
}
html[lang="he"] img { /* Hebrew. or.. lang="ar" for Arabic etc */
  float:left;
}

Демо


16

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

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

Нарешті, уявіть, що у вас є 20 таких тегів зображень. Що станеться, коли ти вирішиш, що їх слід плисти ліворуч?


12
"завжди, завжди перемагай" - якщо тільки! важливе значення не використовується в таблиці стилів
Джеймс Вестгейт,

6
Я живу при припущенні, що люди людяні і не користуються такими чудовиськами. =)
issa marie tseng

3
@JamesWestgate, поки хтось не використовує! Важливо в inline css для
переопрацювання

11

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


7
Я заплачу вам 5 баксів, щоб подати "Вбудовані стилі CSS вважаються шкідливими" до ОСББ.
BalinKingOfMoria Reinstate CMs

11

Використовувати вбудований CSS у підтримці набагато складніше.

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


3
+1 - Я дуже схвалюю, коли наші дизайнери роблять це як швидке виправлення, просто для того, щоб щось вирівняти. Використання зовнішнього CSS означає, що ніколи не потрібно робити велику заміну тексту, якщо, звичайно, не працювати на одному аркуші стилів. У мене вчора був випущений шаблон панелі управління, і знадобилося 2 1/2 години, щоб знайти випадки, коли піктограми були перероблені стилями вбудованого. Maddening Я вам кажу .. maddening :)
Tim Post

1
Коли у вас є 50+ SCSS, а ваш елемент Inspect вказує лише на стиснутий CSS, я не впевнений, що CSS виграє у простоті!
Shadoweb

1
@Shadowbob саме для цього створені вихідні карти. thesassway.com/intermediate/using-source-maps-with-sass
Майк Чемберлен

@TimPost є причина, чому народилася функція "перевірити елемент"
Norielle Cruz

9

Це стосується лише рукописного коду. Якщо ви генеруєте код, я думаю, що нормально використовувати тут і далі стилі вбудованого характеру, особливо у випадках, коли елементи та елементи керування потребують особливої ​​обробки.

DRY - це хороша концепція рукописного коду, але в машинному коді я вибираю "Закон деметера": "Що належить разом, то треба залишатися разом". Простіше маніпулювати кодом, який генерує теги стилю, ніж редагувати глобальний стиль вдруге в іншому та "віддаленому" CSS-файлі.

Відповідь на ваше запитання: це залежить ...


7
Я думаю, що це справді правильна відповідь. Мантра «розділення проблем» - це лише один критерій. «Місцевість» також важлива для зручності обслуговування. Ключовим аспектом є те, чи можна використовувати стиль багаторазово на семантичному рівні, а не лише на синтатичному. Якщо це так, то аркуш має сенс. Наприклад, я не збираюся створювати клас для "float: right" лише тому, що два елементи використовують його. Це залежить від того, що елементи семантично однакові. "Кольоровий" стиль, як правило, є семантично пов'язаним (частина теми) і зазвичай йде в аркуші.
коріандр

5

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

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


4

Зазначте, як вам подобається кодувати, але якщо ви передаєте його комусь іншому, найкраще використовувати те, що роблять всі інші. Є причини CSS, то є причини для вбудованого. Я використовую і те, і інше, тому що мені просто простіше. Використання CSS - це чудово, коли у вас багато одного і того ж повторення. Однак, коли у вас є купа різних елементів з різними властивостями, це стає проблемою. Один з прикладів для мене - це коли я розміщую елементи на сторінці. Кожен елемент як інше верхнє та ліве властивість. Якщо я поміщу все це в CSS, це дійсно роздратує безлад, переходячи між сторінками html та css. Тож CSS - це чудово, коли ви хочете, щоб усе було однаковим шрифтом, кольором, ефектом наведення курсору тощо. Але коли все має інше положення, додавання CSS-екземпляра для кожного елемента справді може бути болем. Але це лише моя думка. CSS дійсно має велике значення у великих програмах, коли вам доведеться копати код. Використовуйте плагін для веб-розробників Mozilla, і він допоможе вам знайти ідентифікатори елементів та класи.


2

Навіть якщо ви використовуєте стиль лише один раз, як у цьому прикладі, ви все-таки змішали ЗМІСТ і ДИЗАЙН. Пошук "Розділення проблем".


1

Використання стилів вбудованої системи порушує принцип розділення проблем, оскільки ви ефективно змішуєте розмітку та стиль в одному вихідному файлі. Це також, в більшості випадків, порушує принцип DRY (не повторюйте себе), оскільки вони застосовні лише до одного елемента, тоді як клас може бути застосований до декількох з них (і навіть поширюватися за допомогою магії правил CSS! ).

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

Нарешті, використання класів додає додаткової ясності вашій DOM, оскільки у вас фактично є дескриптори, які говорять вам про те, який елемент є даним вузлом у ньому. Наприклад:

<div class="header-row">It's a row!</div>

Це набагато виразніше, ніж:

<div style="height: 80px; width: 100%;">It's...something?</div>

1

На сьогоднішній день css-сторінка є суттєвою справою, оскільки Google оцінює це як надання кращого досвіду користувача, ніж css, завантажений з окремого файлу. Можливе рішення - помістити css у текстовий файл, завантажити його на льоту за допомогою php та вивести його в головку документа. У <head>розділ включте це:

<head> ...

<?php
$codestring = file_get_contents("styles/style1.txt");
echo "<style>" . $codestring . "</style>";
?>

... </head>

Введіть потрібний css у стилі / style1.txt, і він викинеться у <head>розділі вашого документа. Таким чином, у вас буде вбудований css-файл із перевагою використання шаблону стилю style1.txt, яким можна ділитися будь-якою та всіма сторінками, що дозволяє змінювати стиль стилю для всього сайту лише через один файл. Крім того, цей метод не вимагає від браузера запитувати окремі файли css з сервера (таким чином, мінімізуючи час пошуку / рендерінгу), оскільки все доставляється відразу за допомогою php.

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


Так! це дуже важливо, намагаючись мінімізувати "час на першу фарбу", якщо весь ваш css знаходиться у файлах, він відкладе DOM, поки користувач не завантажив таблиці стилів. Маючи ваші критичні стилі у вбудованому вузлі <styles> в голові, ви можете почати оновлювати DOM негайно та відкладати зовнішні таблиці стилів. Відтворює великий фактор у ~ 3G з'єднаннях і сприйнятій швидкості. +1 для вашої відповіді
Офіційно

1

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


0

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

Зовнішній файл CSS викликає один додатковий дзвінок HTTP до браузера і, таким чином, додаткову затримку. Замість цього, якщо CSS вставлений вбудований, браузер може розпочати його аналіз відразу. Тим більше, що виклики через протокол SSL HTTP дорожчі та додають додаткові затримки на сторінку. Існує багато інструментів, які допомагають генерувати статичні HTML-сторінки (або фрагмент сторінки), вставляючи зовнішні файли CSS як вбудований код. Ці інструменти використовуються на етапі збірки та випуску, де генерується виробничий двійковий файл. Таким чином ми отримуємо всі переваги зовнішнього CSS, а також сторінка стає швидшою.


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

Ти правий. Ось чому ми вбудовуємо CSS, коли розмір коду дуже малий, щоб він не спричиняв занадто великих витрат на розмір сторінки. Є дуже цікава стаття про Yahoo! Сторінка з рекомендаціями щодо розробників Perf.yahoo.com/performance/rules.html, в якій говориться, що 60-80% користувачів щодня відвідують ваш сайт із порожнім кешем ( yuiblog.com/blog/2007/01/04/performance-research-part -2 ) Звичайно, це повністю залежить від популярності веб-сайту - Чим популярніший сайт, тим більше шансів на те, що він не має порожнього кешу.
Diptendu

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

У наші дні багато сучасних веб-сторінок розроблені як додаток для одиночної сторінки. Повна сторінка завантажується лише вперше. Наступного разу сторінка буде змінена через дзвінок AJAX. Тож навіть якщо сторінка багатофункціональна, зовнішній CSS завантажується лише один раз.
Діптенду

0

Згідно з специфікацією HTML AMP , потрібно ввести CSS у свій HTML-файл (проти зовнішньої таблиці стилів) для досягнення продуктивності. Це не означає вбудований CSS, але вони не задають зовнішніх таблиць стилів .

Неповний перелік оптимізацій, які може виконувати така система обслуговування:

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

0

На додаток до інших відповідей, ви не можете орієнтуватися на псевдокласи або псевдоелементи в вбудованому CSS

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