DEV Community

Serhii Pimenov
Serhii Pimenov

Posted on

4 1

Convert units with LESS mixin

This post will be useful for those who use LESS preprocessor for writing CSS styles.

Less (which stands for Leaner Style Sheets) is a backward-compatible language extension for CSS.

Sometimes we are faced with the task of converting units from one value to another. An example from real life - a designer gave us a layout in which all elements are sized in pixels, and according to the terms of the technical task, we need rem units in the styles.

Of course, you can sit and manually calculate the value for each property, but you can do it easier - write a mixin that will do this work for us - we will give it pixels, and it will generate our properties with rem units.

We want to:

Rule 1

.box {
    .px2rem(height, 16px);
}
Enter fullscreen mode Exit fullscreen mode

will convert to:

.box {
    height: 1rem;
}
Enter fullscreen mode Exit fullscreen mode

Rule 2

.box {
    .px2rem(padding, 16px 32px 24px 0);
}
Enter fullscreen mode Exit fullscreen mode

will convert to:

.box {
    padding: 1rem 2rem 1.5rem 0;
}
Enter fullscreen mode Exit fullscreen mode

Let's write our mixin. At the input, it receives property and a set of values (it can be one value or several). If one of the values is 0, no units should be added.

.px2rem(@attr: width; @size: 16) {
    .get-values(length(@size));
    .get-values(@s, @i: 1) when (@i =< length(@size)) {
        @value: extract(@size, @i);

        & when not(@value = 0) {
                @{attr}+_: unit( @value / 16, rem );
        }

        & when (@value = 0) {
                @{attr}+_: 0;
        }

        .get-values(@s, @i + 1);
    }
}
Enter fullscreen mode Exit fullscreen mode

Let's do the same for the reverse transformation from rem to pixels:

.rem2px(@attr: width; @size: 16) {
    .get-values(length(@size));
    .get-values(@s, @i: 1) when (@i =< length(@size)) {
        @value: extract(@size, @i);

        & when not(@value = 0) {
                @{attr}+_: unit( 16 * @value, px );
        }

        & when (@value = 0) {
                @{attr}+_: 0;
        }

        .get-values(@s, @i + 1);
    }
}
Enter fullscreen mode Exit fullscreen mode

Similarly, we can write converters for other units, for example, pt to pixels, pt to rem, and reverse.

.pt2px(@attr: width; @size: 16) {
    .get-values(length(@size));
    .get-values(@s, @i: 1) when (@i =< length(@size)) {
        @value: extract(@size, @i);

        & when not(@value = 0) {
                @{attr}+_: unit( round(@value * 1.333333) , px );
        }

        & when (@value = 0) {
                @{attr}+_: 0;
        }

        .get-values(@s, @i + 1);
    }
}

.px2pt(@attr: width; @size: 16) {
    .get-values(length(@size));
    .get-values(@s, @i: 1) when (@i =< length(@size)) {
        @value: extract(@size, @i);

        & when not(@value = 0) {
                @{attr}+_: unit( round(.75 * @value), pt );
        }

        & when (@value = 0) {
                @{attr}+_: 0;
        }

        .get-values(@s, @i + 1);
    }
}

.pt2rem(@attr: width; @size: 16){
    .get-values(length(@size));
    .get-values(@s, @i: 1) when (@i =< length(@size)) {
        @value: extract(@size, @i);

        & when not(@value = 0) {
                @{attr}+_: unit( round(@value * 1.333333 / 16), rem );
        }

        & when (@value = 0) {
                @{attr}+_: 0;
        }

        .get-values(@s, @i + 1);
    }
}

.rem2pt(@attr: width; @size: 16){
    .get-values(length(@size));
    .get-values(@s, @i: 1) when (@i =< length(@size)) {
        @value: extract(@size, @i);

        & when not(@value = 0) {
                @{attr}+_: unit( round(.75 * 16 * @value), pt );
        }

        & when (@value = 0) {
                @{attr}+_: 0;
        }

        .get-values(@s, @i + 1);
    }
}
Enter fullscreen mode Exit fullscreen mode

SurveyJS custom survey software

Build Your Own Forms without Manual Coding

SurveyJS UI libraries let you build a JSON-based form management system that integrates with any backend, giving you full control over your data with no user limits. Includes support for custom question types, skip logic, an integrated CSS editor, PDF export, real-time analytics, and more.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

πŸ‘‹ Kindness is contagious

Please leave a ❀️ or a friendly comment on this post if you found it helpful!

Okay