盒子模型

盒子模型概念

根据盒子模型的概念,每个在页面上的元素都是一个拥有宽,高,内边距,边框和外边距的长方形盒子。页面上每个元素都符合盒子模型的定义,所以它非常重要。每个元素都是一个长方形盒子,有几个属性能确定这个盒子的大小。盒子的核心属性是元素的宽高,这两个值可能是由元素的display属性、元素的内容或具体的width,height属性值生成的。内边距padding和边框border拓展了元素的高宽。最后是我们定义的在边框外的外边距margin。
盒子模型对应的CSS属性为:width,height,padding,border,margin。
我们来看例子:
div { border: 6px solid #949599; height: 100px; margin: 20px; padding: 20px; width: 400px; }
根据盒子模型,元素的总宽度计算如下:
margin-right + border-right + padding-right + width + padding-left + border-left + margin-left

image.png

使用上述公式,就能算出示例中的高宽值

  • Width:492px = 20px + 6px + 20px + 400px + 20px + 6px + 20px
  • Height:192px = 20px + 6px + 20px + 100px + 20px + 6px + 20px

毫无疑问盒子模型是HTML和CSS很容易混淆的部分之一。
我们将width的值设置为400像素,但元素的实际宽度为492像素。因此想要确定盒子的实际大小,我们需要考虑将四面的内边距,边框,外边距都考虑进去。

宽度和高度

每个元素都有默认的高度和宽度。虽然宽度和高度都有可能是0像素,但默认情况下,浏览器会渲染每个元素的大小。元素的默认宽度和高度依赖于元素是怎么显示的。如果元素是页面布局的关键元素。那么它就需要设置具体的width和height属性值。这种情况下,只能指定非内联元素的属性值。
宽度
元素的默认宽度依赖于它display属性的值。块状元素的默认宽度为100%,占据整行空间。内联元素和内嵌块元素的宽度都随着元素的内容变化而变化。内联元素不具备固定的大小,所以width和height属性只有在非内联元素上才能生效。如下是为非内联元素设置宽度的例子:
div { width: 400px; }
高度
元素的默认高度取决于它的内容。元素根据内容需要进行垂直扩展或收缩。我们可以使用height属性为非内联元素设置高度:
div { height: 100px; }
调整内联元素
请记住内联元素不支持width和height属性和与其相关的值。块状元素和内嵌块元素支持width和height属性和与其对应的值。


外边距和内边距

浏览器会根据元素设置其默认的外边距和内边距,使其更清晰易读。我们使用基于文本的元素来看一下这个现象。不同浏览器和不同元素之间的默认外边距和内边距可能存在差异。
外边距
margin属性设置一个元素的周围空间大小。外边距在元素边框外并且是完全透明的。外边距可以帮助我们将元素定位在页面的特定位置,并且可以与其他元素保持距离。 示例如下:
div { margin: 20px; }
margin有一个特殊的现象,就是在内联元素中垂直外边距margin-top和margin-bottom不生效,在块状元素和内嵌块元素中有效。
内边距
padding属性和margin属性相似,只不过它在边框内部,padding是为元素提供内部空间。示例如下:
div { padding: 20px; }
padding属性和margin属性不一致的地方是垂直内边距在内联元素中同样有效;虽然垂直内边距显示在元素基准线之上或之下,但是它确实是存在的。


内联元素的外边距和内边距
内联元素对内边距和外边距的实现和块状元素与内嵌块元素不同。外边距只有横向margin-left和margin-right有效。内边距在内联元素中完全生效,但是垂直内边距padding-top和padding-bottom在元素基准线上面或下面显示(注:内联元素加上垂直内边距之后,元素内部的内容部分在视觉上没有产生偏移)。
块状元素和内嵌块元素的外边距和内边距的显示是正常的。
外边距和内边距的声明方式
在CSS中,很多属性都有多种声明方法。普通的写法,就是一个属性一个值,一个个地列出来。但我们也可以使用简写,一个属性包含多个值。不是所有的属性都有简写,所以我们必须确保写出的属性和值的结构是正确的。
margin和padding有普通和简写两种书写方式。当元素四面设置相同的外边距时,可以使用margin属性,并只指定一个值:
div { margin: 20px; }
如果上下外边距的值一致,左右外边距的值一致,我们可以输入两个值。 设置上下外边距的值在前面。以下例子将上下外边距设置为10像素,将左右外边距设置为20像素:
div { margin: 10px 20px; }
如果四个值都不一致,那么我们按照 上右下左 的顺序输入值。例如,我们为div设置10像素的顶部外边距,20像素的右侧外边距,0像素的底部外边距,以及15像素的左侧外边距:
div { margin: 10px 20px 0 15px; }
若我们要设置多个值,优先考虑用margin和padding。但我们也可以用普通写法,输入一一对应的属性和值。每个属性名(该例子中是外边距和内边距)后跟随一个破折号-以及要设置值的盒子的方向:top,bottom,right和left。
例如,padding-left属性只接受一个值,设置元素的左侧内边距;margin-top只接受一个值,设置元素的顶部外边距。
div { margin-top: 10px; padding-left: 6px; }
当我们只想设置单边的margin和padding值时,这种普通写法是最好的选择。保持代码的精确性可以防止出现混淆。例如,我们是否只想将元素的上右左三侧的外边距设为0,是否只想将底部外边距设为10像素?
普通写法输入属性和值可以让目标更明确。当处理三个或以上的值时,缩写更有帮助。


外边距和内边距的颜色 margin和padding属性是完全透明的,不可以设置颜色。但因为是透明的,所以透出了相关元素的背景色。元素外边距部分看到的颜色为它父级元素的背景色。元素内边距部分看到的颜色为该元素的背景色。

边框

边框在内边距和外边距之间,画出了元素轮廓。border属性要求三个值:宽度,样式,颜色。边框属性简写时值的顺序为:宽度,样式,颜色。普通书写方式下,边框的三个属性名为:border-width,border-style和border-color。普通书写方式因为是单个值,更容易修改和复写。
边框的宽度和颜色能分别使用第三节课中讨论过的长度单位和色值。
边框有很多不同样式。最常用的样式值为solid,dashed,dotted和none,但你可以在列表中看到很多其他的样式。
以下是边框设置示例:
div { border: 6px solid #949599; }

image.png

单侧边框
和margin,padding属性一样,也可以一次只设置元素一个方向的边框。使用属性名:border-top, border-right,border-bottom和border-left。它们的属性值和border的属性值一样有三个:宽度,样式和颜色。如下所示:
div { border-bottom: 6px solid #949599; }
另外,单侧边框的样式也可以被细分,如下所示:
div { border-bottom-width: 12px; }
这些高度细分的边框属性名都由连字符分隔,由border单词开头,随后是边框的方向:top,right,bottom,left,最后是要设置的样式:width,style,color。
border-radius
border-radius可以使元素的边角变圆。
border-radius接受多种长度单位,如百分比,像素,确定元素边角变圆的半径。单个值表示四个角的弧度一直,两个值按分别表示top-left/bottom-right和top-right/bottom-left,输入四个值按顺序分别表示:top-left,top-right,bottom-right和bottom-left。
思考border-radius多个值的顺序时(包括margin和padding),记住它们是从左上角开始(margin和padding从上侧开始)按顺时针方向排序的。
div { border-radius: 5px; }

image.png

border-radius属性也允许我们使用普通方法书写单个属性值。这些普通的属性以border单词开通,跟着是边角的垂直位置(top或bottom),再是边角的横向位置(left或right),最后是半径radius。例如,要设置

右上角的边角半径,可以使用border-top-right-radius属性:
div { border-top-right-radius: 5px; }

box-sizing

现在,在盒子模型中有一个附加属性。如果你设置了元素的width为400像素,并将padding设置为20像素,将border设置为10像素,那么实际的盒子宽度为460像素。记住,盒子的宽度是width,padding和border相加获得的。
但是在CSS3中,盒子模型有了一个不一样的计算方式。CSS3推出了box-sizing属性,完全改变了盒子模型的运作模式和元素大小的计算方式。这个属性有三个主要值——content-box,padding-box和 border-box——每个值对盒子模型大小的计算稍微有些不一样。
content-box
content-box这个属性值是默认值。这个默认值和元素不加box-sizing属性时的效果是一致的。元素从width和height属性的值开始计算,加上padding,border和margin属性值获得盒子的实际尺寸。
div { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; }
上例中box-sizing属性前的连字符和字母是什么?
CSS3的推出后,浏览器逐步开始以加前缀的方式支持新属性和值,包括box-sizing属性。随着部分CSS规范被浏览器广泛支持以及浏览器版本的更新,前缀的作用也越来越小,随着时间的发展将不再是一个问题。但在老版本浏览器中还是不可或缺的。
属性名和属性值都可以添加前缀。
最常见的几个浏览器前缀概括如下:

  • Mozilla的火狐浏览器: -moz-
  • 微软的IE浏览器:-ms-
  • Webkit(谷歌的Chrome浏览器和苹果的Safari浏览器):-webkit-

padding-box
属性值padding-box时,元素将padding属性值计算入width和height属性值内,改变了盒子模型计算模式。例如,元素的width设置为400像素,padding值设为20像素,最终元素实际的宽度还是400像素。随着内边距的扩大,元素的内容区域会随着缩小,但是盒子实际大小并未发生改变。
如果我们增加border或margin,那么盒子的大小就是这些属性值加上width和height的值。例如,我们将元素的的width设置为400像素,每个方向的border都设置为10像素,padding设置为20像素,那么元素的实际宽度就为420像素。
div { box-sizing: padding-box; }
值 padding-box 已被弃用
随着CSS规范的更新,box-sizing的值padding-box已被弃用,我们不应再使用它。


Border Box
最后一个属性值是border-box,它将border和padding都算在元素的width和height属性值内。例如,一个元素的width为400像素,每边的padding为20像素,border为10像素,最终元素的实际宽度仍然为400像素。
若我们还增加了margin属性,在获取盒子总大小时它的值需要做加法计算。不管box-sizing的属性值是什么, 计算盒子总大小时任何margin的值都需要做加法计入。
div { box-sizing: border-box; }

image.png

使用box-sizing属性
通常来说,box-sizing最佳属性值为border-box,这个属性值更易计算。如果我们将一个元素的width为400像素,那么不管你增加了边框还是内边距,它的大小都还是400像素。
另外,我们也可以轻松的相对值。如果我们设置一个元素的宽度为40%,元素每边的padding值为20像素,border值为10像素。那么尽管有地方设置了像素值,元素盒子的实际大小仍然为40%。
唯一遗憾的是box-sizing是CSS3的属性,并不是所有浏览器都支持,尤其是老版本浏览器。所幸随着浏览器版本更新,影响会越来越小。我们使用box-sizing的时候,需要留意哪些浏览器会出现兼容问题。

box-shadow

对盒子添加阴影
box-shadow:像素值1 像素值2 像素值3 像素值4 颜色值 阴影类型;
像素值1:元素水平阴影位置(必选)
像素值2:元素垂直阴影位置(必选)
像素值3:元素阴影模糊半径
像素值4:元素阴影扩展半径,不可为负
颜色值:阴影颜色
阴影类型:内阴影(insert)/外阴影(默认)

背景属性

透明度

RGBA模式

在红绿蓝基础上添加透明度
rgba(r,g,b,a,alpha);
div{
background-color:rgba(225,0,0,0.5);
}

opacity属性

div{
opacity:0.5;
}
opacity:透明度;
透明度在0到1之间

background-color 指定要使用的背景颜色
background-position 指定背景图像的位置
background-size(背景大小) 指定背景图片的大小
background-repeat (背景平铺) 指定如何重复背景图像
background-origin
(背景显示区域)
指定背景图像的定位区域
background-clip 指定背景图像的绘画区域
background-attachment
(背景图像固定)
设置背景图像是否固定或者随着页面的其余部分滚动。
background-image 指定要使用的一个或多个背景图像

背景图像平铺

background-repeat

repeat 背景图像将向垂直和水平方向重复。这是默认
repeat-x 只有水平位置会重复背景图像
repeat-y 只有垂直位置会重复背景图像
no-repeat background-image不会重复
inherit 指定background-repea属性设置应该从父元素继承

背景图像位置

background-position

left top left center left bottom
right top right center
right bottom center top
center center center bottom
如果仅指定一个关键字,其他值将会是”center”
x% y% 第一个值是水平位置,第二个值是垂直。左上角是0%0%。右下角是100%100%。如果仅指定了一个值,其他值将是50%。 。默认值为:0%0%
xpos ypos 第一个值是水平位置,第二个值是垂直。左上角是0。单位可以是像素(0px0px)或任何其他 CSS单位
。如果仅指定了一个值,其他值将是50%。你可以混合使用%和positions
inherit 指定background-position属性设置应该从父元素继承

背景图像定位

background-attachment

scroll 背景图片随着页面的滚动而滚动,这是默认的。
fixed 背景图片不会随着页面的滚动而滚动。
local 背景图片会随着元素内容的滚动而滚动。
initial 设置该属性的默认值。 阅读关于initial内容
inherit 指定 background-attachment 的设置应该从父元素继承。 阅读关于inherit内容

背景图像大小

background-size

length 设置背景图片高度和宽度。第一个值设置宽度,第二个值设置的高度。如果只给出一个值,第二个是设置为 auto(自动)
percentage 将计算相对于背景定位区域的百分比。第一个值设置宽度,第二个值设置的高度。如果只给出一个值,第二个是设置为”auto(自动)”
cover 此时会保持图像的纵横比并将图像缩放成将完全覆盖背景定位区域的最小大小。
contain 此时会保持图像的纵横比并将图像缩放成将适合背景定位区域的最大大小。

背景图像显示区域

background-origin

padding-box 背景图像填充框的相对位置
border-box 背景图像边界框的相对位置
content-box 背景图像的相对位置的内容框

背景图片裁剪区域

background-clip

border-box 默认值。背景绘制在边框方框内(剪切成边框方框)。
padding-box 背景绘制在衬距方框内(剪切成衬距方框)。
content-box 背景绘制在内容方框内(剪切成内容方框)。

多重背景图像

background-image

url(‘URL’) 图像的URL
none 无图像背景会显示。这是默认
linear-gradient() 创建一个线性渐变的 “图像”(从上到下)
radial-gradient() 用径向渐变创建 “图像”。 (center to edges)
repeating-linear-gradient() 创建重复的线性渐变 “图像”。
repeating-radial-gradient() 创建重复的径向渐变 “图像”
inherit 指定背景图像应该从父元素继承

背景复合属性

background:颜色 图片 平铺 固定 定位 大小 裁剪 显示;

渐变属性

线性渐变

CSS linear-gradient() 函数用于创建一个表示两种或多种颜色线性渐变的图片。其结果属于数据类型,是一种特别的css盒子模型 - 图5数据类型。
基本语法 linear-gradient(渐变角度, 颜色1,颜色2,…颜色n);

  • 渐变轴为45度,从蓝色渐变到红色linear-gradient(45deg, blue, red);
  • 从右下到左上、从蓝色渐变到红色linear-gradient(to left top, blue, red);
  • /从下到上,从蓝色开始渐变、到高度40%位置是绿色渐变开始、最后以红色结束linear-gradient(0deg, blue, green 40%, red);

background: linear-gradient(#e66465, #9198e5);
结果:
image.png

background: linear-gradient(0.25turn, #3f87a6, #ebf8e1, #f69d3c);
结果:
image.png

background: linear-gradient(to left, #333, #333 50%, #eee 75%, #333 75%);
结果:
image.png

background: linear-gradient(217deg, rgba(255,0,0,.8), rgba(255,0,0,0) 70.71%), linear-gradient(127deg, rgba(0,255,0,.8), rgba(0,255,0,0) 70.71%),
linear-gradient(336deg, rgba(0,0,255,.8), rgba(0,0,255,0) 70.71%);
结果:
image.png

径向渐变

1、径向渐变简介

CSS3径向渐变,是一种从起点到终点颜色从内到外进行圆形渐变,就像从中间点向四周方向拉伸一样。CSS3径向渐变不再像线性渐变那样沿着一条直线进行过度,而是以圆形或椭圆形进行渐变是圆形或椭圆形渐变,是从一个起点向所有方向渐变。

2、径向渐变属性与参数

  1. radial-gradient(渐变形状 圆心位置, 颜色1,颜色2,…颜色n)

渐变形状:1.用像素或百分比定义水平和垂直半径,如“80px 50px”
2.circle 指定圆形径向渐变
3.ellipse 指定椭圆形径向渐变
2.圆心位置:在渐变形状后使用 at 加上关键字或数值来定义径向渐变的中心位置
1.像素/百分比,定义水平,垂直坐标
2.left 设置左边为径向渐变圆心的横坐标值
3.center设置中间为径向渐变圆心的横坐标值或纵坐标位置
4.left 设置右边为径向渐变圆心的横坐标值
5.top设置顶部为径向渐变圆心的横坐标值
6.bottom 设置底部为径向渐变圆心的横坐标值
颜色值:颜色1表示起始颜色,颜色n表示终止颜色,其中可以添加多个颜色值,
用逗号隔开

重复渐变

重复线性渐变

background-image: repeating-radial-gradient(渐变角度 , 颜色1,颜色2,…颜色n);

重复径向渐变

background-image: repeating-radial-gradient(渐变形状 圆心位置, 颜色1,颜色2,…颜色n);