Чому ми використовуємо <script> для сценаріїв, а не <style> для зовнішніх CSS?


76

Це запитання мені поставив мій родич, який почав вивчати веб-розробку.

Чому <script src="min.js"></script>і <link rel="stylesheet" href="min.css">? Чому ні <style href="min.css"></style>. Чому ми використовуємо linkтег для додавання зовнішнього CSS на сторінці, але коли ми посилаємо CSS на сторінку, але ми використовуємо, <style>...</style>коли пишемо CSS всередині <head>?

Я сказав йому, що це через специфікацію. Чи є йому ще якась інформація?


6
Ви також можете зробити це: <style type="text/css">@import url("style.css");</style>.
Racket Hazmat,

1
@Rocket, але це не рекомендується розробником
Jitendra Vyas

1
вони згадували в IE @import поводиться так само, як використання <link> внизу сторінки, тому краще не використовувати його.
Jitendra Vyas

3
Я просто думав, що зазначу інший спосіб зробити це, просто щоб зробити речі цікавішими.
Racket Hazmat

6
Тобто, краще не використовувати його. FIFY
Rocket Hazmat

Відповіді:


45

Це історично ... збіг обставин? Ви можете порекомендувати йому прочитати частину про минуле diveintohtml5.info , де між веб-розробниками є кілька цікавих історій, власне листування. Веб-розробники означають, що вони насправді розробляли Інтернет, який ми бачимо сьогодні;)

Тобто <img>тег, до якого ми звикли:

<IMG SRC="file://foobar.com/foo/bar/blargh.xbm">

може бути:

<ICON name="NoEntry" href="http://note/foo/bar/NoEntry.xbm">

або

<A HREF="..." INCLUDE>See photo</A>

або

<INCLUDE HREF="...">

але нарешті розробники вирішили дотримуватися <img>, що вже було реалізовано :

На даний момент ми не готові підтримувати INCLUDE / EMBED. ... Отже, ми, мабуть, підемо (не ICON, оскільки не всі вбудовані зображення можна значущо називати піктограмами). На даний момент вбудовані зображення не мають явного типу вмісту; далі ми плануємо підтримати це (разом із загальною адаптацією MIME). Власне, процедури читання зображень, які ми зараз використовуємо, на мить з’ясовують формат зображення, тому розширення імені файлу навіть не буде значним.

Я не знаю прямої відповіді на ваше запитання, але мене також цікавить <link>тег. Пошук відповіді, ймовірно, міг би включати копання веб-архівів.


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

1
Що б не було вирішено в минулому, це нормально, але W3C може змінитися в майбутньому, наприклад, в HTML 5 text/cssі text/javascriptне є обов'язковим.
Jitendra Vyas

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

27

Існує різниця, принаймні з точки зору W3C.

<style>Елемент являє блок правил CSS , які застосовуються до поточного документа. Тим НЕ менше, зовнішні таблиці стилів фактично розглядаються як цілі документи , пов'язані з поточною сторінки і призначені для користувача агенти можуть вільно ігнорувати такі документи, в залежності від typeі mediaатрибутів посилання. Наприклад:

<link rel="stylesheet" type="text/css" media="screen" href="screen.css" />
<link rel="stylesheet" type="text/css" media="print" href="print.css" />

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

Це зазначено в специфікації:

Коли LINKелемент пов'язує зовнішню таблицю стилів з документом, typeатрибут вказує мову таблиці стилів, а media атрибут - передбачуваний носій або носій візуалізації. Агенти користувачів можуть заощадити час, отримуючи з мережі лише ті таблиці стилів, які стосуються поточного пристрою.


Але ми також можемо визначити носій всередині зовнішнього файлу CSS. Що сьогодні є кращим для збереження http-запитів
Jitendra Vyas

1
@Jitendra, справді ми можемо, але тоді нам доведеться завантажити файл CSS, щоб перевірити його тип носія. Поміщення цієї інформації в <link>елемент дозволяє користувацькому агенту повністю ігнорувати ресурс, не завантажуючи його спочатку, перш ніж він зможе це зробити.
Фредерік Хаміді,


2
Але елементи стилю також підтримують такий mediaатрибут, як " <style type="text/css" media="screen">Ми можемо мати два елементи стилю, один для, media="screen"а інший для media="print". Я не розумію, чому srcатрибут не дозволений для елемента стилю.
user31782

2
@ user31782 ви можете подати петицію до W3C, якщо хочете, але люди тут нічого не можуть з цим зробити.
Пойнті

4

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

Елементи, які використовують src:script img iframe input video frame

Елементи, які використовують href:a link base


7
У HTML немає суперечливості. srcвикористовується для замінених елементів. Ці елементи є частиною документа HTML. В той час, hrefвикористовується для посилання на інші документи. Тут ми вказуємо "відношення" зовнішнього документа до поточного документа.
apnerve

2
@FelipeElia: Насправді, я б стверджував, що використання атрибута <script>' srcне є посиланням, а заміною. Сторінка поводитиметься однаково, незалежно від того, чи використовуєте srcви сценарій, чи додаєте сценарій в рядку (що вважатиметься "заміною").
rinogo

1
@rinogo так, у вас там хороший момент! Думаючи про це зараз, це вірно і для зображень. Хоча ми, як правило, вказуємо на інші файли, ми завжди можемо вставляти їх із base64, що неправда з елементами href. Щоб використовувати вбудований CSS, нам слід використовувати <style> замість <link>.
Феліпе Елія


1

<link>Тег використовується для «посилання» інші документи до поточної, і описати це відносини, або relразом з ним.

Ви також можете використовувати <link>для прив'язки інших речей до документа. Наприклад, значки:

<link rel="shortcut icon" href="favicon.ico" />

3
Погодьтеся: посилання можна використовувати для посилання на багато речей (по одному для кожного типу rel), тому справді дивовижним моментом щодо інтерфейсу є те, чому не використовувати linkдля сценаріїв, як задано тут .
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1

Можлива причина link refпроти style:

linkможе переходити лише туди head, де, як правило head, дозволено "Вміст метаданих" ,

styleне вдалося перейти до bodyпопереднього HTML5 (тепер ви можете з scoped, але все ще не до зовнішніх стилів). Тому вибір між link refі style srcє довільним.

scriptоднак, він міг уже включати зовнішній скрипт bodyдо HTML5, тому він повинен був бути script src. Але оскільки він повинен був існувати, чому б не допустити його також у head(де scriptце вже було дозволено) та заборонити link rel=scriptуникати дублювання?


Це приємна відповідь, але <a> використовує href, і це завжди можна було мати в організмі ...
Феліпе Елія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.