关于flexbox:手机号码生成器

海豚号码生成器,性能非常丰盛弱小的电脑软件,在软件上,能够抉择全国省份城市,一个省份能够多选城市,批量疾速生成手机号码:(一)能够在线随机生成手机号码;(二)也能够生成靓号豹子号连号,软件主动提供多种尾号组合格局,AAAA、BAAA、ABAB等;(三)还能够你来输出号段即前七位,自定义四位尾号来生成号码。 当然了生成的号码是不能接信息的,也不是接验证马来注册APP的,也不能作为手几卡打电话给他人显示这个号码的。它只是举例这个城市有哪些号码给你看的,单纯的展现号码而已,望您分明这点。 软件除了后面所讲的多种号码生成性能以外,还有更多弱小的性能:【批量导入手机通讯录性能】能够把你的电脑上的手机号码一键导入手机通讯录。【号码打印前排版性能】把你手里的单行单列的号码疾速排版成多行多列,excel表格。【文本信息中提取号码性能】从你手里excel有的混淆文本内容(手机号+汉字+地址等混合),它能够疾速独自提取进去手机号码,去除其余芜杂的货色。【号码的综合整顿性能】它能够帮你整顿你手里的号码,去除非手机号,去除反复号码,号码排序、乱序,号码按运营商筛选,号码按省份城市筛选,号码分批分隔等。

October 19, 2021 · 1 min · jiezi

关于flexbox:flex布局制作自适应网页

网页布局是css的一个重点利用。传统的布局都是依赖display、position、float属性来实现的,然而非凡布局就不易实现,如垂直居中。 01 flex布局是什么?Flex 是 Flexible Box的简写,意为“弹性布局”为盒模型提供最大灵活性。任何一个容器都能够指定为flex布局。 采纳flex布局的元素,称为flex容器。他的所有子元素主动成为容器成员,称为flex我的项目,简称我的项目。 容器默认存在两根轴:程度的主轴(main axis)和垂直的穿插轴(cross axis)。主轴的开始地位(与边框的交叉点)叫做main start,完结地位叫做main end;穿插轴的开始地位叫做cross start,完结地位叫做cross end。 我的项目默认沿主轴排列。单个我的项目占据的主轴空间叫做main size,占据的穿插轴空间叫做cross size。 02 容器的属性flex-direction 设置排列方向(向下、向上、向左、向右)的 flex-wrap 内容搁置不下时换行形式 flex-flow 是flex-direction和flex-wrap属性简写默认值row nowrap justify-content 定义在主轴上的对齐形式。 align-items 定义我的项目在穿插轴上如何对齐。 align-content 定义多根轴线的对齐形式 flex-direction属性值有四个: row(默认值):程度方向,从左到右,终点在左。 row-reverse:程度方向,从右到左,终点在右。 column:垂直方向,从上到下。 column-reverse:垂直方向,从下到上。 flex-wrap属性值有三个: nowrap:不换行。 wrap:失常换行,在第一行下方。 wrap-reverse:换行,在第一行上方。 justify-content属性值有五个: flex-start(默认值):左对齐 flex-end:右对齐 center:居中 space-between:两端对齐 space-around:每个我的项目两侧的距离相等。 align-items属性值有五个: flex-start:穿插轴的终点对齐。 flex-end:穿插轴起点对齐。 center:穿插轴中点对齐。 baseline:我的项目的第一行文字的基线对齐。 stretch(默认值):如果我的项目未设置高度或设置为auto,将占满整个容器的高度。 align-content属性值六个: flex-start:穿插轴的终点对齐。 flex-end:穿插轴起点对齐。 center:穿插轴中点对齐。 space-between:与穿插轴两端对齐,轴线之间距离均匀散布。 space-around:每根轴线两侧距离都相等。 stretch(默认值):轴线占满整个穿插轴。 03 我的项目属性order:定义我的项目的排列程序,数值越小,排列越靠前,默认为0。 flex-grow属性:定义我的项目的放大比例,默认为0 flex-shrink:定义我的项目的放大比例,默认为1。 flex-basis:定义在调配多余空间之前,我的项目占据的主轴空间。默认值为auto,即我的项目原本大小。 flex:是flex-grow、flex-shrink、flex-basis的缩写,默认值0 1 auto。 align-self:属性容许单个我的项目有与其余我的项目不一样的对齐形式,可笼罩align-items属性。默认值为auto,示意继承父元素的align-items属性,如果没有父元素,则等同于stretch。

July 10, 2021 · 1 min · jiezi

译Flexbox-基本原理

原文地址:Flexbox Fundamentals原文作者:Marina-ferreira 整理自 MDN web docs 的笔记,同时参考了 Web Bos 上的什么是 Flexbox 系列视频。 介绍Flexbox 是 Flexible Box Module 的缩写。 它是一种布局模型,允许我们方便地控制 html 元素之间的空间分布和对齐 [2]。 Flexbox 一次只能控制一个维度的定位(行或者列)。二维定位的控制需要依靠网格布局 [2]。 给出以下模板: <body> <div class="container"> <div class="box box-1">1</div> <div class="box box-2">2</div> <div class="box box-3">3</div> <div class="box box-4">4</div> <div class="box box-5">5</div> <div class="box box-6">6</div> <div class="box box-7">7</div> <div class="box box-8">8</div> <div class="box box-9">9</div> <div class="box box-10">10</div> </div></body>上面 div 的行为默认遵循正常的 html 文档流,因此从上到下、从左到右进行渲染,并且会占据整个 body 的宽度,因为它们的 display 属性默认是 block。 弹性项目当为 .containerdiv 设置 display: flex 时,所有的直接子 div 将成为弹性项目,并且获得新的行为 [2]: ...

June 8, 2019 · 3 min · jiezi

Flex简易教程

常见的前端布局模型涵盖浮动、定位和弹性盒等 CSS 技术,其中浮动和定位技术往往在制作自适应布局页面时显得不够优雅——对于浮动布局,前后端分离时代很多时候我们并不知道每行会遍历显示多少个元素,每个元素会被内容撑到多宽,所以每个元素的宽度百分比是很难去控制的;对于定位布局,在垂直居中(尤其是多个兄弟元素的垂直居中)样式上会显得比较吃力。鉴于但不限于以上两点,如今越来越多的开发者正选择弹性盒技术(即 Flex),如果你对这项技术还比较生疏,Flex简易教程 就其基本语法、兼容性写法以及典型实现等给出介绍,希望能够帮到你。 Flex简易教程首发于我的个人博客 ,欢迎访问。

May 24, 2019 · 1 min · jiezi

CSS三栏布局多种方法详解比较兼容性

<!-- 题目:假设高度已知,请写出三栏布局,其中左栏、右栏宽度各为300px,中间自适应 -->这是一道经典的面试题,下面记录了css布局的5种方法。 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>三栏布局</title> <style> * { margin: 0; padding: 0; } </style></head><body><!--5种解决方案--></body>1. 浮动解决方案: <!-- 1. 浮动解决方案 --> <scetion class="layout float"> <!-- 样式 --> <style media="screen"> .layout.float article div { min-height: 80px; } .layout.float .left { width: 300px; background-color: red; float: left; } .layout.float .center { background-color: yellow; } .layout.float .right { width: 300px; background-color: blue; float: right; } </style> <!-- 结构 --> <!-- 注意:结构中 右浮动的div一定要写在 center 的前面,否则无效. --> <h2>三栏布局</h2> <article class="left-ritgh-center"> <div class="left"></div> <div class="right"></div> <div class="center"> <h2>浮动解决方案</h2> 1.这是三栏布局的浮动解决方案; 2.这是三栏布局的浮动解决方案; 3.这是三栏布局的浮动解决方案; 4.这是三栏布局的浮动解决方案; 5.这是三栏布局的浮动解决方案; 6.这是三栏布局的浮动解决方案; </div> </article> </scetion>2. 绝对定位解决方案: <!-- 2. 绝对定位解决方案 --> <section class="layout absolute"> <!-- 样式 --> <style> .layout.absolute article div { min-height: 80px; position: absolute; } .layout.absolute .left { width: 300px; background-color: red; left: 0; } .layout.absolute .center { background-color: yellow; left: 300px; right: 300px; } .layout.absolute .right { width: 300px; background-color: blue; right: 0; } </style> <!-- 结构 --> <h1>三栏布局</h1> <article class="left-center-right"> <div class="left"></div> <div class="center"> <h2>绝对定位解决方案</h2> 1.这是三栏布局的绝对定位解决方案; 2.这是三栏布局的绝对定位解决方案; 3.这是三栏布局的绝对定位解决方案; 4.这是三栏布局的绝对定位解决方案; 5.这是三栏布局的绝对定位解决方案; 6.这是三栏布局的绝对定位解决方案; </div> <div class="right"></div> </article> </section>3. flexbox 解决方案: <!-- 3. flexbox解决方案 --> <section class="layout flexbox"> <!-- 样式 --> <style> /* flexbox解决方案在浏览器中显示时被上面的绝对定位解决方案挡住了,设置一个margin-top */ .layout.flexbox { margin-top: 110px; } /* 设置最低高度 */ .layout.flexbox article div { min-height: 80px; } .layout.flexbox article { display: flex; } .layout.flexbox .left { width: 300px; background-color: red; } .layout.flexbox .center { /*center部分增长 使整行填充*/ flex: 1; background-color: yellow; } .layout.flexbox .right { width: 300px; background-color: blue; } </style> <!-- 结构 --> <h1>三栏布局</h1> <article class="left-center-right"> <div class="left"></div> <div class="center"> <h2>flexbox解决方案</h2> 1.这是三栏布局的flexbox解决方案; 2.这是三栏布局的flexbox解决方案; 3.这是三栏布局的flexbox解决方案; 4.这是三栏布局的flexbox解决方案; 5.这是三栏布局的flexbox解决方案; 6.这是三栏布局的flexbox解决方案; </div> <div class="right"></div> </article> </section>4. 表格布局解决方案 <!-- 4. 表格布局解决方案 --> <section class="layout table"> <!-- 样式 --> <style> .layout.table .left-center-right { width: 100%; min-height: 80px; display: table; } .layout.table .left-center-right>div { display: table-cell; } .layout.table .left { width: 300px; background-color: red; } .layout.table .center { background-color: yellow; } .layout.table .right { width: 300px; background-color: blue; } </style> <!-- 结构 --> <h1>三栏布局</h1> <article class="left-center-right"> <div class="left"></div> <div class="center"> <h2>表格布局解决方案</h2> 1.这是三栏布局的表格布局解决方案; 2.这是三栏布局的表格布局解决方案; 3.这是三栏布局的表格布局解决方案; 4.这是三栏布局的表格布局解决方案; 5.这是三栏布局的表格布局解决方案; 6.这是三栏布局的表格布局解决方案; </div> <div class="right"></div> </article> </section>5. 网格布局解决方案: <!-- 5. 网格布局解决方案 --> <section class="layout grid"> <!-- 样式 --> <style> .layout.grid .left-center-right { width: 100%; display: grid; /* 网格行高 */ grid-template-rows: 100px; /* 网格列宽 */ grid-template-columns: 300px auto 300px; } .layout.grid .left { background-color: red; } .layout.grid .center { background-color: yellow; } .layout.grid .right { background-color: blue; } </style> <!-- 结构 --> <h1>三栏布局</h1> <article class="left-center-right"> <div class="left"></div> <div class="center"> <h2>网格布局解决方案</h2> 1.这是三栏布局的网格布局解决方案; 2.这是三栏布局的网格布局解决方案; 3.这是三栏布局的网格布局解决方案; 4.这是三栏布局的网格布局解决方案; 5.这是三栏布局的网格布局解决方案; 6.这是三栏布局的网格布局解决方案; </div> <div class="right"></div> </article> </section>效果: ...

May 23, 2019 · 2 min · jiezi

FlexBox学习 弹性布局_019

FlexBox学习 弹性布局Flexible Box 模型,通常被称为 flexbox,是一种一维的布局模型。它给 flexbox 的子元素之间提供了强大的空间分布和对齐能力。一维布局:一个 flexbox一次只能处理一个维度上的元素布局,一行或者一列。flex: auto | initial | none | inherit | [ flex-grow ] || [ flex-shrink ] || [ flex-basis ]FlexBox的两根轴线当使用 flex 布局时,首先想到的是两根轴线 — 主轴和交叉轴。主轴由 -direction 定义,另一根轴垂直于它。使用 flexbox 的所有属性都跟这两根轴线有关, 所以有必要在一开始首先理解它。主轴 flex-directionrowrow-reversecolumncolumn-reverse<!DOCTYPE html><html lang=“en”> <head> <meta charset=“UTF-8” /> <meta name=“viewport” content=“width=device-width, initial-scale=1.0” /> <meta http-equiv=“X-UA-Compatible” content=“ie=edge” /> <title>FlexBox学习</title> <style> .container { display: flex; flex-direction: row; } .container-item { height: 100px; width: 100px; margin: 10px; border: 1px solid #dddddd; background-image: linear-gradient(-90deg, #3860f4 0%, #5f87f8 100%); } </style> </head> <body> <div class=“container”> <div class=“container-item”>1</div> <div class=“container-item”>2</div> <div class=“container-item”>3</div> <div class=“container-item”>4</div> <div class=“container-item”>5</div> <div class=“container-item”>6</div> </div> </body></html>交叉轴交叉轴垂直于主轴,所以如果你的flex-direction (主轴) 设成了 row 或者 row-reverse 的话,交叉轴的方向就是沿着列向下的。如果主轴方向设成了 column 或者 column-reverse,交叉轴就是水平方向。起始线和终止线flexbox 不会对文档的书写模式提供假设。过去,CSS的书写模式主要被认为是水平的,从左到右的。现代的布局方式涵盖了书写模式的范围,所以不再假设一行文字是从文档的左上角开始向右书写,新的行也不是必须出现在另一行的下面。 如果 flex-direction 是 row ,那么主轴的起始线是左边,终止线是右边。https://developer.mozilla.org…Flex 容器CSS采用了 flexbox 的区域就叫做 flex 容器。为了创建 flex 容器,把一个容器的 display 属性值改为 flex 或者 inline-flex。容器中的直系子元素就会变为 flex 元素。所有CSS属性都会有一个初始值,所以 flex 容器中的所有 flex 元素都会有下列行为:元素排列为一行 (flex-direction 属性的初始值是 row)。元素从主轴的起始线开始。元素不会在主维度方向拉伸,但是可以缩小。元素被拉伸来填充交叉轴大小。flex-basis 属性为 auto。flex-wrap 属性为 nowrap。这会让你的元素呈线形排列,并且把自己的大小作为主轴上的大小。如果有太多元素超出容器,它们会溢出而不会换行。如果一些元素比其他元素高,那么元素会沿交叉轴被拉伸来填满它的大小。用flex-wrap实现多行Flex容器flexbox是一维模型,但可以使我们的flex项目应用到多行中。 在这样做的时候,应该把每一行看作一个新的flex容器。 任何空间分布都将在该行上发生,而不影响该空间分布的其他行。.container { display: flex; flex-direction: column-reverse; flex-flow: wrap; } .container-item { height: 100px; margin: 10px; width: 40%; border: 1px solid #dddddd; background-image: linear-gradient(-90deg, #3860f4 0%, #5f87f8 100%); }简写属性 flex-flow可以将两个属性 flex-direction 和 flex-wrap 组合为简写属性 flex-flow。第一个指定的值为 flex-direction ,第二个指定的值为 flex-wrap。flex 元素上的属性在考虑这几个属性的作用之前,需要先了解一下 布局空白 available space 这个概念。这几个 flex 属性的作用其实就是改变了 flex 容器中的布局空白的行为。同时,布局空白对于 flex 元素的对齐行为也是很重要的。假设在 1 个 500px 的容器中,我们有 3 个 100px 宽的元素,那么这 3 个元素需要占 300px 的宽,剩下 200px 的布局空白。在默认情况下, flexbox 的行为会把这 200px 的空白留在最后一个元素的后面。如果期望这些元素能自动地扩展去填充满剩下的空白,那么我们需要去控制布局空白在这几个元素间如何分配,这就是元素上的那些 flex 属性要做的事。flex-grow 定义弹性盒子元素的扩展比率。flex-grow 若被赋值为一个正整数, flex 元素会以 flex-basis 为基础,沿主轴方向增长尺寸。这会使该元素延展,并占据此方向轴上的布局空白(available space)。如果有其他元素也被允许延展,那么会各自占据布局空白的一部分。如果我们给上例中的所有元素设定 flex-grow 值为1, 容器中的布局空白会被这些元素平分。它们会延展以填满容器主轴方向上的空间。flex-grow 属性可以按比例分配空间。如果第一个元素 flex-grow 值为2, 其他元素值为1,则第一个元素将占有2/4(上例中,即为200px 中的 100px), 另外两个元素各占有1/4(各50px)。flex-shrink 定义弹性盒子元素的收缩比率flex-grow属性是处理flex元素在主轴上增加空间的问题,相反flex-shrink属性是处理flex元素收缩的问题。如果容器中没有足够排列flex元素的空间,那么可以把flex元素flex-shrink属性设置为正整数来缩小它所占空间到flex-basis以下。与flex-grow属性一样,可以赋予不同的值来控制flex元素收缩的程度 —— 给flex-shrink属性赋予更大的数值可以比赋予小数值的同级元素收缩程度更大。在计算flex元素收缩的大小时,它的最小尺寸也会被考虑进去,就是说实际上flex-shrink属性可能会和flex-grow属性表现的不一致。flex-basis 定义弹性盒子元素的默认基准值flex-basis 定义了该元素的布局空白(available space)的基准值。 该属性的默认值是 auto 。此时,浏览器会检测这个元素是否具有确定的尺寸。 在上面的例子中, 所有元素都设定了宽度(width)为100px,所以 flex-basis 的值为100px。如果没有给元素设定尺寸,flex-basis 的值采用元素内容的尺寸。这就解释了:我们给只要给Flex元素的父元素声明 display: flex ,所有子元素就会排成一行,且自动分配小大以充分展示元素的内容。元素间的对齐和空间分配Flexbox的一个关键特性是能够设置flex元素沿主轴方向和交叉轴方向的对齐方式,以及它们之间的空间分配。align-itemsalign-items 属性可以使元素在交叉轴方向对齐。stretchflex-startflex-endcenterjustify-contentjustify-content属性用来使元素在主轴方向上对齐,主轴方向是通过 flex-direction 设置的方向。初始值是flex-start,元素从容器的起始线排列。但是你也可以把值设置为flex-end,从终止线开始排列,或者center,在中间排列.stretchflex-startflex-endcenterspace-aroundspace-between水平居中.container { display: flex; justify-content: center; } https://www.html.cn/archives/… ...

March 26, 2019 · 2 min · jiezi

JavaScript五十问——对比来说CSS的Grid与FlexBox(下篇)

前言在上篇——JavaScript五十问——对比来说CSS的Grid与FlexBox(上篇),我介绍了Flex的属性与使用,今天我们来总结一下Grid的具体使用方法,最后会结合Flex与Grid布局讲一讲二者的联系与不同。需要注意得是,Grid布局与我们之前所熟悉的css布局思路有很大的不同,阅读这篇文章之前,需要把我们平时对css的刻板印象抛弃掉,准备接受知识的洗礼吧,少年!Grid与 Flex 相同,Grid 也分为容器与元素两个概念;在一个 html 标签中添加样式:display:grid或者display:inline-grid,即构建了一个 Grid 的容器,里面的 dom 元素即为 Grid 元素。同样,Grid 也分为两类属性,分别装载在容器与元素上,下面一一说明。HTML结构说明以下所有例子均基于或扩展于下面的HTML结构:<style> .container{ width:500px; background-color:#999; } .item{ width: 50px; background-color:#567; color:#fff; } </style> <div class=“container”> <div class=“item”>1</div> <div class=“item”>2</div> <div class=“item”>3</div> <div class=“item”>4</div> <div class=“item”>5</div> </div>Grid 基本概念介绍网格Grid容器里面有网格一系列的概念;听着唬人,但是结合图很容易理解。网格线水平方向有垂直方向的线段即为网格线网格轨道两个相邻的平行网格线之间的区域就是网格轨道网格单元四个相邻边组成的区域就是网格单元。frfr是Grid中特有表示尺寸的单位,是分数——fraction的缩写,假设我们现在有四个grid元素,每个元素的宽度都是1fr,那么每个元素的实际宽度就是总宽度的1/4。fr也可以跟%,px 共同使用,他的计算规则就是刨去px与%的剩余空间作为fr分配空间,所有fr相加之和作为分母,分子为每个元素对应的fr的值。(当然,在Grid语境下,我们是不需要设置width属性的,这样说是为了让大家容易理解)。这样说来好像fr仅仅是%的另外一种写法,随着我的介绍,你就会发现fr优于%的地方。接下来,我还是以脑图为思路介绍Grid的各个属性。容器属性grid-templategrid-tempalte是三个属性的简写,这三个属性都是描述整块区域即多个网格单元的属性。grid-template-rowsgrid-template-rows是描述横向的单元轨道属性的。可以试想一下,我们在一个Grid容器中,关于这个属性,我们关心的是什么呢?无非就是这个容器中有多少行,每行的高度;所以,这个属性就是让我们定义这些值得。先来看语法:grid-template-rows: <track-size> | <line-name> <track-size> …;这个属性除了可以定义轨道尺寸和个数之外,还允许我们定义两个轨道之间的网格线的名称,至于他的作用,我们先按下不表,先来看这个属性是怎样定义每个轨道的尺寸和轨道个数的。先来看一个例子:.container{ grid-template-rows:200px auto 1fr 1fr 20%; grid-row-gap:10px;//定义轨道之间的间距}grid-template-rows定义了五个值,表示Grid容器里面有五行,可以使用任意的定义尺寸的方式,效果如下其中auto值就表示元素的实际占用大小。Grid分配空间首先计算除了fr对应轨道的尺寸,然后将剩余尺寸按照比例分配给fr加持的元素。以上,我们在Grid容器里定义了五行容器轨道,当我们定义轨道过多时,可以使用repeat函数来减少我们的工作量,语法为:grid-template-rows:repeat(n, size)例子:.container{ grid-template-rows:repeat(5,1fr); grid-row-gap:10px;}上面就定义了五个网格轨道,每个轨道的高度是Grid容器高度的1/5。grid-template-columnsgrid-template-columns 与 grid-template-rows使用方法是一致的,这两个属性共同作用于Grid容器,相当于把Grid容器分割为mn个子区域。例子:.container{ grid-template-rows:repeat(3,1fr); grid-template-columns: repeat(2, 1fr)上面这个例子就会得到六个均等分的子区域。通过上面两个属性,相信大家对Grid布局有一个基本的认识了,想必对Grid二维布局的模式也有一些概念了,接下来才是Grid精彩之处,震撼灵魂的地方!grid-template-areas上面两个属性分别设置Grid行属性和列属性,grid-template-areas是设置Grid区域的。所谓区域是由一个或多个行、列、单元组成的一篇区域。首先看一下语法:.container { grid-template-areas: “<grid-area-name> | . | none | …” “…”;}其中grid-area-name表示网格区域的名称.表示空的网格区域none 表示没有定义网格区域在我们平时开发时,经常会出现上头下尾中间两栏布局的情况,下面我们使用grid-template-areas完成这样的布局。<style>.container{ display:grid; grid-template-rows:60px auto 60px; grid-template-columns:100px 1fr; grid-template-areas: “header header” “left right” “footer footer”;}.container .item:first-child{ grid-area: header;}.container .item:nth-child(2){ grid-area: left;}.container .item:nth-child(3){ grid-area: right;}.container .item:nth-child(4){ grid-area: footer;}</style>.container{ display:grid; grid-template-rows:60px 1fr 60px; grid-template-columns:100px 1fr; grid-template-areas: “header header” “left right” “footer footer”;}.container .item:first-child{ grid-area: header;}.container .item:nth-child(2){ grid-area: left;}.container .item:nth-child(3){ grid-area: right;}.container .item:nth-child(4){ grid-area: footer;}.container{ display:grid; grid-template-rows:60px 1fr 60px; grid-template-columns:100px 1fr; grid-template-areas: “header header” “left right” “footer footer”;}.container .item:first-child{ grid-area: header;}.container .item:nth-child(2){ grid-area: left;}.container .item:nth-child(3){ grid-area: right;}.container .item:nth-child(4){ grid-area: footer;}</style><div class=“container”> <div class=“item”>1</div> <div class=“item”>2</div> <div class=“item”>3</div> <div class=“item”>4</div></div>在Grid容器中,我们定义了6个网格单元,使用grid-tempalte-areas划分了header footer left right 四片区域;而在grid元素中,每个元素使用grid-area来指定元素所对应的grid区域。因此,我们虽然划分了6个单元,但可以使用四个元素来表示。是不是很神奇呢,更神奇的是,grid-area-name是支持中文定义的。以上grid-template的子属性就说完了,grid-template是以上那三个属性的简写方式,语法如下:grid-tempalte:<‘grid-template-rows’> / <‘grid-template-columns’>``grid-tempalte:[ <line-names>? <string> <track-size>? <line-names>? ]+ [ / <explicit-track-list> ]?例如上面的例子可以这样简写grid-template: “header header” 60px “left right” 1fr “footer footer” 60px / 50px 1fr;grid-gapgrid-gap用来描述Grid 区域之间间隙的尺寸大小。语法如下:.container { grid-gap: <grid-row-gap> <grid-column-gap>;}grid-gap是简写属性,也可以分别定义grid行间隔和grid 列间隔。.container{ grid-row-gap:10px; grid-column-gap:10px;}grid-gap与margin与padding不同,它不占用当前元素的盒模型的位置。上图显示的很清楚,3号元素的margin 与 padding 均为零。place-itemsplace-items 是 justify-items和align-items的简写方式这两个属性分别定义了Grid元素水平与垂直分布方式。语法如下: justify-items: stretch | start | end | center; align-items: stretch | start | end | center;对于这四个属性,默认stretch,相信读者在熟悉了Flex布局后都不会陌生,这里不多做解释,直接看例子,以align-items 为例:.container{ display:grid; grid-template: “header header” 160px “footer footer” 160px / 160px 160px; height:500px; grid-row-gap:10px; grid-column-gap: 10px;}首先定义四个grid单元,每个单元的长宽均为160px接下来我们更改align-items的值align-items:stretchalign-items:centeralign-items:startalign-items: end为了方便大家理解,我用红框框出每个Grid单元所占用的空间。由此可以看出,place-items属性是用来表明一个元素在当前grid单元中的分布方式,这个元素的拉伸,居中等都是以grid单元作为参考的。place-contentplace-content同样是一个简写属性,它包括:justify-content 和 align-content,它表示grid元素在grid容器中的分布方式,只有当grid容器中有剩余空间的时候才起作用。语法如下:justify-content: stretch | start | end | center | space-between | space-around | space-evenly;align-content: stretch | start | end | center | space-between | space-around | space-evenly;属性值得含义同Flex;这里不再过多说明,读者可以自行验证。grid-auto-rows 与 grid-auto-columnsgrid-auto-rows 和 grid-auto-columns;用于当实际的Grid的元素多余划分的Grid元素时,定义多余Grid元素的长宽;例如我们在HTML里面一定了五个Grid元素,但是在css中只定义了22的Grid单元,可以使用grid-auto来定义多出来的轨道的尺寸。grid-auto-flowgrid-auto-flow的用法需要结合下面的元素属性来说明。元素属性grid-column-start grid-column-end两个属性是用来定义Grid元素列方向上的起始与终止位置。语法格式为: grid-column-start: <number> | <name> | span <number> | span <name> | auto其中:number为起止第几条网格线name 为网格线的名称span <number>网格元素会跨越网格单元的数量span <name> 当前的网格元素会在哪一个网格线上开始or终止注意 使用span 如果是start,表示这个从开始的位置跨过的grid单元,如果是end 表示这个元素覆盖的grid单元。grid-column是它们的简写方式,语法为:grid-column:grid-column-start / grid-column-endgrid-row-start grid-row-endgrid-row属性与grid-column用法一致,这里不过多赘言,直接看例子:.container{ display:grid; grid-template-rows:[rone]1fr[rtwo]3fr[rthree]1fr[rfour]; grid-template-columns: [cone]1fr[ctwo]5fr[cthree]2fr[cfour]; height:500px;}.item:first-child{ grid-column-start:1; grid-column-end:cfour; grid-row-start:rone; grid-row-end: 2; }.item:nth-child(2){ grid-column-start:1; grid-column-end:span 1; grid-row-start:rtwo; grid-row-end: span cthree;}.item:nth-child(3){ grid-column-start: ctwo; grid-column-end:4; grid-row-start:rtwo; grid-row-end: span cthree;} .item:nth-child(4){ grid-column-start:1; grid-column-end:4; grid-row-start:3; grid-row-end: span 4;} 效果:首先在Grid容器中划分出9个grid单元,这九个单元被六个网格线所分割,并给这六个网格线命名。在四个Grid元素中定义横行的起始位置。grid-row 与 grid-column结合使用,可以起到与Grid-template-areas同样的效果。grid-areagrid-area我们在前面已经接触过一部分了,他与Grid容器中的grid-template-areas一起定义,也是grid-column与grid-row的简写属性,语法为: grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>;name为grid区域的名称,与grid-tempalte-areas结合使用。上面我们的例子就可以用grid-area表示:.item:first-child{ grid-area:1/rone/2/cfour;}place-selfjustify-selfjustify-self定义Grid元素的水平布局方式的,例如,我们在Grid容器中定义justify-items的属性为默认属性,而在某一个Grid元素中定义justify-self为center,那么其他元素表现为拉伸,这个元素则单独表现为居中。也就是说,justify-self在Grid容器中对应的属性是justify-items。语法为:.item { justify-self: stretch | start | end | center;}algin-selfalign-self与justify-self一致,改变的是这个元素的垂直部署方式,与容器中align-items对应,语法为:.container { align-self: stretch | start | end | center;}由于这四个属性值已经在我们的系列文章中出现多次,这里不再多说。plac-self是以上两个属性的简写方式,语法为:.container { place-items: <align-self> / <justify-self>;}再论frGrid的所有属性已经介绍完毕了,在对Grid宇宙有了一个基本的认识后,我们再回头看一下Grid宇宙中出现的新尺寸单位——fr。可能大家在刚刚结仇到fr这个单位时,都会认为它是%的一个别名;但是,我们来看最下面的例子:我们在Grid容器中划分出四个Grid区域,并定义每个区域的宽度为25%,并定义每个Grid元素之间的gap宽70px;.container{ display:grid; grid-template-columns: repeat(4, 25%); grid-column-gap: 70px;}效果如下:很明显,这里元素溢出了。这种情况是我们不想看到的。下面,我们将25%替换为1fr看一下效果:效果对比很明显。而造成两者显著区别的原因是二者的计算空间方式的不同。使用百分比它的分母是父元素的width或者height,而fr的分母是父元素中剩余空间的尺寸;css会首先计算使用%和px定义的元素尺寸,剩下的空间再由fr元素进行比例分配。这就是使用fr不会出现元素溢出的情况。当然我们也可以使用calc避免溢出的尴尬,但是两种解决方案孰优孰略已经一目了然了。Flex 与 GridFlex布局与Grid布局有很多相似的地方,例如justify-content和justify-items的用法。但是更多的是不同,最重要的是Grid开拓了二维布局的方式,相比于传统的css布局方式(Flex、bootstrp 12列),Grid开创了网格的概念,用户可以从横纵两个方面部署元素。正是因为如此,在Grid宇宙中,传统的css布局、尺寸属性就显得格格不入了。而Grid布局的二维特性所带来的整体观,使Grid在页面级别样式上更加游刃有余。而Flex相比于Grid 更加适合小组件上的样式开发,二者并不冲突相信在Grid 与 Flex双双加持之下,一定会收获更好的开发效果!Grid布局还是一个较新潮的概念,我也是一般看资料学习,一边分享,由于缺少实际的开发经验,对于很多属性的应用场景还没有很深入的理解,故而有的属性一笔带过;如果我有理解不正确的地方,欢迎大家指正!参考文献MDN:Grid Layout张鑫旭:写给自己看的display: grid布局教程知乎:CSS 新的长度单位 fr 你知道么?What’s more:JavaScript五十问——对比来说CSS的Grid与FlexBox(上篇) ...

February 23, 2019 · 2 min · jiezi

CSS Flexbox 可视化手册

翻译:疯狂的技术宅原文:https://medium.com/swlh/css-f…本文首发微信公众号:jingchengyideng欢迎关注,每天都给你推送新鲜的前端技术文章介绍Flexbox是 Flexible Box Module(弹性盒模型)的缩写。 是一种可以轻松控制html元素之间的空间分布和对齐的布局模型。Flexbox同一时间只能控制行或列中的一个维度。对于二维控制需要 CSS 网格布局。首先给出如下模板:<body> <div class=“container”> <div class=“box box-1”>1</div> <div class=“box box-2”>2</div> <div class=“box box-3”>3</div> <div class=“box box-4”>4</div> <div class=“box box-5”>5</div> <div class=“box box-6”>6</div> <div class=“box box-7”>7</div> <div class=“box box-8”>8</div> <div class=“box box-9”>9</div> <div class=“box box-10”>10</div> </div></body>以上 div 的默认行为遵循普通的html文档流,将会从上到下、从左到右呈现,并采用整个 body 的宽度,因为其 display 属性默认为block。弹性项目当 display: flex 应用于 .container div 时,所有直接子div都变为 flex-items,并获得新的行为它们将显示在同一行中,因为flex-direction默认为row它们将会从左到右显示其中的项目不会自动伸展来适应整个宽度(主轴),为了做到这一点,它们会缩小。项目会被拉伸以适合交叉轴(在此示例中为高度)。 如果这些项目的高度不一致,它们将会伸展到最高的那个高度flex-basis 默认为 auto(项目宽度将由其内容决定)flex-wrap 默认为nowrap(如果容器的宽度不足以适合这些项目,它们不会换行,而是会溢出)出于可视化的目的,让我们拉伸容器使其占据整个高度。弹性容器display:flex 使容器扩展至整个可用宽度。 这点与 display:inline-flex 相反,它使容器缩小到内容的宽度。弹性方向一旦被声明为 flex 容器,就可以认为该元素具有两个轴:主轴与交叉轴。 主轴由flex-direction属性定义。 交叉轴垂直于前者。flex-direction 属性有四个值:row,row-reverse,column 和 column-reverse。其默认值为row,它从左到右水平设置主轴,交叉轴从上到下垂直截取。 类似地, column 值从顶部到底部垂直设置主轴,从左到右设置交叉轴。 这两个选项的相反属性使主轴反转180°。 交叉轴保持不变。可以通过下图观察这些值的 flex-items 行为:Flex Wrap当容器中的空间不足以容纳其中的弹性项目时,可以用 flex-wrap 来处理。在默认情况下,flex-wrap 被设置为 nowrap,这意味着如果容器不能适应在其内的行中原始宽度的项目,则这些项目将会缩小来进行适应。 如果它们因为某种原因无法收缩,则会溢出容器。把项目宽度设置为300px,nowrap 选项会输出以下结果:其中,每个项目都会缩小到大约 70px 来适合容器。当属性被更新为wrap时,现在项目的宽度实际上是原始值300px。 当第一行不足以容纳300px时,则该项目将换行到新的一行,而不是溢出容器。 应该把其中的每一行都视为单独的弹性容器。 一个容器中的空间分布不会影响到与其相邻的其他容器。但是为什么弹性项目会占据整个屏幕高度呢? 在第一部分中,容器高度设置为 100vh ,因此可用空间被平均分为四行,来适合 300px 项目的需要。 如果我们没有设置 100vh,容器的高度则会遵循项目内容的高度,如下图所示:另一个选项是wrap-reverse,它会反转交叉轴。 通过 flex-direction 属性从上到下设置,wrap-reverse 将其转换为从下到上。通过使用 flex-direction:column 反转主轴,不适应的元素会被换到另一列,剩余空间被均匀分割。wrap-reverse 选项会沿着列方向将交叉轴从右向左反转,产生以下输出:由于flexbox是单维度布局,所以在进行反转时,项目从下到上进行排列(对于行方向),但保持左右结构,只改变了交叉轴。弹性流flex-direction 和 flex-wrap 可以在一个属性当中声明:flex-flow:[direction][wrap] 。.flex-container { flex-flow : column wrap;}项目之间的缝隙让我们回到row/wrap。 可以通过设置项目的 width:33.3333% 来填充整个容器:但是如果你希望在子div 之间有一个间隙,它们就不会按照你想的那样换行:这个小麻烦这可以通过 CSS 函数 calc() 来解决:.flex-item { width: calc(33.33333% - 40px); margin: 20px;}为了消除容器边缘的空间,可以在容器上使用负边距:.flex-container { margin: -20px;}排序order 属性允许更改出现的可视排序项目。排序被分配给组。 默认情况下所有的弹性项目都设置为 order: 0,这意味着所有项目都属于同一组,并且它们将按照原始顺序定位。 在两个或多个组的情况下,组会相对于它们的整数值进行排序。在下面的例子中,有三个 ordinal groups:-1, 0和 1,按此顺序进行排列。.box-3 { order: 1; }.box-7 { order: 1; }.box-8 { order: -1; }此属性可视地重新分配项目,但在交互时保持其原始源位置,例如使用Tab键遍历它们。 如果物品订购对可访问性有影响,则可以考虑这一点。 flex-direction 也是如此。对齐(此图反复上传总是出错,请大家移步原文查看)在Flexbox中,沿着轴的项目对齐和空间分布可以受到四个属性的控制:justify-content: 对齐主轴中的所有项目align-items: 对齐交叉轴中的所有项目align-self: 对齐交叉轴中的单个项目align-content: 控制交叉轴上柔性线之间的空间justify-content适用于容器,justify-content 处理项目在主轴上的对齐方式。六个最常用的选项包括: flex-start、 flex-end、center、 space-around、 space-between 和 space-evenly,flex-start是默认值。.align-items也适用于容器, align-items 属性处理交叉轴方向上的对齐。它的默认值是 stretch 其它的选项是 flex-start、flex-end、 center 和 baseline 。stretch 选项使所有项目伸展到容器高度(如果设置)或最高项目的高度[5]。 第一张图片显示容器高度设置为 100vh,未设置第二个高度。align-content这是作用在 flex 容器的四个属性中的最后一个,align-content 在交叉轴中的弹性线之间分配空格。 作为后者,它的初始值是 stretch 和 justify-content,它接受以下选项: flex-start, flex-end, center, space-around, space-between, space-evenly 。align-selfalign-items 属性实际上通过在容器内的所有 flex 项目上设置 align-self 来实现。 通过单独设置 align-self,可以覆盖全局值。 它接受与align-items和’auto’相同的值[5]。auto 选项通过 align-items 将 align-self 重置为容器全局定义的值。调整 Flexbox 的大小项目的尺寸和伸展性可以通过三种属性来控制: flex-grow、 flex-shrink 和 flex-basis。 这三个都作用于主轴。flex-grow:如果有额外的空间,每个项目应该如何放大flex-shrink:如果没有足够的空间,应该如何缩小每个项目flex-basis:在设置上述两个属性之前,该项目的大小应该是多少flex-grow由此属性设置的 flex grow factor (弹性增长因子)用来处理项目大小相对于彼此的比率。默认值为 0,这意味着如果还有可用空间,就把它放在最后一个项目之后。在上面的例子中,direction 被设置为 row,每个弹性项目的 width 被设置为 60px。 由于容器宽是 980px,所以剩余的可用空间为 680px。 这个空间被称为positive free space (正自由空间)。如果将 flex-grow 设置为1,正可用空间量会在弹性项目之间平均分配。 每个项目的宽度将会增加 136px,总宽度为196px。通过将 flex-grow: 2 应用到第三个项目,它会得到比其它项目多出两倍的可用正自由空间,即286px,其他项目仍为173px 。下图显示了把项目的 flex-grow 属性值设置为其内容对应的数字时的情形。flex-shrink当没有足够的可用空间来容纳所有容器时,用 flex-shrink 处理项目大小。 它通过缩小这些项目来划分它们之间的 negative free space (负自由空间)。下图显示的是宽度为 980px 的容器,它容纳了5个宽度为 300px的物品。 由于没有空间容纳所需的总宽度 1500px,所以默认的flex shrink factor(弹性收缩系数)的值为1,这样会使每个项目的宽度均匀缩小到196px。通过将第三项的比率设置为2,它缩小为其余项目大小的二分之一。本节的最后一张图显示了将每个项目的内容值对应的数字设定为 flex-shrink 的值时的情形。flex-basisflex-basis 是在实际设置可用空间之前,检查每个项目本来应具有的大小的属性。 默认值为 auto,项宽度由 width 属性显式设置,或者取其内容宽度。 它也接受像素值。下面的动图显示了一个800px宽的容器和五个设置为 flex-basis:160px 的弹性项目。 这告诉浏览器:如果在理想状态下,有足够的空间来放置所有的项目,就遵循它们的160px宽度,并且没有正/负可用空间;如果没有足够的空间的话,那么 flex-shrink 默认为1,所有项目均匀收缩; 如果有额外的空间,flex-grow 默认为0,并且剩余的空间放在最后一个项目之后。下一个动图展示了把项目1设置为flex-shrink:10,项目4设置为flex-grow:10。对于负自由空间,项目1的宽度减少10倍。 对于正空闲空间,第4项的宽度是其他空间的10倍。flex-basis 也接受值 content,此时无论其宽度是否被设置,计算自由空间时所考虑的宽度依据是项目中的内容。flexflex 属性是按顺序排列的 flex-grow、 flex-shrink 和 flex-basis 的简写,它接受以下预定义值:initial:重置为 flexbox 的默认值,等同于 flex: 0 1 autoauto:flex-items能够根据需要增长/缩小,等同于 flex: 1 1 autonone:固定项目,等同于 flex: 0 0 autoflex: 1:flex-items 具有伸缩的能力,flex-basis 设置为零,等同于 flex: 1 1 0Autoprefixer对于跨浏览器的兼容性问题,设置具有具有必要前缀的属性是非常重要的,以确保能够支持所有浏览器。手动自动为每个属性添加前缀可能是一项非常繁琐的任务,也使样式很难维护。使用 Gulp 能够替你自动执行这些任务。为了能够使用Gulp,我们必须将它作为依赖添加到项目当中。 这项工作是在 package.json 文件中完成的,它负责跟踪项目依赖及其版本。 在终端中输入下列命令来创建文件:nmp init系统将提示你输入项目信息,可以一直按回车键直到完成。 输出的文件内容将是这样的:{ “name”: “project-name”, “version”: “1.0.0”, “description”: “Project description”, “main”: “index.js”, “scripts”: { “test”: “echo "Error: no test specified" && exit 1” }, “author”: “Author Name”, “license”: “ISC”}全局安装gulp:npm install gulp -g安装 gulp 和 gulp-autoprefixer 作为项目依赖项:npm install gulp –save-devnpm install gulp-autoprefixer –save-dev它们将会出现在 package.json 文件中的 devDependencies 下。创建一个gulpfile.js文件:touch gulpfile.js添加以下内容:// gulpfile.jsvar gulp = require(‘gulp’);var autoprefixer = require(‘gulp-autoprefixer’);var options = { browsers: [’last 2 versions’], cascade: false };gulp.task(‘styles’, function() { return gulp.src(’./styles.css’) .pipe(autoprefixer(options)) .pipe(gulp.dest(‘build’));});gulp 会从 styles.css 中提取内容并通过 gulp-autoprefixer 传递它。 处理结果会保存在build文件夹下。参考What the Flexbox CourseBasic concepts of flexbox — 25/03/2018Mastering Wrapping of Flex Items — 26/03/2018Ordering Flex Items — 26/03/2018Aligning Items in a Flex Container — 26/03/2018StackOverflow — 27/03/2018Controlling Ratios of Flex Items Along the Main Axis — 28/03/2018GulpGulp Autoprefixer本文首发微信公众号:jingchengyideng欢迎扫描二维码关注公众号,每天都给你推送新鲜的前端技术文章 ...

January 31, 2019 · 2 min · jiezi

八种方法实现CSS页面底部固定

当我们在写页面时经常会遇到页面内容少的时候,footer会戳在页面中间或什么?反正就是不在最底部显示,反正就是很难看,下面要讲的布局就是解决如何使元素粘住浏览器底部,方法一:footer高度固定+绝对定位html<div class=“dui-container”><header>Header</header><main>Content</main><footer>Footer</footer></div>CSS.dui-container{position: relative;min-height: 100%;}main {padding-bottom: 100px;}header, footer{line-height: 100px;height: 100px;}footer{width: 100%;position: absolute;bottom: 0}查看效果方法二:在主体content上的下边距增加一个负值等于底部高度html<header>Header</header><main>Content</main><footer>Footer</footer>CSShtml, body {height: 100%;}main {min-height: 100%;padding-top: 100px;padding-bottom: 100px;margin-top: -100px;margin-bottom: -100px;}header, footer{line-height: 100px;height: 100px;}查看效果方法三:将页脚的margin-top设为负数html<header>Header</header><main>Content</main><footer>Footer</footer>CSSmain {min-height: 100%;padding-top: 100px;padding-bottom: 100px;}header, footer{line-height: 100px;height: 100px;}header{margin-bottom: -100px;}footer{margin-top: -100px;}查看效果方法四: 通过设置flex,将footer的margin-top设置为autohtml<header>Header</header><main>Content</main><footer>Footer</footer>CSSbody{display: flex;min-height: 100vh;flex-direction: column;}header,footer{line-height: 100px;height: 100px;}footer{margin-top: auto;}查看效果方法五: 通过函数calc()计算内容的高度html代码<header>Header</header><main>Content</main><footer>Footer</footer>CSS代码main{min-height: calc(100vh - 200px); /* 这个200px是header和footer的高度 */}header,footer{height: 100px;line-height: 100px;}查看效果方法六: 通过设置flexbox,将主体main设置为flexhtml<header>Header</header><main>Content</main><footer>Footer</footer>CSS代码body{display: flex;min-height: 100vh;flex-direction: column;}main{flex: 1}查看效果方法七: 使用grid布局Html代码<header>Header</header><main>Content</main><footer>Footer</footer>CSS代码html {height: 100%;}body {min-height: 100%;display: grid;grid-template-rows: auto 1fr auto;}.footer {grid-row-start: 3;grid-row-end: 4;}查看效果方法八: display-*html<header>Header</header><main>Content</main><footer>Footer</footer>CSSbody { min-height: 100%; display: table; width: 100%;}main { display: table-row; height: 100%;}查看效果 ...

January 8, 2019 · 1 min · jiezi

10分钟理解CSS3 FlexBox

基本介绍特点flexbox是一种css display类型,提供一种更简单高效的布局方式;flexbox可以对元素相对于父元素、兄弟元素进行定位、控制尺寸、控制间距;flexbox对响应式有很好的支持;工作原理设置父元素的display属性为flex,则子元素都变成flex item,由此可以控制子元素的排列方式、尺寸、间距等;兼容性Flex Container先来看一个最简单的flex示例,外层div设置display: flex成为一个flex container,内部的3个div则自动变为flex item:html:<div class=“flex-container”> <div class=“box one”></div> <div class=“box two”></div> <div class=“box three”></div></div>css:.flex-container{ max-width: 960px; margin: 0 auto; display:flex; }.box{ height: 100px; min-width: 100px; }.one{ background: pink; }.two{ background: lightgreen; }.three{ background: skyblue; }效果:效果与浮动布局类似,但是如果用浮动实现的话需要写更多的代码,而flex一行就搞定了。1. Justify Content如果我们想让flex item居中排列呢,我们可以给flex container增加一个css属性:justify-content,它控制flex item在主轴方向(main axis,由flex-drection决定,默认为水平方向)上的对齐方式:.flex-container{ … justify-content: center;}效果如图:除此之外justify-content还可以设置为flex-start, flex-end, space-around, space-between, space-even等值,具体效果请自行实验。2. Align Items实现了flex方向的居中后,垂直于主轴方向(cross axis)的居中可以用align-items实现。css:.flex-container{ max-width: 960px; margin: 0 auto; display:flex; justify-content: center; height: 200px; background-color: white; align-items: center;}效果:使用flex解决了以往css垂直居中实现复杂的问题!相应的,align-items还有flex-start, flex-end等其他值。3. Flex Directionflex-direction决定了主轴方向即flex item排列方向,除了默认的row方向之外,还可以纵向、反向(row-reverse/column-reverse)排列flex item:css:.flex-container{ … flex-direction: column; align-items: center;}效果:4. Flex Wrap如果我们不想在窗口变窄的情况下压缩flex item,而是让超出边界的flex item换行显示那我们可以设置flex container的flex-wrap:.flex-container{ max-width: 960px; margin: 0 auto; display:flex; flex-wrap: wrap;}.box{ height: 100px; min-width: 300px; flex-grow: 1;}当我们压缩窗口的时候,效果如下:flex wrap还有一个值:wrap-reverse,设置该值后,被wrap的元素会排到其他元素上面:由此可见,flex wrap一定程度上可以取代media query了。5. Flex Row最后,flex-direction和flex-wrap可以合并为一个属性flex-flow,比如:flex-flow: row-reverse wrap。Flex Item1. Flex Grow在上面所有的例子中,三个flex item只占据了flex container小部分空间,如果想让flex item占满flex container我们需要给flex item设置flex-grow属性。顾名思义,grow意味着增长,用于控制flex item的尺寸的伸展。将css修改为:.box { height: 100px; min-width: 100px; flex-grow:1; }效果:可以看到三个子元素平分了父元素的空间,因为此时它们的flex-grow都是1。如果只有一个子元素设置了flex-grow呢?css:.box{ height: 100px; min-width: 100px; }.one{ background: pink; flex-grow: 1; }效果:此时two和three的大小不变,而one占据了父元素剩余空间。如果将one的flex-grow改为2,而two和three改为1,我们看看会发生什么:css:.box{ height: 100px; min-width: 100px; flex-grow:1; }.one{ background: pink; flex-grow: 2; }效果:可以看到one的宽度变成了two和three的两倍,因此flex item的尺寸和flex-grow的值成正比。2. Flex Shrink与flex-grow相对的是flex-shrink, flex-shrink用于控制子元素尺寸超过flex container后,对子元素的压缩。请看示例:修改box的宽度为flex container的1/3,one、two、three的flex-shrink分别为1,2,3:.box{ height: 100px; width: 320px; }.one{ background: pink; flex-shrink: 1; }.two{ background: lightgreen; flex-shrink: 2; }.three{ background: skyblue; flex-shrink: 3; }当窗口正常尺寸时,效果如下:当我们压缩窗口使其变得更窄后,效果如下:当flex container宽度变为540px后,子元素都被不同程度的压缩了。压缩后的one、two、three的宽度分别为250px、180px、110px,所以相比于初始宽度320px被压缩掉的宽度分别为70px、140px、210px,70 : 140 : 210 = 1 : 2 : 3,与flex shrink的值成反比。实际上压缩率和flex item的初始尺寸也有关系,只不过当初始尺寸一样时它带来的影响被忽略了。假设flex shrink为fs,flex item的初始尺寸为is,flex item被压缩的尺寸为ss,则正确的表达式为:fs ∝ is/ss3. Flex Basisflex-basis用于设置flex item的初始宽/高。为什么有width和height还需要重新加一个flex-basis呢?flex-basis和width/height有如下的区别:flex-basis只能用于flex-item,而width/height可以应用于其他类型的元素;flex-basis和flex-direction有关,当flex-direction为row的时,flex-basis设置的是宽度,当flex-direction为column时,flex-basis设置的是高度;当flex item被绝对定位后(absolute position),flex-basis不起作用,而width/height可以;flex-basis可以用于flex的简写形式,如:flex: 1 0 200px;我们来看一下flex-basis的作用,将css修改如下:.box{ height: 100px; flex-grow: 1;}.one{ background: pink; flex-basis: 100px;}.two{ background: lightgreen; flex-basis: 200px;}.three{ background: skyblue; flex-basis: 300px;}3个flex item都在原来的初始宽度基础上增加了相同的宽度:当然,这个例子如果换成使用width也是一样的效果,但是虽然效果一样但意义不一样,所以使用flex布局时还是应该尽量遵守规范,选合适的人去干正确的事。4. Order通过order属性我们可以改变flex item的排列顺序,例如:html:<section id=“blocks”> <div class=“one”>1</div> <div class=“two”>2</div> <div class=“three”>3</div> <div class=“four”>4</div></section>css:#blocks{ display: flex; margin: 10px; justify-content: space-between;}#blocks div{ flex: 0 0 100px; padding: 40px 0; text-align: center; background: #ccc;}默认排列顺序是按照flex item在html中的出现顺序:当我们修改flex item的order值后,flex item会按照order值升序排列:css:.one{ order: 4; }.two{ order: 3; }.three{ order: 2; }.four{ order: 1; }效果:结语flex就先简单介绍到这里,flex很强大也很简单,希望大家用的开心。 ...

December 13, 2018 · 2 min · jiezi

谈一谈flex布局使用中碰到的一些问题

起因工作以后由于大量使用到了flex布局而碰到了一些尚不清楚的问题,以及一些有意思的特性,在此写篇博客记录一下。flex三个值的含义众所周知,flex布局所有的属性有两种:一种作用在弹性容器(Flex container)上,一种作用在弹性项目(Flex item)上,而flex就是作用在弹性项目上的属性。flex 是 flex-grow、flex-shrink、flex-basis 三个值的简写,这个值规定了弹性项目如何伸长或压缩以适应弹性容器中的可用空间。flex-grow 定义弹性项目的放大比列,可以接受数字(小数也可以),不接受负值,默认值是 0 。这个值如果为 0 就意味着即使容器内还存在剩余空间,弹性项目也不会放大。flex-shrink 定义弹性项目的收缩比例,同样接受数字(小数也可以),不接受负值,默认值是 1 。如果一个弹性项目的 flex-shrink 设为 0 而其他弹性项目的 flex-shrink 值为 1 ,则当弹性容器空间不足时,该弹性项目不会被压缩,而其他的弹性项目会被等比例压缩。flex-basis 定义在分配容器内空间之前,弹性项目占据的主轴空间(不一定是宽度,因为主轴方向可以是纵向的),默认值是 auto 。如果对弹性项目同时设置 flex-basis 和 width , width 会被忽略。还要注意当主轴是横向的时候,如果设定了 max-width 或 min-width 会限制弹性项目的宽度。这里讲一下 flex-basis 取值的情况:指定的数值,比如以px、em为单位的数值。百分数,取百分数的话就是相对其父弹性容器的宽或高(取决于主轴方向)来计算,如果包含块的尺寸未指定(也就是说父元素的尺寸取决于子元素),那么这时候结果和 auto 一样。auto 值的意思是基于弹性项目的 width 或 height 调整大小(根据主轴的横向或者纵向),如果没有设置 width 或 height 则根据内容自适应。设置flex之后的弹性项目如何计算宽度这里给一个代码的例子<div id=“content”> <div class=“box1” style=“background-color:red;">A</div> <div class=“box2” style=“background-color:lightblue;">B</div> <div class=“box3” style=“background-color:yellow;">C</div></div>#content { display: flex; width: 360px;}.box1 { width: 100px; flex: 1 1 0;}.box2 { width: 100px; flex: 1 1 0;}.box3 { width: 100px; flex: 1 1 0;}由于flex-basis的值为 0 ,所以此时弹性容器的剩余空间为 360px - 0 * 3 = 360px ,由于3个元素都设置了 flex-grow: 1 ,所以剩余空间3个元素所占比例为 1:1:1 ,每个元素的宽度就是 360px / 3 = 120px 。如果把代码改一下呢?#content { display: flex; width: 360px;}.box1 { width: 100px; flex: 1 1 0;}.box2 { width: 100px; flex: 1 1 auto;}.box3 { flex: 1 1 200px;}此时,弹性容器内剩余宽度为:360px - 0 - 100px - 200px = 60px,3个元素所占剩余空间比例同样是 1:1:1 。那么宽度分别就是:0 + 20px = 20px ,100px + 20px = 120px ,200px + 20px = 220px 。 对应复杂情况的计算,这里有一个回答写得不错:flex设置成1和auto有什么区别flex单值、双值、三值的赋值规则是怎么样的单值情况下:一个无单位的数字:它会被当作 flex-grow 的值,flex-shrink 为 1 ,flex-basis 为 0%。一个有效的宽度值:它会被当作 flex-basis 的值,flex-shrink 和 flex-grow 都是 1 。关键字:比如 auto,none 这两个下文会讲。双值情况下:第一个值必须是无单位的数字,它会作为 flex-grow 的值;第二个值可以是:一个无单位的数字:它会被当作 flex-shrink 的值,而flex-basis 的值就是 0% 。一个有效的宽度值:它会被当作 flex-basis 的值,flex-shrink 的取值就是 1 。三值情况下:第一个和第二个值必须是无单位的数,分别作为 flex-grow,flex-shrink,flex-basis 的值;第三个值可以是有效的宽度值,也可以是 auto 。flex: 0,flex: 1,flex: auto,flex: none,flex: 0%的区别是什么?讲完了上面的三种赋值方式之后,那么简写就变得很容易理解了:flex: 0 是 flex: 0 1 0% 的简写flex: none 是 flex: 0 0 auto 的简写flex: 1 是 flex: 1 1 0% 的简写flex: auto 是 flex: 1 1 auto 的简写flex: 0% 是 flex: 1 1 0% 的简写小结一下:以上就是对 flex 这个属性取值的梳理,最近一年没有写过博客,最近还是要填一下坑的,前端之路且歌且行~ ...

November 4, 2018 · 2 min · jiezi