Чи слід використовувати позначення одинарного чи подвійного двокрапки для псевдоелементів?


108

Оскільки IE7 та IE8 не підтримують позначення подвійної двокрапки для псевдоелементів (наприклад, ::afterабо ::first-letter), а оскільки сучасні браузери підтримують позначення однокрапки (наприклад :after) для зворотної сумісності, чи слід використовувати виключно позначення з двокрапкою та коли Частка ринку IE8 падає до незначного рівня, повертаюсь назад і знаходжу / замінюю в моїй кодовій базі? Або я повинен включати обидва:

.foo:after,
.foo::after { /*styles*/ }

Використання подвійного поодинці здається нерозумним, якщо я дбаю про користувачів IE8 (бідні декари).

Відповіді:


71

Як НЕ використовувати обидва в поєднанні з коми. Інтерфейс користувача, сумісний з CSS 2.1 (не підтримує CSS3), ігнорує все правило:

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

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

http://www.w3.org/TR/CSS2/syndata.html#rule-sets

Однак ви можете використовувати

.foo:after { /*styles*/ }
.foo::after { /*styles*/ }

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


7
дякую за включення інформації про кому та ігнорування. Це, певно, мало би мені (а може й іншим) чухати голови на деякий час. Здається, найкраще, коли 99% використовуваних браузерів підтримують позначення подвійної товстої кишки - перейти на використання цього (і тому, що ніхто не відмовиться від підтримки однієї кишки і зламає Інтернет, тому в подальшому не знайдеться навіть сенсу) заміни старого коду на той момент).
jinglesthula

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

2
@Gershom Maes: На жаль, це не для вас, щоб сказати. Думаю, велика частина розробників сподівається на те саме, але це просто не відбудеться.
BoltClock

@Gershom Maes ми можемо мріяти
Джеймс Кушинг

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

62

Від CSS3 Selectors REC :

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

Здається, ви безпечні, використовуючи (лише) нотацію з двокрапкою для псевдоелементів, які вже існували в CSS2.1 як UA, повинні бути сумісними назад.


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

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

@andrewtweber в контексті початкового запитання (IE8), використовуючи подвійний, порушить CSS. Це говорить про те, що на сьогоднішній день більшість сайтів, мабуть, бачать використання IE8 на такому низькому рівні, що дозволяє подвоїтись без значних випадок. Постачальники веб-переглядачів можуть покладатися на те, щоб вони постійно підтримували єдину нотацію, але нічого поганого в переключенні звичок кодування в цей момент.
jinglesthula

@andrewtweber +1 для ОП Так, IE8 повинен був бути врахований у 2012 році, а YMMV - ще у 2015 році у величезних B2B-проектах тощо, але не в інших веб-проектах. Обидві позначення цілком справедливі для цих існуючих псевдо. За допомогою мінімізації CSS вийде 1 байт, використовуючи нотацію з двокрапкою. Якщо ви хочете завжди використовувати одне позначення і забороняти інше, то це умовно, що ви абсолютно вільні робити це зі своєю командою, але це не РЕКОМЕНДАЦІЯ.
FelipeAls

@jinglesthula і Феліпе, ви праві, я не помітив дату. Можливо, відповідь слід оновити, оскільки це запитання набирає високих результатів пошуку
andrewtweber

22

Я абсолютно не згоден з @mddw та @FelipeAls щодо того, щоб вважати використання однієї кишки "безпечною".

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

ТАК, ми хочемо підтримувати сумісність зі старими стандартами. Будемо розбиратися, це рука, яку нам роздали. Але це не означає, що ви маєте привід бути лінивим у своєму розвитку, ігноруючи діючі стандарти на користь застарілих.

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

Якщо псевдоелементи використовують :у CSS2 та ::CSS3, ми не повинні використовувати те чи інше; ми повинні використовувати обидва .

Щоб повністю відповісти на початкове запитання, наступним є найбільш підходящий метод підтримки найсучаснішої реалізації CSS (версія 3), зберігаючи підтримку застарілої версії 2.

.foo:after {
  /* styles */
}
.foo::after {
  /* same styles as above. */
}

3
Я думаю, що досить безпечно припустити, що постачальники браузерів надалі підтримуватимуть старі позначення нескінченно через кількість коду, який реально ніколи не оновлюватиметься, що вони хочуть, щоб їх браузер відображався "правильно". З іншого боку, підтримка окремих копій стилів піднімає червоний прапор DRY, я думаю. Я думаю, що більш прагматично, ніж ледаче, використовувати позначення однокрапки, поки частка ринку IE7 не випаде. Але це означає, що я хочу, щоб мережа рухалася вперед стільки, скільки хтось!
jinglesthula

9
Якщо ви " абсолютно не згодні " з моєю відповіддю, то ви абсолютно не погоджуєтесь зі словом must у Рекомендації W3C. " Зовнішньою метою має бути підтримка відповідності діючим стандартам, підтримуючи якомога більшу кількість застарілих стандартів ". Це те, на що йдеться у цій частині РЕЦ, і чітко зазначено, що ОА не повинні змушувати авторів використовувати обидва позначення і пояснює, як це потрібно зробити для цих ОП. Не соромтеся зв’язатися зі списком розсилки CSS WG, якщо вам це не в порядку (або у Twitter @glazou, співголовою цієї робочої групи)
FelipeAls

4
Я не погоджуюся з цілковитою вашою відповіддю, лише щодо використання однієї кишки як "безпечної". сумісність не дозволена для нових псевдоелементів, тобто будь-які майбутні псевдоелементи будуть реалізовані лише в ::. У відповідності з вашим підходом, люди тоді починають змішувати і поєднувати застосування :і ::для псевдо-елементів. Явне дотримання старого стандарту (який, на даний момент, можливо, підтримується), є суттєвою поганою практикою, і його слід уникати, коли це можливо. Якщо ви не згодні з цим твердженням, ми просто дотримуємось різних поглядів.
Джошуа Бернс

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

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

2

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


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

2
чому б також не зв’язати таку поліфіл, щоб ми могли використовувати її без подальшого гуглінгу?
MightyPork

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

1

Чого варто за статистикою браузера IE 8.0 в минулому році знизився до менш ніж 1% у США.

http://gs.statcounter.com/browser-version-partial-combined-market-share/desktop/united-states-of-america/#monthly-201512-201612

У грудні 2015 року IE 8.0 мав 2,92% ринку. У грудні 2016 року IE 8.0 мав 0,07% ринку.

При такому темпі спаду було б не найгіршою ідеєю припинити підтримку старих версій IE і почати використовувати :: для псевдоелементів.


Що є для чого святкувати :) Також варто зазначити, що це все ще залежить від ситуації. Якщо ви Amazon, 0,5% ваших користувачів дорівнює понад мільйон клієнтів, які вважають, що ваш сайт зламаний. Якщо ви ведете блог для стартапу на 10 осіб, ставки можуть бути різними.
jinglesthula

Безумовно, правда про таку організацію, як Amazon. Але це .77% не розподілено рівномірно серед усього населення. Це непропорційно старі люди або люди з невеликими грошима, які не можуть оновити. З чисто бізнес-точки зору, вони, ймовірно, не є ідеальними цільовими ринками. Тож для більшості компаній група .77% навіть менш значна, ніж те, що пропонує невелика кількість. І ця кількість стане лише меншою.
DR01D

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

0

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

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


1
Як зрозуміли інші відповіді, це трохи складніше, ніж це, і є деякі не очевидні пастки (наприклад, підтримка однозначної двокрапки для псевдоелементів CSS 3 є явним порушенням специфікації, тому для авторів CSS здається розумним не використовувати позначення одиничної двокрапки для цих селекторів).
Марк Амері
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.