OveUI 博客
菜鸟前端笔记

11个好用的单行CSS代码

lee992阅读(717)

本文分享一些非常好用的CSS代码片段,它们很短但功能强大。使用这些代码,我们可以立即提高网站的体验。下面是11个非常好用的CSS代码片段:

1. Scroll behavior

html{
scroll-behavior:smooth;
}

这行简单的代码可以避免编写复杂的JavaScript。
图片

此属性使我们能够定义当用户,单击滚动框中链接时,浏览器的滚动是跳跃还是平稳过渡。Chrome版本61+、Firefox 36+和Edge版本79+支持此属性。

2. Clip path

clip-path:circle(40%);
clip-path:ellipse(130px140pxat10%20%);
clip-path:polygon(50%0,100%50%,50%100%,050%);
clip-path:path('M0200L0,75A5,50,0,1150,75L200200z');
图片

clip path CSS属性可以使我们控制显示区域的哪一部分。区域内的内容显示,而外部隐藏。

3. Filter 属性

filter:drop-shadow(16px16px20pxred);
图片

通过这行css代码,我们可以给图片添加滤镜效果。此属性的视觉效果包括,如阴影、模糊、颜色偏移、反转颜色等。下面给出了其中一些属性。

filter:blur(5px);
filter:contrast(200%);
filter:grayscale(80%);

4. Pseudo-classes

:is(header,main,footer)p:hover{
color:red;
cursor:pointer;
}

:is()函数帮助我们通过选择器列表将相同的样式应用于一组不同的元素。选择器列表作为参数传递给:is()函数,选择器列表中的任何元素都会受到影响。它可以在实现DRY(不要重复你自己的代码)原则时发挥作用。

5. User select

div{
-webkit-user-select:none;/*Safari*/
-ms-user-select:none;/*IE10andIE11*/
user-select:none;/*Standardsyntax*/
}

想阻止你的用户复制文本吗?如果是,则 user-select属性可以帮助我们实现这个功能。user-select 属性指定用户是否可以选择文本。

6. Change cursor

div{
cursor:alias;
}

简单而强大的属性,可以轻松地更改标指针的外观。

图片不同的光标传达不同的含义。例如,可以用cursor:grab属性来表示可移动对象是可拖动的元素。

7. Caret color

input{
caret-color:red;
}

改变输入框光标颜色,同时又不改变输入框里面的内容的颜色。

8. Custom Scrollbars

::-webkit-scrollbar{
width:20px;
}

我们可以轻松地自定义滚动条,使用此属性可以给网站提供独特的触感。此外,还可以轻松更改滚动条轨迹和滑块。

body::-webkit-scrollbar-track{
-webkit-box-shadow:inset006pxrgba(0,0,0,0.9);}

body::-webkit-scrollbar-thumb{
background-color:red;
outline:1pxsolidred;
}

9. Writing mode

writing-mode:vertical-lr;

正确使用Writing mode可以帮助你为网站增添有趣的变化。书写模式设置文本是水平排列还是垂直排列。我们还可以通过将其应用于HTML文件的根元素来设置整个项目。图片

10. Border box

box-sizing:border-box;
width:100%;

将box-sizing 设置为border-box是一个巧妙的技巧,可以避免任何意外的padding问题。它告诉浏览器在该元素的宽度和高度本身中指定的值中包含border 和 padding。例如,如果元素宽度为125px,则添加的任何padding都将包含在该宽度(125px)中。

11. Place items

place-items:centerstretch;

grid布局中,align-items属性控制垂直位置,justify-items属性控制水平位置。这两个属性的值一致时,就可以合并写成一个值。所以,place-items: center;等同于place-items: center center;。

图片

结论

了解这些属性可以避免编写复杂的JavaScript代码。当然,在使用任何CSS属性之前,都应该检查浏览器的兼容性。

如何用一行 CSS 实现 10 种现代布局

lee992阅读(753)

现代 CSS 布局使开发人员只需按几下键就可以编写十分有意义且强大的样式规则。上面的讨论和接下来的帖文研究了 10 种强大的 CSS 布局,它们实现了一些非凡的工作。

01. 超级居中:place-items: center

对于第一个“单行”布局,让我们解决所有 CSS 领域中最大的谜团:居中。我想让您知道,使用 place-items: center 会让此操作比您想象的容易。

首先指定 grid 作为 display 方法,然后在同一个元素上写入 place-items: center。place-items 是同时设置 align-items 和 justify-items 的快速方法。通过将其设置为 center , align-items 和 justify-items 都将设置为 center。

.parent {
display: grid;
place-items: center;
}

这使得内容能够在父级内完美居中,而不管内部大小。

02. 解构煎饼式布局:flex: <grow> <shrink> <baseWidth>

接下来我们有解构的煎饼!这是营销网站的常见布局,例如,可能有一行 3 个项目,通常带有图像、标题,然后是一些描述产品某些功能的文本。在移动设备上,我们希望它们能够很好地堆叠,并随着我们增加屏幕尺寸而扩展。

通过使用 Flexbox 实现此效果,您不需要在屏幕尺寸发生变化时通过媒体查询来调整这些元素的位置。

flex 简写代表:flex: <flex-grow> <flex-shrink> <flex-basis>

正因为如此,如果您想让您的框填充到它们的 <flex-basis> 大小,缩小到更小的尺寸,但不拉伸以填充任何额外的空间,请写入:flex: 0 1 <flex-basis> 。在这种情况下,您的 <flex-basis> 是 150px,所以应该是这样:

.parent {
display: flex;
}

.child {
flex: 0 1 150px;
}

如果您确实希望框在换到下一行时拉伸并填充空间,请将 <flex-grow> 设置为 1 ,所以应该是这样:

.parent {
display: flex;
}

.child {
flex: 1 1 150px;
}

现在,当您增加或减少屏幕尺寸时,这些 flex 项目会缩小和增长。

03. 侧边栏布局:grid-template-columns: minmax(<min>, <max>) …)

此演示对网格布局利用了 minmax 函数。我们在这里做的是将最小侧边栏大小设置为 150px ,但在更大的屏幕上,让它伸展出 25% 。侧边栏将始终占据其父级水平空间的 25%,直到 25% 变得小于 150px 。

将以下值添加为 grid-template-columns 的值:minmax(150px, 25%) 1fr 。在第一列(在这种情况下,侧边栏)的项目其 minmax 为 150px(在25% ),第二列项目(这里指 main 部分)占据其余的空间作为单一的 1fr 轨道。

.parent {
display: grid;
grid-template-columns: minmax(150px, 25%) 1fr;
}

04. 煎饼堆栈布局:grid-template-rows: auto 1fr auto

与 Deconstructed Pancake 不同,当屏幕尺寸改变时,本例不会包含它的子元素。通常称为粘性页脚,这种布局通常用于网站和应用程序,跨多个移动应用程序(页脚通常是工具栏)和网站(单页应用程序通常使用这种全局布局)。

向组件添加 display: grid 将为您提供一个单列网格,但是主区域的高度将仅与页脚下方的内容一样高。

要使页脚粘在底部,请添加:

.parent {
display: grid;
grid-template-rows: auto 1fr auto;
}

1fr页眉和页脚内容设置为自动采用其子项的大小,并将剩余空间 ( 1fr ) 应用于主区域,而auto调整大小的行将采用其子项的最小内容的大小,以便该内容大小增加,行本身将增长以进行调整。

05. 经典圣杯布局:grid-template: auto 1fr auto / auto 1fr auto

对于经典的圣杯布局,有页眉、页脚、左侧边栏、右侧边栏和主要内容。类似于以前的布局,但现在有侧边栏!

要使用一行代码编写整个网格,请使用 grid-template 属性。这使您可以同时设置行和列。

属性和值对为:grid-template: auto 1fr auto / auto 1fr auto 。第一个和第二个以空格分隔的列表之间的斜线是行和列之间的分隔符。

.parent {
display: grid;
grid-template: auto 1fr auto / auto 1fr auto;
}

与上一个示例一样,页眉和页脚具有自动调整大小的内容,这里的左侧和右侧边栏会根据其子项的固有大小自动调整大小。但是,这次是水平尺寸(宽度)而不是垂直尺寸(高度)。

06. 12 跨网格:grid-template-columns: repeat(12, 1fr)

接下来我们有另一个经典布局:12 跨网格。您可以使用 repeat() 函数在 CSS 中快速编写网格。对网格模板列使用 repeat(12, 1fr); 将为每个 1fr 提供 12 列。

.parent {
display: grid;
grid-template-columns: repeat(12, 1fr);
}

.child-span-12 {
grid-column: 1 / 13;
}

现在您有一个 12 列的轨道网格,我们可以将子项放在网格上。一种方法是使用网格线放置它们。例如, grid-column: 1 / 13 将跨越从第一到最后一行(第 13 行)并跨越 12 列。grid-column: 1 / 5; 将跨越前四个列。

另一种方法是使用 span 关键字。使用 span ,您可以设置起始线,然后设置从该起点跨越的列数。在这种情况下,grid-column: 1 / span 12 将等效于 grid-column: 1 / 13 ,而 grid-column: 2 / span 6 将等效于 grid-column: 2 / 8 。

.child-span-12 {
grid-column: 1 / span 12;
}

07. RAM 技巧

grid-template-columns: repeat(auto-fit, minmax(<base>, 1fr))

Una Kravets 称之为 repeat, auto, minmax 技巧。这在弹性布局 图片/box 这类非常有用(一行可以摆放的卡片数量自动适应)。

  .ex7 .parent {
  display: grid;
  grid-gap: 1rem;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}
<div class="parent white">
  <div class="box pink">1</div>
  <div class="box purple">2</div>
  <div class="box blue">3</div>
  <div class="box green">4</div>
</div>

其效果是如果能够满足多个 box 的最小宽度(比如上面的 150px),自动弹性适应放在多行。举个例子:

  1. 当前宽度是 160px(不考虑 gap),那么上面四个 box 的宽度会自适应为 160px,并且分为 4 行
  2. 当前宽度是 310px (不考虑 gap),上面四个 box 分成两行,两个 box 平分宽度
  3. 当满足一行放下 3 个box 时,第三个 box 自动到第一行
  4. 当满足一行放下 4 个 box 时,第四个 box 自动到第一行

如果我们将 auto-fit 改为 auto-fill:

.parent {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
}

08. 排列布局:justify-content: space-between

对于下一个布局,这里要主要说明的是 justify-content: space-between ,它将第一个和最后一个子元素放置在其边界框的边缘,其余空间均匀分布在元素之间。对于这些卡片,它们被放置在 Flexbox 显示模式中,使用 flex-direction: column 将方向设置为 column。

这会将标题、描述和图像块放在父卡片内的垂直列中。然后,应用 justify-content: space-between 将第一个(标题)和最后一个(图像块)元素锚定到 flexbox 的边缘,并且它们之间的描述性文本以相等的间距放置到每个端点。

.parent {
display: flex;
flex-direction: column;
justify-content: space-between;
}

09. 保持我的风格:clamp(<min>, <actual>, <max>)

这里,我们介绍一些只有少数浏览器支持的技术,但这些技术对布局和响应式 UI 设计有非常令人兴奋的影响。在本演示中,您将使用固定工具设置宽度,如下所示:width: clamp(<min>, <actual>, <max>) 。

这将设置绝对最小和最大尺寸以及实际尺寸。有了值,应该这样:

.parent {
width: clamp(23ch, 60%, 46ch);
}

这里的最小尺寸是 23ch 或 23 个字符单元,最大尺寸是 46ch ,46 个字符。字符宽度单位基于元素的字体大小(特别是 0 字形的宽度)。“实际”尺寸为 50%,代表此元素父宽度的 50%。

在这里, clamp() 函数所做的是使该元素保持 50% 的宽度,直到 50% 大于 46ch (在较宽的视口上)或小于 23ch (在较小的视口上)。您可以看到,当我拉伸和收缩父尺寸时,这张卡片的宽度会增加到其最大限制点并减小到其限制最小点。然后它保持在父级的中心,因为我们已经应用了其他的属性来将它居中。这可以实现更清晰的布局,因为文本不会太宽(超过 46ch )或太窄(小于 23ch )。

这也是实现响应式排版的好方法。例如,您可以编写:font-size: clamp(1.5rem, 20vw, 3rem) 。在这种情况下,标题的字体大小将始终保持在 1.5rem 和 3rem 之间,但会根据 20vw 实际值增大和缩小以适应视口的宽度。

这是一种很好的技术,可以通过最小和最大尺寸值确保易读性,但请记住,并非所有现代浏览器都支持它,因此请确保您有回退措施并进行测试。

10.保持宽高比:aspect-ratio: <width> / <height>

最后要介绍的这一布局工具是最具实验性的工具。它最近在 Chromium 84 中被引入 Chrome Canary,Firefox 正在积极努力实现这一点,但目前还没有任何稳定的浏览器版本。

不过,我确实想提及这一点,因为这是一个经常遇到的问题。这只是简单地保持图像的宽高比。

使用 aspect-ratio 属性,当我调整卡片大小时,绿色视觉块保持 16 x 9 的宽高比。我们通过 aspect-ratio: 16 / 9 保持此宽高比。

.video {
aspect-ratio: 16 / 9;
}

要在没有此属性的情况下保持 16 x 9 的宽高比,需要使用 padding-top hack 并为其提供 56.25% 的 padding 以设置顶宽比。我们很快就会有一个属性来避免黑客攻击和计算百分比的需要。可以使用 1 / 1 的比例制作正方形,使用 2 / 1 制作 2:1 比例。可以设置任何图像缩放比例。

.square {
aspect-ratio: 1 / 1;
}

虽然此功能仍在不断完善中,但它值得了解,因为它解决了许多开发人员面临的冲突,我自己也多次面临,尤其是在视频和 iframe 方面。

结论

感谢您耐心完成对这 10 种强大的 CSS 布局的了解。要了解更多信息,请观看完整视频,并亲自尝试演示。

最强大的 CSS 布局 —— Grid 布局

lee992阅读(673)

img

Grid 布局是什么?

Grid 布局即网格布局,是一种新的 CSS 布局模型,比较擅长将一个页面划分为几个主要区域,以及定义这些区域的大小、位置、层次等关系。号称是最强大的的 CSS 布局方案,是目前唯一一种 CSS 二维布局。

利用 Grid 布局,我们可以轻松实现类似下图布局,

演示地址:https://codepen.io/gpingfeng/pen/qBbveKB?editors=1100

1.png

Grid 布局和 flex 布局

讲到布局,我们就会想到 flex 布局,甚至有人认为竟然有 flex 布局了,似乎没有必要去了解 Grid 布局。但 flex 布局和 Grid 布局有实质的区别,那就是 flex 布局是一维布局,Grid 布局是二维布局flex 布局一次只能处理一个维度上的元素布局,一行或者一列。Grid 布局是将容器划分成了“行”和“列”,产生了一个个的网格,我们可以将网格元素放在与这些行和列相关的位置上,从而达到我们布局的目的。

Grid 布局远比 flex 布局强大!

flex布局示例:

2.png

Grid 布局示例:

3.png

Grid 的一些基础概念

我们使用 Grid 实现一个小例子,演示 Grid 的一些基础概念

演示地址:https://codepen.io/gpingfeng/pen/QWyoexm?editors=1100

<div class="wrapper">
<div class="one item">One</div>
<div class="two item">Two</div>
<div class="three item">Three</div>
<div class="four item">Four</div>
<div class="five item">Five</div>
<div class="six item">Six</div>
</div>
.wrapper {
margin: 60px;
/* 声明一个容器 */
display: grid;
/* 声明列的宽度 */
grid-template-columns: repeat(3, 200px);
/* 声明行间距和列间距 */
grid-gap: 20px;
/* 声明行的高度 */
grid-template-rows: 100px 200px;
}
.one {
background: #19CAAD;
}
.two {
background: #8CC7B5;
}
.three {
background: #D1BA74;
}
.four {
background: #BEE7E9;
}
.five {
background: #E6CEAC;
}
.six {
background: #ECAD9E;
}
.item {
text-align: center;
font-size: 200%;
color: #fff;
}
4.png

容器和项目:我们通过在元素上声明 display:griddisplay:inline-grid 来创建一个网格容器。一旦我们这样做,这个元素的所有直系子元素将成为网格项目。比如上面 .wrapper 所在的元素为一个网格容器,其直系子元素将成为网格项目。

网格轨道:grid-template-columnsgrid-template-rows 属性来定义网格中的行和列。容器内部的水平区域称为行,垂直区域称为列。上图中 OneTwoThree 组成了一行,OneFour 则是一列

5.png

网格单元:一个网格单元是在一个网格元素中最小的单位, 从概念上来讲其实它和表格的一个单元格很像。上图中 OneTwoThreeFour…都是一个个的网格单元

网格线:划分网格的线,称为”网格线”。应该注意的是,当我们定义网格时,我们定义的是网格轨道,而不是网格线。Grid 会为我们创建编号的网格线来让我们来定位每一个网格元素。m 列有 m + 1 根垂直的网格线,n 行有 n + 1 跟水平网格线。比如上图示例中就有 4 根垂直网格线。一般而言,是从左到右,从上到下,1,2,3 进行编号排序。当然也可以从右到左,从下到上,按照 -1,-2,-3…顺序进行编号排序

6.png

容器属性介绍

Grid 布局相关的属性以及值众多,需要记忆的不少,建议可以跟 demo 一起结合起来,边敲代码边理解,再利用一些空闲时间记忆一下。笔者会在介绍每个属性的时候,做个小 demo 演示,建议大家可以自己修改看看效果加深记忆

Grid 布局属性可以分为两大类,一类是容器属性,一类是项目属性。我们先来看容器属性

display 属性

display 属性演示:https://codepen.io/gpingfeng/pen/wvMZwqY

我们通过在元素上声明 display:griddisplay:inline-grid 来创建一个网格容器。声明 display:grid 则该容器是一个块级元素,设置成 display: inline-grid 则容器元素为行内元素

.wrapper {
display: grid;
}
7.png
.wrapper-1 {
display: inline-grid;
}
8.png

grid-template-columns 属性和 grid-template-rows 属性

grid-template-columns 和 grid-template-rows 属性演示地址:

https://codepen.io/gpingfeng/pen/BajEBYq?editors=1100

grid-template-columns 属性设置列宽,grid-template-rows 属性设置行高,这两个属性在 Grid 布局中尤为重要,它们的值是有多种多样的,而且它们的设置是比较相似的,下面针对 grid-template-columns 属性进行讲解

固定的列宽和行高

.wrapper {
display: grid;
/* 声明了三列,宽度分别为 200px 100px 200px */
grid-template-columns: 200px 100px 200px;
grid-gap: 5px;
/* 声明了两行,行高分别为 50px 50px */
grid-template-rows: 50px 50px;
}

以上表示固定列宽为 200px 100px 200px,行高为 50px 50px

9.png

repeat() 函数:可以简化重复的值。该函数接受两个参数,第一个参数是重复的次数,第二个参数是所要重复的值。比如上面行高都是一样的,我们可以这么去实现,实际效果是一模一样的

.wrapper-1 {
display: grid;
grid-template-columns: 200px 100px 200px;
grid-gap: 5px;
/* 2行,而且行高都为 50px */
grid-template-rows: repeat(2, 50px);
}

auto-fill 关键字:表示自动填充,让一行(或者一列)中尽可能的容纳更多的单元格。grid-template-columns: repeat(auto-fill, 200px) 表示列宽是 200 px,但列的数量是不固定的,只要浏览器能够容纳得下,就可以放置元素,代码以及效果如下图所示:

.wrapper-2 {
display: grid;
grid-template-columns: repeat(auto-fill, 200px);
grid-gap: 5px;
grid-auto-rows: 50px;
}
10.gif

fr 关键字Grid 布局还引入了一个另外的长度单位来帮助我们创建灵活的网格轨道。fr 单位代表网格容器中可用空间的一等份。grid-template-columns: 200px 1fr 2fr 表示第一个列宽设置为 200px,后面剩余的宽度分为两部分,宽度分别为剩余宽度的 1/3 和 2/3。代码以及效果如下图所示:

.wrapper-3 {
display: grid;
grid-template-columns: 200px 1fr 2fr;
grid-gap: 5px;
grid-auto-rows: 50px;
}
11.gif

minmax() 函数:我们有时候想给网格元素一个最小和最大的尺寸,minmax() 函数产生一个长度范围,表示长度就在这个范围之中都可以应用到网格项目中。它接受两个参数,分别为最小值和最大值。grid-template-columns: 1fr 1fr minmax(300px, 2fr) 的意思是,第三个列宽最少也是要 300px,但是最大不能大于第一第二列宽的两倍。代码以及效果如下:

.wrapper-4 {
display: grid;
grid-template-columns: 1fr 1fr minmax(300px, 2fr);
grid-gap: 5px;
grid-auto-rows: 50px;
}
12.gif

auto 关键字:由浏览器决定长度。通过 auto 关键字,我们可以轻易实现三列或者两列布局。grid-template-columns: 100px auto 100px 表示第一第三列为 100px,中间由浏览器决定长度,代码以及效果如下:

.wrapper-5 {
display: grid;
grid-template-columns: 100px auto 100px;
grid-gap: 5px;
grid-auto-rows: 50px;
}
13.gif

grid-row-gap 属性、grid-column-gap 属性以及 grid-gap 属性

grid-row-gap 属性、grid-column-gap 属性以及 grid-gap 属性演示地址:

https://codepen.io/gpingfeng/pen/jOWRNeg

grid-row-gap 属性、grid-column-gap 属性分别设置行间距和列间距。grid-gap 属性是两者的简写形式。

grid-row-gap: 10px 表示行间距是 10px,grid-column-gap: 20px 表示列间距是 20px。grid-gap: 10px 20px 实现的效果是一样的

.wrapper {
display: grid;
grid-template-columns: 200px 100px 100px;
grid-gap: 10px 20px;
grid-auto-rows: 50px;
}
.wrapper-1 {
display: grid;
grid-template-columns: 200px 100px 100px;
grid-auto-rows: 50px;
grid-row-gap: 10px;
grid-column-gap: 20px;
}

以上两种写法效果是一样的。

14.png

grid-template-areas 属性

grid-area 以及 grid-template-areas演示地址:

https://codepen.io/gpingfeng/pen/RwrObEJ?editors=1100

grid-template-areas 属性用于定义区域,一个区域由一个或者多个单元格组成

一般这个属性跟网格元素的 grid-area 一起使用,我们在这里一起介绍。grid-area 属性指定项目放在哪一个区域

.wrapper {
display: grid;
grid-gap: 10px;
grid-template-columns: 120px 120px 120px;
grid-template-areas:
  ". header header"
  "sidebar content content";
background-color: #fff;
color: #444;
}

上面代码表示划分出 6 个单元格,其中值得注意的是 . 符号代表空的单元格,也就是没有用到该单元格。

.sidebar {
grid-area: sidebar;
}

.content {
grid-area: content;
}

.header {
grid-area: header;
}

以上代码表示将类 .sidebar .content .header所在的元素放在上面 grid-template-areas 中定义的 sidebar content header 区域中

15.png

grid-auto-flow 属性

grid-auto-flow 属性演示地址:https://codepen.io/gpingfeng/pen/MWKRWKj?editors=1100

grid-auto-flow 属性控制着自动布局算法怎样运作,精确指定在网格中被自动布局的元素怎样排列。默认的放置顺序是”先行后列”,即先填满第一行,再开始放入第二行,即下图英文数字的顺序 one,two,three…。这个顺序由 grid-auto-flow 属性决定,默认值是 row

.wrapper {
display: grid;
grid-template-columns: 100px 200px 100px;
grid-auto-flow: row;
grid-gap: 5px;
grid-auto-rows: 50px;
}
16.png

细心的同学可能发现了一个问题,就是第五个项目和第六个项目之间有个空白(如下图所示),这个是由于第六块的长度大于了空白处的长度,被挤到了下一行导致的。在实际应用中,我们可能想让下面长度合适的填满这个空白,这个时候可以设置 grid-auto-flow: row dense,表示尽可能填满表格。代码以及效果如下所示:

17.png
.wrapper-2 {
display: grid;
grid-template-columns: 100px 200px 100px;
grid-auto-flow: row dense;
grid-gap: 5px;
grid-auto-rows: 50px;
}
18.png

可以设置 grid-auto-flow: column,表示先列后行,代码以及效果如下图所示:

.wrapper-1 {
display: grid;
grid-auto-columns: 100px;
grid-auto-flow: column;
grid-gap: 5px;
grid-template-rows: 50px 50px;
}
19.png

justify-items 属性、align-items 属性以及 place-items 属性

justify-items 属性、align-items 属性演示地址:https://codepen.io/gpingfeng/pen/zYrXYrz?editors=1100

justify-items 属性设置单元格内容的水平位置(左中右),align-items 属性设置单元格的垂直位置(上中下)

下面以 justify-items 属性为例进行讲解,align-items 属性同理,只是方向为垂直方向。它们都有如下属性:

.container {
justify-items: start | end | center | stretch;
align-items: start | end | center | stretch;
}

其代码实现以及效果如下:

.wrapper, .wrapper-1, .wrapper-2, .wrapper-3 {
display: grid;
grid-template-columns: 100px 200px 100px;
grid-gap: 5px;
grid-auto-rows: 50px;
justify-items: start;
}
.wrapper-1 {
justify-items: end;
}
.wrapper-2 {
justify-items: center;
}
.wrapper-3 {
justify-items: stretch;
}
  • start:对齐单元格的起始边缘
20.png
  • end:对齐单元格的结束边缘
21.png
  • center:单元格内部居中
22.png
  • stretch:拉伸,占满单元格的整个宽度(默认值)
23.png

justify-content 属性、align-content 属性以及 place-content 属性

justify-content 属性、align-content 属性演示地址:

https://codepen.io/gpingfeng/pen/qBbwBZx?editors=1100

justify-content 属性是整个内容区域在容器里面的水平位置(左中右),align-content 属性是整个内容区域的垂直位置(上中下)。它们都有如下的属性值。

.container {
justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
align-content: start | end | center | stretch | space-around | space-between | space-evenly;  
}

下面以 justify-content 属性为例进行讲解,align-content 属性同理,只是方向为垂直方向

  • start – 对齐容器的起始边框
  • end – 对齐容器的结束边框
  • center – 容器内部居中
.wrapper, .wrapper-1, .wrapper-2, .wrapper-3, .wrapper-4, .wrapper-5, .wrapper-6 {
display: grid;
grid-template-columns: 100px 200px 100px;
grid-gap: 5px;
grid-auto-rows: 50px;
justify-content: start;
}
.wrapper-1 {
justify-content: end;
}
.wrapper-2 {
justify-content: center;
}
24.png
  • space-around – 每个项目两侧的间隔相等。所以,项目之间的间隔比项目与容器边框的间隔大一倍
  • space-between – 项目与项目的间隔相等,项目与容器边框之间没有间隔
  • space-evenly – 项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔
  • stretch – 项目大小没有指定时,拉伸占据整个网格容器
.wrapper-3 {
justify-content: space-around;
}
.wrapper-4 {
justify-content: space-between;
}
.wrapper-5 {
justify-content: space-evenly;
}
.wrapper-6 {
justify-content: stretch;
}
25.png

grid-auto-columns 属性和 grid-auto-rows 属性

grid-auto-columns 属性和 grid-auto-rows 属性演示地址:

https://codepen.io/gpingfeng/pen/zYrXvYZ?editors=1100

在讲 grid-auto-columns 属性和 grid-auto-rows 属性之前,先来看看隐式和显式网格的概念

隐式和显式网格:显式网格包含了你在 grid-template-columnsgrid-template-rows 属性中定义的行和列。如果你在网格定义之外又放了一些东西,或者因为内容的数量而需要的更多网格轨道的时候,网格将会在隐式网格中创建行和列

假如有多余的网格(也就是上面提到的隐式网格),那么它的行高和列宽可以根据 grid-auto-columns 属性和 grid-auto-rows 属性设置。它们的写法和grid-template-columnsgrid-template-rows 完全相同。如果不指定这两个属性,浏览器完全根据单元格内容的大小,决定新增网格的列宽和行高

.wrapper {
display: grid;
grid-template-columns: 200px 100px;
/* 只设置了两行,但实际的数量会超出两行,超出的行高会以 grid-auto-rows 算 */
grid-template-rows: 100px 100px;
grid-gap: 10px 20px;
grid-auto-rows: 50px;
}

grid-template-columns 属性和 grid-template-rows 属性只是指定了两行两列,但实际有九个元素,就会产生隐式网格。通过 grid-auto-rows 可以指定隐式网格的行高为 50px

26.png

项目属性介绍

grid-column-start 属性、grid-column-end 属性、grid-row-start 属性以及grid-row-end 属性

演示地址:https://codepen.io/gpingfeng/pen/PoZgopr

可以指定网格项目所在的四个边框,分别定位在哪根网格线,从而指定项目的位置

  • grid-column-start 属性:左边框所在的垂直网格线
  • grid-column-end 属性:右边框所在的垂直网格线
  • grid-row-start 属性:上边框所在的水平网格线
  • grid-row-end 属性:下边框所在的水平网格线
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-gap: 20px;
grid-auto-rows: minmax(100px, auto);
}
.one {
grid-column-start: 1;
grid-column-end: 2;
background: #19CAAD;
}
.two {
grid-column-start: 2;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 2;
/*   如果有重叠,就使用 z-index */
z-index: 1;
background: #8CC7B5;
}
.three {
grid-column-start: 3;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 4;
background: #D1BA74;
}
.four {
grid-column-start: 1;
grid-column-end: 2;
grid-row-start: 2;
grid-row-end: 5;
background: #BEE7E9;
}
.five {
grid-column-start: 2;
grid-column-end: 2;
grid-row-start: 2;
grid-row-end: 5;
background: #E6CEAC;
}
.six {
grid-column: 3;
grid-row: 4;
background: #ECAD9E;
}

上面代码中,类 .two 所在的网格项目,垂直网格线是从 2 到 4,水平网格线是从 1 到 2。其中它跟 .three (垂直网格线是从3 到 4,水平网格线是从 1 到 4) 是有冲突的。可以设置 z-index 去决定它们的层级关系

27.png

grid-area 属性

grid-area 属性指定项目放在哪一个区域,在上面介绍 grid-template-areas的时候有提到过,这里不再具体展开,具体的使用可以参考演示地址:

grid-area 以及 grid-template-areas 属性演示地址:

https://codepen.io/gpingfeng/pen/RwrObEJ

justify-self 属性、align-self 属性以及 place-self 属性

justify-self 属性/ align-self 属性/ place-self 属性演示地址:

https://codepen.io/gpingfeng/pen/ZEQZEJK?editors=1100

justify-self 属性设置单元格内容的水平位置(左中右),跟 justify-items 属性的用法完全一致,但只作用于单个项目

align-self 属性设置单元格内容的垂直位置(上中下),跟align-items属性的用法完全一致,也是只作用于单个项目

两者很相像,这里只拿 justify-self 属性演示,align-self 属性同理,只是作用于垂直方向。place-self 是设置 align-selfjustify-self 的简写形式,这里也不重复介绍。

.item {
justify-self: start | end | center | stretch;
align-self: start | end | center | stretch;
}
.item {
justify-self: start;
}
.item-1 {
justify-self: end;
}
.item-2 {
justify-self: center;
}
.item-3 {
justify-self: stretch;
}
  • start:对齐单元格的起始边缘
28.png
  • end:对齐单元格的结束边缘
29.png
  • center:单元格内部居中
30.png
  • stretch:拉伸,占满单元格的整个宽度(默认值)
31.png

Grid 实战——实现响应式布局

经过上面的介绍,相信大家都可以看出,Grid 是非常强大的。一些常见的 CSS 布局,如居中,两列布局,三列布局等等是很容易实现的。我们接下来看看 Grid 布局是如何实现响应式布局的

fr 实现等分响应式

fr 实现等分响应式:https://codepen.io/gpingfeng/pen/wvMZKpB?editors=1100

fr 等分单位,可以将容器的可用空间分成想要的多个等分空间。利用这个特性,我们能够轻易实现一个等分响应式。grid-template-columns: 1fr 1fr 1fr 表示容器分为三等分

.wrapper {
margin: 50px;
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-gap: 10px 20px;
grid-auto-rows: 50px;
}
32.gif

repeat + auto-fit——固定列宽,改变列数量

等分布局并不只有 Grid 布局才有,像 flex 布局也能轻松实现,接下来看看更高级的响应式

上面例子的始终都是三列的,但是需求往往希望我们的网格能够固定列宽,并根据容器的宽度来改变列的数量。这个时候,我们可以用到上面提到 repeat() 函数以及 auto-fit 关键字。grid-template-columns: repeat(auto-fit, 200px) 表示固定列宽为 200px,数量是自适应的,只要容纳得下,就会往上排列,代码以及效果实现如下:

演示地址:https://codepen.io/gpingfeng/pen/eYJopVE?editors=1100

.wrapper {
margin: 50px;
display: grid;
grid-template-columns: repeat(auto-fit, 200px);
grid-gap: 10px 20px;
grid-auto-rows: 50px;
}
33.gif

repeat+auto-fit+minmax 去掉右侧空白

上面看到的效果中,右侧通常会留下空白,这是我们不希望看到的。如果列的宽度也能在某个范围内自适应就好了。minmax() 函数就帮助我们做到了这点。将 grid-template-columns: repeat(auto-fit, 200px) 改成 grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)) 表示列宽至少 200px,如果还有空余则一起等分。代码以及效果如下所示:

演示地址:https://codepen.io/gpingfeng/pen/dyGLYdQ

.wrapper {
margin: 50px;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
grid-gap: 10px 20px;
grid-auto-rows: 50px;
}
34.gif

repeat+auto-fit+minmax-span-dense 解决空缺问题

似乎一切进行得很顺利,但是某天 UI 来说,每个网格元素的长度可能不相同,这也简单,通过 span 关键字进行设置网格项目的跨度,grid-column-start: span 3,表示这个网格项目跨度为 3。具体的代码与效果如下所示:

.item-3 {
grid-column-start: span 3;
}

演示地址:https://codepen.io/gpingfeng/pen/BajEoxy?editors=1100

35.gif

不对,怎么右侧又有空白了?原来是有一些长度太长了,放不下,这个时候就到我们的 dense 关键字出场了。grid-auto-flow: row dense 表示尽可能填充,而不留空白,代码以及效果如下所示:

.wrapper, .wrapper-1 {
margin: 50px;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
grid-gap: 10px 20px;
grid-auto-rows: 50px;
}

.wrapper-1 {
grid-auto-flow: row dense;
}
36.gif

Grid 布局兼容性

最后,聊聊 Grid 布局兼容性问题,在 caniuse 中,我们可以看到的结果如下,总体兼容性还不错,但在 IE 10 以下不支持。个人建议在公司的内部系统运用起来是没有问题的,但 TOC 的话,可能目前还是不太合适

现代 CSS 解决方案:Modern CSS Reset

lee992阅读(758)

在早年间(其实也不是很早),写过几篇关于 CSS Reset 的文章 – reset.css 知多少[1]。 详细描述了当时业界比较常用的,两个 CSS reset 方案:reset.css 与 Normalize.css。 以更为推荐的 Normalize.css 为例,它的核心思想是:

  1. 统一了一些元素在所有浏览器下的表现,保护有用的浏览器默认样式而不是完全清零它们,让它们在各个浏览器下表现一致;
  2. 为大部分元素提供一般化的表现;
  3. 修复了一些浏览器的 Bug ,并且让它们在所有浏览器下保持一致性;
  4. 通过一些巧妙的细节提升了 CSS 的可用性;
  5. 提供了详尽的文档让开发者知道,不同元素在不同浏览器下的渲染规则;

如今,Normalize 已经出到了第八版 — normalize.css V8.0.1[2],而随之而变的是浏览器市场环境的巨大变化。

IE 已经逐渐退出历史舞台,处理各个浏览器之间巨大差异、不同兼容性问题的日子像是一去不复返了。虽然今天不同厂商在对待标准仍然存在差异,一些细节上仍旧有出入,但是我们已经不需要再像过去般大肆地对浏览器默认样式进行重置。

到今天,我们更多听到现代 CSS 解决方案一词。它除去页面样式最基本的呈现外,同时也关注用户体验可访问性。这也可能是过去,我们在写 CSS 的时候比较容易忽略的环节。

Modern CSS Reset

我最近比较喜欢的一个 CSS Reset 方案,源自于 — Modern-CSS-Reset[3]。

它的核心观点是:

  1. 重置合理的默认值
  2. 关注用户体验
  3. 关注可访问性

整个 Reset 的源码比较简单:

/* Box sizing rules */
*,
*::before,
*::after {
 box-sizing: border-box;
}

/* Remove default margin */
body,h1,h2,h3,h4,p,
figure,blockquote,
dl,dd {
 margin: 0;
}

/* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */
ul[role='list'],
ol[role='list'] {
 list-style: none;
}

/* Set core root defaults */
html:focus-within {
 scroll-behavior: smooth;
}

/* Set core body defaults */
body {
 min-height: 100vh;
 text-rendering: optimizeSpeed;
 line-height: 1.5;
}

/* A elements that don't have a class get default styles */
a:not([class]) {
 text-decoration-skip-ink: auto;
}

/* Make images easier to work with */
img,
picture {
 max-width: 100%;
 display: block;
}

/* Inherit fonts for inputs and buttons */
input,
button,
textarea,
select {
 font: inherit;
}

/* Remove all animations, transitions and smooth scroll for people that prefer not to see them */
@media (prefers-reduced-motion: reduce) {
 html:focus-within {
  scroll-behavior: auto;
}
 
*,
*::before,
*::after {
   animation-duration: 0.01ms !important;
   animation-iteration-count: 1 !important;
   transition-duration: 0.01ms !important;
   scroll-behavior: auto !important;
}
}

其中一些比较有意思的点,单看盒子模型:

*,
*::before,
*::after {
 box-sizing: border-box;
}

Normalize.css 是不推荐这么做的,大部分元素的 box-sizing 其实都是 content-box,但是,对于实际开发,全部元素都设置为 border-box 其实是更便于操作的一种方式。

再看看在用户体验可访问性方面的一些做法:

html:focus-within {
 scroll-behavior: smooth;
}

scroll-behavior: smooth 意为平滑滚动,当然这里是设置给了 html:focus-within 伪类,而不是直接给 html 赋予平滑滚动,这样做的目的是只对使用键盘 tab 键切换焦点页面时,让页面进行平滑滚动切换,带来更好的使用体验。

如果我们设置了如下 CSS:

html {
 scroll-behavior: smooth;
}

可能会起到一起副作用,譬如,当我们在页面查找元素时候(使用 Ctrl + F、或者 Mac 的 Commond + F),这段 CSS 代码可能会严重延缓我们的查找速度:

图片

再看看这段代码:

@media (prefers-reduced-motion: reduce) {
 html:focus-within {
  scroll-behavior: auto;
}
 
*,
*::before,
*::after {
   animation-duration: 0.01ms !important;
   animation-iteration-count: 1 !important;
   transition-duration: 0.01ms !important;
   scroll-behavior: auto !important;
}
}

我曾经在 使用 CSS prefers-* 规范,提升网站的可访问性与健壮性[4] 介绍过 prefers-reduced-motion

prefers-reduced-motion 规则查询用于减弱动画效果,除了默认规则,只有一种语法取值 prefers-reduced-motion: reduce,开启了该规则后,相当于告诉用户代理,希望他看到的页面,可以删除或替换掉一些会让部分视觉运动障碍者不适的动画类型。

规范原文:Indicates that user has notified the system that they prefer an interface that removes or replaces the types of motion-based animation that trigger discomfort for those with vestibular motion disorders.

vestibular motion disorders 是一种视觉运动障碍患者,翻译出来是前庭运动障碍,是一种会导致眩晕的一类病症,譬如一个动画一秒闪烁多次,就会导致患者的不适。

使用方法,还是上面那段代码:

.ele {
   animation: aniName 5s infinite linear;
}

@media (prefers-reduced-motion: reduce) {
   .ele {
       animation: none;
  }
}

如果我们有一些类似这样的动画:

图片

在用户开启了 prefers-reduced-motion: reduce 时,就应该把这个动画去掉。

而上述 Reset 中的那段代码,正是用于当用户开启对应选项后,减弱页面上的所有动画效果。属于对可访问性的考虑。

结合实际环境

当然,结合实际环境,目前国内整体不太注重可访问性相关的内容。

而且,许多业务根本无法抛弃一些老旧浏览器,仍然需要兼容 IE 系列。

因此,对于现阶段的 Reset 方案,可以灵活搭配:

  1. 如果你的业务场景仍然需要考虑一些老旧浏览器,依旧需要兼容 IE 系列,Normalize.css 的大部分功能都还是非常好的选择
  2. 如果你的业务场景只专注于 Chrome 或者是 Chromium 内核,Normalize.css 内的许多内容其实可能是一些实际中根本不会遇到或者用上的兼容适配,可以进行必要的精简
  3. 如果你的业务是全球化,面向的用户不仅仅在国内,你应该开始考虑更多可访问性相关的内容,上述的 Modern CSS Reset 可以借鉴一下

因此,更应该的情况是,根据实际的业务需要,吸收多个业界比较常见/知名的 Reset 方案形成自己业务适用的。

这里再罗列一些常见及现代 CSS Reset 方案:

Reset 方案简介Github Stars 数
normalize.css[5]CSS Reset 的现代替代方案47.1K
sanitize.css[6]提供一致的、跨浏览器的 HTML 元素默认样式以及有用的默认样式4.8K
reseter.css[7]Normalize.css 和 CSS Reset 的未来替代方案981
Modern-CSS-Reset[8]小而美,重置合理的默认值的现代 CSS Reset 方案2.4K

你会看到,其实大家都号称自己是现代 CSS Reset 解决方案,但其实其内部做的 Reset 工作很多是我们根本用不上的。有人喜欢小而美,有人喜欢大而全,实际使用的时候需要具体取舍,魔改合并成适合自己的才是最好的。

最后

好了,本文到此结束,希望对你有帮助 🙂

如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

参考资料

  1. reset.css 知多少: https://github.com/chokcoco/iCSS/issues/5
  2. normalize.css V8.0.1: https://github.com/necolas/normalize.css
  3. Modern-CSS-Reset: https://github.com/hankchizljaw/modern-css-reset
  4. 用CSS prefers-*规范提升网站的可读性与健壮性: https://github.com/chokcoco/iCSS/issues/118
  5. sanitize.css: https://github.com/csstools/sanitize.css
  6. reseter.css: https://github.com/resetercss/reseter.css
  7. Github — iCSS: https://github.com/chokcoco/iCSS

19 个实用的 CSS 技巧 比如解决img 5px 间距

lee992阅读(782)

修改 placeholder 样式,多行文本溢出,隐藏滚动条,修改光标颜色,水平和垂直居中。这些熟悉的场景啊! 前端开发者几乎每天都会和它们打交道,这里有20个CSS技巧,让我们一起来看看吧。

1. 解决 img 5px 间距的问题

你是否经常遇到图片底部多出5px间距的问题?不用急,这里有4种方法可以解决。

图片

方案1:设置父元素字体大小为 0

关键代码:

.img-container{
font-size:0;
}

事例地址:https://codepen.io/qianlong/pen/VwrzoyE

方案2:将 img 元素设置为display: block

关键代码:

img{
display:block;
}

事例地址:https://codepen.io/qianlong/pen/eYeGONM

方案3:将 img 元素设置为vertical-align: bottom

关键代码:

img{
vertical-align:bottom;
}

事例地址:https://codepen.io/qianlong/pen/jOaGNWw

解决方案4:给父元素设置line-height: 5px

关键代码:

.img-container{
line-height:5px;
}

事例地址:https://codepen.io/qianlong/pen/PoOJYzN

2. 元素的高度与 window 的高度相同

如何使元素与窗口一样高?答案使用height: 100vh;

事例地址:https://codepen.io/qianlong/pen/xxPXKXe

3. 修改 input placeholder 样式

关键代码:

.placehoder-custom::-webkit-input-placeholder{
color:#babbc1;
font-size:12px;
}

事例地址:https://codepen.io/qianlong/pen/JjOrPOq

4. 使用:not选择器

除了最后一个元素外,所有元素都需要一些样式,使用not选择器非常容易做到。

如下图所示:最后一个元素没有底边。

图片

关键代码

li:not(:last-child){
border-bottom:1pxsolid#ebedf0;
}

事例地址:https://codepen.io/qianlong/pen/QWOqLQO

5. 使用 flex 布局将一个元素智能地固定在底部

当内容不够时,按钮应该在页面的底部。当有足够的内容时,按钮应该跟随内容。当你遇到类似的问题时,使用flex来实现智能的布局。

图片

事例地址:https://codepen.io/qianlong/pen/ZEaXzxM

6. 使用caret-color来修改光标的颜色

可以使用caret-color来修改光标的颜色,如下所示:

caret-color:#ffd476;
图片

事例地址:https://codepen.io/qianlong/pen/YzErKvy

7. 删除type="number"末尾的箭头

默认情况下,在type="number"的末尾会出现一个小箭头,但有时我们需要将其删除。我们应该怎么做呢?

图片

关键代码:

.no-arrow::-webkit-outer-spin-button,
.no-arrow::-webkit-inner-spin-button{
-webkit-appearance:none;
}

事例地址:https://codepen.io/qianlong/pen/OJOxLrg

8.outline:none删除输入状态线

当输入框被选中时,它默认会有一条蓝色的状态线,可以通过使用outline: none来移除它。

如下图所示:第二个输入框被移除,第一个输入框没有被移除。

事件地址:https://codepen.io/qianlong/pen/YzErzKG

9. 解决iOS滚动条被卡住的问题

在苹果手机上,经常发生元素在滚动时被卡住的情况。这时,可以使用如下的 CSS 来支持弹性滚动。

body,html{
-webkit-overflow-scrolling:touch;
}

10. 绘制三角形

图片
.box{
padding:15px;
background-color:#f5f6f9;
border-radius:6px;
display:flex;
align-items:center;
justify-content:center;
}

.triangle{
display:inline-block;
margin-right:10px;
/*BaseStyle*/
border:solid10pxtransparent;
}
/*下*/
.triangle.bottom{
border-top-color:#0097a7;
}
/*上*/
.triangle.top{
border-bottom-color:#b2ebf2;
}
/*左*/
.triangle.left{
border-right-color:#00bcd4;
}
/*右*/
.triangle.right{
border-left-color:#009688;
}

事例地址:https://codepen.io/qianlong/pen/rNYGNRe

11. 绘制小箭头、

关键代码:

.box{
padding:15px;
background-color:#ffffff;
border-radius:6px;
display:flex;
align-items:center;
justify-content:center;
}

.arrow{
display:inline-block;
margin-right:10px;
width:0;
height:0;
/*BaseStyle*/
border:16pxsolid;
border-color:transparent#cddc39transparenttransparent;
position:relative;
}

.arrow::after{
content:"";
position:absolute;
right:-20px;
top:-16px;
border:16pxsolid;
border-color:transparent#ffftransparenttransparent;
}
/*下*/
.arrow.bottom{
transform:rotate(270deg);
}
/*上*/
.arrow.top{
transform:rotate(90deg);
}
/*左*/
.arrow.left{
transform:rotate(180deg);
}
/*右*/
.arrow.right{
transform:rotate(0deg);
}

事例地址:https://codepen.io/qianlong/pen/ZEaXEEP

12. 图像适配窗口大小

图片

事例地址:https://codepen.io/qianlong/pen/PoOJoPO

13. 隐藏滚动条

第一个滚动条是可见的,第二个滚动条是隐藏的。这意味着容器可以被滚动,但滚动条被隐藏起来,就像它是透明的一样。

图片

关键代码:

.box-hide-scrollbar::-webkit-scrollbar{
display:none;/*ChromeSafari*/
}

事例地址:https://codepen.io/qianlong/pen/yLPzLeZ

14. 自定义选定的文本样式

图片

关键代码:

.box-custom::selection{
color:#ffffff;
background-color:#ff4c9f;
}

事例地址:https://codepen.io/qianlong/pen/jOaGOVQ

15. 不允许选择文本

图片

关键代码:

.boxp:last-child{
user-select:none;
}

事例地址:https://codepen.io/qianlong/pen/rNYGNyB

16. 将一个元素在水平和垂直方向上居中

图片

关键代码:

display:flex;
align-items:center;
justify-content:center;

事例地址:https://codepen.io/qianlong/pen/VwrMwWb

17. 单行文本溢出时显示省略号

图片

关键代码:

overflow:hidden;
white-space:nowrap;
text-overflow:ellipsis;
max-width:375px;

事例地址:https://codepen.io/qianlong/pen/vYWeYJJ

18. 多行文本溢出时显示省略号

图片

关键代码:

overflow:hidden;
text-overflow:ellipsis;

display:-webkit-box;
/*setnlines,including1*/
-webkit-line-clamp:2;
-webkit-box-orient:vertical;

事例地址:https://codepen.io/qianlong/pen/ZEaXEJg

19.使用 “filter:grayscale(1)”,使页面处于灰色模式。

图片

关键代码:

body{
filter:grayscale(1);
}

10分钟理解CSS3 Grid布局

lee992阅读(1152)

基本介绍

Grid做前端的同学应该都很熟悉了,翻译成中文为“栅格”,用过bootstrap、semantic ui、ant design的同学肯定都了解grid layout(删格布局),以往css框架中的grid布局一般是通过float和百分比的宽度实现的,这种实现有几种缺点:

  • html不够简洁;
  • 需要清除浮动以避免高度塌陷;
  • 列的个数是固定的,不能灵活定义。比如bootstrap是12列,semantic ui是16列,ant design 24列。

当然grid也可以用flex实现,但是并不会比用float简单多少,而且flex擅长的是一维空间的布局,而对grid这种二维空间并不擅长。现在css3从规范和标准层面实现了grid,编程体验大大提升!

兼容性

用法

Grid作为一个二维的栅格系统,由若干列(column)和行(row)构成。

1. Column

(1) 设置column

CSS3中的Grid可以划分为任意个数的列(column),而且每个column的宽度可以任意设置!我们先来看一个简单的例子:

<div id="content">
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
    <div>5</div>
    <div>6</div>
    <div>7</div>
    <div>8</div>
    <div>9</div>
</div>

复制代码

css:

body{
    color: #fff;
    text-align: center;
}
#content{
    display: grid;
    grid-template-columns: 33.3% 33.3% 33.3%;
    max-width: 960px;
    margin: 0 auto;
}
#content div{
    background: lightgrey;
    padding: 30px;
}
#content div:nth-child(even){
    background: skyblue;
}

复制代码

效果:

13661853-8b753e6c59fed119

当我们设置了display: gridgrid-template-columns: 33.3% 33.3% 33.3%#content就被划分成了三行三列的grid,此时#content被称为grid container,而#content的子元素称为grid item。

我们也可以任意改变column的个数和宽度,比如:

#content{
    grid-template-columns: 10% 20% 30% 40%;
}

复制代码

效果:

13661853-8efec47309cad12d

(2) fr(fraction)

css3中引入了一个新的单位fr(fraction),中文意思为“分数”,用于替代百分比,因为百分比(小数)存在除不尽的情况,用分数表示可以避免多位小数的写法。比如三列等宽的grid可以表示为:

grid-template-columns: repeat(3, 1fr);

复制代码

(3) repeat

我们也可以用repeat方法来简化column或者row的写法,repeat方法接受两个参数,第一个参数表示重复的次数,第二个参数表示重复的内容。所以,三列等宽的grid我们还可以表示为:

`grid-template-columns:` `repeat``(``3``,` `1``fr);`

复制代码

当我们要定义的列数很多时,repeat就会变得非常有用,比如我们要定义一个10列等宽的grid,可以写成repeat(10, 1fr),而不用将1fr重复书写10遍。

2. Row

(1) 设置row

当我们设置column之后,row会因为元素的换行而自动产生,但是我们依然可以设置row的个数和高度。

css:

`#content{`
`display``: grid;`
`grid-template-columns:` `repeat``(``3``,` `1``fr);`
`grid-template-rows:` `repeat``(``4``,` `60px``);`
`max-width``:` `960px``;`
`}`

复制代码

效果:

13661853-ba86f4dbf73048f4

可以看到,虽然第四行没有内容,但是row确实存在并占据了那部分空间。

(2) minmax

上面的例子中我们给了row一个固定高度,这导致一个问题:如果某个grid item中的内容特别多,受制于固定的高度,部分内容将无法显示,如下图:

13661853-01778dd2502e3075

为解决这个问题,css提供了minmax函数,让我们可以设置row的最小高度和最大高度,最大高度取auto后便可以让row的高度自适应:

css:

`grid-auto-rows: minmax(``60px``,` `auto``);`
`// 或者`
`grid-template-rows:` `repeat``(``3``, minmax(``60px``,` `auto``));`

复制代码

效果:

13661853-13ad68ac8ba2b9ab

(3) grid gap

如果我们想给行和列之间加上间隔,也有现成的方法:

css:

`grid-gap:{`
`10px``;`
`}`

复制代码

效果:

13661853-71dec29197c7461b

3. Grid Line

以上所有例子中,grid中的每个grid item都是按默认顺序排列的。如果我们想重新布局改变grid item的位置或大小呢?为此引入了grid lines的概念,所谓的grid lines就是将grid若干等分后的分割线,如下图中横向和纵向序号1~8的线即为grid lines:

`<``img` `src="[http://lc-jOYHMCEn.cn-n1.lcfi...;/](http://lc-joyhmcen.cn-n1.lcfi...%3B/)>`

复制代码

通过定义grid item的起始和结束的grid line我们就可以实现对grid item位置和覆盖面积的控制。一个简单的例子:

html:

<div id="content">
    <div class="one">1</div>
</div>

复制代码

css:

#content {
  display: grid;
  grid-template-columns: repeat(8, 100px);
  grid-template-rows: repeat(8, 100px);
  grid-gap: 10px;
}

.one {
  grid-column-start: 3;
  grid-column-end: 6;
  grid-row-start: 3;
  grid-row-end: 6;
}

复制代码

效果:

13661853-4ccee8d455d83319

通过设置grid-column-start/end grid-row-start/end 相当于给grid item设置起始坐标和结束坐标,上面的css也可以简写为:

.one {
  grid-column: 3 / 6;
  grid-row: 3 / 6;
}
// 或者
.one {
  grid-area: 3 / 3 / 6 / 6;
}

复制代码

如果grid item的起始grid line为默认,我们可以只设置它的跨度(span):

.one{
  grid-column: span 3;
  grid-row: span 3;
}

复制代码

4. Grid Area Template

除了通过grid lines进行布局,css3提供了一种更牛逼的布局方式:grid area template。与其用语言解释什么是grid area template,不如直接看代码:

html:

<div id="content">
    <header>Header</header>
    <main>Main</main>
    <section>Section</section>
    <aside>Aside</aside>
    <nav>Nav</nav>
    <footer>Footer</footer>
</div>

复制代码

css:

body {
  color: #fff;
  text-align: center;
}

#content {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-rows: minmax(100px, auto);
  max-width: 960px;
  margin: 0 auto;
  grid-gap: 10px;
  grid-template-areas:
  "header header header header"
  "aside . main main"
  "nav . main main"
  "section section section section"
  "section section section section"
  "footer footer footer footer";
}

#content>* {
  background: #3bbced;
  padding: 30px;
}

header { grid-area: header; }
main   { grid-area: main; }
section{ grid-area: section; }
aside  { grid-area: aside; }
nav    { grid-area: nav; }
footer { grid-area: footer; }

复制代码

效果:

13661853-be8a94312cf09534

看明白没有?重点在于grid container的 grid-template-areas 属性。我们给每个grid item设置一个grid area,然后在grid container中设置一个grid area模版(grid-template-areas),模版中每行字符串表示一个row,每个area名称表示一个column,完全将几何布局用文字模拟出来,空白的grid item用 . 表示。当然使用grid area要注意语法严谨,像 "header main header main" 这种写法css是无法解析的,用area名称模拟出的结构在二维空间上必须是一个整体,因为每个grid item也是无法分割的。

使用grid area template的优点在实现响应式布局时也是显而易见的,我们只需要针对不同的屏幕尺寸制定不同的grid area template就行了。

5. Justify and Align

与flex类似,grid也可以设置justify和align来调整grid item横向和纵向对齐方式。同样也同时支持对grid container或单个grid item进行设置。

对grid container设置

html:

<div id="content">
    <div class="one">1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
    <div>5</div>
    <div>6</div>
</div>

复制代码

css:

#content {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: repeat(2, minmax(120px, auto));
  grid-gap: 10px;
  max-width: 960px;
  align-items: start;
  justify-items: end;
}

复制代码

效果:

13661853-06f3fc041e46af64

注意:flex里面用的是 justify-content 而grid里面是 justify-items ,flex里面的值是 flex-start/flex-end,而grid里面是 start/end 。justify和align的默认值都是 stretch 。

对grid item设置

css:

.one{
  align-self: start;
  justify-self: end;
}

复制代码

效果:

13661853-b31a0ae959466b81

CSS多种三列自适应布局实现

lee992阅读(1140)

前言

为了按照常规WEB布局,这里全部采用拥有header和footer模式进行左中右布局编写。

第一种:基于float实现

实现思路

常规思路,使左右两个Aside分别浮动至左右两侧即可

代码实现

<!-- HTML部分 -->
<div class="container">
  <!-- 顶部Header -->
  <header>这里是头部</header>
  <!-- 中间aside及content -->
  <div class="middle clearfix">
    <aside class="left"></aside>
    <aside class="right"></aside>
    <!-- 中间content显示内容 为了防止将右侧挤下去故放置在右侧栏下方 -->
    <div class="content">这里是内容</div>
  </div>
  <!-- 底部Footer -->
  <footer></footer>
</div>
<!-- CSS部分 -->
<style lang="scss">
  * {
    margin: 0;
    padding: 0;
  }

  .clearfix {
    zoom: 1;
    &::after {
      display: block;
      content: ' ';
      clear:both
    }
  }

  html, body {
    width: 100%;
    height: 100%
    }
    .container {
      width: 100%
      height: 100%
      header {
        height: 80px;
        background: rgba(0, 0, 0, 0.5)
      }
      footer {
        height: 80px;
        background: rgba(0, 0, 0, 0.5)
      }
      .middle {
        height: calc(100% - 80px - 80px)
        aside {
          height: 100%;
          width: 300px;
          background: rgba(156, 154, 249, 1)
        }
        .left {
          float: left
        }
        .right: {
          float: right
        }
      }
    }
  }
</style>
复制代码

实现效果

图片

第二种:基于position:absolute实现

实现思路

为中间三栏父级赋予position: relative,赋予左右Aside position: absolute,并且分别赋予left: 0 right: 0 width:自定义值,赋予中间content left,right 分别等于左右width即可

代码实现

<!-- HTML相关代码 -->
<div class="container">
  <!-- 顶部Header -->
  <header></header>
  <div class="middle">
    <!-- 左侧Aside -->
    <aside class="left"></aside>
    <!-- 中间content内容 -->
    <div class="content">这里是内容</div>
    <!-- 右侧Aside -->
    <aside class="right"></aside>
  </div>
  <!-- 底部Footer -->
  <footer></footer>
</div>
<!-- CSS相关代码 -->
<style lang="scss">
  * {
    margin: 0;
    padding: 0
  }

  html, body {
    width: 100%;
    height: 100%
  }

  .container {
    width: 100%;
    height: 100%;
    header {
      height: 80px;
      background: rgba(0, 0, 0, 0.5);
    }
    footer {
      height: 80px;
      background: rgba(0, 0, 0, 0.5);
    }
    .middle {
      height: calc(100% - 80px - 80px);
      position: relative;
      aside,
      .content {
        position: absolute;
      }
      .left {
        width: 300px;
        background: rgba(156, 154, 249, 1);
        left: 0;
        height: 100%;
      }
      .right {
        width: 300px;
        background: rgba(156, 154, 249, 1);
        right: 0;
        height: 100%;
      }
      .content {
        left: 300px;
        right: 300px;
      }
    }
  }
</style>
复制代码

实现效果

图片

第三种:基于display:flex实现

实现思路

赋予左中右三列父级display: flex,赋予左右Aside width自定义,赋予中间content flex:1即可

代码实现

<!-- HTML相关代码 -->
<div class="container">
  <!-- 顶部Header -->
  <header></header>
  <div class="middle">
    <!-- 左侧Aside -->
    <aside class="left"></aside>
    <!-- 中间content内容 -->
    <div class="content">这里是内容</div>
    <!-- 右侧Aside -->
    <aside class="right"></aside>
  </div>
  <!-- 底部Footer -->
  <footer></footer>
</div>
<!-- CSS部分 -->
<style lang="scss">
  * {
    margin: 0;
    padding: 0;
  }

  html, body {
    width: 100%;
    height: 100%;
  }

  .container {
    header {
      height: 80px;
      background: rgba(0, 0, 0, 0.5);
    }
    footer {
      height: 80px;
      background: rgba(0, 0, 0, 0.5);
    }
    .middle {
      display: flex;
      height: calc(100% - 80px - 80px);
      aside {
        width: 300px;
        background: rgba(156, 154, 249, 1);
      }
      .content: {
        flex: 1;
      }
    }
  }
</style>
复制代码

实现效果

图片

第四种:基于display: table实现

实现思路

赋予左中右三列父级display: table, width: 100%,分别赋予左中右三列display: table-cell,分别赋予左右Aside width即可。

代码实现

<!-- HTML相关代码 -->
<div class="container">
  <!-- 顶部Header -->
  <header></header>
  <div class="middle">
    <!-- 左侧Aside -->
    <aside class="left"></aside>
    <!-- 中间content内容 -->
    <div class="content">这里是内容</div>
    <!-- 右侧Aside -->
    <aside class="right"></aside>
  </div>
  <!-- 底部Footer -->
  <footer></footer>
</div>
<!-- CSS部分 -->
<style lang="scss">
  * {
    margin: 0;
    padding: 0;
  }

  html, body {
    width: 100%;
    height: 100%;
  }

  .container {
    header {
      height: 80px;
      background: rgba(0, 0, 0, 0.5);
    }
    footer {
      height: 80px;
      background: rgba(0, 0, 0, 0.5);
    }
    .middle {
      display: table;
      width: 100%
      height: calc(100% - 80px - 80px);
      aside {
        width: 300px;
        display: table-cell;
        background: rgba(156, 154, 249, 1);
      }
      .content: {
        display: table-cell;
      }
    }
  }
</style>
复制代码

实现效果

图片

第五种:基于display: grid实现

实现思路

赋予左中右三列父级display: grid,并且使用grid-template-columns: 300px auto 300px,将其分为宽为300px、auto、300px三列布局即可。

代码实现

<!-- HTML相关代码 -->
<div class="container">
  <!-- 顶部Header -->
  <header></header>
  <div class="middle">
    <!-- 左侧Aside -->
    <aside class="left"></aside>
    <!-- 中间content内容 -->
    <div class="content">这里是内容</div>
    <!-- 右侧Aside -->
    <aside class="right"></aside>
  </div>
  <!-- 底部Footer -->
  <footer></footer>
</div>
<!-- CSS部分 -->
<style lang="scss">
  * {
    margin: 0;
    padding: 0;
  }

  html, body {
    width: 100%;
    height: 100%;
  }

  .container {
    header {
      height: 80px;
      background: rgba(0, 0, 0, 0.5);
    }
    footer {
      height: 80px;
      background: rgba(0, 0, 0, 0.5);
    }
    .middle {
      display: grid;
      grid-template-columns: 300px auto 300px;
      height: calc(100% - 80px - 80px);
      aside {
        background: rgba(156, 154, 249, 1);
      }
    }
  }
</style>
复制代码

实现效果

图片

CSS font-family 各名称一览表

lee992阅读(4081)

windows常见内置中文字体

字体中文名 字体英文名 字体应用
宋体 SimSun(浏览器默认)

黑体 SimHei

微软雅黑 Microsoft Yahei

微软正黑体 Microsoft JhengHei

楷体 KaiTi

新宋体 NSimSun

仿宋 FangSong

OS X常见内置中文字体

字体中文名 字体英文名 字体应用
苹方 PingFang SC

华文黑体 STHeiti

华文楷体 STKaiti

华文宋体 STSong

华文仿宋 STFangsong

华文中宋 STZhongsong

华文琥珀 STHupo

华文新魏 STXinwei

华文隶书 STLiti

华文行楷 STXingkai

冬青黑体简 Hiragino Sans GB

兰亭黑-简 Lantinghei SC

翩翩体-简 Hanzipen SC

手札体-简 Hannotate SC

宋体-简 Songti SC

娃娃体-简 Wawati SC

魏碑-简 Weibei SC

行楷-简 Xingkai SC

雅痞-简 Yapi SC

圆体-简 Yuanti SC

office安装后新增字体

字体中文名 字体英文名 字体应用
幼圆 YouYuan

隶书 LiSu

华文细黑 STXihei

华文楷体 STKaiti

华文宋体 STSong

华文仿宋 STFangsong

华文中宋 STZhongsong

华文彩云 STCaiyun

华文琥珀 STHupo

华文新魏 STXinwei

华文隶书 STLiti

华文行楷 STXingkai

方正舒体 FZShuTi

方正姚体 FZYaoti

开源字体

字体中文名 字体英文名 字体应用
思源黑体 Source Han Sans CN

思源宋体 Source Han Serif SC

文泉驿微米黑 WenQuanYi Micro Hei

版权字体(汉仪)

字体中文名 字体英文名 字体应用
汉仪旗黑 HYQihei 40S

汉仪旗黑 HYQihei 50S

汉仪旗黑 HYQihei 60S

汉仪大宋简 HYDaSongJ

汉仪楷体 HYKaiti

汉仪家书简 HYJiaShuJ

汉仪PP体简 HYPPTiJ

汉仪乐喵体简 HYLeMiaoTi

汉仪小麦体 HYXiaoMaiTiJ

汉仪程行体 HYChengXingJ

汉仪黑荔枝 HYHeiLiZhiTiJ

汉仪雅酷黑W HYYaKuHeiW

汉仪大黑简 HYDaHeiJ

汉仪尚魏手书W HYShangWeiShouShuW

版权字体(方正)

字体中文名 字体英文名 字体应用
方正粗雅宋简体 FZYaSongS-B-GB

方正报宋简体 FZBaoSong-Z04S

方正粗圆简体 FZCuYuan-M03S

方正大标宋简体 FZDaBiaoSong-B06S

方正大黑简体 FZDaHei-B02S

方正仿宋简体 FZFangSong-Z02S

方正黑体简体 FZHei-B01S

方正琥珀简体 FZHuPo-M04S

方正楷体简体 FZKai-Z03S

方正隶变简体 FZLiBian-S02S

方正隶书简体 FZLiShu-S01S

方正美黑简体 FZMeiHei-M07S

方正书宋简体 FZShuSong-Z01S

方正舒体简体 FZShuTi-S05S

方正水柱简体 FZShuiZhu-M08S

方正宋黑简体 FZSongHei-B07S

方正宋三简体 FZSong

方正魏碑简体 FZWeiBei-S03S

方正细等线简体 FZXiDengXian-Z06S

方正细黑一简体 FZXiHei I-Z08S

方正细圆简体 FZXiYuan-M01S

方正小标宋简体 FZXiaoBiaoSong-B05S

方正行楷简体 FZXingKai-S04S

方正姚体简体 FZYaoTi-M06S

方正中等线简体 FZZhongDengXian-Z07S

方正准圆简体 FZZhunYuan-M02S

方正综艺简体 FZZongYi-M05S

方正彩云简体 FZCaiYun-M09S

方正隶二简体 FZLiShu II-S06S

方正康体简体 FZKangTi-S07S

方正超粗黑简体 FZChaoCuHei-M10S

方正新报宋简体 FZNew BaoSong-Z12S

方正新舒体简体 FZNew ShuTi-S08S

方正黄草简体 FZHuangCao-S09S

方正少儿简体 FZShaoEr-M11S

方正稚艺简体 FZZhiYi-M12S

方正细珊瑚简体 FZXiShanHu-M13S

方正粗宋简体 FZCuSong-B09S

方正平和简体 FZPingHe-S11S

方正华隶简体 FZHuaLi-M14S

方正瘦金书简体 FZShouJinShu-S10S

方正细倩简体 FZXiQian-M15S

方正中倩简体 FZZhongQian-M16S

方正粗倩简体 FZCuQian-M17S

方正胖娃简体 FZPangWa-M18S

方正宋一简体 FZSongYi-Z13S

方正剪纸简体 FZJianZhi-M23S

方正流行体简体 FZLiuXingTi-M26S

方正祥隶简体 FZXiangLi-S17S

方正粗活意简体 FZCuHuoYi-M25S

方正胖头鱼简体 FZPangTouYu-M24S

方正卡通简体 FZKaTong-M19S

方正艺黑简体 FZYiHei-M20S

方正水黑简体 FZShuiHei-M21S

方正古隶简体 FZGuLi-S12S

方正幼线简体 FZYouXian-Z09S

方正启体简体 FZQiTi-S14S

方正小篆体 FZXiaoZhuanTi-S13T

方正硬笔楷书简体 FZYingBiKaiShu-S15S

方正毡笔黑简体 FZZhanBiHei-M22S

方正硬笔行书简体 FZYingBiXingShu-S16S

前端布局神器display:flex

lee992阅读(3666)

2009年,W3C提出了一种新的方案–Flex布局,可以简便、完整、响应式地实现各种页面布局。目前已得到所有现在浏览器的支持。

flex浏览器支持

一、Flex布局是什么?

Flex是Flexible Box的缩写,翻译成中文就是“弹性盒子”,用来为盒装模型提供最大的灵活性。任何一个容器都可以指定为Flex布局。

.box{
    display: -webkit-flex; /*在webkit内核的浏览器上使用要加前缀*/
    display: flex; //将对象作为弹性伸缩盒显示
}

当然,行内元素也可以使用Flex布局。

.box {
    display: inline-flex; //将对象作为内联块级弹性伸缩盒显示
}

兼容性写法
.box {
    display: flex || inline-flex;
}

二、基本概念

采用Flex布局的元素,被称为Flex容器(flex container),简称“容器”。其所有子元素自动成为容器成员,成为Flex项目(Flex item),简称“项目”。

结构示意图

容器默认存在两根主轴:水平方向主轴(main axis)和垂直方向交叉轴(cross axis),默认项目按主轴排列。

  • main start/main end:主轴开始位置/结束位置;
  • cross start/cross end:交叉轴开始位置/结束位置;
  • main size/cross size:单个项目占据主轴/交叉轴的空间;

三、容器属性

设置在容器上的属性有6种。

  • flex-direction
  • flex-wrap
  • flex-flow
  • justify-content
  • align-item
  • align-content

flex-direction属性:决定主轴的方向(即项目的排列方向)

.box {
   flex-direction: row | row-reverse | column | column-reverse;
}
  • row(默认):主轴水平方向,起点在左端;
  • row-reverse:主轴水平方向,起点在右端;
  • column:主轴垂直方向,起点在上边沿;
  • column-reserve:主轴垂直方向,起点在下边沿。
主轴的4个方向

flex-wrap属性:定义换行情况

默认情况下,项目都排列在一条轴线上,但有可能一条轴线排不下。

一条轴线排不下

.box{
   flex-wrap: nowrap | wrap | wrap-reverse;
}
  • nowrap(默认):不换行;
    不换行nowrap
  • wrap:换行,第一行在上方;
    换行,第一行在上
  • wrap-reverse:换行,第一行在下方。
    换行,第一行在下

flex-flow属性:flex-direction和flex-wrap的简写,默认row nowrap

.box{
    flex-flow: <flex-direction> || <flex-wrap>;
}

justify-content属性:定义项目在主轴上的对齐方式。

对齐方式与轴的方向有关,本文中假设主轴从左到右。

.box {
   justify-content: start | end | flex-start | flex-end | center | left | right | space-between | space-around | space-evenly | stretch | safe | unsafe | baseline | first baseline | last baseline;
}
  • flex-start(默认值):左对齐;
    左对齐
  • flex-end:右对齐;
    右对齐
  • center:居中;
居中对齐
  • space-between:两端对齐,项目之间间隔相等;
两端对齐
  • space-around:每个项目两侧的间隔相等,即项目之间的间隔比项目与边框的间隔大一倍。
两侧间隔相等

align-items属性:定义在交叉轴上的对齐方式

对齐方式与交叉轴的方向有关,假设交叉轴从下到上。

.box{
    align-items: flex-start | flex-end | center | baseline | stretch;
}
  • flex-start:起点对齐;
起点对齐
  • flex-end:终点对齐;
终点对齐
  • center:中点对齐;
中点对齐
  • baseline:项目的第一行文字的基线对齐;
基线对齐
  • stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。

align-content属性:定义多根轴线的对齐方式

如果项目只有一根轴线,该属性不起作用。
所以,容器必须设置flex-wrap:···;

.box{
    align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
  • flex-start:与交叉轴的起点对齐;
起点对齐
  • flex-end:与交叉轴的终点对齐;
终点对齐
  • center:与交叉轴的中点对齐;
中点对齐
  • space-between:与交叉轴的两端对齐,轴线之间的间隔平均分布;
轴线之间等间距
  • space-around:每根轴线两侧的间隔相等,即轴线之间的间隔比轴线与边框的间隔大一倍;
轴线两侧等间距
  • stretch(默认值):轴线占满整个交叉轴。
项目未设置高度时

有意思的是,当你不给项目设置高度但是给容器设置align-content不为stretch时,同一轴线上的项目的高度将等于项目中高度最高的项目。

四、项目的属性

设置在项目上的属性也有6个。

  • order
  • flex-grow
  • flex-shrink
  • flex-basis
  • flex
  • align-self

order属性:定义项目的排列顺序。

数值越小,排列越靠前,默认为0,可以是负值。

.item {
    order: <整数>;
}
展示效果不明显,直接盗图

flex-grow属性:定义项目的放大比例

默认值为0,即如果空间有剩余,也不放大。
可以是小数,按比例占据剩余空间。

默认情况

.item{
    flex-grow: <数字>;
}

若所有项目的flex-grow的数值都相同,则等分剩余空间

等分剩余空间

若果有一个项目flex-grow为2,其余都为1,则该项目占据剩余空间是其余的2倍

不等分占据

flex-shrink属性:定义项目的缩小比例

默认值都为1,即如果空间不足将等比例缩小。
如果有一个项目的值为0,其他项目为1,当空间不足时,该项目不缩小。
负值对该属性无效,容器不应该设置flex-wrap。


.item{
    flex-shrink: <非负整数>;
}

如果一个项目设置flex-shrink为0;而其他项目都为1,则空间不足时,该项目不缩小。

设置flex-shrink为0的项目不缩小

如果所有项目都为0,则当空间不足时,项目撑破容器而溢出。

不缩小

如果设置项目的flex-shrink不为0的非负数效果同设置为1。

flex-basis属性:定义在分配多余空间之前,项目占据的主轴空间。

默认值为auto,浏览器根据此属性检查主轴是否有多余空间。


.item{
    flex-basis:  <auto或者px>;
}

注意设置的flex-basis是分配多余空间之前项目占据的主轴空间,如果空间不足则默认情况下该项目也会缩小。

设置flex-basis为350px,但空间充足

 

空间不足,项目缩小,小于设定值

flex属性是flex-grow,flex-shrink和flex-basis的简写

默认值为0 1 auto,第一个属性必须,后两个属性可选。

.item{
    flex: none | [<flex-grow><flex-shrink><flex-basis>];
}

  • 可以用 flex:auto; 代替 flex: 1 1 auto;
  • 可以用 flex: none;代替 flex: 0 0 auto
####align-self属性:允许单个项目与其他项目有不一样的对齐方式
>默认值为auto,表示继承父元素的align-items属性,并可以覆盖align-items属性。

.item{
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}