Ответ Темани был очень полезным и указал мне правильное направление. После небольшого исследования я думаю, что теперь я могу опубликовать более подробный и правильно подобранный ответ на свой вопрос.
Законно ли применять любое действительное правило CSS к любому элементу HTML?
Да, это . Это четко указано в CSS2.1 spe c: https://www.w3.org/TR/CSS2/about.html#applies -to (CSS3 является модульно-обратно-совместимым расширением CSS2.1, так что это все еще применяется). В нем говорится:
Считается, что все элементы имеют все свойства, но некоторые свойства не оказывают влияния на некоторые типы элементов. Например, свойство 'clear' влияет только на элементы уровня блока.
Считается, что все элементы имеют все свойства неявно означает, что любое свойство может быть установлено для любого элемента.
Некоторые свойства не влияют на рендеринг некоторых элементов означает, что некоторые элементы просто игнорируют определенные свойства при рендеринге (это не означает, что они не может быть унаследовано, читайте дальше).
Может ли какое-либо правило быть унаследованным?
Чтобы ответить на этот вопрос, давайте рассмотрим CSS Значения и единицы Уровень модуля 3 spe c : https://www.w3.org/TR/css3-values/#common -ключевые слова . В нем говорится, что:
Все CSS свойства также принимают значения ключевых слов CSS в качестве единственного компонента значения их свойства.
Существует три CSS значения ключевых слов: initial
, inherit
и unset
.
spe c фактически говорит, что любое свойство может использовать inherit
в качестве значения, таким образом, ответ на вопрос да . Важной деталью, однако, является то, как определяется наследуемое значение. Как уже указывал Темани, это не так просто, как может показаться.
Как вычисляются унаследованные значения?
Отличным показателем каскадирования и наследования является CSS Уровень каскадирования и наследования 3 spe c: https://www.w3.org/TR/css-cascade-3/. В нем говорится, что:
Унаследованным значением свойства элемента является вычисленное значение свойства родительского элемента элемента.
На основе спецификации c, вот моя упрощенная версия процесса определения вычисленного значения для любого свойства любого элемента:
- Соберите все объявленные значения для свойства для элемента - т.е. все соответствующие и действительные объявления CSS, найденные в таблицах стилей разработчика и атрибутах стилей, таблицах стилей пользовательского агента и т. д. c.
- Определите каскадное значение - выигрыш значение всех объявленных значений (в этом случае правила имеют приоритет, а одно выходит сверху).
- Если каскадного значения нет, используйте унаследованное значение , если свойство имеет наследуется.
- Если свойство не наследуется (см. этот вопрос для получения списка свойств, которые наследуются по умолчанию: Какие CSS свойства наследуются? * 10 78 *), используйте начальное значение . Каждое свойство имеет начальное значение в соответствии со значением c (например, начальное значение
font-size
равно medium
; стоит отметить, что оно не является абсолютным значением, как 16px
!). В этот момент для свойства будет присвоено некоторое значение, назначенное ему, но оно может быть относительным значением, т.е. зависеть от некоторые другие свойства CSS (например, процентное значение зависит от некоторого абсолютного значения, такого как абсолютные измерения родителя). На этом шаге значение будет разрешено настолько, насколько это возможно, чтобы оно было однозначным и готово к наследованию .
Важно отметить, что так же, как и значение c определило начальное значение для каждого свойства, оно также определяет, как получить вычисленное значение . Например, MDN указал это вычисленное значение для размера шрифта:
, как указано, но с относительными длинами, преобразованными в абсолютные длины
Таким образом, medium
остается medium
, но 1.2em
становится, скажем, 19.2px
(если размер шрифта родителя 16px
).
Важный бит
То же каскадное и наследуемое spe c указывает, что:
Вычисленное значение существует, даже если свойство не применяется (как определено в строке «Применяется к»). Однако некоторые свойства могут изменить способ определения вычисленного значения в зависимости от того, применяется ли свойство к элементу.
Таким образом, каждый элемент будет иметь вычисленное значение для каждого свойство , но не может его использовать (так называемое используемое значение , которое является следующим шагом после вычисленного значения, равно none). Вычисленное значение - это то, что будет унаследовано.
Что все это означает для моего примера кнопки SVG:
- Мне определенно разрешено устанавливать
stroke
и fill
на <button>
. Он будет игнорировать это свойство при рендеринге, но при необходимости передаст его своим дочерним элементам. - Дочерний SVG будет наследовать эти свойства по умолчанию (мне даже не нужно явно укажите это).
- Вычисленные значения для
stroke
и fill
не имеют никаких оговорок, поэтому я могу ожидать, что правильный цвет будет унаследован (и это так!).