TGViewer
mefody.dev mefody.dev @mefody_dev · 5.39K subscribers
Post #106 2.53K
Приведение численных типов в CSS

Наверняка вы сталкивались с тем, что в CSS нельзя делить, умножать, складывать и вычитать разные единицы измерения. То есть запись calc(100vw / 1px) не работает. А ведь так можно было бы получить количество пикселей в ширине вьюпорта, что можно было бы использовать для каких-нибудь интересных анимаций или других эффектов. Не ширину вьюпорта, а именно число пикселей, без единиц измерения.

Джейн Ори хакнула современные возможности CSS и всё-таки получила ширину вьюпорта числом.

1. Регистрируем CSS-переменную с типом <length>. Так браузер позволит использовать её в операциях с длиной, что пригодится нам дальше.


@property --100vw {
  syntax: "<length>";
  initial-value: 0px;
  inherits: false;
}


2. Используем обратные тригонометрические функции в CSS, а именно тангенс и арктангенс:


--width: calc(
  tan(atan2(var(--100vw), 1px))
);


Из школьного курса геометрии можно вспомнить, как работают тангенс и арктангенс. По сути здесь записано --100vw / 1px, зачем-то обёрнутое в вычисления. Но именно благодаря вычислениям в итоге внутри --width будет лежать число, а именно 100vw в пикселях. Если записать просто calc(var(--100vw) / 1px), вы получите ошибку.

В комментариях к статье Темани Афиф справедливо пишет, что сейчас в Chrome не учитывается тип делителя, что по сути является ошибкой браузерной реализации. То есть напишите там хоть 1px, хоть 1em, разницы нет. Но в будущем, когда тригонометрические функции починят, код с пикселями будет всё равно работать.

https://dev.to/janeori/css-type-casting-to-numeric-tanatan2-scalars-582j
DEV Community CSS Type Casting to Numeric: tan(atan2()) Scalars In current browser implementations of CSS, you cannot divide by length types; calc(100vw / 5px) does...
  • 🔥 28
  • 🤯 22
  • 👍 3
  • 🎉 3
  • 🐳 2
  • 🤔 1
  • 😐 1
More from @mefody_dev
  1. Sep 28, 2026View Transitions Toolkit Брамус делится своей коллекцией утилит, чтобы можно было более уд…
  2. Sep 25, 2026Эффект одометра Люблю такие демки, когда на чистом CSS делают что-то необычное, для чего я…
  3. Sep 23, 2026Цена ошибок гидрации В React есть много ухищрений, чтобы серверный кусок страницы обновилс…
  4. Sep 16, 2026Какие анимации более производительные: CSS или JS? Лучше пару раз увидеть, чем много откуд…
  5. Sep 14, 2026Единица измерения lh Если коротко, то 1lh = 1 line height. И это не размер шрифта, который…
  6. Sep 11, 2026<mermaid-element> Ещё одна полезная библиотека. Брамус собрал кастомный элемент, которому…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →