Ответ 1
Когда спецификация говорит...
Каждое свойство, которое позволяет проценты, также определяет значение, на которое указывает процент.
... это определение дается спецификацией, а затем соответствующий пользовательский агент реализует вычисление в соответствии со спецификацией. Спецификация не делает никаких ссылок на пользовательские процентные вычисления. Если мне угрожать догадки, вероятно, потому, что он изменил, как встроенный блок CSS в принципе работает, потенциально может открыть разработчиков до множества осложнений.
Функция calc()
, введенная здесь в той же спецификации, с которой вы ссылаетесь, сама по себе не позволяет вам указать свойство CSS, либо одного элемента, либо другого элемента, что означает, например, что вы не можете сделать что-то вроде этого:
.text {
height: 100px;
line-height: calc(100% * height);
}
Однако есть недавно опубликованный проект под названием CSS Custom Properties для каскадных переменных, который позволяет авторам указывать собственные значения свойств и использовать их в произвольные наборы правил в таблице стилей. И хотя сам модуль не обсуждает способ определения пользователями процентного соотношения, он обсуждает использование каскадных переменных с помощью calc()
.
Это очень многообещающе: поскольку вы уже можете выполнять умножение и деление с помощью calc()
, вы можете полностью эмулировать процентные вычисления путем умножения на десятичное число вместо процента (или просто использовать каскадное значение, как для 100%). Вы даже можете заставить свойства, которые обычно не принимают проценты, такие как border-width
, чтобы их значения были рассчитаны на основе какого-либо другого свойства, используя этот метод.
Вот пример, с интерактивным доказательством концепции, который работает в Firefox 31 и более поздних версиях, где текущий проект реализуется с это письмо:
.text {
--h: 50px;
height: var(--h);
/* 100% of height, given by --h
Line height percentages are normally based on font size */
line-height: var(--h);
/* 20% of height, given by --h
Border properties do not normally accept percentages */
border-width: calc(0.2 * var(--h));
border-style: solid;
}
Единственное предостережение в том, что, поскольку var()
работает только с настраиваемыми свойствами, вам нужно
- объявить значение в своем собственном настраиваемом свойстве, а затем
- любое свойство, зависящее от этого значения, должно получить доступ к пользовательскому свойству через
var()
.
Но тот факт, что он работает, сам по себе очень, очень многообещающий, и мы можем только надеяться, что этот новый модуль будет продолжать развиваться и быть более широко реализованным.