前端之路(二)CSS贰

1、盒模型

所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用。

CSS盒模型本质上是一个盒子,封装周围的HTML元素,盒模型从内到外分为:content、padding、border、margin

盒模型允许我们在其它元素和周围元素边框之间的空间放置元素。

2、盒模型宽高计算

盒模型有两种,标准盒模型怪异(IE)盒模型,两种盒模型的计算公式有略微不同。

标准盒模型:

content|width|height + padding + border + margin

怪异盒模型:

width|height(content + padding + border) + margin

CSS3之后,可以通过box-sizing切换这两种模型,值为:content-box(标准盒模型)和border-box(怪异盒模型)

3、元素宽高

左右留白:网站左边内边距是固定的,内容在右侧甩出的空白不一样,可以给定一个足够的宽度,只设置左边的内边距,右边空白区域自动剩余。

在实际的使用中,一般不设置高度,是为了让内部的内容撑开盒子,达到让盒子自动撑高减小。当然,这不绝对,要视情况而定。

4、外边距(margin)

同级元素之间的边距,或者距离父元素之间的边距。

1)数值法设置margin

**单值法:**margin:1px,统一设置盒子上下左右的margin值。

**双值法:**margin:1px 2px,第一个值是上下margin,第二个值是左右margin。

**三值法:**margin:1px 2px 3px,第一个值是上margin,第二个是左右margin,第三个是下margin。

**四值法:**margin:1px 2px 3px 4px,分别是上、右、下、左,顺时针。

2)方向法

**margin-top:**上

**margin-bottom:**下

**margin-left:**左

**margin-right:**右

5、margin塌陷

margin塌陷现象:在垂直方向(左右不会引起塌陷)如果有两个元素的外边距有相遇,在浏览器中加载的真正的外边距不是两个间距的加和,而是两个边距中值比较大的,边距小的塌陷到了边距值大的值内部。

1)同级元素塌陷

上面的元素有下边距,下面的元素有上边距,两个边距相遇,真正盒子间距离是较大的那个值。

解决方案:

如果两个元素垂直方向有间距,只需要设置给一个元素完整的间距,不要拆分给两个元素。

2)父子元素塌陷

在父元素没有设置padding、border、overflow的情况下,给子级设置margin-top时,他不会相对父级一起动,只有他的margin超过父级的margin时,才会生效,但会带着父级一起移动。

解决方案:

(1)为父盒子设置border,为外层添加border后父子盒子就不是真正意义上的贴合。

(2)为父盒子添加overflow : hidden;

(3)为父盒子设定padding值,而非使用子盒子的margin。

6、border边框

用于设置盒子的边框。

1)按方向设置大小

border-top:上

border-bottom:下

border-left:左

border-right:右

2)设置属性

border-style:边框线形。值:solid,实线

​ dotted,点线

​ dashed,虚线

​ double,双线

border-width:边框宽度。值:像素值

​ thick,粗线

​ thin,细线

​ medium,中等宽线

border-color:边框颜色

border:综合写法,顺序:style width color

7、内边距(padding)

元素内容和边框之间的间距。

1)数值法设置padding

**单值法:**padding:1px,统一设置盒子上下左右的padding值。

**双值法:**padding:1px 2px,第一个值是上下padding,第二个值是左右padding。

**三值法:**padding:1px 2px 3px,第一个值是上padding,第二个是左右padding,第三个是下padding。

**四值法:**padding:1px 2px 3px 4px,分别是上、右、下、左,顺时针。

2)方向法

**padding-top:**上

**padding-bottom:**下

**padding-left:**左

**padding-right:**右

注意:当使用百分比设置margin和padding时,无论哪个方向都是参照父元素设置的。

8、标准文档流

文档流指的是元素排版布局过程中,元素会默认自动从左往右,从上往下的流式排列方式。并最终窗体自上而下分成一行行,并在每行中从左至右的顺序排放元素。

标准文档流的特征:

1)文本内容具有空白折叠现象。

2)文本内容高低不齐,底边对齐(baseline)。

3)文本内容如果超过了盒子的宽度会自动换行。

标准文档流的分类:

分为行内元素和块级元素。

所有的文本级标签,除了<P>都是行内元素。

所有的容器级标签还有<p>都是块级元素。

9、块级元素

1)特征:

可以设置宽高,有换行符。

独占一行,如果设置了宽高,那么容器范围是设置的宽高;如果没有设置宽度,默认是撑满父容器,即父容器宽度的100%。

非块级元素可以使用display:block属性设为块级元素。

可以包含块级元素和行内元素。

2)块级元素有:

<address>、<div>、<h1>~<h6>、<hr>、<p>、<pre>、<ul>、<ol>、<dl>、<table>、<form>等

10、行内元素

1)特征:

不可以设置宽高,与其他行内元素在一行内从左到右依次排列。

容器默认包裹内容,宽度由内容撑开。

行内元素设置上下margin、padding不生效(不占位置但是背景色能呈现),左右生效。

非行内元素可以通过display:inline属性设为行内元素。

只能包含行内元素。

2)行内元素有:

<span>、<a>、<br>、<strong>、<sup>、<sub>、<em>、<del>、<select>、<label>等

11、行内块元素

1)特征:

可以设置宽高,与其他行内元素在一行内从左到右依次排列。

容器默认包裹内容,宽度由内容撑开。如果设置了宽高,那么容器的范围是设置的宽高。

非行内块元素可以通过display:inline-block属性设为行内块元素。

2)行内块元素有:

<img>、<input>、<textarea>等

12、元素隐藏

三种方式:

1)display:none,设置元素消失,不占位。(常用)

2)visibility:hidden,设置元素消失,占位。(不常用)

3)opacity:0,设置元素不透明度为0,消失占位。(实现透明度渐变效果常用)

区别:

1、空间占据

display:none隐藏后不占据额外空间,它会产生回流和重绘,而visibility:hidden和opacity:0元素虽然隐藏了,但它们仍然占据着空间,它们俩只会引起页面重绘。

2、子元素继承

display:none不会被子元素继承,但是父元素都不在了,子元素也就不会显示了

visibility:hidden 会被子元素继承,可以通过设置子元素visibility:visible 使子元素显示出来

opacity: 0 也会被子元素继承,但是不能通过设置子元素opacity: 1使其重新显示
3、事件绑定

display:none 的元素都已经不再页面存在了,因此肯定也无法触发它上面绑定的事件;

visibility:hidden 元素上绑定的事件也无法触发;

opacity: 0元素上面绑定的事件是可以触发的。

4、过渡动画

transition对于display无效,

transition对于visibility也是无效的,

transition对于opacity有效。

13、居中

**单行文本:**设置height和line-height相同。

**多行文本:**不设置高度,通过padding双值法设置上下padding,左右设为0。

**子容器:**水平居中使用margin:0 auto;垂直居中,若父容器已知高度,使用margin-top(注意塌陷问题)。如果父容器高度不一定,则可以在父容器中使用上下padding。

**行内块:**水平text-align;垂直vartical-align:middle;

14、浮动

浮动不同于标准文档流,浮动按元素的类型排列;

浮动的元素都脱离了标准文档流,不再占据以前的位置。

浮动出现的初衷是为了实现文字环绕效果。

浮动分为:left(左浮动)、right(右浮动)、none(无,标准文档流)

1)特征

浮动可以按照从左到右紧密排列。

浮动的元素具有块级元素的部分特点,可以设置宽高、padding、margin但是没有换行符。

浮动的元素不存在上下margin合并的问题。

浮动的元素都脱离了标准文档流,不再占据以前的位置。

一个元素设置浮动后,其他同级元素都要设置浮动。

元素设置浮动后,原有的自适应占父元素宽度百分百的宽度变为包裹的内容的宽度。

元素设置浮动后,会影响后面元素的布局,所以要及时清除浮动。

2)浮动的元素塌陷问题

在父元素不设置宽高的情况下,若是子元素都设置了浮动,则会呈现出父元素塌陷的问题。

解决方案:

1、给父元素设置高度:在确定宽高的情况下可以使用,但是一般情况下,父元素的宽高由内容撑起,因此此方案有效但是不常用。

2、外墙法:在父元素后面加入一个同级的空元素(div),然后在这个空元素中设置清除浮动。这种方法会添加很多无用元素,增加结构层代码量,且我们完全可以直接在后面的元素中清除浮动。

3、内墙法:在父元素内部的最后加入一个空元素(div),然后在这个空元素中设置清除浮动。问题类似于外墙法,但是撑起了父元素的高度也解决了塌陷。

4、给浮动的元素的容器添加浮动:给浮动元素的容器也添加上浮动属性即可清除内部浮动,但是这样会使其整体浮动,影响布局,不推荐使用。

5、父元素设置display:inline-block,达不到想要的布局效果

6、使用CSS的overflow属性:

给浮动元素的容器添加overflow:hidden;(溢出隐藏)或overflow:auto;(溢出自适应)可以清除浮动,另外在 IE6 中还需要触发 hasLayout ,例如为父元素设置容器宽高或设置 zoom:1。

在添加overflow属性后,浮动元素又回到了容器层,把容器高度撑起,达到了清理浮动的效果。

但是这种方式在需要内容溢出盒子时,可能会影响内容的显示效果。

7、使用邻接元素处理:什么都不做,给浮动元素后面的元素添加clear属性。

8、使用CSS的:after伪元素

结合 :after 伪元素(注意这不是伪类,而是伪元素,代表一个元素之后最近的元素)和 IEhack ,可以完美兼容当前主流的各大浏览器,这里的 IEhack 指的是触发 hasLayout。

给浮动元素的容器添加一个clearfix的class,然后给这个class添加一个:after伪元素实现元素末尾添加一个看不见的块元素(Block element)清理浮动。

也可以直接用父元素:after直接加给父元素,但是最好还是写一个clearfix类

.clearfix::after{
  content: ""; 
  display: block; 
  height: 0; 
  clear: both; 
  visibility: hidden;  
  }

.clearfix {
  /* 触发 hasLayout */ 
  zoom: 1; 
  }

通过CSS伪元素在容器的内部元素最后添加了一个看不见的空格"020"或点".",并且赋予clear属性来清除浮动。需要注意的是为了IE6和IE7浏览器,要给clearfix这个class添加一条zoom:1;触发haslayout。

9、双伪元素清除浮动

.clearfix::after,
.clearfix::before {
    content: "";
    display: table;
}

.clearfix::after {
    clear: both;
}

.clearfix {
    *zoom: 1;
}

15、伪元素和伪类的区别

1)伪类允许出现在选择器的任何位置,伪元素只能跟在选择器的最后一个简单选择器后面。

2)伪类操作的对象是文档树中已有的元素,而伪元素则创建了一个文档树之外的新元素(本质)。

3)伪类是类,伪元素是元素,权重不同。

16、浮动元素依次贴边

默认盒子会按照顺序排列,如果前面有兄弟,则紧贴着兄弟。如果没有兄弟,盒子将贴在父亲的边上。如果一行容不下,会另起一行然后渲染。方向永远是从左到右,从上到下,在另起一行后即使发现上面有空隙容得下,也不会挤进去。

17、浮动与行内块的区别

浮动:使元素脱离标准文档流,向指定的方向移动,遇到其他相邻浮动元素或者父元素的边就会停下来。

行内块:同时具有行内元素和块元素的特点,可以实现对元素的有序排列。不会贴边,会另起一行。

两者区别:

1)当标签高度不一致时,浮动会改变排列的顺序,行内块会依旧遵循排列的顺序。

2)浮动元素脱离标准文档流,不占用空间,行内块会抢占空间。

18、margin对元素宽度的影响

如果块元素没有设置宽度,其宽度默认为父元素宽度。此时如果修改margin值,会影响元素的宽度,正值宽度减小,负值宽度加大。

如果设置了宽度,则宽度恒定不受margin值影响,只改变元素位置。在其中,margin-left改变位置的优先级大于margin-right。

19、margin对浮动元素的影响

对于标准文档流来说,块元素默认占满整行,因此设置水平方向的margin不会影响后面的元素。

margin是相对于原有位置移动的。

如果让盒子浮动,此时设置盒子的边距会影响后面的元素,前面的元素不受影响.

​ 1)如果浮动的盒子通过margin移动是受前面元素影响的,那么盒子移动的距离就是前面所有盒子移动的距离。

​ 2)如果盒子2要移动到盒子1前面,移动的距离与盒子1的移动距离无关,与两个盒子的宽度有关:盒子1+盒子2

​ 3)当盒子2移动到盒子1前面,盒子3与盒子1贴边,为盒子3设置margin时,其移动距离为盒子1移动距离+盒子2宽度+自身移动距离(margin)

公式:

设定w为盒子自身宽度,w1代表盒子1的宽……

​ d为移动距离,d1代表盒子1的移动距离……

2贴1边:d2=w1+w2

2溢出,3贴1边:d3=d1+w2+d3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值