CSS布局之-浮动(Float)与定位(Position)-让盒子飞!

一、 前言:
浮动和定位的原理一定要深刻掌握!(其实每个原理都要深刻掌握!)如果你只是知道有float与position这些属性和他们的值,但是不清楚他们的值到底是怎么回事,那么你在写CSS的时候将会非常的苦恼,由刚开始的热血沸腾的想让盒子飞变成了让自己飞!因为盒子已经不知道飞到哪里去了,时间长了之后就可能会到九宵云外,盒子也找不回来了,您也可能崩溃了……
二、 浮动(Float)问题:
我们先来说说浮动问题,浮动是为了定位(这里的定位不是position).
1. 浮动对邻居有何影响?
我们先来做一下准备工作
下面是HTML中的内容:

<div class="son son1">我是第一个盒子, 此次的任务是为浮动做贡献!</div> <div class="son son2">我是第二个盒子, 是第一个盒子的搭档!</div>

下面是CSS中的内容:

body{margin:0;} .son{border:dashed 1px #990000;} .son1{background:orange;margin:5px;} .son2{background:pink;margin:5px;}

上一张图:

 

这里的盒子只是按照默认的排列方式。
下面开始让第一个飞!
在CSS中让第一个盒子向左float,为了方便观察它对邻居到底有何影响,把它的margin值改的大一点。

body{margin:0;} .son{border:dashed 1px #990000;} .son1{background:orange;margin:10px;} .son2{background:pink;margin:5px;}

看图:

可以看到,当第一个盒子设置为向左浮动的时候,它影响的只是第二个盒子里面的内容,同时第一个盒子的宽度已经是按照里面的内容来定义大小了。第二个盒子会向上移动,也就是忽视第一个盒子的存在。至于它的margin值怎么计算呢?我想您不会找这样的麻烦来折磨自己吧……更何况可悲的IE浏览器也有着自己独特的计算方法(我们需要的是Web标准!)……这里设置margin只是为了让您知道它的浮动只对盒子里的内容产生影响。
2. 浮动对父层级有何影响?
做好准备工作:
以下是HTML中的内容:

<div class="son son1">我是第一个盒子, 此次的任务是为浮动做贡献! 我是第一个盒子, 此次的任务是为浮动做贡献! 我是第一个盒子, 此次的任务是为浮动做贡献!</div> <div class="son son2">我是第二个盒子, 是第一个盒子的搭档!</div> <div class="son son3">我是第三个盒子, 我是路过的!</div>

以下是CSS中的内容:
这里只把第一个盒子设置了向左浮动

body{margin:0;} .father{margin:10px;background:skyblue;border:dashed 1px #000;} .son{border:dashed 1px #990000;margin:5px;} .son1{background:orange;float:left;} .son2{background:pink;} .son3{background:white;}

下面是效果图:

可以看到,父层级的盒子会当它不存在,第二个和三个盒子也会当第一个盒子不存在(但里面的内容不这样认为)。
好了,现在再把第二个盒子也浮动一下,只需要改一下CSS:

body{margin:0;} .father{margin:10px;background:skyblue;border:dashed 1px #000;} .son{border:dashed 1px #990000;margin:5px;} .son1{background:orange;float:left;} .son2{background:pink;float:left;} .son3{background:white;}

得到效果:

这里的margin就值得一说了,我们来看看第一个盒子与第二个盒子之间的距离是多少:


这里的切片宽度可以看到是10px,这样的结论和前面一篇” CSS布局之-盒子(Box)”说的是吻合的,那么上下的margin呢?我们来把浏览器的窗口变窄一点看一下:


现在浏览器已经变窄了,可以很明显的看到两个盒子之间的距离不只5个像素,到底是多少呢?猜10px试试,好吧,看看到底是不是:


果然是这样,切片的高度是10px,这个结论有别于以前说的上下的margin会重叠。
好了,我们现在再回到浮动的盒子对父级的影响吧,在上面的实验中看到,当设置浮动后,父级块变的相当没有权威性,在实际布局中我们绝对不想出现这样的效果,那么如何解决呢?父层级需要一个有力的帮手!请往下看。

3. 清除浮动。
还是上面的HTML,把CSS改一下:
把第三个盒子添加属性:clear:left;

body{margin:0;} .father{margin:10px;background:skyblue;border:dashed 1px #000;} .son{border:dashed 1px #990000;margin:5px;} .son1{background:orange;float:left;} .son2{background:pink;float:left;} .son3{background:white;clear:left;}

得到效果:

我们再把clear:left改为clear:right

再改为:clear:both

这里的几张图让您想起了一些东西了吗?一个简单的两列布局是不是就出现了呢?
三、 定位(Position)问题:
首先我们要知道position有哪几个属性值:static(这是默认的值,不需要考虑太多)、relative(相对定位)、absolute(绝对定位)、fixed(基于浏览器的绝对定位),这些是控制大局的东西,还有细节由什么控制呢?那就是left、top、bottom、right属性,他们的值可以用相对单位,也可以用绝对单位。
1、 relative:
准备一下代码:
以下是HTML中的内容:

<div class="father"> <div class="son">我是第一个盒子, 此次的任务是为position做贡献!</div> </div>

以下是CSS中的内容:

body{margin:0;} .father{margin:10px;background:skyblue;border:dashed 1px #000;} .son{background:pink;border:dashed 1px #990000;margin:5px;}

为下面做参考的图:

下面把这个盒子相对定位一下:

body{margin:0;} .father{margin:10px;background:skyblue;border:dashed 1px #000;} .son{ background:pink;border:dashed 1px #990000;margin:5px;position:relative;left:5px;top:5px;}

看细节图(盒子后面的幻影是盒子原来的位置):

得出结论:relative这种定位方式是基于他本身原来的位置来定位的。从上面的图看出,盒子现在的位置距离原来的位置左边是5px,顶部是5px,对应CSS中的left:5px;top:5px;。同时还可以得出什么呢?再来看这张图:

当盒子设置了relative定位方式以后,它不会影响其它的盒子,不管是邻居还是父级层。也不管它定位到哪里。
2、 absolute:
还是上面的代码,直接把relative改为absolute,把left和top的值都改为0,总之把影响观察的东西通通去掉!

.father{background:skyblue;border:dashed 1px #000;} .son{background:pink;border:dashed 1px #990000;position:absolute;left:0;top:0;}

外面的盒子彻底失去了作用……,得出结论,设置了position属性的盒子会脱离标准进行定位,也就是说它对其它的盒子有影响,什么影响呢?就是其它的盒子会视它为空气。那么里面的盒子是以浏览器为基准进行定位的(这是不是最终结论呢?)。我们来把父层级的盒子设置一下,方便观察。

.father{background:skyblue;border:dashed 1px #000;width:200px;height:200px;margin:10px;position:relative;} .son{background:pink;border:dashed 1px #990000;position:absolute;left:0;top:0;}

可以看到,此时里面的盒子不再以浏览器为基准进行定位了,而是以设置了retalive属性的父层级的盒子进行定位了。于是可以得出结论:position定位方式元素的定位基准是距离该元素最近的且设置了非static(也就是不是默认的定位方式)属性的父级元素。好了,那么我为什么不把父级元素设置为fixed或者absolute呢?原因很简单,因为absolute和fixed的定位方式会脱离标准方式定位(近朱者赤,近墨者黑)。这里顺便把fixed也说了吧,把上面的CSS改一下:

body{margin:0;} .father{background:skyblue;border:dashed 1px #000;width:200px;height:200px;margin:10px;position:relative;} .son{background:pink;border:dashed 1px #990000;position:fixed;left:0;top:0;}

可以看到,fixed不管父层级是如何定位的,始终以浏览器为基准进行定位。
好了,说的够多了,再说下去,右边的滚动条越来越小了,不过也没有多少东西要说了,更多的细节,您在做的时候多多注意……。

Tags: absolutefloatpositionrelative定位浮动

 

 转自:http://www.skywoo.me/css-layout-float-position-let-the-boxes-fly/

时间: 2025-01-19 06:05:36

CSS布局之-浮动(Float)与定位(Position)-让盒子飞!的相关文章

如何处理div+css布局左右浮动问题

  上次分享了<DIV+CSS网页设计制作页面布局技巧分享!>,相信我们对网页布局技巧方面已经有所了解,其实在我们进行div+css网页布局时,还会出现css布局左右出现浮动的问题.这里就在分享下如何处理div+css布局左右浮动问题. 先看以下代码片段: css代码: #left{ float:left;width:200px;} #right{ float:right;width:800px;} 页面代码: <body> <div id="content&quo

css+div布局要素:文档流position属性 父级对象和同级对象

div+css布局要素:文档流position属性.父级对象和同级对象.从学div+css以来,一直对position几个属性的理解不够清晰.自己对position这一属性有了更深入和清晰的认识,同时让自己对整个div+css布局有了更深入的认识. 因为div实质是一个四方块,被很多业界人士形象的比喻成盒子.那么div+css布局的过程其实就是摆放这些盒子的过程.最近一周来,专门针对这个问题进行了深入的思考和研究.结果通过对这一问题的研究不仅让自己对position这一属性有了更深入和清晰的认识

使用CSS布局定位属性轻松实现优美站点布局

本文为大家介绍CSS布局定位属性,熟练的使用可以轻松实现优美站点布局,感兴趣的朋友可以参考下,希望对大家有所帮助   CSS定位属性: ◆bottom.left.right和top ◆position ◆clip ◆float ◆clear ◆overflow ◆z-index 该类属性设置元素在父级元素中的位置.在设置这类元素时,如果设置长度数值,均以px作为单位,在通过style对象读取属性时,返回带单位的字符串. 1.边偏移(bottom,left,right和top) 作用:设置元素距离

CSS浮动(float,clear)通俗讲解

  很早以前就接触过CSS,但对于浮动始终非常迷惑,可能是自身理解能力差,也可能是没能遇到一篇通俗的教程. 前些天小菜终于搞懂了浮动的基本原理,迫不及待的分享给大家. 写在前面的话: 由于CSS内容比较多,小菜没有精力从头到尾讲一遍,只能有针对性的讲解. 如果读者理解CSS盒子模型,但对于浮动不理解,那么这篇文章可以帮助你. 小菜水平有限,本文仅仅是入门教程,不当之处请谅解! 本文以div元素布局为例. 教程开始: 首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流.

[译] 渐进增强的 CSS 布局:从浮动到 Flexbox 到 Grid

本文讲的是[译] 渐进增强的 CSS 布局:从浮动到 Flexbox 到 Grid, 原文地址:Progressively Enhancing CSS Layout: From Floats To Flexbox To Grid 原文作者:Manuel Matuzović 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:LeviDing 校对者:薛定谔的猫,LouisaNikita 今年早些时候,大多数主流浏览器都支持了 CSS Grid 布局.自然地

彻底理解浮动float CSS浮动详解 清除浮动的方法

原文:彻底理解浮动float CSS浮动详解 清除浮动的方法  我们把网页的常用的布局格式分为以下三种:   1.标准流.  所谓的标准流就是,行内元素自己单独一行,而块级元素是上下显示的. 以前我们学习的都是标准流.   注意:标准流使我们网页布局中最稳定的一种结构       2. 浮动流  使我们学习的脱离标准流的第一种方式.会影响我们标准流的排列.所以,我们布局的时候,能用标准流做的,就不用浮动做.       3. 定位流   定位流也是脱离标准流的一种模式.它完全脱离标准流,不会对标

CSS中HTML元素定位Position参数可选值详解

position 属性规定元素的定位类型.这个属性定义建立元素布局所用的定位机制.任何元素都可以定位,不过绝对或固定元素会生成一个块级框,而不论该元素本身是什么类型.相对定位元素会相对于它在正常流中的默认位置偏移. 默认值: static 语法: position : static | absolute | fixed | relative 继承性: no 版本: CSS2 JavaScript 语法: object.style.position="absolute" static 元

CSS实例:定位(position)页面定位详解

注:在做这节教程的时候,我又上网查了相关资料,看了大量的文章,做了大量的测试,最后总结出下面这些文字,洋洋洒洒一整篇,不过需要大家一句话一句话的看,一定要仔细喽!还有对于课程中的说的,最好一边看,一边练,不练绝对看不懂! 定位(position)布局页面说容易非常容易,只需要记住这节课最后一句话就可以了,说困难,那是相当的难理解,需要一定的耐心,不过还好,KwooJan给大家总结的已经很通俗易懂了. 如果下面的文字实在是无法理解透,那就记住这节课最后总结的一句话"如果用position来布局页面

CSS基础知识 - 盒模型/定位/浮动

1. Box Model (盒模型)       Box Model 是CSS的指定元素如何显示和交互,是CSS的基石之一.       页面上的每个元素被看成是一个矩形框,它由内容,填充(padding),边框(border),空白边(margin)组成.       他们之间的关系如下:       [ margin [ border [ padding [ content ] ] ] ]       margin, border, padding 都是可选的,他们的默认值为0.