【CSS】min-marginやmax-marginを使いたい

CSSでmin-widthやmax-width同様にmin-marginmax-marginを使いたい時があると思います。
つまり基本的にはvwなどでウィンドウ幅に合わせてmarginを可変にし、指定値以下や指定値以上にはしたくないというときですね。

しかし残念ながらCSSにmin-marginやmax-marginは用意されていないようです(2024/2/14時点)。


でも大丈夫、CSSにはmin関数max関数という便利な関数が用意されており、これで同等の事を実現できます。





min関数

下記のようにmin関数の第一引数に基本サイズ、第二引数に最大サイズを指定してmax-marginを実現する事ができます。

<style>
    .text1 {
        margin-left: min(13vw, 140px);
    }
</style>
<div class="text1">このブロックのmargin-leftは13vw、ただし最大140px。</div>


上記の場合基本サイズを13vwにしているので、ウインドウ幅に合わせてmarginが可変になります。
最大値を140pxにしているので、marginがそれ以上になることはありません。



PCの方は下記で動きをご確認いただけるので、ウィンドウ幅を変えてみてください。

このブロックのmargin-leftは13vw、ただし最大140px。




max-marginを実現するのにmin関数を使ってるので混乱しそうになるかもしれませんが、これはmin関数の仕組みを知ると理解できるかもしれません。

min関数は第一引数と第二引数の内、小さい方を返します。
なので上記の場合第一引数の13vwが第二引数の140pxを超えた瞬間、140pxが適用されるため、最大140pxが実現できるというわけになります。







max関数

max関数の第一引数に基本サイズ、第二引数に最小サイズを指定してmin-marginを実現する事ができます。

<style>
    .text2 {
        margin-left: max(13vw, 110px);
    }
</style>
<div class="text2">このブロックのmargin-leftは13vw、ただし最小110px。</div>


上記の場合、margin-leftが基本13vw、最小110pxになります。



PCの方は下記で動きをご確認いただけます。

このブロックのmargin-leftは13vw、ただし最小110px。



こちらも混乱しそうになるかもしれませんが、max関数の仕組みを知っておくと理解しやすいです。

max関数は第一引数と第二引数の内、大きい方を返します。
上記の場合、第一引数の13vwが第二引数の110pxを下回った瞬間110pxが適用されるので、最小110pxが実現できるというわけになります。







clamp関数

clamp関数はmin関数とmax関数を合わせたようなもので、最小サイズと最大サイズを一括で指定する事ができます。
clamp関数の形式は、clamp(最小サイズ, 基本サイズ, 最大サイズ)になります。

<style>
    .text3 {
        margin-left: clamp(110px, 13vw, 140px);
    }
</style>
<div class="text3">このブロックのmargin-leftは13vw、ただし最小110px、最大140px。</div>


PCの方は下記で動きをご確認いただけます。

このブロックのmargin-leftは13vw、ただし最小110px、最大140px。







ScssやSassで使いたい場合

min関数やmax関数は、ScssやSassで同じことをしようとすると、下記のエラーがでてしまいます。
Incompatible units: ‘vw’ and ‘px’.

これはScssやSassにも同名の関数が定義されており、しかも挙動が違うために起きてしまうようです。
(詳しい挙動についてはこちらの記事がとてもわかりやすく解説してくれています。)



解決するのは簡単でunquote関数を使えばOKです。

.text1 {
    margin-left: unquote('min(13vw, 140px)');
}







以上、CSSでmin-marginやmax-marginを実現する方法でした。


他にもmin-padding、max-padding、min-fontsize、max-fontsizeなども同様の方法で実現できるので、試してみてください!

スポンサーリンク

You can subscribe by SNS

スポンサーリンク

コメントを残す

*