在前端开发中经常会碰到各种类型布局的网页,这要求我们对css网页布局非常熟悉。其中水平垂直居中布局,多列布局等经常会被使用到,今天就来解决一下css布局方面的问题。

水平垂直居中的几种方法

说到水平垂直居中布局我们一般会立马想到以下几种情况:

实验参数设置

<div class="container">
123
<p class="inner">456</p>
<span class="inner">789</span>
<img class="inner" src="img/1.jpg">
</div>

未脱离文档流时

文本元素

/*方法一:*/
/*配合单行文字使用*/
.container{
height: 400px;
width: 400px;
border: 1px solid red;
text-align:center;
line-height:400px;
}
/*方法二:*/
.container{
height: 400px;
width: 400px;
border: 1px solid red;
text-align:center;
}
.container:after{
display:inline-block;
content:"";
height:100%;
vertical-align:middle;
}

行内元素

/*方法一:*/
.container{
height: 400px;
width: 400px;
border: 1px solid red;
text-align:center;
display:table-cell;
vertical-align:middle;
}
/*方法二:*/
.container{
height: 400px;
width: 400px;
border: 1px solid red;
text-align:center;
}
.container:after{
display:inline-block;
cotent:"";
height:100%;
vertical-align:middle;
}

块状元素

/*方法一:*/
.container{
height: 400px;
width: 400px;
border: 1px solid red;
text-align:center;
display:table-cell;
vertical-align:middle;
}
/*方法二:*/
/*配合多行文本使用*/
.container{
height: 400px;
width: 400px;
border: 1px solid red;
text-align:center;
display:table-cell;
vertical-align:middle;
}
.inner{
width:200px; /*需要给子元素一个宽度*/
margin: auto;
}

替换元素

常见的替换元素有:<img> <input> <textarea> <select> <button>

/*方法一:*/
.container{
height: 400px;
width: 400px;
border: 1px solid red;
text-align:center;
}
.container:after{
display:inline-block;
cotent:"";
height:100%;
vertical-align:middle;
}
.inner{
vertical-align:middle;
}
/*方法二:*/
.container{
height: 400px;
width: 400px;
border: 1px solid red;
text-align:center;
display:table-cell;
vertical-align:middle;
}
.inner{
vertical-align:middle;
}

水平垂直居中的终极方法:

.container{
height: 400px;
width: 400px;
border: 1px solid red;
display: flex;
align-items: center;
justify-content: center;
/*以下是个各种兼容代码*/
/* 老版本语法: 比较少用*/
display: -webkit-box;
display: -moz-box;
display: -webkit-flex;
display: -ms-flexbox;
-webkit-box-align: center;
-moz-box-align: center;
-ms-flex-align: center;
-webkit-align-items: center;
-webkit-box-pack: center;
-moz-box-pack: center;
-ms-flex-pack: center;
-webkit-justify-content: center;
}

优点:同样的代码解决各种问题

缺点:IE8及以下不兼容

脱离文档流时

行内元素、块状元素、替换元素

由于行内元素加上position:absolute;之后会生成一个块级框,与块状元素类似,其高宽可控

/*当知道子元素高宽时*/
.container{position:relative;}
.inner{
position: absolute;
width:100px;
height: 50px;
top:50%;
left:50%;
margin-left:-50px;
margin-top:-25px;
}
或者
.inner{
position:absolute;
top:0;
bottom:0;
left:0;
right:0;
width:200px;
height:设置为适当的高度;
margin: auto;
}
/*当子元素高宽未知时*/
.inner{
position: absolute;
top:50%;
left:50%;
-webkit-transform: translate(-50%,-50%);
-o-transform: translate(-50%,-50%);
-moz-transform: translate(-50%,-50%);
-ms-transform: translate(-50%,-50%);
transform: translate(-50%,-50%);
}

常见的几种页面布局

固定布局

负边距除去列表右边框
<style type="text/css">
#div1 { width: 580px; height: 380px; margin: 0 auto; border: 3px solid lightblue; overflow: hidden; margin-top: 10px; }
.box { width: 180px; height: 180px; margin: 0 20px 20px 0; background: lightgreen; float: left; }
#div2 { margin-right: -20px; /*通过在外面包裹的div上添加负边距,除去列表的右边框*/}
</style>
<div id="div1">
<div id="div2">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>
</div>
双飞翼布局
  1. 三列布局,中间宽度自适应,两边定宽;
  2. 中间栏要在浏览器中优先展示渲染;
  3. 允许任意列的高度最高;
  4. 要求只用一个额外的DIV标签;
  5. 要求用最简单的CSS、最少的HACK语句;
body,html { height: 100%; font: 20px/40px "microsoft yahei"; color: white; }
#container { width: 90%; margin: 0 auto; height: 100%; }
#header,#footer { height: 12.5%; background: deepskyblue; }
#main { height: 75%; }
#center,#left,#right { height: 100%; float: left; }
#center { width: 100%; background: lightgreen; }
#left { background: lightcoral; width: 20%; margin-left: -100%; }
/*左侧设置margin-left: -100%;使得left移上去*/
#right { background: lightblue; width: 20%; margin-left: -20%; }
/*右侧设置margin-left: -20%;使得right在右侧*/
#main-inner { margin: 0 20%; }
/*双飞翼布局和圣杯布局的区别在于是否有main-inner块,如果没有可直接通过设置
#center{padding: 0 20%;}
#left{position:relative;left:-leftwidth;}
#right{position:relative;right:-rightwidth;}
</style>
<div id="container">
<div id="header">
header
</div>
<div id="main">
<div id="center">
<div id="main-inner">
center
</div>
</div>
<div id="left">
left
</div>
<div id="right">
right
</div>
</div>
<div id="footer">
footer
</div>
</div>

流式布局

网页中主要的划分区域的尺寸使用百分数(搭配min-、max-属性使用)图片也作类似处理(width:100%, max-width一般设定为图片本身的尺寸,防止被拉伸而失真)。这种布局方式在Web前端开发的早期历史上,用来应对不同尺寸的PC屏幕,在当今的移动端开发也是常用布局方式。

缺点:宽度使用百分比定义,但是高度和文字大小等大都是用px来固定(现在用em,rem),所以在大屏幕的手机下显示效果会变成有些页面元素宽度被拉的很长,但是高度、文字大小还是和原来一样(即,这些东西无法变得“流式”),显示非常不协调。

弹性布局

由于前人总结的很好,我就不造轮子了

一劳永逸的搞定 flex 布局

由于flex是css3的属性,低版本浏览器不兼容

瀑布流布局

masonry实现瀑布流布局

具体使用方法可参考官网教程

响应式布局

@media screen and (max-width:320px){ /*视窗<=320px*/
/*css code */
}
@media screen and (min-width:769px)and(max-width:1000px){ /* 769px<=视窗<=1000px */
/*css code */
}

清除浮动的几种方法

空标签

<div style="clear:both;"></div>

优点:简单明了

缺点:增加无意义的空标签,违背了结构表现分离,给后期维护带来了问题。

利用BFC

BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。

BFC布局规则:

  • 内部的Box会在垂直方向,一个接一个地放置。
  • Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
  • 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
  • BFC的区域不会与float box重叠。
  • BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
  • 计算BFC的高度时,浮动元素也参与计算

以下元素会生成BFC:

根元素
float属性不为none
overflow不为visible
position为absolute或fixed
display为inline-block, table-cell, table-caption, flex, inline-flex中任何一个

after伪类样式

给父元素增加clearfix类即可,推荐使用

.clearfix:after{
content: ".";
display: block;
height: 0px;
clear: both;
visibility: hidden;
}

参考文章:

  1. CSS3与页面布局学习总结(四)——页面布局大全
  2. 一劳永逸的搞定 flex 布局

CSS页面布局常见问题总结的更多相关文章

  1. CSS 页面布局、后台管理示例

    CSS 页面布局.后台管理示例 页面布局 1.头部菜单 2.中间内容/中间左侧菜单 3.底部内容 <div class='pg-header'> <div style='width: ...

  2. css页面布局

    写在前面: 页面布局整体上可以分为两类:固定宽度(一般固定960px):流式布局:将流式布局转换为固定布局很容易,只需要外围再包括一个div,为其设置宽度即可. html默认的布局方式是将每个块状标签 ...

  3. css页面布局总结

    W3C标准:是万维网制定的一系列标准,包括结构化标准语言(html.xml),表现 标准语言(css),行为标准语言(DOM,ECMAScript<javascript>)组成.这个标准倡 ...

  4. CSS页面布局与网格(上)

    1.布局规划 1.1 网格 网格系统是设计师在切分布局时作为参照的一组行和列. 1.2 布局辅助类 类名用于为布局添加样式.为了让样式可以重用,让类名表达其意图. .column { /* 一般列的样 ...

  5. 第6天:DIV+CSS页面布局实战

    今天我从早上9:00写代码一直写到下午18:00,写的我差点抑郁了,还好最后终于写出了一个完整页面,没有做动画效果,就是练习了一下DIV+CSS布局,做的是福务达(www.zzfwd.cn)的主页,真 ...

  6. 一、CSS概述 二、CSS的选择器(认识) 三、CSS样式和属性(练习) 四、重构商城首页DIV+CSS(页面布局)(重点) 浮动/更改显示方式

    一.CSS概述###<1>概念 DIV,就是一个HTML元素,块级元素,通常结合CSS进行页面的布局. CSS,层叠样式表,给HTML元素增强显示. ###<2>作用 样式定义 ...

  7. 3种常见的CSS页面布局--双飞翼布局、粘连布局、左右两列布局

    一.左右两列布局 1.代码如下,可先粘贴复制,自行运行 <!DOCTYPE html><html> <head> <meta charset="UT ...

  8. dic+css页面布局分享

    HTML部分代码<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...

  9. 第五章 CSS页面布局基础

    1.标准文档流 在正常流中,在没有使用浮动或者定位的情况下,文本元素按照从上到下.从左到右的格式布局.这是浏览器的默认行为.在正常流中,块级元素从上到下依次排列,而行级元素从左到右依次排列.正常流中的 ...

随机推荐

  1. SUDO:/ETC/SUDOERS 可被任何人写 解决方案

    问题一: sudo: /etc/sudoers is world writablesudo: no valid sudoers sources found, quittingsudo: unable ...

  2. 关于如何使`(a === 1 && a === 2 && a === 3)`返回`true`问题的思考

    看见这个面试题目,第一反应就是在变量a取值时进行了一些改变,那就要用getter,关于存取器的介绍可以看这里 var temp = 1; Object.defineProperty(window, ' ...

  3. sublime text下安装插件autoprefixer

    有时候在写css样式的时候,分不清哪些属性需要前缀,哪些不需要,总是爱搞混淆了,于是autoprefixer这款插件便应运而生了.虽然在使用webpack的时候,我们可以很方便的使用这个,但是,如果项 ...

  4. 2-4 完整Todolist案例

    在2-3 的基础上继续,综合前面的Todolist编写一个完整的案例,实现基本的输入内容,添加内容,点击删除内容 稍微讲解54行代码 splice()的用法

  5. Spring 源码分析之 bean 实例化原理

    本次主要想写spring bean的实例化相关的内容.创建spring bean 实例是spring bean 生命周期的第一阶段.bean 的生命周期主要有如下几个步骤: 创建bean的实例 给实例 ...

  6. [EXP]CVE-2018-2628 Weblogic GetShell Exploit

    漏洞简介 漏洞威胁:RCE--远程代码执行 漏洞组件:weblogic 影响版本:10.3.6.0.12.1.3.0.12.2.1.2.12.2.1.3 代码: # -*- coding: utf-8 ...

  7. PHP扩展开发教程(总结)

    PHP是一种解释型的语言,对于用户而言,我们精心的控制内存意味着easier prototyping和更少的崩溃!当我们深入到内核之后,所有的安全防线都已经被越过,最终还是要依赖于真正有责任心的软件工 ...

  8. Volley Get网络请求

    public class VolleyActivity extends AppCompatActivity { WebView webView; Button button; RequestQueue ...

  9. C语言实现多态

    C语言实现多态 首先声明,大神就不要看了.小弟水平有限. C++多态是通过虚函数表实现的,类似于JAVA多态的实现方式.关于Java多态的实现方式可以看我之前写过的一篇不是很完善的文章.从JVM角度看 ...

  10. Windows系统环境下创建mysql主从数据库方法(双向主从复制)

    创建mysql主从数据库方法(双向主从复制) (一)Windows系统下的MySQL主从复制(单向复制) (1)环境说明: 1,Mysql版本:mysql5.7.20(主从机mysql版本必须一致) ...