亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > CSS > 正文

CSS垂直居中完美解決方法

2024-07-11 09:05:32
字體:
來源:轉載
供稿:網友
之前看到很多人一直都問這個問題,不過當時我沒當一回事,因為在 CSS 中要垂直居中,多數是在有高度的情況下,或者容器高度不定的情況下才用,看上去比較舒服,而且實現的方法也不少,不一定要拘泥于和 table 布局一樣。不過最近有人問了幾個例子,看來對此的需求還不少。現在就把我經驗拿出來分享一下,希望大家鼓鼓掌。
首先,要有一個概念:凡是 table 布局可以實現的,CSS 一定可以實現。CSS 可以實現的,table 未必能做到。
現在來幾個例子:
一、單行內容的居中
只考慮單行是最簡單的,無論是否給容器固定高度,只要給容器設置 line-height 和 height,并使兩值相等,再加上 over-flow: hidden 就可以了
.middle-demo-1{
height: 4em;
line-height: 4em;
overflow: hidden;
}
優點:
1. 同時支持塊級和內聯極元素
2. 支持所有瀏覽器
缺點:
1. 只能顯示一行
2. IE中不支持<img>等的居中
要注意的是:
1. 使用相對高度定義你的 height 和 line-height
2. 不想毀了你的布局的話,overflow: hidden 一定要
為什么?
請比較以下兩個例子:
<p style="background: #900; color: #00f; font: bold 12px/24px Helvertica,Arial,sans-serif; height:24px; width:370px;">Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>
<br/>
<br/>
<p style="background: #090; color: #00f; font: bold 12px/2em Helvertica,Arial,sans-serif; height:2em; width:370px; overflow: hidden;">Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>
上一個高度是用的絕對單位px,并且沒有隱藏溢出,下一個高度用的單位是相對單位em,并且隱藏了溢出。如果你的瀏覽器支持放大字體,那么盡情地放大字體,看看會出現什么效果。
二、多行內容居中,且容器高度可變
也很簡單,給出一致的 padding-bottom 和 padding-top 就行
.middle-demo-2{
padding-top: 24px;
padding-bottom: 24px;
}
優點:
1. 同時支持塊級和內聯極元素
2. 支持非文本內容
3. 支持所有瀏覽器
缺點:
容器不能固定高度
三、把容器當作表格單元
CSS 提供一系列diplay屬性值,包括 display: table, display: table-row, display: table-cell 等,能把元素當作表格單元來顯示。這是再加上 vertical-align: middle, 就和表格中的 valign="center" 一樣了。
.middle-demo-3{
display: table-cell;
height: 300px;
vertical-align: middle;
}
可惜IE不支持這些屬性,不過在其他瀏覽器上顯示效果非常完美。
要注意的是:和一個合法的<td>元素必須在<table>里一樣,display: table-cell 元素必須作為 display: table 的元素的子孫出現。
優點:
不用說了吧,就是表格,效果和表格一模一樣
缺點:
IE下無效
四、以毒攻毒!用 IE 的 bug 解決 IE 中的絕對居中
先不得不說一句,IE 真的是個很爛的瀏覽器,CSS1中的定義都不支持,害得要我們轉個大圈子來造居中。不過就像我說的,凡是 table 布局可以實現的,CSS 一定可以實現,即使在 IE 里也不例外。我研究 IE layout 模式多年,還是找出了一個可以在 IE 中絕對居中的方法。這個方法就是基于 IE layout 的 bug,也可以算以毒攻毒。至于原理,不要問我,這是獨門秘學,何況三言兩語也講不清楚,只要好用就行
.middle-demo-4{
height: 300px;
position: relative;
}
.middle-demo-4 div{
position: absolute;
top: 50%;
left: 0;
}
.middle-demo-4 div div{
position: relative;
top: -50%;
left: 0;
}
五、整合三和四,寫出支持所有瀏覽器的垂直居中容器!
思路是利用 IE 和 非IE 瀏覽器的 CSS hack, 整合三和四的CSS,寫出兼容主流瀏覽器的垂直居中容器。具體代碼就不給出了,大家權當作練習練習。例子可以在下面的附錄中找到。
最終實測支持的瀏覽器:IE6+, Mozilla 1.7, Netscape Navigator 8, Opera 8.0+, Firefox 1.0+ 和 Safari 1.0+IE5 下需要加上對合適模型的補正。
推測支持的瀏覽器:Mozilla 1.5+, Netscape Navigator 7+, Opera 7+
未測試瀏覽器:Konqueror
最后附上自己寫的,所有居中布局的范例網頁,大家不明白可以參考。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Demo:: vertical align: middle</title>
<meta lang="en" name="author" content="Spenser Lee" />
<meta lang="en" name="copyright" content="(c)2006 Liberty Studio" />
<style media="screen" type="text/css">
html,body,div,h1,h2,pre,dd,ol{margin: 0;padding: 0;border: 0}
html{min-width: 779px}
body{background: #fff;color: #596480;text-align: center}
div#main-wrapper{padding: 12px 5px;width: 769px;margin: 0 auto}
div,code,p,h1,h2,address,dt,dd,li{font: normal 12px/1.5em Tahoma,"Lucida Grande",Helvetica,Verdana,Lucida,Arial,"Arial Unicode",sans-serif,serif}
h1{font-size: 22px;font-weight: bold;border-left: 12px solid #324f96;background: #e0eaf4;color: #4868a9;height: 4em;line-height: 4em;padding: 0 12px;overflow: hidden; text-align: left}
h2{font-size: 12px;font-weight: bold;background: #c0014e;color: #fff;height: 2.5em;line-height: 2.5em;padding: 0 24px;overflow: hidden;margin: 12px 0;text-align: left}
h2 a{color: #fff;background: transparent}
h2 a:hover{text-decoration: none}
p{margin: 6px 0;padding: 0 12px 0 24px;text-indent: 2em;text-align: left}
p.snap-back{text-align: right}
code{display: block;font-family: "Courier New", Courier, monospace, mono, serif;margin: 12px auto;padding: 12px;border: 1px solid #596480;color: inherit;background: #f6f6f6;text-align: left;white-space: pre;width: 350px}
strong{font-weight: bold}
em{font-style: italic}
address{display: block;padding: 0 12px;margin: 12px 0;text-align: right}
dl{margin: 6px 0;padding: 0 12px 0 24px;text-align: left}
dt{margin: 0;text-indent: 2em;font-weight: bold}
dd{margin-left: 24px;text-indent: 2em}
li{list-style: square inside none;text-align: left}
ol#table-of-content{padding-left: 24px}
a{color: #c0014e;background: transparent;text-decoration: none}
a:hover{text-decoration: underline}
div.demo{width: 400px;margin: 12px auto;border: 1px solid #596480;color: inherit;background: #ffc}
div.demo p{text-align: left;margin: 24px;text-indent: 0}
p#demo-1{margin: 12px auto;padding: 0 12px;width: 400px;text-indent: 0;border: 1px solid #596480;color: inherit;background: #ffc;line-height: 4em;height: 4em;overflow: hidden}
div#demo-2{padding: 50px 0}
div#demo-4, div#demo-5{height: 300px;position: relative}
div#demo-4 div, div#demo-5 div{position: absolute;top: 50%;left: 0}
div#demo-4 p, div#demo-5 p{position: relative;top: -50%}
div#demo-3{display: table;height: 300px;border-collapse: collapse}
div#main-wrapper>div#demo-5{position: static;display:table}
div#main-wrapper>div#demo-5>div{display:table-cell;vertical-align:middle;position:static}
div#demo-3>div{display: table-row}
div#demo-3>div>div{display: table-cell;vertical-align: middle}
span.property{font-family: "Courier New", Courier, monospace, mono, serif;border-bottom: 1px dotted #596480;background: #ffc;color: #c0014e}
p.copyright{line-height: 3em;text-align: center;border-top: 1px dotted #596480}
</style>
</head>
<body>
<div id="main-wrapper">
<h1>Demo of middled vertical align</h1>
<address>
Author: Spenser Lee, Liberty Studio<br />
Originally posted on <a href="http://www.blueidea.com/bbs/" title="BlueIdea Forum">BlueIdea Forum</a>
</address>
<h2><a id="bullet-0">Table of centents:</a></h2>
<ol id="table-of-content">
<li><a href="#bullet-1" title="Single line countainer with/without a fixed height">Single line countainer with/without a fixed height</a></li>
<li><a href="#bullet-2" title="Align multi-line container which does not have a fixed height">Align multi-line container which does not have a fixed height</a></li>
<li><a href="#bullet-3" title="Simulating table layout in container with a fixed height">Simulating table layout in container with a fixed height</a></li>
<li><a href="#bullet-4" title="IE's solution">IE's solution</a></li>
<li><a href="#bullet-5" title="A perfect compounded sample">A perfect compounded sample</a></li>
</ol>
<h2><a id="bullet-1">Case One: Single line countainer with/without a fixed height</a></h2>
<p>If you only want to display a container which only holds a single line of text, you can set <span class="property">line-height</span> property to <span class="property">height</span> property, then set <span class="property">overflow</span> to hidden.</p>
<p><strong>Sample:</strong></p>
<p id="demo-1">Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>
<p><strong>Core code:</strong></p>
<pre><code>.middle-demo-1{
height: 4em;
line-height: 4em;
overflow: hidden;
}</code></pre>
<dl>
<dt>Notes:</dt>
<dd>
  <ol>
   <li>I strongly recommend you use relative size in <span class="property">height</span> and <span class="property">line-height</span> property. <em>Why?</em> You can simply set the font size larger if your browser support it. When it gets large enough, you will see the countainer is stretched and the <span class="property">height</span> is no longer equal to <span class="property">line-height</span> property, thus, the layout is messed up. Using relative size as <span class="property">em, ex</span> or <span class="property">%</span> will let your countainer stretch with the content.</li>
   <li><span class="property">overflow: hidden</span> is a must. <em>Why?</em> Same as above. Just ensure <span class="property">height</span> and <span class="property">line-height</span> are always equal.</li>
  </ol>
</dd>
</dl>
<dl>
<dt>Pros:</dt>
<dd>
  <ol>
   <li>Fits in both <span class="property">block</span> elements and <span class="property">inline</span> elements.</li>
   <li>Capable of all 5th-gen browsers.</li>
  </ol>
</dd>
</dl>
<dl>
<dt>Cons:</dt>
<dd>
  <ol>
   <li>Text length is limited. Max with only <em>one</em> line.</li>
   <li>Does not work well on none text contents such as images and objects.</li>
  </ol>
</dd>
</dl>
<p class="snap-back"><a href="#bullet-0" title="Back top table of centents">Back</a></p>
<h2><a id="bullet-2">Case Two: Align multi-line container which does not have a fixed height</a></h2>
<p>In this case, we should simply set a pair of fixed equivalences to padding-top and padding-bottom attribute. It works on both IE and non-IE browsers.</p>
<p><strong>Sample:</strong></p>
<div class="demo" id="demo-2">
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas dignissim diam eu sem. Proin nunc ante, accumsan sollicitudin, sodales at, semper sed, ipsum. Etiam orci. Vestibulum magna lectus, venenatis nec, tempus ac, dictum vel, lorem.</p>
</div>
<p><strong>Core code:</strong></p>
<pre><code>.middle-demo-2{
padding-top: 24px;
padding-bottom: 24px;
}</code></pre>
<dl>
<dt>Pros:</dt>
<dd>
  <ol>
   <li>Fits in both <span class="property">block</span> elements and <span class="property">inline</span> elements.</li>
   <li>Works on none text contents as fine as text contents.</li>
   <li>Capable of all 5th-gen browsers. Might need a little tune-up for the box model bug of IE5 though.</li>
  </ol>
</dd>
</dl>
<dl>
<dt>Cons:</dt>
<dd>
  <ol>
   <li>You can <em>not</em> assign height in this solution.</li>
  </ol>
</dd>
</dl>
<p class="snap-back"><a href="#bullet-0" title="Back top table of centents">Back</a></p>
<h2><a id="bullet-3">Case Three: Simulating table layout in container with a fixed height</a></h2>
<p>CSS offers a set of very convenient display atrribute values called <span class="property">display: table</span>, <span class="property">display: table-row</span>, <span class="property">display: table-cell</span> and other display values begin with <span class="property">table-</span>. It offers a way to simulate table layout in all elements. As a result, any element with <span class="property">display: table-cell</span>, <span class="property">vertical-align: middle</span> and a fixed height will display exactly like a table cell.</p>
<p><strong>Sample:</strong> (You may not be able to view the effect on IE)</p>
<div class="demo" id="demo-3">
<div><div><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas dignissim diam eu sem. Proin nunc ante, accumsan sollicitudin, sodales at, semper sed, ipsum. Etiam orci. Vestibulum magna lectus, venenatis nec, tempus ac, dictum vel, lorem.</p></div></div>
</div>
<p><strong>Core code:</strong></p>
<pre><code>.middle-demo-3{
display: table-cell;
height: 300px;
vertical-align: middle;
}</code></pre>
<dl>
<dt>Notes:</dt>
<dd>
  <ol>
   <li><span class="property">display: table-cell</span> must work with other elements with <span class="property">display: table</span> value sets in order to form a literal table. Or it might cause unexceptable bugs.</li>
   <li>Sadly IE series (including the latest IE 7 beta) does not support any of <span class="property">display: table</span> values, so it won't work in IE.</li>
  </ol>
</dd>
</dl>
<dl>
<dt>Pros:</dt>
<dd>
  <ol>
   <li>It has the most perfect render for <span class="property">vertical-align: middle</span> align.</li>
  </ol>
</dd>
</dl>
<dl>
<dt>Cons:</dt>
<dd>
  <ol>
   <li>It only works in latest versions of non-IE browsers, such as Mozilla, Firefox, Netscape 8, Opera 8, and Safari.</li>
  </ol>
</dd>
</dl>
<p class="snap-back"><a href="#bullet-0" title="Back top table of centents">Back</a></p>
<h2><a id="bullet-4">Case Four: IE's solution</a></h2>
<p>Since IE is a lame browser when it comes to ANYTHING, so you can't use the solution above simply because IE does not recognize it at all. However, <strong>there has been nothing yet you can not code with CSS if you have already coded it with table</strong>. It even offers you possibility to layout your page that tables can not do!</p>
<p>So what's the solution for IE? Like what we always do: Hit IE's back with the BUGS it offers!</p>
<p><strong>Sample:</strong> (You are able to view the correct result only on IE)</p>
<div class="demo" id="demo-4">
<div><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas dignissim diam eu sem. Proin nunc ante, accumsan sollicitudin, sodales at, semper sed, ipsum. Etiam orci. Vestibulum magna lectus, venenatis nec, tempus ac, dictum vel, lorem.</p></div>
</div>
<pre><code>.middle-demo-4{
height: 300px;
position: relative;
}
.middle-demo-4 div{
position: absolute;
top: 50%;
left: 0;
}
.middle-demo-4 div div{
position: relative;
top: -50%;
left: 0;
}</code></pre>
<p>See? Don't ask me why it worked. This hack is based on years of study in IE's own stupid layout model and it works very well, even in IE5 given the box width hack. I won't tell you the theory behind all these. It's my top secret, with which I solved a lot of other cross browser layout problems, and I'm not going to share it with you. But you are free to use this IE hack It's kinda handful in most occassions.</p>
<dl>
<dt>Pros:</dt>
<dd>
  <ol>
   <li>The only perfect vertical align method in IE. It works even better then add automatic <span class="property">padding</span>s.</li>
  </ol>
</dd>
</dl>
<dl>
<dt>Cons:</dt>
<dd>
  <ol>
   <li>After all it's a CSS hack. We can avoid it if not for IE.</li>
  </ol>
</dd>
</dl>
<p class="snap-back"><a href="#bullet-0" title="Back top table of centents">Back</a></p>
<h2><a id="bullet-5">Case Five: A perfect compounded sample</a></h2>
<p>Here's the perfect compounded solution on vertical centering that works on almost all latest browsers.</p>
<p><strong>Sample:</strong> (This works on almost all browsers)</p>
<div class="demo" id="demo-5">
<div><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas dignissim diam eu sem. Proin nunc ante, accumsan sollicitudin, sodales at, semper sed, ipsum. Etiam orci. Vestibulum magna lectus, venenatis nec, tempus ac, dictum vel, lorem.</p></div>
</div>
<p>I'm not going to give you the full code of this one. But it's not difficult to write it yourself, with the solution of case 3 and 4, and a little knowledge in IE/non-IE CSS hackers. And actually the hacking style is not limited, so I don't want to force you to use my hacking style neither. Stop being lazy, and write the code yourself!</p>
<dl>
<dt>Browser capability:</dt>
<dd>
  <ol>
   <li>Works on: IE6+, Mozilla 1.5+, Netscape Navigator 7+, Opera 7+, Firefox 1.0+ and Safari 1.0+</li>
   <li>On IE5, you might need to apply the box model hacker to make the height correct.</li>
   <li>Untested: WebOmini, Konqueror.</li>
   <li>Fails on: Other browsers not reffered in the list above.</li>
  </ol>
</dd>
</dl>
<p class="snap-back"><a href="#bullet-0" title="Back top table of centents">Back</a></p>
<p class="copyright">Copyright &copy; Spenser Lee, 2006 Liberty Studio</p>
</div>
</body>
</html>
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国内精品400部情侣激情| 欧美精品在线观看| 日韩精品中文字幕在线观看| 在线亚洲国产精品网| 国产精品第三页| 亚洲精品欧美日韩| 色综合久久久久久中文网| 亚洲精品成人久久电影| 欧美日韩视频在线| 久久久综合免费视频| 亚洲人成在线电影| 久久精品夜夜夜夜夜久久| 国产精品旅馆在线| 国产va免费精品高清在线观看| 亚洲iv一区二区三区| 最近2019好看的中文字幕免费| 国产精品一区二区久久久| 国产精品一区二区电影| 亚洲国产精品国自产拍av秋霞| 国产精品极品在线| 亚洲精品日韩欧美| 国产成人精品免费久久久久| 美女福利视频一区| 黄色一区二区三区| 亚洲人成网站在线播| 97色在线视频| 日韩专区在线观看| 亚洲福利影片在线| 亚洲视频日韩精品| 亚洲一区精品电影| 国语自产精品视频在免费| 91精品国产综合久久香蕉| 国产精品视频久久| 久久久成人精品| 日韩国产一区三区| 久久久综合免费视频| 亚洲欧美福利视频| 亚洲欧美三级在线| 国产精品久久久久久久app| 久久精品青青大伊人av| 在线亚洲国产精品网| 精品美女永久免费视频| 91啪国产在线| 美日韩精品免费观看视频| 亚洲天堂免费在线| 欧美激情2020午夜免费观看| 亚洲成av人乱码色午夜| 久久久国产精品一区| 中文字幕无线精品亚洲乱码一区| 97免费视频在线播放| 欧美日韩国产精品一区| 亚洲精品国产成人| 欧美精品在线免费播放| 亚洲午夜未满十八勿入免费观看全集| 欧美裸身视频免费观看| 深夜成人在线观看| 国产69精品久久久久9| 日本欧美中文字幕| 日韩欧美在线第一页| 国产一区二区日韩精品欧美精品| 欧美精品电影免费在线观看| 91精品久久久久久久久青青| 久久97精品久久久久久久不卡| 国产亚洲精品一区二555| 中文字幕九色91在线| 亚洲第一网站男人都懂| 97热在线精品视频在线观看| 亚洲aaa激情| 国产网站欧美日韩免费精品在线观看| 久久久噜噜噜久久中文字免| 成人av电影天堂| 日韩成人xxxx| 中文字幕亚洲图片| 国产成人综合亚洲| 亚洲欧美日韩第一区| 九九精品视频在线观看| 午夜精品久久久久久久99热浪潮| 成人黄色中文字幕| 成人xxxxx| 91精品国产乱码久久久久久蜜臀| 欧美国产日韩在线| 国语自产偷拍精品视频偷| 久久久久久12| 美女福利视频一区| 久久久精品一区二区| 国产精品久久77777| 欧美午夜性色大片在线观看| 成人免费观看49www在线观看| 91av成人在线| 国产精品成人久久久久| 26uuu另类亚洲欧美日本一| 国产精品嫩草影院久久久| 欧美日韩福利电影| 欧美视频在线观看免费网址| 中文字幕亚洲欧美在线| 国产成人一区二区三区电影| 亚洲一区二区三区xxx视频| 福利一区视频在线观看| 亚洲第一福利在线观看| 91爱爱小视频k| 久久精品一本久久99精品| 午夜精品久久久99热福利| 欧美在线视频免费播放| 日日狠狠久久偷偷四色综合免费| 少妇激情综合网| 亚洲精品一区av在线播放| 精品国产户外野外| 午夜精品蜜臀一区二区三区免费| 国产成人精品久久亚洲高清不卡| 日韩一区二区三区xxxx| 九九热r在线视频精品| 国产精品香蕉在线观看| 中文字幕综合一区| 亚洲色图综合网| 久久人人爽人人| 国产欧美一区二区三区久久| 欧美一级大片在线观看| 亚洲a在线观看| 久久精品91久久香蕉加勒比| 中文精品99久久国产香蕉| 成人写真福利网| 久久精品国产亚洲一区二区| 欧美亚洲一区在线| 韩剧1988免费观看全集| 国产成人av网| 国产精品亚洲美女av网站| 国产精品网红福利| 国产精品jizz在线观看麻豆| 色小说视频一区| 欧美极品在线视频| 亚洲一区二区三区sesese| 国语自产在线不卡| 国产精品久久国产精品99gif| 国产精品视频精品| 欧美久久精品一级黑人c片| 国产精品永久在线| 97热在线精品视频在线观看| 日韩在线观看网址| 亚洲国产欧美日韩精品| 亚洲国产一区二区三区四区| 色播久久人人爽人人爽人人片视av| 日本一区二区在线免费播放| 98精品在线视频| 国产综合在线视频| 国产成人欧美在线观看| 懂色av中文一区二区三区天美| 成人日韩av在线| 久久精品国产精品| 亚洲激情视频在线观看| 亚洲va欧美va国产综合剧情| 欧美在线视频一二三| 伊人久久男人天堂| 亚洲视频一区二区| 福利微拍一区二区| 91视频国产一区| 亚洲精品999| 欧美成人精品一区二区| 亚洲成人精品av| 亚洲综合在线做性| 国产+成+人+亚洲欧洲| 亚洲欧美日本精品| 亚洲色图美腿丝袜| 97精品国产97久久久久久春色| 久久97精品久久久久久久不卡|