csso
csso copied to clipboard
'background-position' compression
Для background-position со значениями вида right top (9 символов) возможно сжатие до 100% 0% (7). То же для остальных пар.
Вместо 0% лучше использовать просто 0.
Если теория и практика подтвердят неломаемость при таком сокращении, будет. В CSS иногда с этим 0%/0 кудрявые штуки вылезают.
Уже много лет повсеместно пишу 0 вместо 0px и 0% — ни разу ни в одном браузере проблем не было. И даже в теории не может: ноль — он в любых единицах измерения ноль.
UPD:
http://www.w3.org/TR/2011/REC-CSS2-20110607/syndata.html#value-def-length
"The format of a length value (denoted by
Это относится к тем свойствам, которые могут принимать абсолютные значения. Например, для rgb и hsl это тоже справедливо.
Сравни, пожалуйста, результат рендеринга этих классов:
.test1 { color: rgb(100%, 0%, 0) }
.test2 { color: rgb(100%, 0%, 0%) }
Вполне вероятно, я чего-то не понимаю, но у меня в нескольких браузерах результат отличается. test1 — чёрный цвет, test2 — красный цвет. Я говорил не только про length, но вообще про подход 0% —> 0.
http://www.w3.org/TR/2011/REC-css3-color-20110607/#numerical Насколько я понял, test1 невалиден, т.к. по спецификации единицы измерения должны быть одинаковыми в пределах одного свойства. Получается, что rgb(100%, 0%, 0%) нужно заменять на rgb(255, 0, 0).
Я бы сказал, что пока такое преобразование делать не нужно, т.к. если не проверять остальные значения (скажем, rgb(0%, 0%, 0%) не изменится в рендеринге), можно ненароком невалидный rgb превратить в валидный, что означает не минимизацию, но исправление CSS, чем CSSO не занимается. Но это можно оставить для будущего unsafe-режима.
Насколько я понимаю, надо сделать проверку на совпадение единиц измерения у всех трёх параметров (это позволит избежать инверсии валидности) и, в случае идентичности, заменять проценты на соответствующие числа: 100% => 255, 0% => 0.
Не совсем понятно, как быть с процентами, которые пересчитываются в абсолютные значения дробно (например, 50% => 127,5). Видимо, в этом случае нужно просто округлять до ближайшего целого (наверняка, это зафиксировано в каком-нибудь стандарте).
Кстати, в процессе изучения вопроса стало понятно, что для hsl и hsla преобразования единиц измерения невозможны.