Чому тире віддають перевагу для CSS-селекторів / атрибутів HTML?


213

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

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

Поповнення та редагування коду

Більшість редакторів розглядають тире як роздільник слів, тому я не можу вкласти в потрібний символ. Скажіть, що клас " featured-product", я повинен автоматично завершити " featured", ввести дефіс та завершити " product".

З підкресленнями " featured_product" трактується як одне слово, тому його можна заповнити за один крок.

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

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

Неоднозначність з арифметичним оператором

Використання тире розбиває доступ до властивостей об'єкта для формування елементів у JavaScript. Це можливо лише підкреслення:

form.first_name.value='Stormageddon';

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

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

$list-item-10
$list-item - 10

Невідповідність змінному іменуванню для різних мов

Ще в той день я писав underscored_namesпро змінні в PHP, ruby, HTML / CSS та JavaScript. Це було зручно і послідовно, але знову ж таки для того, щоб "вписатись" я зараз використовую:

  • dash-case в HTML / CSS
  • camelCase в JavaScript
  • underscore_case в PHP та рубіні

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

var featured_product = $('#featured_product'); // instead of
var featuredProduct = $('#featured-product');

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

Тому я запитую: Чому громада майже повсюдно влаштовується на тире, і чи є причини, які переважають підкреслення?

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


50
Я використовую тире, тому що мені не потрібно натискати клавішу зміни.
Ірод

12
Цікаво, чому це було закрито ... чи були голоси, щоб його закрити? Я не вимагаю думок з цього питання. Я наводив конкретні причини проти використання тире, але для цього повинні бути вагомі причини, якщо всі, здавалося б, погодилися з цією тенденцією. Тут є кілька хороших відповідей та хорошої інформації. Чи можу я покращити питання?
Ендрю Віт

9
Я висуваю своє запитання для повторного відкриття: всі відповіді нижче містять "факти, посилання чи специфічну експертизу" ... тому я не бачу, як це було "не конструктивно".
Ендрю Віт

12
Я думаю, закрити цю тему як неконструктивну було дурним рішенням. Якщо є стиль кодування, який вважається кращим через щось інше, ніж перевагу (простіші завдання для IDE, легше завершення коду, краща інтеграція з інструментами), я думаю, це було б досить конструктивним питанням / відповідями / обговореннями.
Джейк Вілсон

8
@AndrewVit: це дуже вдале запитання, добре відформатований, інформативний та висвітлює декілька аспектів. +1 для цього. До речі, я погоджуюся, що безглуздо закривати цю тему як "неконструктивну" . Насправді це конструктивно.
Sk8erPeter

Відповіді:


130

Заповнення коду

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

Також використання дефісів дозволяє скористатися селектором атрибутів | = , який вибирає будь-який елемент, що містить текст, за бажанням слідує тире:

span[class|="em"] { font-style: italic; }

Це призведе до того, що такі елементи HTML мають шрифт у курсиві:

<span class="em">I'm italic</span>
<span class="em-strong">I'm italic too</span>

Неоднозначність з арифметичним оператором

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

var firstName = $('#first-name');
var firstName = document.querySelector('#first-name');
var firstName = document.forms[0].first_name;

Я вважаю два перші варіанти набагато більш бажаними, тим більше, що вони '#first-name'можуть бути замінені змінною JavaScript і побудовані динамічно. Я також вважаю їх більш приємними на очах.

Той факт, що Sass дає можливість арифметики в своїх розширеннях до CSS, насправді не стосується самого CSS, але я розумію (і сприймаю) той факт, що Sass дотримується мовного стилю CSS (за винятком $префікса змінних, що, звичайно, має бути були @). Якщо документи Sass повинні виглядати як CSS-документи, вони повинні дотримуватися того ж стилю, що і CSS, який використовує тире як роздільник. У CSS3 арифметика обмежена calcфункцією, яка свідчить про те, що в самому CSS це не проблема.

Невідповідність змінному іменуванню для різних мов

Усі мови, будучи мовами розмітки, мовами програмування, мовами стилів або мовами сценаріїв, мають свій власний стиль. Ви знайдете це в підмовах мовних груп, таких як XML, де, наприклад, XSLT використовує малі регістри з дефініторами дефісів, а XML Schema використовує корпус верблюда.

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

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


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

13
Хороший пункт про |=селектора, я бачив це в іншій відповіді, і це справедливий момент. Чи була розроблена мовна конвенція навколо цього чи навпаки? (Дефіси як універсальна тенденція здаються відносно недавніми; вони могли виникнути приблизно в той же час.)
Ендрю Віт,

1
@AndrewVit, є редактори на базі CLI, де подвійне клацання не є актуальним (оскільки миші зазвичай немає), і це може бути налаштовано на таку поведінку. Але загалом ти маєш рацію. |=Селектор атрибуту зроблений спеціально для langатрибута, але його використання може бути продовжено. Я завжди використовував дефіси у своєму CSS, тому не можу говорити для широкої громадськості, але напевно було конвергенція до дефісів із паскальної справи, справи верблюда та підкреслення. Хоча |=я можу сказати, що селектор і дефіс як роздільник є настільки непов'язаними.
Asbjørn Ulsberg

3
Я не бачу позначення крапок як помилку, це CSS, який не повинен був використовувати дефіси. Також те, що радує око, є змінним.
vivek

2
@ KamilKiełczewski Це корисно, але воно працює трохи інакше.
gcampbell

68

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

Документ Mozilla, опублікований в березні 2001 року @ https://developer.mozilla.org/en-US/docs/Underscores_in_class_and_ID_Names

Специфікація CSS1, опублікована в остаточній формі в 1996 році, не дозволяла використовувати підкреслення в іменах класів та ідентифікаторів, якщо вони не були "уникнуті". Уникнутий підкреслення виглядатиме приблизно так:

    p.urgent\_note {color: maroon;}

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

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


6
Дякую! Я люблю з'ясовувати "етимологію" такої конвенції. Це допомагає мені запам'ятати використання конвенції, оскільки я можу пов’язати мову з нею. Наявність асоціації допомагає мені узагальнити мою підсвідомість у використанні конвенції.
Ape-inago

39

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

  1. Підкреслення вимагає натискання клавіші Shift, тому їх важче набрати.

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

  3. Цей подальший виступ на уступі, але ... Будь це міф чи факт, існує давня ідея, що Google трактує слова, розділені підкресленнями, як одне слово, а слова, розділені тире, як окремі слова. (Метт Куттс на підкресленнях проти тире.) З цієї причини я знаю, що зараз я більше віддаю перевагу створенню URL-адрес сторінки - використовувати слова-з тире, і, принаймні, для мене це увійшло до моїх угод про іменування для інших речей , як CSS-селектори.


2
Хороший момент щодо SEO щодо тире в URL-адресах та для семантичної розмітки (незалежно від того, справді це чи ні) ... Чи можете ви уточнити, які "селектори CSS, що входять до офіційних специфікацій CSS, використовують тире"?
Ендрю Віт,

У своїй відповіді я розширив питання 2, щоб навести кілька прикладів, хоча я думав більше про властивості CSS, як текстове оздоблення, а не про "селектори", так що це було дещо помилково, хоча є кілька селекторів, які роблять, як зазначено вище.
Мейсон Жвіті

1
Дякую @albert, це дозволило б власноручно відповісти ... принаймні для історичного контексту. Я не знав, що оригінальна специфікація не дозволила підкреслити! (Але це не має сенсу, чому їх слід заборонити.)
Ендрю Віт,

4
Точка №2 переконала мене, особливо з урахуванням таких властивостей, як колір фону, декорування тексту тощо.
Big McLargeHuge

2
FYI для допитливих, URL-адрес Devge-Temp, на який посилається в коментарі @ albert вище ( devedge-temp.mozilla.org/viewsource/2001/css-underscores ) зараз знаходиться на сайті developer.mozilla.org/en-US/docs/…
aponzani

14

Причин багато, але одна з найважливіших речей - це підтримка послідовності .

Думаю, ця стаття це всебічно пояснює.

CSS - синтаксис з обмеженим дефісом. Під цим я маю на увазі , що ми писати такі речі , як font-size, line-height, і border-bottomт.д.

Так:

Ви просто не повинні змішувати синтаксиси: це непослідовно .


11

Протягом останніх років чіткий зміст у розділених дефісом цілих словах сегментах URL протягом останніх років. Цьому сприяє передовий досвід SEO. Google прямо "рекомендує використовувати в своїх URL-адресах замість підкреслення (_) замість підкреслення (_)": http://www.google.com/support/webmasters/bin/answer.py?answer=76329 .

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

Моя гіпотеза полягає в тому, що позиція Google закріплює цю закономірність в одному ключовому контексті (SEO), а тенденція до використання цієї моделі у назвах класів, id та атрибутів - просто стадо, яке повільно рухається в цьому загальному напрямку.


5

Я думаю, що це річ, яка залежить від програміста. Хтось любить використовувати тире, інші використовують підкреслення.
Я особисто використовую підкреслення ( _), оскільки використовую його і в інших місцях. Такі як:
- змінні JavaScript ( var my_name);
- Мої дії контролера ( public function view_detail)
Ще однією причиною того, що я використовую підкреслення, є те, що в більшості IDE два слова, розділені підкресленнями, розглядаються як 1 слово. (і їх можна вибрати двома клацаннями).

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