Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Sharing style data
Webkit nodes references style objects (RenderStyle) These objects can be shared by nodes in some conditions. The nodes are siblings or cousins and:
- The elements must be in the same mouse state (e.g., one can't be in :hover while the other isn't)
- Neither element should have an id
- The tag names should match
- The class attributes should match
- The set of mapped attributes must be identical
- The link states must match
- The focus states must match
- Neither element should be affected by attribute selectors, where affected is defined as having any selector match that uses an attribute selector in any position within the selector at all
- There must be no inline style attribute on the elements
- There must be no sibling selectors in use at all. WebCore simply throws a global switch when any sibling selector is encountered and disables style sharing for the entire document when they are present. This includes the + selector and selectors like :first-child and :last-child.
То есть если элементы в одном состоянии мышки (то есть :hover, :active), у них нет id, нет инлайновых стилей (задаваемые через атрибут style), совпадает набор атрибутов, совпадает набор классов и так далее по списку, то такие элементы могут совместно использовать один объект описания стиля (RenderStyle).
Вы задаете стиль для псевдо-элементов, для которых в плане атрибутов все идентично (их попросту нет). Видимо в этом случае (когда стиль задается для псевдо-элементов) игнорируется тот факт, что используется атрибутный селектор, использование которого по идее должно мешать совместному использованию стиля. Вернее в этом случае, атрибутный селектор применяется к элементу (ссылке), а не к самому псевдо-элементу. Это, скорее всего, баг.
Так стоит обратить внимание на последний пункт из списка, который говорит, что если используется хотя бы один контекстный селектор в документе, то webkit сбрасывает глобальный флаг, который позволяет элементам совместно использовать стилевые объекты. Для того чтобы это произошло достаточно чтобы в документе появился любой селектор с комбинаторами + или ~, либо же позиционные селекторы :first-child, :last-child, :nth-child и т.д. То есть как только появляется селектор, для которого важен не только сам элемент, но и его контекст (расположение относительно других элементов), то webkit перестает «экономить» стилевые объекты, так как это может привести к ошибкам. При этом не обязательно, чтобы этот селектор применялся. Поэтому ваш «хак»foo + bar {}помог решить проблему.
Сегодня практически любой сайт содержит как минимум один селектор, который препятствует sharing'у (тем более если используется генерируемое содержимое). Поэтому либо до вас эту проблему никто не ловил, либо баг имеет низкий приоритет.
Необычный баг WebKit с CSS селектором