I am a noob web developer and made a big mistake. I am creating a website for a college project, it needs to be responsive. I have tons of CSS written all in px units. But now for responsiveness, I want to convert all the px to rem. It would be a tiring task to do it one by one. Is there any tool that can help me?
CodePudding user response:
I don't know of any tool that would automatically change all px to rems but you can make the changes quickly if you do something like this:
body {
font-size: 0.625rem;
{
Now 1 rem will be equal to 10 px, if you use Vscode you can enter a shortcut Ctrl F
and choose a Use Regular Expression option in Find input.
Then you can type (\d*)?(\d).?(\d*)?px
in Find field, and $1.$2$3rem
in Replace field.
But be alert, this regex doesn't work for sizes beginning with dot like .5px
.
The search bar should look like this:
If you want to learn how this regular expression works click here.
CodePudding user response:
Regex shouldn't be used this way, but...
This function should work but the predicament you are in is usually a one time thing and I normally advise against using Regex in this manner. The function pxToRem()
:
- Finds all occurrences of a number (even with a decimal) adjacent to the letters 'px'.
- Then a replacer function takes the number part and divides it by 16
- Next it suffixes the new number with 'rem' and replaces the old number and 'px'.
Usage
- Open your stylesheet, select as much of the text you need to change and copy it.
- Next, paste it on a blank .html or .js file.
- Wrap the text in grave marks
```
on a QWERTY keyboard it's the key located upper left hand corner `~ - Assign the string to a variable.
- Copy and paste
pxToRem()
code to the same page.
let css = `.box {width: 32px; height: 16px; border: 6px; padding 2.5px;}`;
function pxToRem(CSSString) {
const rgx = new RegExp(/(\d \.?\d*)px/, 'g');
return CSSString.replace(rgx, (match, n) => (n / 16) 'rem');
}
console.log(pxToRem(css));
Keep in mind that rem
are relative to the font-size
set on :root/html
and if that font-size
happens to be absolute (like the default of 16px) then the styles with rem
aren't responsive, but they have the potential to be responsive. If you use a vmin
units all rem
will react immediately to any changes to the viewport. This not for the faint of heart.