一个入门的DIV+CSS布局问题:一个宽度不确定的DIV里面放三个水平对齐的DIV,左右两个DIV宽度固定为150px,中间那个DIV充满剩余的宽度。

  说明:代码非真实情况下使用,所以直接简单。

  没耐心的直接看最后解答。

  1. 我的第一反应:

<div style="width:500px;">
<div id="px1" style="float:left; height:100px; width:150px; background-color:gray;"></div>
<div id="px2" style="float:left; height:100px; width:auto; background-color:red;"></div>
<div id="px3" style="float:left; height:100px; width:150px; background-color:green;"></div>
</div>

  然后发现不对,中间红色的div根本就没有显示:

  

图1

  2. 百度看到一个CSDN问答,4楼 的答案如下:

这是比较典型的一个三栏布局 给你思路吧
左右两个可以用绝对定位 让他们分别left:0;和right:0;
然后中间的元素不定宽度 让他们的margin-left和margin-right分别对应左右两栏的宽度就好了

  修改后:

    <div style="width:500px;" >
<div id="px1" style="position:absolute; left:0px;top:0px;height:100px; width:150px; background-color:gray;"></div>
<div id="px2" style="float:left; height:100px;margin-left:150px;margin-right:150px; width:100%; background-color:red;"></div>
<div id="px3" style="position:absolute; right:0px;top:0px;height:100px; width:150px; background-color:green;"></div>
</div>

  结果如下:(浅灰色是html页面背景颜色)

  

图2

  很明显,这不符合预期。左右2个div的 定位出现问题了,不是以 父div 来定位,而是以 窗口 为 父元素定位了。于是我在w3cshool详细了解才发现:

  absolute: 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。

  就是说现在左右2个div的父元素是 static 定位(static是默认的定位方式),不符合absolute的定位要求。那怎么办,把那个父div也改为 position: absolute (或者position: relative)呗,于是

  

  3. 修改父元素为非static定位

    <div style="width:500px;position:absolute;left:200px;top:100px;" >
<div id="px1" style="position:absolute; left:0px;top:0px;height:100px; width:150px; background-color:gray;"></div>
<div id="px2" style="float:left; height:100px;margin-left:150px;margin-right:150px; width:100%; background-color:red;"></div>
<div id="px3" style="position:absolute; right:0px;top:0px;height:100px; width:150px; background-color:green;"></div>
</div>

  结果是:(浅灰色是html页面背景颜色)

  

    图3

  可以发现:左右2个 absolue 的div元素都乖乖的没有问题,倒是中间的红色div 明显变长了,突出了一部分。用Chrome调试,发现是右边的绿色div覆盖在了中间的红色div上,并且红色div整体是 宽500px。

  应该说,它的 margin-left 起作用了,但是宽度100%,却变成了宽度500px,并且仿佛 margin-right 丝毫不起作用。

  【后经GK同学指导:margin-right起作用了,只是它透明了看不见。至于红色超出部分可以给 父div设置属性:overflow:hidden解决,这里也还有问题,见5】

  4. 去掉 margin-*

  后来把 margin-left 去掉,发现正常了。(其实就是绿色和灰色把红色的左右两边遮住了而已,其实红色还是500px)。

    <div style="width:500px;position:absolute;left:200px;top:100px;" >
<div id="px1" style="position:absolute; left:0px;height:100px; width:150px; background-color:green;"></div>
<div id="px2" style="float:left; height:100px; width:100%; background-color:red;"></div>
<div id="px3" style="position:absolute; right:0px;height:100px; width:150px; background-color:gray;"></div>
</div>

  结果就正常了:

  

图4

  但是也就看上去正常,但感觉不是符合要求,并没有充满“剩余宽度”,而是直接充满“全部宽带”,然后被左右2个absolute的div遮住了左右宽度。

  如果写上文字,会发现(中间的div文字被遮住了):

  

图5

  5.父div添加overflow的问题(上接3)

  

    <div style="width:500px;position:absolute;left:200px;top:100px;overflow:hidden" >
<div id="px1" style="position:absolute; left:0px;height:100px; width:150px; background-color:gray;">一二三四五六七八九十一二三四五六七八九十</div>
<div id="px2" style="float:left; height:100px;margin-left:150px;margin-right:150px; width:100%; background-color:red;">一二三四五六七八九十一二三四五六七八九十</div>
<div id="px3" style="position:absolute; right:0px;height:100px; width:150px; background-color:green;">一二三四五六七八九十一二三四五六七八九十</div>
</div>

  结果如图:中间div的文字被右边遮住了,问题只是被简单的隐藏了。并没有解决。

  

图6

  6、先贴出一个完美办法,GK同学的。很清晰,很明确。

<html>
<head>
<title>TEST</title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
.d0 {
width: 40%;
height: 200px;
margin: 0 auto;
position: relative;
min-width: 300px;
}
.d1 {
position: absolute;
left: 0;
top: 0;
width: 150px;
height: 100%;
background-color: #CF4D4D;
}
.d2 {
width: auto;
padding: 0 150px;
height: 100%;
background-color: #8F8FCF;
}
.d3 {
position: absolute;
right: 0;
top: 0;
width: 150px;
height: 100%;
background-color: #62C262;
}
</style>
</head>
<body style="background-color:#CCCCCC">
<div class="d0">
<div class="d1"><p>左边的内容左边的内容左边的内容左边的内容左边的内容左边的内容</p></div>
<div class="d2"><p>中间的内容中间的内容中间的内容中间的内容中间的内容中间的内容</p></div>
<div class="d3"><p>右边的内容右边的内容右边的内容右边的内容右边的内容右边的内容</p></div>
</div>
</body>
</html>

  结果如下图:

    

图7

这里有个更好的文章,讲解三栏布局。 

后记:(2014年2月20日)

最近又看了一次本文,上面有些啰嗦。之所以一直不对,是我对下面2个知识点没理解。

    width: auto 和 width: 100%

    margin       和 padding

GK同学方法之所以奏效,他用的是

   width: auto 和 padding:0 150px

而我用的则是

  width: 100% 和 margin: 0 150px 

这二者的区别就是:

  width: 100% 就是自己和父元素的宽度一样是500px,接着 margin: 0 150px,就是自己左边离父元素边界有150px,这么算,自己中间的div自然会超出一部分。

    并且中间div的一部分会被右边(绿色)的div给遮住一部分。如图3。

  width: auto 由浏览器自己计算div的宽度。GK同学代码里,由于左右div是绝对定位,不在文档流中,中间div自动充满整个父元素,只不过左右被 左边和右边的div遮住了。但是,有趣的是,

    他用的是 padding: 0 150px,这样,中间div内容区域就不会被遮住。如下图:

图8

  这里关键理解 CSS 中盒模型的 width 指什么区域:

  

图9

DIV+CSS布局问题:一个宽度不确定的DIV里面放三个水平对齐的DIV,左右两个DIV宽度固定为150px,中间那个DIV充满剩余的宽度的更多相关文章

  1. 一个宽度不确定的DIV里放三个水平对齐的DIV,左右两个DIV宽度固定为100px,中间那个DIV自适应宽度

    方法一:浮动  注意三个div的位置 <html><head> <meta charset="utf-8"> <style type=&q ...

  2. DIV+CSS布局中主要CSS属性介绍

    Float: Float属性是DIV+CSS布局中最基本也是最常用的属性,用于实现多列功能,我们知道<div>标签默认一行只能显示一个,而使用Float属性可以实现一行显示多个div的功能 ...

  3. DIV+CSS布局-固定页面开度布局

    DIV+CSS布局中主要CSS属性介绍: Float: Float属性是DIV+CSS布局中最基本也是最常用的属性,用于实现多列功能,我们知道<div>标签默认一行只能显示一个,而使用Fl ...

  4. 一小时搞定DIV+CSS布局-固定页面开度布局

    本文讲解使用DIV+CSS布局最基本的内容,读完本文你讲会使用DIV+CSS进行简单的页面布局. 转载请标明:http://www.kwstu.com/ArticleView/divcss_20139 ...

  5. (转)div+css 布局经验 - 最简单的 = 最不变形的(原创技巧)

    站酷几年了 一直饱受其恩泽 尤为感激 一直想奉献些什么 但是苦于水平 苦于奔波 今天静下心来 为大家奉献下 自己的div+css 经验 ,以下观点只代表 深海个人立场 希望为初学者提供一条" ...

  6. (转)一小时搞定DIV+CSS布局-固定页面开度布局

    本文讲解使用DIV+CSS布局最基本的内容,读完本文你讲会使用DIV+CSS进行简单的页面布局. 转载请标明:http://www.kwstu.com/ArticleView/divcss_20139 ...

  7. (转)Div+CSS布局入门

    在网页制作中,有许多的术语,例如:CSS.HTML.DHTML.XHTML等等.在下面的文章中我们将会用到一些有关于HTML的基本知识,而在你学习这篇入门教程之前,请确定你已经具有了一定的HTML基础 ...

  8. div+css 布局下兼容IE6 IE7 FF常见问题

    div+css 布局下兼容IE6 IE7 FF常见问题 收藏 所有浏览器 通用 (市面上主要用到的IE6 IE7 FF)height: 100px; IE6 专用 _height: 100px; IE ...

  9. <转载>Div+Css布局教程(-)CSS必备知识

    目录: 1.Div+Css布局教程(-)CSS必备知识 注:本教程要求对html和css有基础了解. 一.CSS布局属性 Width:设置对象的宽度(width:45px). Height:设置对象的 ...

随机推荐

  1. 论前端css初始化的重要性

    新手,求喷,刚刚知道每个浏览器都有对 标签的初始化,就造成我们网站开发者开发的web程序,会在不同的网站上有不同的样式风格,这给用户带来了很不好的体验,这也是浏览器本身的原因造成的,这时候,我们不可能 ...

  2. hibernate中使用HQL进行数据库查询

    1.写的规则比较简单,我讲一下,如图Station这个不是数据库中的表,而是entity包中的类名Station,可以省略 select * 2.返回的类型自动转化为String类型,不用你自己再转化 ...

  3. 控件AutoCompleteTextView实现动态匹配输入内容的一种输入框

    <AutoCompleteTextView android:layout_width="match_parent" android:layout_height="w ...

  4. String or binary data would be truncated. The statement has been terminated.

    常见的情况为:插入的值大于字段定义的最大长度. String or binary data would be truncated. The statement has been terminated

  5. UITextView/UITextField检测并过滤Emoji表情符号

    UITextView/UITextField检测并过滤Emoji表情符号 本人在开发过程中遇到过这种情况,服务器端不支持Emoji表情,因此要求客户端在上传用户输入时,不能包含Emoji表情.在客户端 ...

  6. [转]PHP取整函数:ceil,floor,round,intval的区别详细解析

    我们经常用到的PHP取整函数,主要是:ceil,floor,round,intval. 1.ceil -- 进一法取整 说明float ceil ( float value ) 返回不小于 value ...

  7. 如何制作css3的3d动画——以骰子旋转为例,详解css3动画属性

    首先先来看两个用css3实现的炫酷的3d动画效果 1 2 3 4 5   6 你没看错,这个炫酷的效果都是用css3实现的. 下面是动画实现所需要用到的几个css3属性. 1.perspective: ...

  8. SGU 220.Little Bishops(DP)

    题意: 给一个n*n(n<=10)的棋盘,放上k个主教(斜走),求能放置的种类总数. Solution: 一眼看上去感觉是状压DP,发现状态太多,没办法存下来... 下面是一个十分巧妙的处理: ...

  9. 初涉JavaScript模式 (3) : 字面量

    什么是字面量? 在编程语言中,字面量是一种表示值的记法.例如,"Hello, World!" 在许多语言中都表示一个字符串字面量(string literal ),JavaScri ...

  10. html5本地数据库(一)

    本地数据库 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important ...