Flexbox-30天学会HTML+CSS,制作精美网站

以前排版都会使用float、display属性的block、inline来制作,现在有了Flexbox,几乎可以解决各种排版需求。

Flexbox是什麽

flex 是Flexible Box的缩写,中文为弹性布局,是由 Flex Containers (父元素)和 Flex Items (子元素)他组成,依据单一 横向或垂直方向放置内容,可以解决过去复杂的版面配置问题,像是水平垂直置中。
https://ithelp.ithome.com.tw/upload/images/20211008/20112053gGHpANzHYH.png

弹性区块宣告

display: flex/inline-flex
  • flex:区块层级,类似display:block
  • inline-flex:行内层级,类似display:inline-block
    范例:分别将.box设置flex及inline-flex,文字的部分一个会换行,另一个不会
<div class="box">
    <div class="item">item</div>
    <div class="item">item</div>
    <div class="item">item</div>
  </div>
  <span>text</span><div class="flex">
    <div class="box">
      <div class="item">item</div>
      <div class="item">item</div>
      <div class="item">item</div>
    </div>
    <span>display:flex</span>
  </div>
  <div class="inline-flex">
    <div class="box">
      <div class="item">item</div>
      <div class="item">item</div>
      <div class="item">item</div>
    </div>
    <span>display:inline-flex</span>
  </div>
.box{
  width: 350px;
  padding: 15px 10px;
  background-color: #dee2e8;
}
.item{
  width: 100%;
  padding: 15px;
  text-align: center;
  background-color: #bdc2ca;
  margin: 0 5px;
}
.flex .box{
  display: flex;
}
.inline-flex .box{
  display: inline-flex;
}

https://ithelp.ithome.com.tw/upload/images/20211008/20112053hkfqCBDYwW.png

Flex Container

flex-direction

设定子元素排列方向,水平或是垂直

属性

  • row:由左到右,由上到下,预设值
  • row-reverse:与row相反
  • column:由上到下,由左到右
  • column-reverse:与column相反
    https://ithelp.ithome.com.tw/upload/images/20211008/20112053xdgllbdUXX.png

flex-wrap

让子元素排成一行或多行,当子元素超过父元素宽度时是否要换行。

属性

  • nowrap:单行,预设值
  • wrap:多行
  • wrap-reverse:单行,反转
    https://ithelp.ithome.com.tw/upload/images/20211008/20112053cG4UQ9MYD1.png

flex-flow

是flex-direction及flex-wrap的简写

flex-flow: flex-direction flex-wrap

justify-content

水平对齐方式

属性

  • flex-start:预设值,靠左对齐,从行头开始
  • flex-end:靠右对齐,从行尾开始
  • center:水平置中对齐
  • space-between:平均分配内容,会对齐行头及行尾
  • space-around:内容间距都会平均分配
    https://ithelp.ithome.com.tw/upload/images/20211008/20112053jsqZ8gCU8w.png

align-items

垂直对齐方式

属性

  • stretch:预设值,元素高度会填满容器高度
  • flex-start:对齐父元素起始位置开始排列
  • flex-end:对齐父元素终点位置开始排列
  • center:垂直置中对齐
  • baseline:内容的基线作为对齐线
    https://ithelp.ithome.com.tw/upload/images/20211008/20112053uz0pkzIsy4.png

align-content

与align-items相似,只是align-content是处理多行,但父元素设定flex-wrap:nowrap,变成一行时会无效

属性

  • flex-start:对齐最上面的 cross start
  • flex-end:对齐最下面的 cross end
  • center:垂直置中
  • stretch:元素高度会填满容器高度
  • space-between:第一行与最後一行分别对齐最上方与最下方
  • space-around:平均分配间距
    https://ithelp.ithome.com.tw/upload/images/20211008/20112053EAyTcJsL90.png

Flex-item

order

可依照自己的规划,由小到大排出区块的顺序

<div class="box">
      <div class="item item1">1</div>
      <div class="item item2">2</div>
      <div class="item item3">3</div>
      <div class="item item4">4</div>
    </div>
.box{
  display: flex;
  flex-wrap: wrap;
  width: 350px;
  padding: 15px 10px;
  background-color: #dee2e8;
  align-items: flex-start;
}
.item{
  width: 30px;
  padding: 15px;
  text-align: center;
  background-color: #bdc2ca;
  margin: 5px;
}
.item1{
  order:3;
}
.item2{
  order:1;
}
.item3{
  order:4;
}
.item4{
  order:2;
}

https://ithelp.ithome.com.tw/upload/images/20211008/20112053q340lZ3c3H.png

align-self

与align-items相同,用於覆写已经套用 align-items 的属性

范例:将2区块个别设定align-self:flex-end
https://ithelp.ithome.com.tw/upload/images/20211008/20112053w6t27usFOJ.png

flex-grow

依照比例分配剩余空间。

当区块物件小於容器宽度时会留白,为了不要留白个别让区块放大预设为0,不会有弹性变化,不可为负值。

flex-grow:数值
<div class="box">
  <div class="item" style="background-color:red;"></div>
  <div class="item" style="background-color:green;"></div>
  <div class="item" style="background-color:blue;"></div>
</div>

宽度为350px,item宽度为100px,就会有多余的空间50px

.box .item{
  width: 100px;
}

https://ithelp.ithome.com.tw/upload/images/20211008/20112053Kw8V0BDJbA.png
将红色区块改为flex-grow: 1,就会将剩余空间的50px给红色区块
https://ithelp.ithome.com.tw/upload/images/20211008/20112053EO6L2aEMqH.png

.box div:nth-of-type(1) {flex-grow: 1;}
.box div:nth-of-type(2) {flex-grow: 3;}
.box div:nth-of-type(3) {flex-grow: 2;}

https://ithelp.ithome.com.tw/upload/images/20211008/20112053zPtGuZ3sNI.png

flex-shrink

当区块物件大於容器宽度会超出范围,会个别区块做缩小预设值为1,不可为负数,数值0不会有弹性变化。

flex-shrink:数值
<div class="box">
  <div class="item siderbar" style="background-color:red;"></div>
  <div class="item content" style="background-color:green;"></div>
</div>

.box宽度为100%,当容器宽度不够宽时,会缩小.content区块的宽度,.siderbar宽度都会是100px,直到宽度不足时,才会按比例缩放

.siderbar{
  flex-basis: 100px;
}
.content{
  flex-grow: 1;
  flex-shrink: 0;
  flex-basis: 500px;
}

https://ithelp.ithome.com.tw/upload/images/20211008/20112053Jtl3AU54e3.png

flex-basis

设定区块的大小,预设为auto,依据内容设置宽度,与width类似,但优先程度较高

flex-basis:数值/auto
<div class="box">
  <div style="background-color:red;"></div>
  <div style="background-color:green;"></div>
  <div style="background-color:blue;"></div>
</div>
.box {
  width: 350px;
  height: 100px;
  display: flex;
}
.box div{
  flex-grow: 0;
  flex-shrink: 0;
  flex-basis: 50px;
}
.box div:nth-of-type(2) {
	flex-basis: 100px;
}

https://ithelp.ithome.com.tw/upload/images/20211008/20112053axrJKaHTas.png

flex统一设定属性

flex: none flex-grow flex-shrink flex-basis

参考资料:
https://www.oxxostudio.tw/articles/201501/css-flexbox.html
https://blog.camel2243.com/2019/11/14/css-搞懂-flex-grow-flex-shirk-及-flex-basis-三种属性/


<<:  [NestJS 带你飞!] DAY23 - Authentication (上)

>>:  Rust-30天的心得

【Day 19】- 让 Selenium 去 Dcard 上爬文! (实战 Selenium 模拟使用者划手机 1/2)

前情提要 前一篇与大家介绍了 Selenium 的基本运用,并在补充资料中给予了语法的资源。 开始之...

Day9. functional programming in Ruby - Block Part2

初来乍到Ruby世界的读者们,绝对想不到原来Ruby 也有 curry, bind 等用法。这些语法...

[Day 19] SQL select & where

select 使用*号可取得table内所有资料 select * from schema名称.ta...

D17-(9/17)-联电(2303)-成熟晶圆代工

注:发文日和截图的日期不一定是同一天,所以价格计算上和当日不同,是很正常的。 声明:这一系列文章并无...

Day 01 「科学 v.s. 数学」前言

笔者从业数年,面试过不少程序开发者。每当问到对方是否有做单元测试时,绝大多数的面试者总会说: 「我知...