博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
前端学习笔记二:稍稍苦手的DIV进阶
阅读量:5266 次
发布时间:2019-06-14

本文共 3580 字,大约阅读时间需要 11 分钟。

       昨天学习了div+css的相关基础,用到了margin和float的基础知识,今天将在深入学习这两个知识的同时,学习css盒模型,相对定位,绝对定位的相关基础知识。

      

       首先我们先用昨天的知识来做这么一个东西“两列居中显示”,先看看下面的效果:

 

 

如图所示,两个div相邻居中显示在页面上,而且不管怎么拖动浏览器,他们始终都是居中的。

 

要达到这种效果,用单独的两个div来实现的话,个人觉得不怎么好做,这个时候我们可以用嵌套的div来实现,html代码如下:

 

html    	
辛苦的左手

 

由上面的代码可以看出来,我们在居中显示的那两个div放在一个id为content的div里面,所以这样,要解决居中两个div的问题就变成了居中id为content的div的问题。那么运用上一章的内容,我们设置content的上下边距为0,左右边距为auto,就可以达到居中的效果,如下:

 

css

div

        {
            background:#FFC;
            border:1px solid #000;
            }

#content

{

  width:804px;

    height:599px;

  margin:0 auto;

}

然后在运用上一章的另外一个例子“两列并排显示”,让content里的两个div并排显示就ok了,当然除此之外我们还要对其宽度和高度做一点手脚,让其能把content占满,并且连个div的宽度相同,代码如下:

 

css#left		{			background:#F00;			width:400px;			height:597px;						float:left;			}					#right		{			background:#00C;			width:400px;			height:597px;				float:left;				}

疑问产生了!content的宽度是804,而里面两个div的宽度是400,804-400-400=4….

等于4啊!混蛋!不是0啊,但是为什么还是满的啊?!!!这是因为,页面中的一个对象,它的大小并不是仅仅由宽和高来定义的,它的大小等于外边距+边框宽度+内边距+对象宽度的和….这个东西是css的一个核心概念,叫做盒模型,后面会细讲。从css代码来分析,我们对div设置了统一的边框宽度,1px,所以content里面的两个div的实际宽度就是2*(400+1+1)=804。刚好能占满,多1像素,就会被挤到下面去了。

 

好了,上一章的东西巩固完了。下面开始正片。

 

首先,我们来讲讲css中一个非常重要的概念,css盒模型….Box Model

 

什么是盒模型,看看w3c的定义:

 

 

上图的意思就是说“页面中对象的实际大小,等于外边距+边框+内边距+对象大小的总和”我们实际操作一下,见下面的代码:

 

html			稍稍苦手的div进阶    		    	

 

上面的代码中,我们设置了一个宽高均为300px,外边距均为10像素,内边距均为10像素,边框为1像素的div,那么按照css盒模型的定义,这个对象在页面上所占的宽度应该为10*2(外边距)+1*2(边框)+10*2(内边距)+300(对象宽度)=342,高度同理。那么我们来看看效果,为了更好的能看到效果,我在这里使用了firebug插件,从firebug插件的解析来看,总大小的确是342*342,如下图:

 

 

不过盒模型在一定条件是会进行合并的,比如下面的代码:

 

cssdiv{	width:50px;	height:50px;	margin:50px;	background:#000;}

 

html
练习

 

我们在页面中放入了两个宽高都是50,背景颜色都是黑色,边距也是50的div。我们看看效果:

 

 

我们可以看出来,两个div四边的边距的50像素,说明我们的css代码起了预料中的效果….等等,好像哪点出了问题….不对啊!尼玛两个两个div的上下边距都是50px,所以两个div之间的距离不就是100px了吗,但是这里明显还是50像素….肿么回事?其实这是因为浏览器基于一些乱七八糟的原因(排版美观?)在解析过程中会自动把两个对象的上下边距合并在一起,当然这并不仅仅出现在两个相邻的对象之间,也有可能是下面这些原因(引用自):

 

1. 水平 margin 不会合并。

2. 两个上下渲染相邻(不一定是兄弟节点)的块状元素在正常页面流情况下会发生 margin 合并。

3. 浮动元素不会和任何元素(包括子孙节点)发生 margin 合并。

4. overflow = visible 的元素不和任何元素发生 margin 合并。

5. 绝对定位的元素不和任何元素发生 margin 合并。

6. inline-block 的元素不和任何元素发生 margin 合并。

7. 设置 clear 属性的元素不和任何元素发生 margin 合并。

8. 根元素不和任何元素发生 margin 合并。

9. 父节点和第一个子节点发生 margin-top 合并。

10. 如果最后一个子节点没有 border 以及 padding ,则和其父节点发生

margin-bottom 合并。

 

所以到时候根据具体的需求,配以相对较好的解决选择就ok了。

 

盒模型基本搞定,然后下面就是DIV的绝对定位相对定位

 

先来看绝对定位,什么叫绝对定位,我们可以这么想象,把浏览器想象成一个坐标轴,有纵向的y坐标,也有横向的x坐标,然后常规上来说,浏览器是从上往下解析一个html文档的,它会把html中定义的各种对象依次从上到下排列在这个坐标轴内,然后再通过相应的css代码对这些对象进行装饰。但是可能会有这么一个需求,比如我要在页面中做一个弹窗,或者恶心的浮动广告之类,它们都浮在页面其他对象的上面的,而像这样的东西就是用绝对定位或者是相对定位来实现的。我们先看一个效果:

 

 

这个效果表明了再a和b的上面叠放了一个叫“guanggao”的div,恩…这里用叠放来形容还是比较恰当。而这里的guanggao就是一个绝对定位的div,要把一个对象设置成绝对定位只需要设置css“position:absolute”就ok了,代码如下:

 

cssdiv{	width:80px;	height:80px;	margin:3px;	background:#FF0;	float:left;	border:1px solid #F00;}#guanggao{	position:absolute;	top:30px;	left:30px;}

 

 

html
稍稍苦手的div练习
a
guanggao
b

 

从上面的代码可以也可以看出来,一旦将某个对象设置成绝对定位之后,那么浮动模型就不会再起任何作用了。另外,当一个对象为绝对定位时,还需要设置它的坐标,主要是这几个属性(如果没有设定其中至少一个属性,那绝对定位是不会起效的,并且对象依然受浮动模型的控制):

 

                         top(表示离浏览器上面的距离)

                         left(表示离浏览器左边的距离)

                         bottom(表示离浏览器下面的距离)

                         right(表示离浏览器右边的距离)

 

然后除了这几个属性外,还有一个叫做z-index的属性,它是用来表示对象的深度的,因为当启用绝对定位之后就有对象重叠这样的问题,而重叠的先后顺序,就是谁在上,谁在下,就是通过z-index来决定的,z-index的值为数值型,值越大,对象就在越上面。

 

然后在来看看相对定位,相对定位相对来说要相对难理解一些,这么说把,绝对定位中,对象是根据浏览器的左上角为参造来进行定位的,而相对定位的话,对象是根据自己本来的位置做参照来进行定位。这里我们把上面的css代码中的position属性值改成relative就ok了,效果应该是下面这个样子:

 

 

从上图可以看出来,浮动模型是起效了的,a和b中间的guanggao的占位信息是存在,虽然是一片空白,然后guanggao相对其本来的位置(a和b的中间)向右下角偏移。这就是相对定位….

 

想要更详细的深入理解可以查看这篇文章:

转载于:https://www.cnblogs.com/fatlee/archive/2012/05/24/learn_css_html2.html

你可能感兴趣的文章
mysql新建用户,用户授权,删除用户,修改密码
查看>>
JS博客
查看>>
如何设置映射网络驱动器的具体步骤和方法
查看>>
ASP.NET WebApi 基于OAuth2.0实现Token签名认证
查看>>
283. Move Zeroes把零放在最后面
查看>>
Visual Studio Code 打开.py代码报Linter pylint is not installed解决办法
查看>>
Python 数据类型
查看>>
centos下同时启动多个tomcat
查看>>
slab分配器
查看>>
【读书笔记】C#高级编程 第三章 对象和类型
查看>>
针对sl的ICSharpCode.SharpZipLib,只保留zip,gzip的流压缩、解压缩功能
查看>>
【SVM】libsvm-python
查看>>
Jmeter接口压力测试,Java.net.BindException: Address already in use: connect
查看>>
Leetcode Balanced Binary Tree
查看>>
go:channel(未完)
查看>>
[JS]递归对象或数组
查看>>
多线程《三》进程与线程的区别
查看>>
linux sed命令
查看>>
html标签的嵌套规则
查看>>
[Source] Machine Learning Gathering/Surveys
查看>>