实现div垂直居中的CSS代码

   我学到的第一个CSS知识就是如何把一个固定宽度和高度的元素水平或者垂直居中。这些居中的内容可能是入站欢迎页面(Splash Page http://searchsoa.techtarget.com/sDefinition/0,,sid26_gci213036,00.html)中图片,或者是一些设计喜欢的居中设计的网站等。最原始的解决办法就是把元素在窗口中距左和距上边缘进行50%的绝对定位。当然这只是把元素的右上角移动到了窗口的中央,接下来你还需要设置负的margin-left和margin-top并且使它们的值刚好是宽和高的一半来把元素拉加到屏幕的中央。

让我们看一下旧式做法的例子并注意一下其中的不足:

view plaincopy to clipboardprint?

  1. html,body{   
  2.     height:100%;   
  3.   margin:0;   
  4.  padding:0;   
  5. }   
  6. body{   
  7.   background:#eae7d7 url(images/vert-centre.jpg) repeat-x center center;   
  8.     text-align:center;   
  9.     min-width:626px;   
  10.   min-height:400px;   
  11. }   
  12. #vert-hoz{   
  13.   position:absolute;   
  14.     top:50%;   
  15.   left:50%;   
  16.  margin-top:-198px;/* half elements height*/  
  17.    margin-left:-313px;/* half elements width*/  
  18.    width:624px;   
  19.   height:394px;   
  20.  border:1px solid silver;   
  21.   background:#666;   
  22.   overflow:auto;/* allow content to scroll inside element */  
  23.     text-align:left;   
  24. }   
  25. h1 {color:#fff;margin:0;padding:0}  
html,body{
	height:100%;
	margin:0;
	padding:0;
}
body{
	background:#eae7d7 url(images/vert-centre.jpg) repeat-x center center;
	text-align:center;
	min-width:626px;
	min-height:400px;
}
#vert-hoz{
	position:absolute;
	top:50%;
	left:50%;
	margin-top:-198px;/* half elements height*/
	margin-left:-313px;/* half elements width*/
	width:624px;
	height:394px;
	border:1px solid silver;
	background:#666;
	overflow:auto;/* allow content to scroll inside element */
	text-align:left;
}
h1 {color:#fff;margin:0;padding:0}

view plaincopy to clipboardprint?

  1. <div id="vert-hoz">  
  2.  <h1>Content goes here</h1>  
  3. </div>  
<div id="vert-hoz">
	<h1>Content goes here</h1>
</div>

你可以在这里看到线上演示,效果如下图:

图1

    为了页面美观起见我给各元素添加了一些背景颜色,这里我们真正感兴趣的是灰色居中部分(此外,你应该注意到为了使背景图片居中你应该设置html、body的高度为100%)。
    如图1所示,这个结果正题我们想要的,元素在水平和垂直方向上都完美地实现了居中。文章中已经提到,对元素绝对定位使其top和left值都为50%,然后使用负的顶部填充和左侧填充并使填充的值为高和宽的一半。
   尽管看起来没有什么问题,但是使用这种方法存在几个严重的不足,水平或者垂直缩小窗口你就会发现这个问题了。当窗口缩小到比元素还要小时,元素就会开始从窗口的上部和左侧滑出。滑出的部分即使是使用窗口的滚动条也无法可见。这就意味着使用较小屏幕的用户根本看不见这些内容。
    图2显示了当窗口缩小时例子中单行文本发生的变化。

图2

    文本上部有一半丢失,左侧也有一部分不见了。如果我们进一步缩小窗口,整个文本会完全消失。为了达到我们最初的目的,试着给body增加min-height和min-width属性,但是你会发现这根本没有任何效果,元素依然会滑出窗口之外。

修正后的方法

面对这些问题,一个类似居中技术可以供我们采用,它依然采用了对于顶部的绝对定位,但是对于水平居中使用的是自由浮动。这会限制元素从窗口的左侧滑出。
下面是修正后的代码:

view plaincopy to clipboardprint?

  1. html,body{   
  2.     height:100%;   
  3.   margin:0;   
  4.  padding:0;   
  5. }   
  6. body{   
  7.   background:#eae7d7 url(images/vert-centre.jpg) repeat-x center center;   
  8.     text-align:center;   
  9.     min-width:626px;   
  10.   min-height:400px;   
  11. }   
  12. #vertical{   
  13.   position:absolute;   
  14.     top:50%;   
  15.   margin-top:-198px;/* half main elements height*/  
  16.   left:0;   
  17.    width:100%;   
  18. }   
  19. #hoz {   
  20.     width:624px;   
  21.   margin-left:auto;   
  22.  margin-right:auto;   
  23.     height:394px;   
  24.  border:1px solid silver;   
  25.   background:#666;   
  26.   overflow:auto;/* allow content to scroll inside element */  
  27.     text-align:left;   
  28. }   
  29. h1 {color:#fff;margin:0;padding:0}  
html,body{
	height:100%;
	margin:0;
	padding:0;
}
body{
	background:#eae7d7 url(images/vert-centre.jpg) repeat-x center center;
	text-align:center;
	min-width:626px;
	min-height:400px;
}
#vertical{
	position:absolute;
	top:50%;
	margin-top:-198px;/* half main elements height*/
	left:0;
	width:100%;
}
#hoz {
	width:624px;
	margin-left:auto;
	margin-right:auto;
	height:394px;
	border:1px solid silver;
	background:#666;
	overflow:auto;/* allow content to scroll inside element */
	text-align:left;
}
h1 {color:#fff;margin:0;padding:0}

view plaincopy to clipboardprint?

  1. <div id="vertical">  
  2.  <div id="hoz">  
  3.       <h1>Content goes here</h1>  
  4.     </div>  
  5. </div>  
<div id="vertical">
	<div id="hoz">
		<h1>Content goes here</h1>
	</div>
</div>

    可以在这里查看在线演示。
    水平方向上已经达到我们所要的效果,但是当窗口高度缩小时顶部依然会消失,如图3所示:

图3

修正:

    为了解决这个问题(也是本文写作的目的)我之前曾经使用过几个比较复杂的方法,但是现在使用的这种方法更简单、更健壮,那就是使用浮动(float)来代替绝对定位。
    页面中设置为顶端50%绝对定位的第一个元素进行浮动。然后把浮动向上拉动,大小为元素高度的一半。
    下面是必要的修改:

view plaincopy to clipboardprint?

  1. #vertical{   
  2.     float:left;   
  3.    height:50%;   
  4.    margin-top:-198px;/* half vertical height*/  
  5.    width:100%;   
  6. }  
#vertical{
	float:left;
	height:50%;
	margin-top:-198px;/* half vertical height*/
	width:100%;
}

view plaincopy to clipboardprint?

  1. <div id="vertical"></div>  
  2. <div id="hoz">  
  3.    <h1>Content goes here</h1>  
  4. </div>  
<div id="vertical"></div>
<div id="hoz">
	<h1>Content goes here</h1>
</div>

这里有一个在线演示你可以自己观察一下。

图4

     重要的是我们对浮动元素设置的宽度是100%,并且记住由于某些浏览器会出现问题我们需要对后面的元素设置clear:both。如果我们不使用“float”,元素依然会居中但是它会从顶端消失掉。

为什么这样可行呢?

    实际上这里涉及到浮动的一个有趣的行为,而且也比较好理解它的原理。为什么当我们使用一个静态元素(或者是第一个示例中绝对定位元素)时内容会从窗口的顶端消失,而当我们使用float时却不会产生这个问题呢?

    浮动的一个特点就是他们脱离了文本流(尽管你可以通过为后面的元素使用clear来重新控制它们)。浮动元素后面的内容会被移动以为浮动元素留空间(通常是通过浏览器对静态顶部填充来清除浮动)。如果浮动元素根本没有出现该位置,那么后面的内容会占居浮动元素原来在页面中的位置。因此对一个浮动元素使用负的顶部填充(margin),浮动元素会冲破任何包含它的块级元素限制,因为我们前面已经提到浮动元素一开始就脱离了文本流。但是如果我们把元素从包含它的块级元素向外拖动足够远以至于它完全超出父元素范围,那么它后面的任何元素将不会继续跟随其向上移动,但是重新设定包含块级元素的内部内容的大小,会使浮动元素继续浮动。

    这就是我们的例子中发生的事情,浮动元素被从body中向上移动,它后面的元素被迫留在body形成的块级元素中。这可能有点难以直接去理解,但是我们可以看一下下面的这个演示。

view plaincopy to clipboardprint?

  1. .float{   
  2.    width:200px;   
  3.   height:100px;   
  4.  background:red;   
  5.    float:left;   
  6. }   
  7. .top{   
  8.  background:green;   
  9.  height:300px;   
  10.  width:100%;   
  11. }   
  12. .follow-on{   
  13.    clear:both;   
  14.    background:blue;   
  15.   height:100px  
  16. }  
.float{
	width:200px;
	height:100px;
	background:red;
	float:left;
}
.top{
	background:green;
	height:300px;
	width:100%;
}
.follow-on{
	clear:both;
	background:blue;
	height:100px
}
<div class="top">Top</div>
<div class="float">Float</div>
<div class="follow-on">Following content</div>

    上面的代码在页面的顶端设置了一个静态元素,其后是一个浮动元素,再后是其它的静态内容,它就产生了如图5所示的效果,或者可看在线演示。

图5

     没有什么特别需要注意的,一切如同我们相像的一样。

    如果下面我们给浮动元素增加一个负的100px的顶端边距,我们就得到如图6所示的结果:

view plaincopy to clipboardprint?

  1. .float{   
  2.    width:200px;   
  3.   height:100px;   
  4.  background:red;   
  5.    float:left;   
  6.    margin-top:-100px  
  7. }  
.float{
	width:200px;
	height:100px;
	background:red;
	float:left;
	margin-top:-100px
}

图6

仍然和我们料想的一样,但是如果我们增加负的200px的顶端填充又会发生什么呢?

view plaincopy to clipboardprint?

  1. .float{   
  2.    width:200px;   
  3.   height:100px;   
  4.  background:red;   
  5.    float:left;   
  6.    margin-top:-200px  
  7. }  
.float{
	width:200px;
	height:100px;
	background:red;
	float:left;
	margin-top:-200px
}

图7显示了结果:

图7

    和你看到的一样,浮动元素从后面的内容中移走,但是浮动元素后面的内容仍然会停留在包含它的元素的顶端(如在绿色元素的下面)。在我们的前面的例子中,当我们向外移动浮动元素时,也是发生了同样的事情。

    但是如果我们从红色的div去掉float属性,那么红色的div和它后面下面的内容就会被移动到绿色元素的上面。

图8

    浮动元素负的边距产生变化,后面的内容也会相应地向上移动。

    我希望这个小的提示会让你感兴趣(即使你已经知道了),这也说明对于我们每一个人都有新的东西要去学习

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索float
, 浮动窗口
, background
, 浮动
, 元素
, px
, height
, Div向上浮动
顶部滑出
css实现div垂直居中、css div 垂直居中、css div文字垂直居中、css3 div垂直居中、cssdiv垂直居中,以便于您获取更多的相关知识。

时间: 2024-09-27 05:30:49

实现div垂直居中的CSS代码的相关文章

CSS解决未知高度的DIV垂直居中

css|解决 原文标题:Vertical Centering in CSS副标题:Yuhu's Definitive Solution with Unknown Height 尽管有CSS的vertical-align特性,但是并不能有效解决未知高度的垂直居中问题(在一个DIV标签里有未知高度的文本或图片的情况下). 标准浏览器如Mozilla, Opera, Safari等.,可将父级元素显示方式设定为TABLE(display: table;) ,内部子元素定为table-cell (dis

css 实现div半透明度实现代码

place holder height:1000px; 背景半透明覆盖整个可视区域 这个效果效果在工作中经常会遇到,这篇文章主要介绍了当内容超过一屏时如何做到多浏览器的兼容性. 下面我们通过一个简单的例子看看如何实现,高手请绕道. html代码很简单 < d i v class="mask opacity">< / d i v > 1 .半透明效果可以使用 css3 中的 opacity 属性,在低版本的IE浏览器中使用IE的alpha 滤镜.代码: .opac

绝对居中的层div+css代码示例

绝对居中的层div+css代码示例 以下是代码:<html> <head> <title>Nice and Free CSS Template 11</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <style type="text/css"><!--

请高手指点asp.net中如何加入div+css代码,实现菜单效果

问题描述 问题如下:下面的DIV+CSS代码是一个菜单,想用在asp.net中.大类和小类分别从数据库中循环读取出来,显示在指定位置的aspx页面中,相当于动态添加.便于后期维护.有什么好的方法实现吗?<divclass="wrapper"><divclass="nav-bg"><divclass="nav-list"><ulid="nav"class="nav"&

纯css+div经典导航菜单代码

提示:您可以先修改部分代码再运行 纯css+div经典导航菜单代码 Home Single Level Dropdown Dropline Flyout Support Contact 提示:您可以先修改部分代码再运行

css+div 横向二级菜单代码

提示:您可以先修改部分代码再运行 css+div 横向二级菜单代码 Home Single Level Dropdown Dropline Flyout Support Contact 提示:您可以先修改部分代码再运行

非常有用的50个CSS代码片段

原文:50 Useful CSS Snippets Every Designer Should Have          面对每年如此多的 新趋势 ,保持行业的领先是个很困难问题. 网站设计者和前端工程师都已经全面的使用 CSS3 properties, 决定这些的是 浏览器支持 和新的特性. 但是还是有些优秀的CSS2代码片段和CSS3一起运行中.       这篇文字里我会介绍 50 个便于使用的 CSS2/CSS3 代码片段 给所有的WEB专业人员. 选择IDE开发环境来存储这些是个不错

Bootstrap模态框(modal)垂直居中的实例代码_javascript技巧

Bootstrap官网下载:http://v3.bootcss.com/ 今天就在使用Bootstrap框架中遇到的一个问题分享一下,在产品开发的过程中使用了大量的弹出窗口(modal). 刚开始学习使用的过程中就发现此窗口不能垂直居中,总是偏上,并且不能拖动,看了一下使用说明也没有提供过多的属性设置和方法,就这样使用默认的方式一直用着.最近,客户却提出了一个要求:能不能让弹出窗口居中,因为一些小的窗口偏上总感觉整体页面失衡,大一点的还过得去. 因为之前对Bootstrap也不是很熟悉,便开始b

CSS如何水平垂直居中?CSS水平垂直居中的方法汇总

直接进入主题! 一.脱离文档流元素的居中 方法一:margin:auto法 CSS代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 div{       width:400px;       height:400px;       position:relative;       border:1pxsolid#465468;  }  img{       position:absolute;       margin:auto;       top:0;       l