CSS常见布局方式

以下总结一下CSS中常见的布局方式。本人才疏学浅,如有错误,请留言指出。

如需转载,请注明出处:CSS常见布局方式

目录:

  1. 使用BFC隐藏属性
  2. float + margin
  3. absolute + margin
  4. 圣杯布局
  5. 双飞翼布局
  6. flex布局

以上5种方式都可以实现两栏或三栏布局

如果对BFC(块级格式化上下文)概念不熟悉的朋友,可以先看看这篇文章。BFC深入理解

使用BFC隐藏属性

在对需要自适应的元素BFC化,可以实现两栏或三栏布局

两栏布局
<aside class="aside1"></aside>
<article class="main"></article> // 左边固定宽度,右边自适应
.aside1 {
float: left;
margin-right: 10px;
width: 100px;
height: 100vh;
background-color: lightsalmon;
}
.main {
overflow: hidden;
height: 100vh;
background-color: lightpink;
}

如果要让两栏之间有空隙,可以给浮动元素设置margin-right值,也可以给自适应的主内容设置margin-left值。但设置margin-left时,需要考虑到aside的宽度。实现三栏布局也是如此,给浮动元素设置margin值会方便一些。

三栏布局
// 这里要注意DOM的书写顺序问题。
<aside class="aside1"></aside>
<aside class="aside2"></aside>
<article class="main"></article> // 固定宽度
.aside1 {
float: left;
margin-right: 10px;
width: 100px;
height: 100vh;
background-color: lightsalmon;
}
// 固定宽度
.aside2 {
float: right;
margin-left: 10px;
width: 100px;
height: 100vh;
background-color: lightsalmon;
}
// BFC化自适应宽度
.main {
overflow: hidden;
height: 100vh;
background-color: lightpink;
}

使用BFC实现三栏布局时需要注意的是DOM的书写顺序问题。如果将aside2与article交换位置,那么aside2元素会被挤到article元素之下,无法实现三栏自适应布局。缺点:宽度小于aside宽度时,由于宽度不足的原因,三栏布局时会使元素出现掉下去的现象。

float + margin

在自适应宽度的元素上设置margin值,margin的值大于或等于固定宽度的值即可。实现思路与使用BFC隐藏属性差不多。缺点:宽度小于aside宽度时,由于宽度不足的原因,三栏布局时会使元素出现掉下去的现象。

两栏布局
<aside class="aside1"></aside>
<article class="main"></article> .aside1 {
float: left;
width: 100px;
height: 100vh;
background-color: lightsalmon;
}
.main {
margin-left: 110px;
height: 100vh;
background-color: lightpink;
} 三栏布局
// 注意,DOM顺序不可改变
<aside class="aside1"></aside>
<aside class="aside2"></aside>
<article class="main"></article> .aside1 {
float: left;
width: 100px;
height: 100vh;
background-color: lightsalmon;
} .main {
margin-left: 110px;
margin-right: 110px;
height: 100vh;
background-color: lightpink;
} .aside2 {
float: right;
width: 100px;
height: 100vh;
background-color: lightsalmon;
}

absolute + margin

// 使用position: absolute时,DOM元素顺序并不重要。给左右两栏定宽,主内容自适应宽度。缺点:侧边栏元素脱离文档流。优点:article元素可先加载。
<article class="main"></article>
<aside class="aside1"></aside>
<aside class="aside2"></aside> .aside1 {
position: absolute;
left: 0;
top: 0;
width: 100px;
height: 100vh;
background-color: lightsalmon;
}
.aside2 {
position: absolute;
right: 0;
top: 0;
width: 100px;
height: 100vh;
background-color: lightsalmon;
}
.main {
margin: 0 110px;
height: 100vh;
background-color: lightpink;
}

使用absolute + margin实现两栏布局时,只需要删除对应的栏目即可。

圣杯布局

圣杯布局,为什么叫圣杯布局...其实我觉得很奇怪,倒不如叫float + 负margin + relative更贴切一下。实现思路如下

  1. 两栏和自适应元素都设置同一方向的浮动(如float: left)
  2. 父元素设置左右padding为左右边栏的宽度。
  3. 自适应元素设置宽度为100%
  4. 左边栏margin-left为负100%,再设置relative,最后通过left属性偏移负的自身宽度。
  5. 右边栏margin-left为负自身宽度,再设置relative,最后通过right属性偏移负的自身宽度。
// 与其他布局不同,此布局需要父元素
<div class="parent">
<article class="main"></article>
<aside class="aside1"></aside>
<aside class="aside2"></aside>
</div> .parent {
padding: 0 100px;
// 左右边栏的宽度,可适当缩小以增加每栏之间的距离
}
.main {
float: left;
width: 100%;
height: 100vh;
background-color: lightpink;
}
.aside1 {
float: left;
position: relative;
left: -100px;
margin-left: -100%;
width: 100px;
height: 100vh;
background-color: lightseagreen;
}
.aside2 {
float: left;
margin-left: -100px;
position: relative;
right: -100px;
width: 100px;
height: 100vh;
background-color: lightsalmon;
}

当然了,缺点也是有的。就是在宽度小于两栏宽度时,元素会因为宽度不足而掉下去。

双飞翼布局

双飞翼布局与圣杯布局相似。只不过少了relative与left, right的步骤和共同父元素,主内容元素多了层父元素。实现思路如下:

  1. 两栏和自适应元素都设置同一方向的浮动(如float: left)
  2. main元素设置左右margin值,值为左右两栏的宽度。main父元素设置宽度为100%
  3. 左边栏margin-left为负100%
  4. 右边栏margin-left为负自身宽度
<div class="main-wrap">
<article class="main"></article>
</div>
<aside class="aside1"></aside>
<aside class="aside2"></aside> // 以下包含部分sass语法
.main {
margin: 0 100px;
height: 100vh;
background-color: lightpink;
&-wrap {
float: left;
width: 100%;
}
}
.aside1 {
float: left;
width: 100px;
margin-left: -100%;
height: 100vh;
background-color: lightseagreen;
}
.aside2 {
float: left;
width: 100px;
margin-left: -100px;
height: 100vh;
background-color: lightsalmon;
}

flex布局

flex布局新出现的概念较多,有兴趣的朋友可以到以下博客看更为详细的教程。使用flex来实现布局,我个人认为是最简单的方式。在移动端上,Android 4.4+以上、IOS 7.0+以上都支持flex布局。而在PC端上,使用flex布局时还是需要考虑一下的,因为到目前为止,IE11仍然只有部分属性支持。

Flex 布局教程:语法篇

css常见布局方式的更多相关文章

  1. css CSS常见布局解决方案

    CSS常见布局解决方案说起css布局,那么一定得聊聊盒模型,清除浮动,position,display什么的,但本篇本不是讲这些基础知识的,而是给出各种布局的解决方案.水平居中布局首先我们来看看水平居 ...

  2. CSS原生布局方式

    前言 网页原生布局的方法其实网上有很多,大概为Flow(流动布局模型).Float(浮动布局模型).Layer(层级布局模型).<!--more--> Flow布局 流动布局模型其实就是默 ...

  3. CSS常见布局问题整理

    实现div的水平居中和垂直居中 多元素水平居中 实现栅格化布局 1. 实现div的水平居中和垂直居中 实现效果: 这大概是最经典的一个题目了,所以放在第一个. 方法有好多, 一一列来 主要思路其实就是 ...

  4. 前端进阶系列(二):css常见布局解决方案

    水平居中布局 margin+定宽 <div class="parent"> <div class="child">Demo</di ...

  5. HTML5+CSS3常见布局方式

    1.等高布局 1.1 代码 等高布局是指子元素在父元素中高度相等的布局方式 <div class="father"> <div class="f1&qu ...

  6. CSS常用布局方式-两列布局、三列布局

    CSS基础 2.几种布局方式1)table布局 当年主流的布局方式,第一种是通过table tr td布局 示例: <style type="text/css"> ta ...

  7. <转载>div+css布局教程之div+css常见布局结构定义

    在使用div+css布局时,首先应该根据网页内容进行结构设计,仔细分析和规划你的页面结构,你可能得到类似这样的几块: 页面层容器.页面头部.标志和站点名称.站点导航(主菜单).主页面内容.子菜单.搜索 ...

  8. CSS常见布局解决方案

    最近要准备移动端项目,大半年没好好写过CSS了,今天恶补了一下CSS的一些布局,下面做一些分享. 水平居中布局 1.margin + 定宽 <div class="parent&quo ...

  9. CSS常见布局

    一.单列布局 1. 水平居中 1.1 使用inline-block和text-align .parent{text-align:center;} .child{display:inline-block ...

随机推荐

  1. JS实现60s倒计时(亲测有效),及span标签如何使用和禁用onclick事件

    效果如下图:点击按钮出现60秒倒计时,60s内按钮不可用,倒计时到了时间方可再次点击获取. 另外还有一个知识点,只有input 及button这样的表单元素有disbale属性,如何设置是否可用属性的 ...

  2. jquery_mobile事件

    1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 < ...

  3. 汇编指令-bic(位清除)、orr(位或)(3)

    1. bic  (Bit Clear)位清除指令bic指令的格式为:bic{条件}{S}  Rd,Rn,operand bic指令将Rn 的值与操作数operand2 的反码按位逻辑"与&q ...

  4. Day-11: IO编程

    由于CUP的运行速度远高于其他外设,IO操作有两种方式: 同步IO:CUP登着,程序暂停直到执行完后续代码 异步IO:CUP不等待,去做其他的事情,磁盘做完该做的事情后,告诉CUP,CUP再进行后续代 ...

  5. webarchive文件转换成htm文…

    原文地址:webarchive文件转换成htm文件作者:xhbaxf Mac OS X系统带有文件转换功能,可以把webarchive文件变成html文件.方法是:   Step 1: 建立一个文件夹 ...

  6. 团队作业9——测试与发布(Beta版本)

    Deadline: 2017-6-5 22:00PM,以博客发表日期为准 评分基准: 按时交 - 有分,检查的项目包括后文的两个方面 测试报告 发布说明 展示博客(单独一篇博客) 晚交 - 0分 迟交 ...

  7. 【1414软工助教】团队作业9——测试与发布(Beta版本) 得分榜

    题目 团队作业9--测试与发布(Beta版本) 往期成绩 个人作业1:四则运算控制台 结对项目1:GUI 个人作业2:案例分析 结对项目2:单元测试 团队作业1:团队展示 团队作业2:需求分析& ...

  8. 蓝桥杯PREV-11:横向打印二叉树

    嗯,没错我还报了蓝桥杯. 这是题目 问题描述 二叉树可以用于排序.其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树. 当遇到空子树时,则把该节点放 ...

  9. 201521123118《java程序与设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  10. 201521123059 《Java程序设计》第十二周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...