--- title: CSS · 三种布局方式 slug: css-layouts tags: - CSS created: 2022-01-13T10:07:00.000Z summary: Float / Flexbox / Grid / lastmod: 2022-05-07T05:30:20.613Z --- 课程:[Build Responsive Real-World Websites with HTML and CSS](https://www.udemy.com/course/design-and-develop-a-killer-website-with-html5-and-css3/) ## Overview ![](https://s2.loli.net/2022/01/08/SjgmE2nl7TkUAqM.png) ## Box-sizing ![https://s2.loli.net/2022/01/09/yCScJXVD9dYIjqK.png](https://s2.loli.net/2022/01/09/yCScJXVD9dYIjqK.png) > 未定义之前:content-box ### reset ```css * { margin: 0; padding: 0; box-sizing: border-box; } ``` ## Float Layout - 浮动在页面之上,对周围元素没有影响 - 现在很少用了 ### left - 浮动到页面左边 ![https://s2.loli.net/2022/01/08/HZlqu9dyfmG5QYV.png](https://s2.loli.net/2022/01/08/HZlqu9dyfmG5QYV.png) ```css .author-img { float: left; } ``` > 此时图片和文本不在同一个层面上 ### right > 浮动到页面右边 ![https://s2.loli.net/2022/01/08/ESLcqpbH2VfuNXj.png](https://s2.loli.net/2022/01/08/ESLcqpbH2VfuNXj.png) ```css p { float: right; } ``` ### ABSOLUTE POSITIONING VS. FLOATS ![https://s2.loli.net/2022/01/08/g6Zk2rDAWbxLeoI.png](https://s2.loli.net/2022/01/08/g6Zk2rDAWbxLeoI.png) ### Clear Float - 当没有其他元素可以 clear float 时,在其后新建一个元素设置 clear - 当存在需要清除的元素时,直接在该元素上清除 #### 方法 1: empty div 使用一个并列的空`
`元素来清除 ```html

title

title

``` ```css /*清除两者*/ .clear { clear: both; } /*清除左边*/ .clear { clear: left; } ``` #### 方法 2:clearfix hack 原理和 empty div 的方式一样,但更简单,利用 pseudo element 在 parent element 后增加一个元素 ```html

title

title

``` ```css .clearfix::after { clear: both; content: ''; display: block; } ``` ## Flexbox ![](https://s2.loli.net/2022/01/09/8HiwTDALGbCZQdf.png) ![](https://s2.loli.net/2022/01/09/RMmiLHxa78n4Atw.png) > 加粗字体为默认状态 ```css .container { display: flex; align-items: center; /*水平居中*/ justify-content: center; /*垂直居中*/ } ``` ### Flex container - flex container takes the height of the tallest items 常用: ```css .container { display: flex; align-items: stretch; justify-content: flex-start; } ``` ### Flex items ```css .items { align-self: flex-start; } ``` ### Propetities #### order 数字越大越靠后 #### flex-grow 数字越大占比越大 #### flex-basis item’s width #### shorthand `flex:1` = ```css flex-grow: 1; flex-shrink: 1; flex-basis: 0%; ``` ## CSS Grid ![](https://s2.loli.net/2022/01/09/6ovHUJOilxqtkjb.png) ![](https://s2.loli.net/2022/01/09/1vLi2G6okjNzrut.png) ![](https://s2.loli.net/2022/01/09/krsGJ3AgQpR2Uf9.png) ### grid container ```css .container { display: grid; grid-template-columns: 250px 200px; /*两列*/ grid-template-rows: 200px 200px; /*两行*/ } ``` > 通常不定义 rows #### Gap 用 gap 而不是 margin: ```css .container { /*gap:20px;*/ columns-gap: 30px; row-gap: 20px; } ``` #### align tracks inside containers > when the content is smaller than the grid ```css justify-content: center; align-content: center; ``` ### grid items ```css .items: { grid-column: 2/3; /*当前后数值相差只有1位时,可省去后面的数字*/ grid-row: 2/3; /*占几个列/行时*/ grid-column: 1/3; grid-row: 1/3; /*或者*/ grid-column: 1 / span 3; /*自动填充剩余空间*/ grid-column: 1/-1; } ``` #### align items inside cells ```css .container { align-items: center; justify-items: center; } ``` ```css .item { align-self: end; } ``` ### fr - `1fr`:自动填充剩余空间 - 2:1:1:1 的四列 ```css .container { grid-template-columns: 2fr 1fr 1fr 1fr; } /*shorthand*/ .container { grid-template-columns: repeat(4, 1fr); } ``` ### implicit row 所定义的空间被用完后多出来的列