原文地址:https://segmentfault.com/a/1190000008411418

页面布局中经常用会遇到左侧宽度自适应,右侧固定宽度,或者左侧宽度固定,右侧自适应。总之就是一边固定宽度,一边自适应宽度。

一般固定宽度是导航栏,自适应宽度的是主体内容显示区。

所以要实现这种布局,就先给出如下html结构:

<div class="container">
<div class="sidebar">导航区域</div>
<div class="main">主体内容显示区域</div>
</div>
<div class="footer">footer保证前面的不会影响此元素的显示</div>

container用于包裹sidebar与main,footer用来测试前面的布局不会影响footer的正常显示,如果footer样式不对,说明我们的布局是有问题的。

接下来看常见的几种布局方法:

四种布局:

固定区域浮动,自适应区域不设置宽度但设置margin

.container {
overflow: hidden;
*zoom: 1;
} .sidebar {
float: right;
width: 300px;
background: #333;
} .main {
margin-right: 320px;
background: #666;
} .footer {
margin-top: 20px;
background: #ccc;
}

其中,sidebar让它浮动,并设置了一个宽度;而main没有设置宽度。

大家要注意html中必须使用div标签,不要妄图使用什么p标签来达到目的。因为div有个默认属性,即如果不设置宽度,那它会自动填满它的父标签的宽度。这里的main就是例子。

当然我们不能让它填满了,填满了它就不能和sidebar保持同一行了。我们给它设置一个margin。由于sidebar在右边,所以我们设置main的margin-right值,值比sidebar的宽度大一点点——以便区分它们的范围,例子中是320。

假设main的默认宽度是100%,那么它设置了margin后,它的宽度就变成了100%-320,此时main发现自己的宽度可以与sidebar挤在同一行了,于是它就上来了。

而宽度100%是相对于它的父标签来的,如果我们改变了它父标签的宽度,那main的宽度也就会变——比如我们把浏览器窗口缩小,那container的宽度就会变小,而main的宽度也就变小,但它的实际宽度100%-320始终是不会变的。

这个方法看起来很完美,只要我们记得清除浮动(这里我用了最简单的方法),那footer也不会错位。而且无论main和sidebar谁更长,都不会对布局造成影响。

但实际上这个方法有个很老火的限制——html中sidebar必须在main之前!

但我需要sidebar在main之后!因为我的main里面才是网页的主要内容,我不想主要内容反而排在次要内容后面。

但如果sidebar在main之后,那上面的一切都会化为泡影。

可能有的人不理解,说你干嘛非要sidebar在后面呢?这个问题说来话长,反正问题就是——main必须在sidebar之前,但main宽度要自适应,怎么办?

下面有两个办法,不过我们先把html结构改成我们想要的样子:

<div class="container">
<div class="main">主体内容显示区域</div>
<div class="sidebar">导航区域</div>
</div>

固定区域使用定位,自适应区域不设置宽度但设置margin

我们把sidebar扔掉,只对main设置margin,那么我们会发现main的宽度就已经变成自适应了——于是main对sidebar说,我的宽度,与你无关。

main很容易就搞定了,此时来看看sidebar,它迫不得已抛弃了float。我们来看看sidebar的特点:在右边,宽度300,它的定位对main不影响——很明显,一个绝对主义分子诞生了。

于是我们的css如下:

.container {
position: relative;
} .sidebar {
position: absolute;
top: 0;
right: 0;
width: 300px;
background: #333;
} .main {
margin-right: 320px;
background: #666;
}

这段css中要注意给container加上了相对定位,以免sidebar太绝对了跑到整个网页的右上角而不是cintainer的右上角。

好像完成了?在没有看footer的表现时,我很欣慰。我们来把sidebar加长100px。

咦,好像不对,footer怎么还是在那儿呢?怎么没有自动往下走呢?footer说——我不给绝对主义者让位!

其实这与footer无关,而是因为container对sidebar的无视造成的——你再长,我还是没感觉。

看来这种定位方式只能满足sidebar自己,但对它的兄弟们却毫无益处。

float与margin齐上阵

经过前面的教训,我们重新确立了这个自适应宽度布局必须要达成的条件:

1.sidebar宽度固定,main宽度自适应
2.main要在sidebar之前
3.后面的元素要能正常显示,不能受影响

由于绝对定位会让其他元素无视它的存在,所以绝对定位的方式必须抛弃。

如果main和sidebar一样,都用float,那main的自适应宽度就没戏了;如果不给main加float,那sidebar又会跑到下一行去。

所以,最终我决定:float与margin都用。

我打算把main的宽度设为100%,然后设置float:left,最后把它向左移动320,以便于sidebar能挤上来。

但这么一来main里面的内容也会跟着左移320像素,导致被遮住了,所以我们要把它重新挤出来。为了好挤,我用了一个额外的div包裹住内容,所以html结构变成了这种样子:

<div class="container">
<div class="main">
<div class="main_container">主体内容显示区域</div>
</div>
<div class="sidebar">导航区域</div>
</div>

css则变成这样:

.main {
float: left;
width: 100%;
margin-left: -320px;
} .main_container {
margin-left: 320px;
} .sidebar {
float: right;
width: 300px;
}

这样一改,真正的“main”就变成了main_container,它的宽度跟以前的main一样,是100%-320。

大家可能注意到了代码中的两个margin-left,一个-320px一个320px,最后结合起来相当于什么都没干,着实蛋疼。但它确实解决了main与sidebar的顺序问题。

这个方法的缺点就是:太怪异,以及额外多了一层div。

标准浏览器的方法:

当然,以不折腾人为标准的w3c标准早就为我们提供了制作这种自适应宽度的标准方法。那就简单了:把container设为display:table并指定宽度100%,然后把main+sidebar设为display:table-cell;然后只给sidebar指定一个宽度,那么main的宽度就变成自适应了。

.container {
display: table;
width: 100%;
} .main {
display: table-cell;
} .sidebar {
display: table-cell;
width: 300px;
}

代码很少,而且不会有额外标签。不过这是IE7都无效的方法。

如果不考虑ie7及以下版本,则使用标准方法;如果不在意sidebar与main的顺序,则用第一种方法;否则用第3种方法。

以上代码都没在IE6测试,有问题不负责解释。个人觉得,让IE6寿终正寝的办法就是——从此不再理它。

参考文章:http://jo2.org/css-auto-adapt...

[转]css实现左侧宽度自适应,右侧固定宽度的更多相关文章

  1. 最简单的css实现页面宽度自适应

    <div class="rxs"> <div class="rxleft"> 第一段内容,可以是任何html标签 </div> ...

  2. 老生长谈:css实现右侧固定宽度,左侧宽度自适应

    反过来也可以:左侧宽度固定,右侧自适应.不管是左是右,反正就是一边宽度固定,一边宽度自适应. 这种布局比较常见,博客园很多默认主题就是这种.一般情况下,这种布局中宽度固定的区域是侧边栏,而自适应的区域 ...

  3. 老生长谈,温故知新:css实现右侧固定宽度,左侧宽度自适应

    反过来也可以:左侧宽度固定,右侧自适应.不管是左是右,反正就是一边宽度固定,一边宽度自适应. 这种布局比较常见,博客园很多默认主题就是这种.一般情况下,这种布局中宽度固定的区域是侧边栏,而自适应的区域 ...

  4. css实现右侧固定宽度,左侧宽度自适应

    https://blog.csdn.net/qq_22889599/article/details/78414040 反过来也可以:左侧宽度固定,右侧自适应.不管是左是右,反正就是一边宽度固定,一边宽 ...

  5. 如何用CSS实现左侧宽度固定,右侧自适应(两栏布局)?左右固定中间自适应(三栏布局)呢?

    在前端日常布局中,会经常遇到左侧宽度固定,右侧自适应或者左右两边固定,中间部分自适应的实用场景.本文例子中将列举出两种常用的两栏布局,左侧固定右侧自适应的常用方法以及代码和五种左右固定中间自适应的常用 ...

  6. CSS 实现左侧固定,右侧自适应两栏布局的方法

    "左边固定,右边自适应的两栏布局",其中有老生常谈的float方法,BFC方法,也有CSS3的flex布局与grid布局.并非所有的布局都会在开发中使用,但是其中也会涉及一些知识点 ...

  7. css回顾之左侧宽度自适应布局

    目标: <!DOCTYPE html> <meta charset=utf-8> <html> <head> <title>alibaba& ...

  8. CSS实现两列布局,一列固定宽度,一列宽度自适应方法

    不管是左是右,反正就是一边宽度固定,一边宽度自适应. 博客园的很多主题也是这样设计的,我的博客也是右侧固定宽度,左侧自适应屏幕的布局方式. html代码: <div id="wrap& ...

  9. CSS两列布局——左侧宽度固定,右侧宽度自适应的3种方法

    1.左侧绝对定位法 直接看代码: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

随机推荐

  1. 机器学习数据处理时label错位对未来数据做预测

    这篇文章继上篇机器学习经典模型简单使用及归一化(标准化)影响,通过将测试集label(行)错位,将部分数据作为对未来的预测,观察其效果. 实验方式 以不同方式划分数据集和测试集 使用不同的归一化(标准 ...

  2. 从源码看Spring Boot 2.0.1

    Spring Boot 命名配置很少,却可以做到和其他配置复杂的框架相同的功能工作,从源码来看是怎么做到的. 我这里使用的Spring Boot版本是 2.0.1.RELEASE Spring Boo ...

  3. 多线程学习笔记九之ThreadLocal

    目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...

  4. bzoj 3811: 玛里苟斯

    3811: 玛里苟斯 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 190  Solved: 95[Submit][Status][Discuss] ...

  5. [HDU4906]Our happy ending

    [HDU4906]Our happy ending 题目大意: 让你构造一个\(n(n\le20)\)个数的数列,其中每个数都为小于等于\(l(l\le10^9)\)的非负整数. 问你能构造出多少个这 ...

  6. SpringMVC拷贝属性

    A a = new A(); B b = new B(); //将A的属性拷贝到B上 BeanUtils.copyProperties(a,b)

  7. bootstrap中的行和列布局

    <!doctype html><html > <head> <meta charset="utf-8"> <link rel= ...

  8. CentOS+Nginx+PHP 前端部署

    都说Nginx比Apache性能优越,一直没有时间装测试,今天终于有时间装上试试性能了,其实Nginx的安装非常简单,具体流水步骤记录如下: 1.系统环境: ===================== ...

  9. 机器学习笔记(6):多类逻辑回归-使用gluon

    上一篇演示了纯手动添加隐藏层,这次使用gluon让代码更精减,代码来自:https://zh.gluon.ai/chapter_supervised-learning/mlp-gluon.html f ...

  10. [原创]推荐一些在线API生成工具

    [原创]推荐一些在线API生成工具 最近发现Api文档维护是个大体力活,版本控制文档统一化特别麻烦,寻思着这个怎么处理,经高人指点开源有一些工具不错,具体如下: 1.Swagger   http:// ...