花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 230|回复: 86

CSS函数min、max和clamp

[复制链接]
  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2025-4-3 18:43 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    本帖最后由 马黑黑 于 2025-4-3 19:47 编辑

    当我们给一个元素设置最小、最大宽度,我们自然而然会想到使用 min-width 和 max-width 这两个CSS属性。前缀 min 和 max 分别是最小、最大之意。实际上,CSS 有 min 函数和 max 函数,使用它们我们不仅仅可以设置元素的尺寸,凡可用数值参与表达的属性,都可以通过它们设置最小值和最大值。先来看看 min 函数:

    width: min(50%, 200px);
    width: min(50%, 400px);

    min() 函数支持单值或多值,如果是多值,下一个值与上一个值之间用逗号隔开。多值的时候,浏览器会在这些值当中选取最小的那个值渲染元素对应属性。例如上例,由于受到父元素 600px 的宽度限制,棕褐色 div 所提供的 min(50%, 200px) 两个值当中,50% 为 300px,显然大于 200px,浏览器选择 200px 作为棕褐色盒子的最终宽度。而粉红色的 div min() 函数参数值是 50% 和 400px,后者大于 50% 所得的 300px,故浏览器以二者中最小的 50% 即 300px渲染粉红色盒子的宽度。上例中,可以尝试拖曳父元素右下角缩小其宽度,我们会发现两个子元素最终均以父元素 50% 的宽度呈现,这是因为 min() 函数的第二个参数值大于 50% 计算出来的值,所以只能以 50% 为最终宽度;往大里拖曳父元素,粉红色尺寸也会发生改变,直到其宽度等于 400px,这是因为当父元素的宽度的一般大于 400px 时,粉红色盒子使用最小的 min() 函数参数值作为自己的最终宽度。

    从功能上看,min() 函数用来限制元素指定属性的最小渲染值,函数在执行的时候,浏览器在函数参数值中选取值最小的值返回给元素。max() 函数也是此理,不同的是,它用于限制元素指定属性的最大值、浏览器会从中选取值最大的那个返回给元素。看演示:

    width: max(50%, 200px);
    width: max(50%, 400px);

    上述演示,棕褐色盒子使用 max(50%, 200px) 来限制盒子的最终宽度:当 50% 小于 200px,返回 200px 给元素,反之,当 50% 换算后大于 200px,则返回 50% 给元素。粉红色使用的是 max(50%, 400px),原理与上同。可以尝试改变父元素的宽高查看 50% 与 200px、400px 的大小关系以及元素总是以最大那个值渲染宽度的原则。

    可以嵌套使用 min()、max() 函数来规定一个元素的最小值和最大值。以下演示,银白色的盒子使用 max 函数提供两个值宽度值,红色部分是其中的一个值,浏览器将在这两个值之间选取最大的那个;红色值实际上是不确定的,它由 min 函数提供,浏览器将在其内两个值之间选取最小的那一个给前面的 max 函数作比较,最终才定夺使用哪一个值渲染盒子的宽度,可以拉大父元素观察效果:

    width: max(350px, min(50%, 500px));

    而实现上面的效果,CSS有专门的函数,clamp(最小值, 首选值, 最大值):

    clamp(350px, 50%, 500px);

    不要被 clamp 函数第二个参数名称 首选值 所误导,它实际上是最小值和最大值之间的弹性值。具体来说,浏览器这样做检测:当 50% 换算所得的值小于最小值,就返回最小值,当 50% 换算所得的值大于最大值,就返回最大值,若 50% 换算所得值在最小值和最大值之间,就返回 50% 换算值。所以,缩小父元素,浅蓝色盒子保持最低宽度为 350px,放宽父元素,在父元素宽度的一半没有达到 500px 之前,子盒子都在加大自己的长度,直至加到 500px 就不会再加。

    上述两个演示是等效的,但在 clamp 函数出生以前,老前端程序员们能够使用的唯一方法是 min、max 的嵌套组合。

    min、max、clamp 等函数有着广泛的应用场景。我们以 clamp 为例,通过它,希望帖子最小尺寸为 800 * 400、最大尺寸为 1400 * 760,并能在这二者间自适应。看代码:

    <style>
    #tz {
        position: absolute;
        width: clamp(800px, 90vw, 1400px);
        height: clamp(460px, 90vh, 760px);
        left: 50%;
        transform: translate(-50%, 20px);
        background: #eee;
        border: 2px solid teal;
    }
    </style>
    
    <div id="tz"></div>
        

    最后强调:使用 min、max、clamp 这三个函数的元素是基于父元素的,就是说,它们的参照为父元素的相关属性设置。父元素可以是上一层的某个 HTML 标签,例如,div、body 等。

    评分

    参与人数 4威望 +160 金钱 +320 经验 +160 收起 理由
    梦江南 + 30 + 60 + 30 赞一个!
    小辣椒 + 50 + 100 + 50 赞一个!
    红影 + 50 + 100 + 50 赞一个!
    花飞飞 + 30 + 60 + 30 很给力!

    查看全部评分

  • TA的每日心情
    慵懒
    2025-8-5 16:33
  • 签到天数: 44 天

    [LV.5]常住居民I

    62

    主题

    1万

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女流光溢彩优雅神秘花潮贵宾

    发表于 2025-4-3 19:13 | 显示全部楼层
    max(50%, 200px) 说明中,反之后那句应这个是返回50%吧。
    这个取最大值的时候,如果父框太小,还会出现滚动条
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-8-5 16:33
  • 签到天数: 44 天

    [LV.5]常住居民I

    62

    主题

    1万

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女流光溢彩优雅神秘花潮贵宾

    发表于 2025-4-3 19:19 | 显示全部楼层
    width: max(350px, min(50%, 500px));限于350和500之间了。。这嵌套还挺有意思的。。发明这个的也是神人
    下面的clamp更好玩,就确定一个范围跑不掉了。。
    clamp代替嵌套,真是越来越先进
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-8-5 16:33
  • 签到天数: 44 天

    [LV.5]常住居民I

    62

    主题

    1万

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女流光溢彩优雅神秘花潮贵宾

    发表于 2025-4-3 19:26 | 显示全部楼层
    最后这个直观演示好啊,分明就是演示贴子怎么自适应屏幕大小啊。。。
    预览开始界面是800*460,最大化后就变1400*760,拖拉界面可以看到 变化过程。。。
    这样无论浏览器边框界面大小都能按比例完美显示。。
    好智能的设计。。咋这么聪明涅
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-8-5 16:33
  • 签到天数: 44 天

    [LV.5]常住居民I

    62

    主题

    1万

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女流光溢彩优雅神秘花潮贵宾

    发表于 2025-4-3 19:27 | 显示全部楼层
    90vw,90vh这啥意思呀,为何不是上面例子中的百分比。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-4-3 19:47 | 显示全部楼层
    花飞飞 发表于 2025-4-3 19:13
    max(50%, 200px) 说明中,反之后那句应这个是返回50%吧。
    这个取最大值的时候,如果父框太小,还会出现滚 ...

    额,是的,改了。谢谢
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-4-3 19:47 | 显示全部楼层
    花飞飞 发表于 2025-4-3 19:19
    width: max(350px, min(50%, 500px));限于350和500之间了。。这嵌套还挺有意思的。。发明这个的也是神人
    ...

    它是后面一点出来的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-4-3 19:48 | 显示全部楼层
    花飞飞 发表于 2025-4-3 19:26
    最后这个直观演示好啊,分明就是演示贴子怎么自适应屏幕大小啊。。。
    预览开始界面是800*460,最大化后就 ...

    最主要的,它是可以适配不同显示设备的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-4-3 19:49 | 显示全部楼层
    花飞飞 发表于 2025-4-3 19:27
    90vw,90vh这啥意思呀,为何不是上面例子中的百分比。。

    vw,vh,分别代表屏幕的横向、纵向尺寸单位,1vw = 1% 个屏幕横向距离,1vh = 1% 个屏幕纵向距离
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2025-4-3 20:25 | 显示全部楼层
    clamp 就是那个嵌套的表达吧,那个例子中,当宽度在800和1400之间,就直接显示为90vw,高度也如此。
    这个自适应挺好的,不用考虑设置的过大或过小了。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2025-4-3 20:27 | 显示全部楼层
    貌似也有问题,当自己的图图是竖版的,会不会直接被变成横版了啊
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2025-4-3 20:28 | 显示全部楼层
    这些判断都可以交给电脑了,太省力了,这些函数厉害了
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-8-5 16:33
  • 签到天数: 44 天

    [LV.5]常住居民I

    62

    主题

    1万

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女流光溢彩优雅神秘花潮贵宾

    发表于 2025-4-3 20:40 | 显示全部楼层
    马黑黑 发表于 2025-4-3 19:47
    额,是的,改了。谢谢

    好不容易不是JS的,没那么吓人,一不小心就看进去了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-8-5 16:33
  • 签到天数: 44 天

    [LV.5]常住居民I

    62

    主题

    1万

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女流光溢彩优雅神秘花潮贵宾

    发表于 2025-4-3 20:41 | 显示全部楼层
    马黑黑 发表于 2025-4-3 19:47
    它是后面一点出来的

    函数也很神奇啊,几个字母它就知道要做什么。应该是背后有固定有某个功能的程序,起了这个名字
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-8-5 16:33
  • 签到天数: 44 天

    [LV.5]常住居民I

    62

    主题

    1万

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女流光溢彩优雅神秘花潮贵宾

    发表于 2025-4-3 20:42 | 显示全部楼层
    马黑黑 发表于 2025-4-3 19:48
    最主要的,它是可以适配不同显示设备的

    比如,手机,平板,电脑。。现在明白适配是怎么来的了。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-8-5 16:33
  • 签到天数: 44 天

    [LV.5]常住居民I

    62

    主题

    1万

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女流光溢彩优雅神秘花潮贵宾

    发表于 2025-4-3 20:43 | 显示全部楼层
    马黑黑 发表于 2025-4-3 19:49
    vw,vh,分别代表屏幕的横向、纵向尺寸单位,1vw = 1% 个屏幕横向距离,1vh = 1% 个屏幕纵向距离

    原来它还是百分比,只不过分了横纵。。省了百分号
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-4-3 20:50 | 显示全部楼层
    花飞飞 发表于 2025-4-3 20:43
    原来它还是百分比,只不过分了横纵。。省了百分号

    这是很好用的符号
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-4-3 20:50 | 显示全部楼层
    花飞飞 发表于 2025-4-3 20:42
    比如,手机,平板,电脑。。现在明白适配是怎么来的了。。。

    才明白
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-4-3 20:51 | 显示全部楼层
    花飞飞 发表于 2025-4-3 20:40
    好不容易不是JS的,没那么吓人,一不小心就看进去了。

    还是挺厉害的说
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-4-3 20:54 | 显示全部楼层
    红影 发表于 2025-4-3 20:28
    这些判断都可以交给电脑了,太省力了,这些函数厉害了

    封装的挺优秀
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2025-12-15 13:55 , Processed in 0.102878 second(s), 25 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表