This plugin creates a new pixel-viewport unit of measurement called a pxv
.
input:
div { width: 150pxv; }
output:
div { width: clamp(1px, calc(150vw * (100 / var(--siteBasis))), calc(150px * var(--siteMax) / var(--siteBasis))); }
"Wow, that looks insane!" you might say. And you'd be right, but there is very good reason for it all, and we've used this very successfully on some large sites.
Use this when you want to reach for a px
but need it to behave like a vw
unit. Rule must support css clamp()
:
✅ Use with | ❌ Don't use with |
---|---|
width |
font-size * |
height |
|
padding |
|
margin |
|
left , right , top , bottom |
|
box-shadow |
|
border |
- Note:
font-size
does support clamp but responsive typography needs a different solution to allow for the browser to still be able to use the zoom functionality. (Please see the 2.0 branch alpha release of kni-scss for this.)
By using css custom properties we can live inject a new "basis" for the scaling.
The plugin requires two custom properties:
--siteBasis
- The size at which your layout was designed--siteMax
- The size at which you want you comp to stop scaling
In an example implementation you may have a site comped at 1440px
, 768px
, and 375px
for desktop, tablet, andd mobile respectively:
:root {
--mobile: 375;
--tablet: 768;
--desktop: 1440;
--mobileMax: 600;
--tabletMax: 900;
--desktopMax: 1900;
--siteBasis: var(--mobileMax);
--siteMax: var(--siteMaxMobile);
}
and in a very simple implementation we can handle 95% of all responsive elements with one media query:
@media (min-width: 768px) {
* {
--siteBasis: var(--tablet);
--siteMax: var(--tabletMax);
}
}
@media (min-width: 1024px) {
* {
--siteBasis: var(--desktop);
--siteMax: var(--desktopMax);
}
}
npm i postcss-pxv --save-dev
for now:
npm i
- edit
index.js
orinput.css
- process css:
node process-css.js