CSS minmax()函数简介
之前写过一篇关于 Grid 布局教程,见CSS Grid 网格布局实例教程,但是都是一些基础的知识,后来随着 Grid 布局规范的成熟,各大浏览器又支持了多个全新的语法特性,其中一个很重要的特性就是 CSS minmax()函数,还是老样子先来看一下语法参数。
语法、参数与说明
语法
minmax(min, max) minmax( [ <length> | <percentage> | <flex> | min-content | max-content | auto ] , [ <length> | <percentage> | <flex> | min-content | max-content | auto ] )
参数
<length> 具体的尺寸值,例如 150px,30vw 等。
<percentage> 百分比值。
<flex> 数据类型表示 grid 容器可伸缩的长度,如 1fr,1.5fr。
min-content 最小内容尺寸。
max-content 最大内容尺寸。
auto 出现出现在 min 的参数位置,则作用等同于 min-content,如果出现在 max 参数位置,作用等同于 max-content。
说明
- minmax(min, max)中,如果 min 的计算值比 max 还要大,则 max 的值会被忽略。
- <flex>数据类型不能作为 min 参数使用。
- minmax 函数只能用在下面 4 个 CSS 属性中:
- grid-template-columns
- grid-template-rows
- grid-auto-columns
- grid-auto-rows
示意
下面是用法,都是合法的,源自MDN 文档:
minmax(200px, 1fr) minmax(400px, 50%) minmax(30%, 300px) minmax(100px, max-content) minmax(min-content, 400px) minmax(max-content, auto) minmax(auto, 300px) minmax(min-content, auto)
兼容性

移动端项目可以放心使用的有木有?有!
内网项目可以放心使用的有木有?有!
学习价值很高的有木有?众人:额……
此刻的我↘

minmax()可不是普通的函数,可以这么说,尚未支持 minmax()函数的 Grid 布局就像夏天的袜子——可有可无。虽然名声很响,看起来也不错,不过语法有点多,学起来有点累,又有替代的实现方法,为什么要非你不可呢?
而支持 minmax()函数的 Grid 布局就像拥有了世间无双的独门绝学,方圆百里,只此一家,无可取代,实现的效果天地撼动万马奔腾剑指九霄。
不信你看。
实例
让大家实现如下图所示的布局,关键是中间分隔线,需要无论是四列还是三行,都能够显示良好,还是有一定难度的。

但是,如果使用 Grid 布局,配合 minmax()函数,则非常智能的布局效果就出来了。
HTML 代码:
<nav class="list">
<a class="list-item" href="#">
<css-icon class="list-item-icon icon-mail"></css-icon>
<span class="list-item-title">商品秒杀</span>
</a>
<a class="list-item" href="#">
<css-icon class="list-item-icon icon-mail"></css-icon>
<span class="list-item-title">商品秒杀</span>
</a>
<a class="list-item" href="#">
<css-icon class="list-item-icon icon-mail"></css-icon>
<span class="list-item-title">商品秒杀</span>
</a>
<a class="list-item" href="#">
<css-icon class="list-item-icon icon-mail"></css-icon>
<span class="list-item-title">商品秒杀</span>
</a>
<a class="list-item" href="#">
<css-icon class="list-item-icon icon-mail"></css-icon>
<span class="list-item-title">商品秒杀</span>
</a>
<a class="list-item" href="#">
<css-icon class="list-item-icon icon-mail"></css-icon>
<span class="list-item-title">商品秒杀</span>
</a>
<a class="list-item" href="#">
<css-icon class="list-item-icon icon-mail"></css-icon>
<span class="list-item-title">商品秒杀</span>
</a>
<a class="list-item" href="#">
<css-icon class="list-item-icon icon-mail"></css-icon>
<span class="list-item-title">商品秒杀</span>
</a>
<a class="list-item" href="#">
<css-icon class="list-item-icon icon-mail"></css-icon>
<span class="list-item-title">商品秒杀</span>
</a>
<a class="list-item" href="#">
<css-icon class="list-item-icon icon-mail"></css-icon>
<span class="list-item-title">商品秒杀</span>
</a>
<a class="list-item" href="#">
<css-icon class="list-item-icon icon-mail"></css-icon>
<span class="list-item-title">商品秒杀</span>
</a>
<a class="list-item" href="#">
<css-icon class="list-item-icon icon-mail"></css-icon>
<span class="list-item-title">商品秒杀</span>
</a>
</nav>
CSS 代码:
.list {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
color: #524940;
border: 15px solid;
position: relative;
background-color: currentColor;
grid-gap: 1px;
overflow:hidden;
}
.list-item {
position: relative;
text-align: center;
color: #e9e3e1;
padding: 30px 15px;
text-decoration: none;
border-radius: 15px;
margin: -1px;
overflow:hidden;
transition:.2s;
outline:0;
}
.list-item:hover,
.list-item:focus{
z-index:1;
color: #ffdd40;
}
.list-item::before {
content: '';
position: absolute;
left:1px;
top:1px;
right:1px;
bottom:1px;
/*inset: 1px;*/
pointer-events: none;
box-shadow: 0 0 0 1px currentColor;
}
.list-item-icon {
font-size: 30px;
}
.list-item-title {
font-size: 16px;
display: block;
margin-top: 15px;
}
css-icon {
display: inline-block;
height: 1em;
width: 1em;
font-size: 20px;
box-sizing: border-box;
text-indent: -9999px;
vertical-align: middle;
position: relative;
}
css-icon::before,
css-icon::after {
content: '';
box-sizing: inherit;
position: absolute;
left: 50%;
top: 50%;
-ms-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
.icon-mail::before {
width: .9em;
height: .75em;
border: 2px solid;
border-radius: 2px;
}
.icon-mail::after {
width: .4em;
height: .4em;
border-style: solid;
border-width: 0 0 2px 2px;
-ms-transform: translate(-50%, -.35em) rotate(-45deg) skew(10deg, 10deg);
transform: translate(-50%, -.35em) rotate(-45deg) skew(10deg, 10deg);
}
视频录屏效果(不动点击播放):
其中,实现的关键代码就是下面这两行:
.container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
}
其中 minmax(150px, 1fr)的含义是每一个列的宽度最小是 150 像素,最大是 1fr,也就是等分宽度。
假设容器现在的宽度是 500 像素,此时每一列的宽度应该是 166.67px,因为此时一定是三列,因为每一列的最小宽度是 150 像素,至少应该是 500/150 列,由于有 1fr 的最大宽度限制,因此,每一列的宽度是 3 列等分尺寸也就是 500px/3。
一个智能的弹性的布局效果就这样达成了,而且这种弹性布局是二维层面的。Table 布局的弹性变化是 1 维的,因为列数无法变化。
结语
当然,CSS Grid 布局发生蜕变开始剑指九霄还离不开一个函数,那就是 CSS repeat()函数。感兴趣的同学可以看一下这篇深入探究 CSS repeat()函数知识及用法
原文链接:《CSS minmax()函数简介》
以上关于CSS minmax()函数简介的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » CSS minmax()函数简介
微信
支付宝