1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-accelerated-mobile-pages

Клонировать/Скачать
writing-css.md 13 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 24.05.2025 06:24 e035f8c

Написание CSS для AMP Runtime?

Кому следует читать этот документ?

Вы вносите изменения в AMP Runtime или добавляете/изменяете AMP расширения? Если да, то вам обязательно следует прочитать этот документ.

Вы пишете решения на основе библиотеки amp (ampstart/ABE)? Этот документ может быть полезен для вас.

Что такое специфичность?Специфичность — это способ, которым браузеры определяют, какие CSS-значения свойств наиболее релевантны элементу и, следовательно, будут применены. Специфичность основана на правилах соответствия, которые состоят из различных типов CSS-селекторов.

Селектор — это то, что может идентифицировать/выбирать элемент или группу элементов и применять список свойств ко всем выбранным элементам.

Пример: CSS-селекторы

 *
 .favorite
 ul#summer-drinks li.favorite
 html body div#pagewrap ul#summer-drinks li.favorite
 html > body div#pagewrap ul#summer-drinks > li.favorite
 .ampstart-dropcap:first-letter
 #summer-drinks::before
 #summer-drinks::after

Селектор может содержать класс, id, псевдоэлементы, псевдоклассы, :not(), а также любую их комбинацию. Для полного списка всех CSS-селекторов см. https://developer.mozilla.org/en-US/docs/Web/CSS/Reference#Selectors. В общем, порядок CSS-селекторов не влияет на то, какие правила применяются к вашему CSS, если только селекторы не имеют одинаковой специфичности и не применяются к общему элементу. Хорошо написанный CSS будет работать идеально даже при перестановке селекторов (например, при перестановке импортов в файле CSS). В реальном мире достичь этого сложно, особенно когда мы импортируем CSS сторонних разработчиков (который может изменяться в любое время).

Как рассчитать специфичностьПосетите CSS Tricks: Specifics on CSS Specificity, который объясняет специфичность простыми словами и показывает, как она рассчитывается (это очень коротко и понятно).Для расчета специфичности используйте этот онлайн-калькулятор: https://specificity.keegan.st/

Написание CSS в AMP Runtime или расширениях

Создание нового селектора

  1. Сохраняйте специфичность на минимальном уровне; свойства селектора должны быть легко переопределяемыми (используя, возможно, один id или имя класса, без необходимости повторения сложного селектора).
  2. Постарайтесь писать селекторы, используя теги и атрибуты; имена классов, добавляемые после сборки, вызывают FOUC (Flash Of Unstyled Content). FOUC — это очень плохой UX. Будьте осторожны и прилагайте максимальные усилия, чтобы избегать использования элементов/классов, которые являются результатом сборки в CSS.
    • Хорошим примером может служить amp-selector.
    • Плохим примером может служить amp-accordion (см. Кей-стади ниже).
  3. Сохраняйте селектор как можно более простым и обеспечивайте его читаемость.

Модификация существующего селектора

Это немного сложнее, чем создание нового селектора (с полностью новыми свойствами).

AMP — это версионная библиотека, используемая многими веб-сайтами. Вы можете задаться вопросом: "Но я изменяю только CSS, как это может сломать AMP?". Да, это может! Все, что требуется для нарушения обратной совместимости, — это замена селектора другим селектором с более высокой специфичностью.1. Не изменяйте специфичность селектора, если это возможно. 2. Если добавляется новое свойство (например, font-size: 12px;), это допустимо добавить новый селектор. 3. Если существующее свойство перемещается между существующими селекторами, убедитесь, что свойства всегда перемещаются с высокой специфичности на низкую. 4. НЕ МОЖЕТЕ перемещать свойства в селектор с высокой специфичностью ни при каких обстоятельствах! Это является разрушающим изменением. 5. Помните, что есть два типа свойств: - Переопределяемые - Непереопределяемые: те, которые окончены !important - Эти свойства легко могут быть перемещены. Однако будьте осторожны, когда вы добавляете !important к существующему свойству, потому что это всегда будет нарушать обратную совместимость (но может исправить проблемы). - Всегда добавляйте !important во время первой попытки и планируйте это на этапе дизайна или ранней фазы реализации.

FOUC

При создании расширений вы всегда должны быть в курсе вещей, которые могут вызвать FOUC (Flash Of Unstyled Content). Это происходит, когда (если) расширение строится очень поздно, и CSS расширения зависит от изменений структуры DOM (добавление класса или тега или, возможно, перестройка самого DOM).Хотя полностью избежать этого невозможно, лучше всего писать селекторы, независимые от результатов сборки. Это гарантирует, что не будет перерисовок (по крайней мере, в начальном состоянии).Один из способов избежать перестроек после сборки — разделить все CSS-свойства на in и out свойства. "In" стили маловероятно вызовут FOUC или вообще не вызовут. "Out" стили могут вызвать FOUC, и мы должны, вероятно, запретить их. Хорошим примером является изменение отступов (padding) по сравнению с отступами (margin) элемента. Изменение отступов во время сборки вполне допустимо, но изменение отступов — огромное "нет".

Правило большого пальца

  1. Создавайте селекторы с низкой спецификой.
  2. В основном можно переносить свойства/селекторы с более высокой спецификой на более низкую.
  3. НЕ переносите свойства/селекторы с более низкой спецификой на более высокую.
  4. Избегайте FOUC, писая CSS для тегов и атрибутов, не зависящих от результатов сборки.

Примеры случаев

Вот несколько примеров того, что НЕ следует делать, используя реальные примеры.

Высокая спецификация CSS для селектора AMP

Вот пример плохого селектора CSS:

amp-selector:not([disabled]) [option][selected]:not([disabled]) {
  outline: solid 1px rgba(0, 0, 0, 0.7);
}

Почему это плохой?

  1. Это селектор с очень высокой спецификой, то есть его очень сложно переопределить с помощью одного имени класса или id.
  2. Отсутствуют комментарии, и он почти непрочитаем.

Единственное хорошее в этом CSS — то, что он полностью избегает FOUC, целенаправленно выбирая теги и атрибуты, а не завися от результатов сборки.Улучшение CSS

Вот как мы изменили этот CSS, чтобы сделать его лучше:

amp-selector [option][selected] {
  outline: solid 1px rgba(0, 0, 0, 0.7);
}
amp-selector [selected][disabled],
amp-selector[disabled] [selected] {
  outline: none;
}

Исправление PR: https://github.com/ampproject/amphtml/commit/e12deb125bc0bed16d33481e0c

Изменения CSS для AMP Accordion нарушили специфичность

- .i-amphtml-accordion-header {
- cursor: pointer;
- background-color: #efefef;
- padding-right: 20px;
- border: solid 1px #dfdfdf;
- }


+ amp-accordion > section > :first-child {
+ cursor: pointer;
+ background-color: #efefef;
+ padding-right: 20px;
+ border: solid 1px #dfdfdf;
+}

Урок, извлеченный из этого случая, заключается в том, что даже если изменение CSS было хорошим (оно исправило FOUC из-за введенного класса на этапе BUILD), оно переместило свойства из селектора с НИЖЕЙШЕЙ специфичностью к ВЫШЕЙШЕЙ, что нарушает обратную совместимость.

Читаемое материальное

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-accelerated-mobile-pages.git
git@api.gitlife.ru:oschina-mirror/mirrors-accelerated-mobile-pages.git
oschina-mirror
mirrors-accelerated-mobile-pages
mirrors-accelerated-mobile-pages
main