CSS常用知识总结

414 阅读9分钟

盒模型

完整的 CSS 盒模型应用于块级盒子,内联盒子只使用盒模型中定义的部分内容。模型定义了盒的每个部分 —— margin, border, padding, and content —— 合在一起就可以创建我们在页面上看到的内容。为了增加一些额外的复杂性,有一个标准的和替代(IE)的盒模型。

79178-12f8c9590705a099

可以通过box-sizing属性来设置盒模型种类,改属性有两个值:

  • box-sizing:box-sizing 默认值,标准盒子模型。 widthheight 只包括内容的宽和高, 不包括边框(border),内边距(padding),外边距(margin)。注意: 内边距、边框和外边距都在这个盒子的外部。 比如说,.box {width: 350px; border: 10px solid black;} 在浏览器中的渲染的实际宽度将是 370px。 尺寸计算公式:width = 内容的宽度,height = 内容的高度
  • box-sizing: border-box widthheight 属性包括内容,内边距和边框,但不包括外边距。这是当文档处于 Quirks模式 时Internet Explorer使用的盒模型。注意,填充和边框将在盒子内 , 例如, .box {width: 350px; border: 10px solid black;} 导致在浏览器中呈现的宽度为350px的盒子。内容框不能为负,并且被分配到0,使得不可能使用border-box使元素消失。 尺寸计算公式:width = border + padding + 内容的宽度,height = border + padding + 内容的高度。

BFC

块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。

具有 BFC 特性的元素可以看作是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且 BFC 具有普通容器所没有的一些特性。通俗一点来讲,可以把 BFC 理解为一个封闭的大箱子,箱子内部的元素无论如何翻江倒海,都不会影响到外部。

出发BFC的条件:

  • 根元素(
  • 浮动元素(元素的 float 不是 none
  • 绝对定位元素(元素的 positionabsolutefixed
  • 行内块元素(元素的 displayinline-block
  • 表格单元格(元素的 displaytable-cell,HTML表格单元格默认为该值)
  • 表格标题(元素的 displaytable-caption,HTML表格标题默认为该值)
  • 匿名表格单元格元素(元素的 displaytable、``table-rowtable-row-group、``table-header-group、``table-footer-group(分别是HTML table、row、tbody、thead、tfoot 的默认属性)或 inline-table
  • overflow 计算值(Computed)不为 visible 的块元素
  • display 值为 flow-root 的元素
  • contain 值为 layoutcontent 或 paint 的元素
  • 弹性元素(displayflexinline-flex 元素的直接子元素)
  • 网格元素(displaygridinline-grid 元素的直接子元素)
  • 多列容器(元素的 column-countcolumn-width (en-US) 不为 auto,包括 ``column-count1
  • column-spanall 的元素始终会创建一个新的BFC,即使该元素没有包裹在一个多列容器中(标准变更Chrome bug)。
BFC特性及应用:
1. 同一个 BFC 下外边距会发生折叠

​ 因为两个 div 元素都处于同一个 BFC 容器下 (这里指 body 元素) 所以第一个 div 的下边距和第二个 div 的上边距 发生了重叠,我们可以理解为一 种规范,如果想要避免外边距的重叠,可以将其放在不同的 BFC 容器中。

<!DOCTYPE html>
<html>
<head>
	<title>bfc-下边距重叠</title>
	<meta charset="utf-8">
	<style type="text/css">
		.box{
			overflow: hidden;
		}
		p{
			width:100px;
			height:100px;
			margin:100px;
			border:1px solid red;
		}
	</style>
</head>
<body>
<div class="box">
	<p></p>
</div>
<div class="box">
	<p></p>
</div>
</body>
</html>
2. BFC 可以包含浮动的元素(清除浮动)
<!DOCTYPE html>
<html>
<head>
	<title>bfc-清除浮动</title>
	<meta charset="utf-8">
	<style type="text/css">

	</style>
</head>
<body>
<div style="border: 1px solid #000;overflow: hidden:hidden">
    <div style="width: 100px;height: 100px;background: #eee;float: left;"></div>
</div>
</body>
</html>
3. BFC 可以阻止元素被浮动元素覆盖
<!DOCTYPE html>
<html>
<head>
	<title>bfc-与浮动元素等高</title>
	<meta charset="utf-8">
	<style type="text/css">

	</style>
</head>
<body>
<div style="height: 100px;width: 100px;float: left;background: lightblue">我是一个左浮动的元素</div>
<div style="width: 200px; height: 200px;background: #eee;overflow: hidden;">我是一个没有设置浮动, 
也没有触发 BFC 元素, width: 200px; height:200px; background: #eee;</div>
</body>
</html>

position

定位是一个相当复杂的话题,所以我们深入了解代码之前,让我们审视一下布局理论,并让我们了解它的工作原理。

首先,围绕元素内容添加任何内边距、边界和外边距来布置单个元素盒子——这就是 盒模型 ,我们前面看过。 默认情况下,块级元素的内容宽度是其父元素的宽度的100%,并且与其内容一样高。内联元素高宽与他们的内容高宽一样。您不能对内联元素设置宽度或高度——它们只是位于块级元素的内容中。 如果要以这种方式控制内联元素的大小,则需要将其设置为类似块级元素 display: block;

这只是解释了单个元素,但是元素相互之间如何交互呢? 正常的布局流(在布局介绍文章中提到)是将元素放置在浏览器视口内的系统。默认情况下,块级元素在视口中垂直布局——每个都将显示在上一个元素下面的新行上,并且它们的外边距将分隔开它们。

内联元素表现不一样——它们不会出现在新行上;相反,它们互相之间以及任何相邻(或被包裹)的文本内容位于同一行上,只要在父块级元素的宽度内有空间可以这样做。如果没有空间,那么溢流的文本或元素将向下移动到新行。

如果两个相邻元素都在其上设置外边距,并且两个外边距接触,则两个外边距中的较大者保留,较小的一个消失——这叫外边距折叠, 我们之前也遇到过。

定位的整个想法是允许我们覆盖上面描述的基本文档流行为,以产生有趣的效果。如果你想稍微改变布局中一些盒子的位置,使它们的默认布局流程位置稍微有点古怪,不舒服的感觉呢?定位是你的工具。或者,如果您想要创建一个浮动在页面其他部分顶部的UI元素,并且/或者始终停留在浏览器窗口内的相同位置,无论页面滚动多少?定位使这种布局工作成为可能。

position一共有五个值:

  • static 静态定位, 静态定位是每个元素获取的默认值——它只是意味着“将元素放入它在文档布局流中的正常位置
  • relative 相对定位, 依赖top, right, bottom, left 等属性相对于该对象在标准文档流中的位置进行偏移,同时可通过z-index定义层叠关系。
  • absolute 绝对定位,对象脱离标准文档流,使用top, right, bottom, left 等属性进行绝对定位(相对于static定位以外的第一个父元素进行绝对定位) 同时可通过z-index定义层叠关系
  • fixed 固定定位,对象脱离标准文档流,使用top, right, bottom, left 等属性进行绝对定位(相对于浏览器窗口进行绝对定位)同时可通过z-index定义层叠关系。

flex布局

阮一峰大佬文章链接: www.ruanyifeng.com/blog/2015/0…

Flexible Box 模型,通常被称为 flexbox,是一种一维的布局模型。它给 flexbox 的子元素之间提供了强大的空间分布和对齐能力

flex容器默认存在两根轴,水平的主轴和垂直的交叉轴。

容器属性有六个值:

  • felx-direction

    设置主轴的排列方向

    .box {
      flex-direction: row | row-reverse | column | column-reverse;
    }
    
  • felx-wrap

    设置在主轴方向排列的项目如何换行

    .box{
      flex-wrap: nowrap | wrap | wrap-reverse;
    }
    
  • flex-flow

    flex-direction和flex-wrap简写。

  • justify-content

    定义属性在主轴的对齐方式

    .box {
      justify-content: flex-start | flex-end | center | space-between | space-around;
    }
    

    bg2015071010

  • align-items

    属性定义项目在交叉轴上如何对齐。

    .box {
      align-items: flex-start | flex-end | center | baseline | stretch;
    }
    

    bg2015071011

  • align-content

    属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用

    .box {
      align-content: flex-start | flex-end | center | space-between | space-around | stretch;
    }
    

项目属性有六个值:

  • order

    属性定义项目的排列顺序。数值越小,排列越靠前,默认为0

    .item {
      order: <integer>;
    }
    
  • flex-grow

    属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大

    .item {
      flex-grow: <number>; /* default 0 */
    }
    
  • flex-shrink

    属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小

    .item {
      flex-shrink: <number>; /* default 1 */
    }
    
  • flex-basis

    属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小

    .item {
      flex-basis: <length> | auto; /* default auto */
    }
    
  • flex

    属性是flex-grow, flex-shrinkflex-basis的简写

  • align-self

    align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch

实现元素固定宽高比

如果元素尺寸已知,就比较简单了,直接根据比例计算就行了,如果元素未知的话,也可以通过JavaScript动态计算。实际上通过css也可以同样达到这个效果。

  • 可替换元素

    CSS 中,可替换元素replaced element)的展现效果不是由 CSS 来控制的。这些元素是一种外部对象,它们外观的渲染,是独立于 CSS 的。

    简单来说,它们的内容不受当前文档的样式的影响。CSS 可以影响可替换元素的位置,但不会影响到可替换元素自身的内容。某些可替换元素,例如 `` 元素,可能具有自己的样式表,但它们不会继承父文档的样式。

    CSS 能对可替换元素产生的唯一影响在于,部分属性支持控制元素内容在其框中的位置或定位方式。

    可替换元素(、)本身具有像素宽度和高度的概念,可以指定其宽度和高度,另一边自动计算就可以实现固定宽高比。

    <!DOCTYPE html>
    <html>
    <head>
    	<title>position</title>
    	<meta charset="utf-8">
    	<style type="text/css">
    		.img-wrapper {
    		  width: 50vw;
    		  margin: 100px auto;
    		  padding: 10px;
    		  border: 5px solid lightsalmon;
    		  font-size: 0;
    		}
    
    		img {
    		  width: 100%;
    		  height: auto;
    		}
    	</style>
    </head>
    <body>
    <div class="img-wrapper">
      <img src="https://p3.ssl.qhimg.com/t01f7d210920c0c73bd.jpg" alt="">
    </div>
    </body>
    </html>
    
  • 一般元素

    垂直方向上的内外编剧使用百分比做单位时,是基于包含块的宽度来计算的。通过padding-bottom实现普通元素的固定宽高比

    <!DOCTYPE html>
    <html>
    <head>
    	<title>position</title>
    	<meta charset="utf-8">
    	<style type="text/css">
    		.wrapper {
    		  width: 40vw;
    		}
    		.intrinsic-aspect-ratio-container {
    		  width: 100%;
    		  height: 0;
    		  padding: 0;
    		  padding-bottom: 50%;
    		  margin: 50px;
    		  background-color: lightsalmon;
    		}
    	</style>
    </head>
    <body>
    <div class="wrapper">
      <div class="intrinsic-aspect-ratio-container"></div>
    </div>
    </body>
    </html>