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()函数简介