穆萨妹编者按:CSS是Web合作开发中必不可少的一小部分,随著Web控制技术的急速技术革新,CSS也显得更为强悍。CSS的为数众多优点你晓得了啥?具体内容合作开发中该采用甚么优点才最适宜正确?现如今的许多CSS优点能让他们节省更多的天数。比如说在Web产业布局中,当代CSS优点就能更快的协助他们加速同时实现如等高产业布局,水准横向德博瓦桑县,经典之作的死神产业布局、收录机比率、页脚维持在顶部等效用。Niederbronn后端控制技术研究者边城将详尽如是说许多相同的CSS优点来同时实现那些效用,期望对全校师生略有协助。
variations社会福利:浏览《后端标识符是甚么样智能化聚合的》图书。
一 水准横向德博瓦桑县怎样同时实现水准横向德博瓦桑县能说是CSS丘托韦中的经典之作丘托韦,在多年前那个丘托韦给许多老师都增添了疑惑,但Flexbox产业布局组件和CSS Grid产业布局组件的来临,能说同时实现水准横向德博瓦桑县已是十分的难。Flexbox中同时实现水准横向德博瓦桑县在Flexbox产业布局组件中,无论是单行线却是二百一十三,要让它在罐子中水准垂直德博瓦桑县都是件难事,所以方式也有多种相同。最常用的是在Flex罐子上增设翻转形式,在Flex工程项目上增设margin:auto。先上看在Flex罐子上增设翻转形式。Flex罐子和Flex工程项目上增设翻转形式你可能已经晓得在Flex罐子上增设justify-content、align-items 的值为 center 时,能让原素在Flex罐子中达至水准横向德博瓦桑县的效用。上看一个实例:<!– HTML –><div class=“flex__container”> <div class=“flex__item”></div></div>/* CSS */.flex__container {display: flex; justify-content: center; align-items: center;}效用如下:这种形式特别适应于让Icon图标在罐子中水准横向德博瓦桑县,相同的是在Icon图标罐子上显示增设 display: inline-flex。比如说下面那个实例:<!– HTML –><div class=“flex__container”> <svg> </svg></div>/* CSS */.flex__container { display: inline-flex; align-items: center; justify-content: center;}效用如下:在这种模式之下,如果要让多个原素实现水准横向德博瓦桑县的效用,那还需要加上flex-direction: column,比如说:<!– HTML –><div class=“flex__container”> <div class=“avatar”>🙂</div> <div class=“media__heading”></div> <div class=“media__content”></div> <div class=“action”></div></div>/* CSS */.flex__container { display: flex; flex-direction: column; justify-content: center;align-items: center;}效用如下:在Flexbox产业布局中,还能像下面这样让Flex工程项目在Flex罐子中达至水准横向德博瓦桑县的效用:<!– HTML –><div class=“flex__container”> <div class=“flex__item”></div></div>/* CSS */.flex__container {display: flex; // 或inline-flex justify-content: center;}.flex__item { align-self: center;}效用如下:如果在Flex罐子中有多个Flex工程项目时,该方式同样有效:.flex__container { display: flex; // 或inline-flex justify-content: center;}.flex__container > * { align-self: center;}比如说下面那个效用:除此之外,还能采用 place-content: center 让Flex工程项目同时实现水准横向德博瓦桑县:.flex__container { display: flex; place-content: center;}.flex__item { align-self: center;}效用如下:或者换:.flex__container { display: flex; place-content: center; place-items: center;}效用如下:这两种形式同样适用于Flex罐子中有多个Flex工程项目的情景:.flex__container {display: flex; flex-direction: column; place-content: center;}.flex__container > * { align-self: center;}// 或.flex__container { display: flex; flex-direction: column; place-content: center; place-items: center;}效用如下:可能将许多同学对于place-content 和 place-items 会感到陌生。其实 place-content 是 align-content 和 justify-content 的简写优点;而 place-items 是 align-items 和 justify-items 的简写优点。即:.flex__container { place-content: center; place-items: center;}等效于:.flex__container { align-content: center; justify-content: center; align-items: center; justify-items: center;}虽然扩展出来有四个优点,但最终等效于:.flex__container { display: flex; align-items: center; justify-content: center;}// 二百一十三.flex__container { display: flex; flex-direction: column; align-items: center; justify-content: center;}在Flex工程项目上增设margin: auto如果在Flex罐子中只有一个Flex工程项目,还能显式在Flex工程项目中显式增设 margin 的值为auto,这样也能让Flex工程项目在Flex罐子中水准横向德博瓦桑县。例如:.flex__container { display: flex; // 或 inline-flex}.flex__item { margin: auto;}效用如下:整个过程,你能通过下面那个实例来体验。尝试着选中相同方向的margin 值: Grid中同时实现水准横向德博瓦桑县CSS Grid产业布局能说是当代Web产业布局中的银弹。它也是到目前为止产业布局系统中唯一一个二维产业布局系统。在CSS Grid产业布局中,只需要仅仅的几行标识符也能加速的协助他们同时实现水准横向德博瓦桑县的效用。比如说下面那个实例:<!– HTML –><div class=“grid__container”> <div class=“grid__item”></div></div>/* CSS */.grid { display: grid; // 或 inline-grid place-items: center}效用如下:在CSS Grid产业布局组件中,只要显式增设了display: grid(或 inline-grid)就会创建Grid罐子和Grid工程项目,也会自动聚合网格线,即行和列(默认为一行一列)。在没有显式地在Grid罐子上增设 grid-template-columns 和 grid-template-rows,浏览器会将Grid罐子默认增设为Grid内容大小:这种方式也适用于CSS Grid罐子中有多个子原素(Grid工程项目),比如说:<!– HTML –><div class=“grid__container”> <div class=“avatar”>🙂</div> <div class=“media__heading”></div> <div class=“media__content”></div> <div class=“action”></div></div>那个时候你看到的效用如下:所以 place-items适用于每个单元格。这意味着它将德博瓦桑县单元格的内容。比如说下面那个实例:<!– HTML –><div class=“grid__container”> <div class=“grid__item”> <h3>Special title treatment</h3> <p>With supporting text below as a natural lead-in to additional content.</p> <div class=“action”>Go somewhere</div> </div></div>/* CSS */.grid__container { display: grid; place-items: center;grid-template-columns: repeat(2, 1fr); gap: 2vh;}.grid__item { display: grid; place-items: center;}效用如下:二 等高产业布局等高产业布局也是Web中十分常用的一种产业布局形式,所以同时实现等高产业布局的方案也有许多种相同。这里他们主要上看Flexbox产业布局组件和Grid产业布局组件给他们增添了甚么样的变化。在Flexbox和Grid产业布局模块中,让他们同时实现等高产业布局已经是十分的简单了,比如说:<!– Flexbox –><flex__container> <flex__item></flex__item> <flex__item></flex__item> <flex__item></flex__item></flex__container>/* CSS */.flex__container {display: flex; // 或 inline-flex}简单地说,在罐子上显式增设了 display 的值为 flex 或 inline-flex,该罐子的所有子原素的高度都相等,因为罐子的 align-items 的默认值为 stretch。那个时候你看到的效用如下:这种形式特别适用于卡片组件中:在Grid产业布局组件中类似:<!– HTML –><grid__container> <grid__item></grid__item> <grid__item></grid__item> <grid__item></grid__item></grid__container>/* CSS */.grid__container {display: grid; grid-template-columns: 20vw 1fr 20vw; /* 根据需求调整值*/}效用如下:同样在许多卡片类产业布局中运用:如果需求略有调整,比如说在Flex工程项目 或 Grid工程项目的子原素高度和罐子高度相同。<!– HTML –><flex__container> <flex__item> <content></content> </flex__item></flex__container>/* CSS */.flex__container { display: flex;}.content { height: 100%}// 或.grid__container {display: grid; grid-auto-flow: column;}.content { height: 100%;}效用如下:三 Sticky Footer首先用下图来描述甚么是Sticky Footer产业布局效用:Sticky Footer同时实现方案和等高、横向德博瓦桑县一样,同样有许多种相同方案能同时实现。比如说像下面这样的结构:<!– HTML –><header></header><main></main><footer></footer>先上看Flexbox产业布局组件中的同时实现方案:body { display: flex; flex-direction: column;}footer { margin-top: auto;}能尝试着在 main 区域右下角向下拖动,改变主内容区域的高度,你会发现“当内容不足一屏时,<footer> 会在页面的最顶部,当内容超出一屏时,<footer> 会自动往后延后”。在Flexbox产业布局中,还能在<main> 区域上增设下面的样式,达至相等的效用:body { display: flex; flex-direction: column;}main { flex: 1 0 auto;}效用如下:<main> 中的 flex: 1 0 auto 相当于是:main { flex-grow: 1; /*罐子有剩余空间时,main区域会扩展*/ flex-shrink: 0; /*罐子有不足空间时,main区域不会收缩*/ flex-basis: auto; /*main区域高度的基准值为main内容自动高度*/}如果你想省事的话,能在 main 上显式增设 flex-grow:1,因为 flex-shrink 和 flex-basis 的默认值为 1 和 auto。在CSS Grid产业布局中他们能借助 1fr 让 <main> 区域根据Grid罐子剩余空间来做计算。.grid__container { display: grid; grid-template-rows: auto 1fr auto;}效用如下:四 均分列在Web产业布局中,许多时候会对列做均分产业布局,最为常用的就是在移动端的顶部Bar,比如说下图这样的一个效用:在Flexbox和Grid还没出现之前,如果期望真正的做到均分效用,能用100%(或 100vw)除以具体内容的列数。比如说:<!– HTML –><container> <column></column> <column></column> <column></column></container>/* CCSS */.container { inline-size: 50vw;min-inline-size: 320px; display: flex-row;}.column { float: left; width: calc(100% / 3);}效用如下:通过浏览器调试器中能发现,现个列的宽度都是相等的:在Flexbox和Grid产业布局中,同时实现上面的效用会显得更难地多。先上看Flexbox中的产业布局:<!– HTML –><flex__container> <flex__item></flex__item> <flex__item></flex__item> <flex__item></flex__item></flex__container>/* CSS */.flex__container {inline-size: 50vw; display: flex;}.flex__item { flex: 1;}效用如下:在Flexbox产业布局组件中,当flex取的值是一个单值(无单位的数),比如说实例中的 flex:1,它会当作显式的增设了flex-grow: 1。浏览器计算出来的 flex:接下上看Grid中怎样同时实现上例的效用:<!– HTML –><grid__container> <grid__item></grid__item> <grid__item></grid__item> <grid__item></grid__item></grid__container>/* CSS */.grid__container { display: grid; grid-template-columns: repeat(3, 1fr); /*这里的3表示具体内容的列数*/}最终的效用是相同的:这样的产业布局形式也适用于其他的产业布局中。但无论是Flexbox却是Grid产业布局中,都存在一定的缺陷,当罐子没有足够的空间容纳Flex工程项目(或Grid工程项目)时,Flex工程项目或Grid工程项目会溢出(或隐藏,如果Flex罐子或Grid罐子显式设置了overflow:hidden):修复这种现象最简单的形式是在Flex罐子或Grid罐子显式增设一个 min-width(或 min-inline-size):.flex__container { min-inline-size: 300px;}不过话又说回来,比如说他们的Flex工程项目(或Grid工程项目)是一个卡片,每张卡片宽度是相等之外,更期望罐子没有足够空间时,Flex工程项目(或Grid工程项目)会自动断行排列。他们继续通过实例向大家展示。先上看Flexbox同时实现方案:.flex__container { display: flex; flex-wrap: wrap;}.flex__item { flex: 0 1 calc((100vw – 18vh) / 4); /* calc(100vw -18vh) / 4 是flex-basis的基准值 */}你能尝试着调整浏览器的视窗宽度,当浏览器的视窗越来越小时,Flex罐子宽度也就会越来越小,当Flex罐子小到没有足够的空间容纳四个Flex工程项目(就此例而言),那么Flex工程项目就会断行排列:基于该例,如果把Flex工程项目的 flex 值改成:.flex__item { flex: 0 0 400px;}那个时候,当Flex罐子没有足够空间时,Flex工程项目会按 flex-basis: 400px 计算其宽度,Flex罐子没有足够空间时,Flex就会断行:反过来,如果Flex工程项目的值 flex 改成:.flex__item { flex: 1 0 400px;}当Flex罐子没有足够空间排列Flex工程项目时,Flex工程项目会按 flex-basis: 400px计算其宽度,Flex会断行,并且同一行出现剩余空间时,Flex工程项目会扩展,占满整个Flex罐子:在Grid中同时实现类似的效用要更复杂一点。能采用 repeat() 函数,1fr 以及 auto-fit 等优点:.grid__container { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2vh;}效用如下:如果你对这方面知识感兴趣的话,还可以移步阅读《Container Query Solutions with CSS Grid and Flexbox》一文。其实在Grid中与 auto-fit 对比的值还有一个叫 auto-fill。但两者的差异是十分地大,用下图来描述auto-fit 和 auto-fill 的差异:另外这种形式也是到目前为止一种不需要借助CSS媒体查询就能同时实现响应式产业布局效用。五 死神产业布局死神产业布局(Holy Grail Layout))是Web中典型的产业布局模式。看上去像下图这样:对于死神产业布局而言,HTML结构是有一定的要求,那就是内容为先:<!– HTML –><header></header><main> <article></article> <!– 主内容 –> <nav></nav> <aside></aside></main><footer></footer>在这里主要却是和大家一起探讨,怎样采用Flexbox和Grid产业布局组件来同时实现死神产业布局。先上看Flexbox同时实现方案:body { width: 100vw; display: flex; flex-direction: column;}main { flex: 1; min-height: 0; display: flex; align-items: stretch; width: 100%;}footer { margin-top: auto;}nav { width: 220px; order: –1;}article { flex: 1;}aside { width: 220px;}效用如下:通过在 nav、aside 和 article 上显式增设 order的值,能很好的控制这三个区域的产业布局顺序。比如说说,期望<aside> 在 <article> 之前排列,只需要在上面的实例基础上做一点点调整:nav { order: 0;}aside { order: –1;}效用如下:注意,order的默认值为0,值越大越排在后面!
在上例的基础上,借助CSS媒体对象的优点,能很难同时实现响应式的死神产业布局效用:@media screen and (max-width: 800px) { main { flex-direction: column; } nav, aside { width: 100%; }}效用如下:尝试着拖动浏览器来改变视窗大小,你能看到如下图的效用:在Grid产业布局组件中,同时实现死神产业布局要比Flexbox产业布局组件中更难,所以更灵活。在CSS Grid产业布局组件中,HTML结构能更简洁:<!– HTML –><body> <header></header> <main></main> <nav></nav> <aside></aside> <footer></footer></body>在CSS方面有许多种相同方案能同时实现死神产业布局效用。他们先上看第一种:body { display: grid; grid-template: auto 1fr auto / 220px 1fr 220px;}header { grid-column: 1 / 4;}main { grid-column: 2 / 3; grid-row: 2 / 3;}nav { grid-column: 1 / 2; grid-row: 2 / 3;}aside { grid-column: 3 / 4; grid-row: 2 / 3;}footer { grid-column: 1 / 4;}效用如下:上面实例采用的是网格线来给每个区域进行定位的:和Flexbox产业布局类似,在媒体查询中能改变每个网格区域的位置:@media screen and (max-width: 800px) { body { grid-template-rows: auto; grid-template-columns: auto; } header, main, nav, aside, footer { grid-column: 1 / 2; min-height: auto; } main { grid-row: 3 / 4; margin: 0; } nav { grid-row: 2 / 3; } aside { grid-row: 4 / 5; } footer { grid-row: 5 / 6; }}除了 grid-template(即 grid-template-columns 和 grid-template-rows)之外,在Grid产业布局中还能采用 grid-area 和 grid-template-areas优点的结合,也能很方便的同时实现CSS死神产业布局。基于上面的实例上,只需要把你的CSS调整为:body { display: grid; grid-template-areas: “header header header” “nav main aside” “footer footer footer”;}header { grid-area: header;}main { grid-area: main;}nav { grid-area: nav;}aside { grid-area: aside;}footer { grid-area: footer;}@media screen and (max-width: 800px) { body { grid-template-areas: “header” “nav” “main” “aside” “footer”; }}效用如下:你可能将发现了它之间的差异性:后面那个实例中,<nav>、<main> 和 <aside> 区域宽度相等。这是因为他们实例中通过 grid-template-areas 来声明网格,在采用 grid-template-areas 创建网格时,其实也隐式的创建了网格线,只不过他和 grid-template 相同的是 grid-template 能显式的指定网格轨道大小,而 grid-template-areas 在该实例中相当于网格轨道大小都是 1fr。如果他们期望 <main>的区域显得更大,那么能在grid-template-areas 上做个调整:body { display: grid; grid-template-areas: “header header header header header” “nav main main main aside” “footer footer footer footer footer”;}效用如下:那个时候网格区域的划分像下图这样:虽然在效用略有调整了,但却是均分状态。更快的解决方案是,将grid-template-areas 和 grid-template 结合起来采用:body { display: grid; grid-template-areas: “header header header” “nav main aside” “footer footer footer”; grid-template-columns: 220px 1fr 220px; grid-template-rows: auto 1fr auto;}header { grid-area: header;}main { grid-area: main;}nav { grid-area: nav;}aside { grid-area: aside;}footer { grid-area: footer;}@media screen and (max-width: 800px) { body { grid-template-areas: “header” “nav” “main” “aside” “footer”; grid-template-columns: 1fr; grid-template-rows: auto auto 1fr auto auto; } main { margin-left: 0; margin-right: 0; }}效用如下:你能发现,那个时候,网格线的区域的命名像下图这样:六 12列网格产业布局12列网格产业布局最早是由960.gs提出的网格产业布局系统:12列网格产业布局在设计系统和CSS Framework中经常采用,比如说业内经典之作的Bootstrap就采用了12列网格产业布局系统:在社区中也有许多在线工具,协助他们加速构建12列网格系统,比如说 Free CSS Grid Tools & Resources For Developers 一文中罗列的工具。不过这里主要是想和大家一起看看在Flexbox和Grid产业布局组件中是怎样同时实现12列的网格产业布局系统。先上看Flexbox产业布局组件。12列网格产业布局的HTMl结构一般类似于下面这样:<!– HTML –><flex__grid> <flex__row> <flex__item col4></flex__item col4> <flex__item col4></flex__item col4> <flex__item col4></flex__item col4> </flex__row></flex__grid>注意,12列网格中,一般同一行的列数值和刚好等于12。比如说上面的HTML结构,行中有三列,每列的宽度刚好四个网格宽度加两个列间距。并且在计算的时候有一套成熟的计算公式:而且还设计上也会略有差异,比如说说距离罐子两侧有没有间距等:那些的差异对于计算公式和样式标识符的设计都略有差异。他们用其中一个为例::root { –gutter: 10px; –columns: 12; –span: 1;}.flex__container { display: flex; flex-direction: column; padding-left: var(–gutter); padding-right: var(–gutter);}.flex__row { display: flex; margin-left: calc(var(–gutter) * –1); margin-right: calc(var(–gutter) * –1);}.flex__row + .flex__row { margin-top: 2vh;}.flex__item { flex: 1 1 calc((100% / var(–columns) –var(–gutter)) * var(–span)); margin: 0 var(–gutter);}.flex__item1 { –span: 1;}.flex__item2 { –span: 2;}.flex__item3 { –span: 3;}.flex__item4 { –span: 4;}.flex__item5 { –span: 5;}.flex__item6 { –span: 6;}.flex__item7 { –span: 7;}.flex__item8 { –span: 8;}.flex__item9 { –span: 9;}.flex__item10 { –span: 10;}.flex__item11 { –span: 11;}.flex__item12 { –span: 12;}你会看到的效用如下:在该实例中采用了CSS自定义优点相关的优点,让整个计算显得更难许多。对于采用CSS Grid产业布局组件来实现12列网格产业布局,相对而言,无论是HTML结构却是CSS标识符都会更简易许多。在采用CSS Grid产业布局组件同时实现12列网格产业布局,将会运用到repeat()、minmax()、gap 和 fr等优点。具体内容的来看一个实例吧。<!– HTML –><grid__container> <grid__item></grid__item></grid__container>他们上看CSS标识符:采用 fr将网格均分为相等的值,即每列宽度都是 1 个fr;配合 repeat() 函数,即 repeat(12, 1fr) 创建了12列网格。
采用 gap 能用来控制网格之间的间距。
配合 minmax() 还能增设网格最小值。
具体内容的标识符如下::root { –columns: 12; –gap: 10px; –span: 1;}.grid__container { display: grid; grid-template-columns: repeat(var(–columns), 1fr); grid-template-rows: 1fr; gap: var(–gap); padding-left: calc(var(–gap) / 2); padding-right: calc(var(–gap) / 2);}.grid__item { min-block-size: 10vh; grid-column: span var(–span);}.col1 { –span: 1;}.col2 { –span: 2;}.col3 { –span: 3;}.col4 { –span: 4;}.col5 { –span: 5;}.col6 { –span: 6;}.col7 { –span: 7;}.col8 { –span: 8;}.col9 { –span: 9;}.col10 { –span: 10;}.col11 { –span: 11;}.col12 { –span: 12;}你将看到的效用如下:就该实例而言,grid-template-columns: repeat(12, 1fr) 创建网格如下图所示:除了上述这种粗暴的形式,还能更灵活许多,将 auto-fit、minmax() 以及 grid-auto-flow: dense 等来创建:.grid__container { padding: 1em; display: grid; grid-template-columns: repeat(auto-fit, minmax(60px, 1fr)); gap: 1em; grid-auto-flow: dense;}对于 .grid__item 能通过 grid-column、grid-row来控制网格工程项目的位置:加上 grid-auto-flow: dense 会根据Grid罐子空间,Grid工程项目会自动流到合适的位置:这种产业布局对于杂志类的产业布局十分的适用。有关于这方面更详尽的如是说能阅读@Keir Watson的《Responsive Grid Magazine Layout in Just 20 Lines of CSS》一文。七 两端翻转在Web产业布局中时常碰到两端翻转的需求。在Flexbox产业布局中,时常在Flex罐子中显式增设justify-content 的值:.flex__container { display: flex; flex-wrap: wrap; justify-content: space-between; width: 100%;}但在末尾行,如果和前面行的个数不相同(Flex工程项目)就会出现下图这样的效用:像上图这样的效用,并不是他们所需要的,因为他们期望在最后一行的Flex工程项目不足够排列满一行时,期望Flex工程项目一个紧挨一个的排列:在Flexbox要同时实现上图这样的效用,只需要在Flex罐子中添加一个伪原素:.flex__container::after { content: “”; display: flex; flex: 0 1 32vw;}注意,伪原素的 flex-basis 建议增设的和卡片的 flex-basis(或宽度)等同。那个时候你将看到像下面这样的实例:不过这种形式也不是最佳的形式,当末尾行的个数不只少一个时,就会出现下图这样的效用:面对这样的场景,他们需要给Flex罐子添加额外的空标签原素:占位符原素数量 = 每行最大的列数 – 2
但是 gap优点出现之后,要同时实现这样的效用就不难了:body { padding: 1vh;}.flex__container { display: flex; flex-wrap: wrap; gap: 2vh; width: 100%;}.flex__item{ flex: 0 1 calc((100vw – 8vh) / 4);}效用如下:注意,gap运用在Flexbox中到目前为止,仅得到了Firefox浏览器的支持。上面的实例,采用Firefox浏览器,你看到的效用如下:在CSS Grid产业布局中,就能直接采用 gap:body { padding: 1vh;}.grid__container { display: grid; grid-template-columns:repeat(auto-fit, minmax(300px, 1fr)); gap: 1vh;}效用如下:八 选择最佳的值许多时候,针对相同的场景,设计师会为他们提供相同的设计风格,比如说原素大小:随著 clam() 函数的来临,这一切都显得难地多。clam() 函数接受三个参数,即 clam(MIN, VAL, MAX),其中 MIN 表示最小值,VAL 表示首选值,MAX 表示最大值。它之间:如果 VAL 在 MIN 和 MAX 之间,则采用 VAL 作为函数的返回值。
如果 VAL 大于 MAX,则采用 MAX 作为函数的返回值。
如果 VAL 小于 MIN,则采用 MIN 作为函数的返回值。
他们上看一个实例:.element { /*** MIN = 100px * VAL = 50vw ➜ 根据视窗的宽度计算 * MAX = 500px **/ width: clamp(100px, 50vw, 500px);}比如说浏览器视窗现在所处的位置是1200px的宽度,那么.element 渲染的结果如下:那个时候 .element 原素的 width 是 500px。此时,clamp(100px, 50vw, 500px) 相当于 clamp(100px, 600px, 500px),对应的 VAL 值是 600px,大于 MAX 值,那么那个时候 clamp() 函数返回的值是 MAX,即 500px,那个时候 .element 的 width 值就是 500px(即 MAX 的值)。如果我们把浏览器视窗缩小至760px:那个时候 .element 原素的 width 是 50vw。此时,clamp(100px, 50vw, 500px) 相当于clamp(100px, 380px, 500px),对应的VAL 值是 380px,该值大于 MIN 值(100px),小于 MAX 值(500px),那么那个时候 clamp() 函数返回的值是 VAL,即 50vw,那个时候 .element 的 width 值就是 50vw(即VAL 的值)。如果继续将浏览器的视窗缩小至 170px:那个时候 .element 原素的 width 是 100px。此时,clamp(100px, 50vw, 500px) 相当于 clamp(100px, 85px, 500px),对应的 VAL 值是 85px,该值小于 MIN 值(100px),那么那个时候 clamp() 函数返回的值是 MIN,即 100px,那个时候 .element 的 width 值就是 100px(即MIN 的值)。就该实例而言,clamp(100px, 50vw, 500px) 还能这样来理解:原素 .element 的宽度不会小于 100px(有点类似于原素增设了 min-width: 100px)。
原素 .element 的宽度不会大于 500px(有点类似于原素增设了 max-width: 500px)。
首选值 VAL 为 50vw,只有当视窗的宽度大于 200px 且小于 1000px 时才会有效,即原素 .element 的宽度为 50vw(有点类似于原素增设了 width:50vw)。
九 Logo图标的翻转我想你在Web合作开发中可能将碰到过类似下图的这样的场景:正像上图所示,Logo图像的有大有小(宽度和高度都不一样)。面对这样的业务场景,许多时候都期望设计师能提供相同尺寸的图像。但这样势必会影响Logo图像的外观。前段天数看到@Ahmad Shadeed专门写了一篇博文《Aligning Logo Images in CSS》,就是如是说怎样同时实现上图这样的产业布局效用。其实同时实现这样的产业布局效用,主要运用到的就是CSS的 object-fit 优点,而那个优点早在多年前就得到了各大主流浏览器的支持。这里他们用一个简单的实例,上看看具体内容同时实现过程。先上看HTML结构:<!– HTML –><ul class=“brands”> <li class=“brands__item”> <a href=“#”> <img src=“img/logo.png” alt=“”> </a> </li> <li> <!– … –> </li></ul>德博瓦桑县翻转前面已经如是说过了,这里主要是看图像大小方面的处理:.brands { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); grid-gap: 1rem;}.brands__item { background: #eee;}.brands__item a { display: flex; justify-content: center; align-items: center; height: 100%;}.brands__item img { width: 130px; height: 75px; object-fit: contain;}这样就能同时实现上图的效用。你可能将发现了,有些Logo图像带有背景颜色,如果让效用更好许多,能把CSS混合模式相关的优点运用进来:.brands__item img { width: 130px; height: 75px; object-fit: contain; mix-blend-mode: multiply;}那个时候,你看到的效用如下:object-fit 除了取值 contain 之外,还有其他几个值:其实那个方案也适用于产品图片,人物头像等产业布局。小结文章中主要如是说了Web中许多产业布局的实现思路和具体内容方案。其实文章提到的效用,比如说水准横向德博瓦桑县、等高产业布局、平均分布列和Sticky Footer等,在CSS中一直有多种相同解决方案,只不过随著CSS Flexbox产业布局组件和CSS Grid产业布局组件的来临,同时实现那些效用显得更为灵活和简洁。当然,文章中提到的只是许多最为常用的许多效用,其实在Web产业布局中,特别是Flexbox产业布局和Grid产业布局中还存在着许多有意思的东西,只不过因为篇幅的原因没有一一罗列。如果你感兴趣能再挖掘许多出来,如果你在这方面有更快的经验或方案,欢迎在下面的评论中分享。最后期望这篇文章对你平时的工作略有协助。 社会福利来了 图书免费浏览