现在的位置: 首页 > 综合 > 正文

[教程] [译]10步掌握CSS布局定位: position static relative absolute float

2012年06月04日 ⁄ 综合 ⁄ 共 9128字 ⁄ 字号 评论关闭
无意中看到此文,因作者强调其中避开了浏览器bug/分歧,所以个人认为值得借鉴。
不才仔细看了此文,自觉受益匪浅 ,屡试不爽,佩服作者对css布局的精炼总结,顺便小译了一段,
英文水平有限,且个人通常写写php,对css了解不深却有点兴趣,错误之处还请指正。
个人没有空间,代码中的css文件和js保留了完整路径:http://www.barelyfitz.com/screencast/html-training/css/positioning/
原文地址:http://www.barelyfitz.com/screencast/html-training/css/positioning/

如有转载,请注明原文出处,译过的就在这里了

 

代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>10步掌握CSS定位: position static relative absolute float</title>
<link rel="stylesheet" href="http://www.barelyfitz.com/screencast/html-training/css/positioning/tabber.css" type="text/css" media="screen" />
<link rel="stylesheet" href="http://www.barelyfitz.com/screencast/html-training/css/positioning/tabber-print.css" type="text/css" media="print" />
<style type="text/css" media="screen">
#example 
{
    float
:right;
}
#example div 
{
}
#div-before, #div-after 
{
    background-color
:#eee;
    color
:#000;
}
#div-1 
{
    width
:400px;
    background-color
:#000;
    color
:#fff;
}
#div-1-padding 
{
    padding
:10px;
}
#div-1a 
{
    background-color
:#888;
    color
:#fff;
}
#div-1b 
{
    background-color
:#666;
    color
:#fff;
}
#div-1c 
{
    background-color
:#aaa;
    color
:#fff;
}
#example div p 
{
    margin
:0 .25em;
    padding
:.25em 0;
}
#description 
{
    float
:left;
    width
:40%;
}
pre 
{
    padding
:1em;
    border
:1px dashed #aaa;
    background
:#fafafa;
}
{
    margin
:0.5em 0;
}
h3 
{
    color
:#999;
}
</style>
<link rel="alternate stylesheet" href="http://www.barelyfitz.com/screencast/html-training/css/positioning/1.css" type="text/css" title="1" media="screen" />
<link rel="alternate stylesheet" href="http://www.barelyfitz.com/screencast/html-training/css/positioning/2.css" type="text/css" title="2" media="screen" />
<link rel="alternate stylesheet" href="http://www.barelyfitz.com/screencast/html-training/css/positioning/3.css" type="text/css" title="3" media="screen" />
<link rel="alternate stylesheet" href="http://www.barelyfitz.com/screencast/html-training/css/positioning/4.css" type="text/css" title="4" media="screen" />
<link rel="alternate stylesheet" href="http://www.barelyfitz.com/screencast/html-training/css/positioning/5.css" type="text/css" title="5" media="screen" />
<link rel="alternate stylesheet" href="http://www.barelyfitz.com/screencast/html-training/css/positioning/6.css" type="text/css" title="6" media="screen" />
<link rel="alternate stylesheet" href="http://www.barelyfitz.com/screencast/html-training/css/positioning/7.css" type="text/css" title="7" media="screen" />
<link rel="alternate stylesheet" href="http://www.barelyfitz.com/screencast/html-training/css/positioning/8.css" type="text/css" title="8" media="screen" />
<link rel="alternate stylesheet" href="http://www.barelyfitz.com/screencast/html-training/css/positioning/9.css" type="text/css" title="9" media="screen" />
<link rel="alternate stylesheet" href="http://www.barelyfitz.com/screencast/html-training/css/positioning/10.css" type="text/css" title="10" media="screen" />
<script type="text/javascript">
function chooseStyle(title)
{
  setActiveStyleSheet(title);
}
var tabberOptions = {
  onTabClick:
  
function(tabIndex)
  {
    chooseStyle(tabIndex
+1);
  }
};
</script>
<script type="text/javascript" src="http://www.barelyfitz.com/screencast/html-training/css/positioning/styleswitcher.js"></script>
<script type="text/javascript" src="http://www.barelyfitz.com/screencast/html-training/css/positioning/tabber.js"></script>
<script type="text/javascript">
/* If the user has javascript, temporarily set the .tabber class to
   display:none 
*/
//document.write(unescape('%3Cstyle%20type%3D%22text/css%22%3E%0A.tabber%20%7B%20display%3Anone%3B%20%7D%0A%3C/style%3E%0A'));
</script>
</head>
<body >
<table id="layout_table" cellpadding="0" cellspacing="0" border="0" width="100%">
  
<tr valign="top">
    
<td id="block_left_kludge"></td>
    
<td id="block_middle" width="100%" rowspan="2">
      
<div id="content">
        
<h1>10步掌握CSS定位: position static relative absolute float</h1>
        
<div id="description">
          
<div class="tabber">
            
<div id="text-1" class="tabbertab" title="1">
              
<h2>1. position:static</h2>
              
<p>元素的 position 属性默认值为:<em>static</em>,即该元素出现在文档的常规位置,不会重新定位。</p>
              
<p>通常此属性值可以不设置,除非是要覆盖之前的定义。</p>
              
<pre>#div-1 {
 position:static;
}
</pre>
            
</div>
            
<div id="text-2" class="tabbertab" title="2">
              
<h2>2. position:relative</h2>
              
<p>设置了 <em>position:relative</em>,便可以结合<em>top</em> 、 <em>bottom</em>、 <em>left</em> 、 <em>right</em> 的属性来偏移其文档的常规位置。</p>
              
<p>例如将 div-1 向下移动 20 像素、向左移动 40 像素:</p>
              
<pre>#div-1 {
 position:relative;
 top:20px;
 left:-40px;
}
</pre>
              
<p>注意 div-1 未被移动之前的地方,现在多了一点空隙,紧接着 div-1 的元素(div-after)却没有被移动,事实上即便 div-1 被移动了,<strong>它仍占据原始位置</strong></p>
              
<p>貌似 <em>position:relative</em> 用处不大(我到觉得这点很有用),但在后面的内容中显得尤为重要。</p>
            
</div>
            
<div id="text-3" class="tabbertab" title="3">
              
<h2>3. position:absolute</h2>
              
<p>设置了 <em>position:absolute</em>,即绝对定位,便可以将元素放在文档中任何想放的位置。</p>
              
<p>例如将 div-1a 放置到右上角:</p>
              
<pre>#div-1a {
 position:absolute;
 top:0;
 right:0;
 width:200px;
}
</pre>
              
<p>注意!由于 div-1a 被移走, 页面中的其他元素位置也变了: div-1b, div-1c, div-after 都因此上移了。</p>
              
<p>div-1a 被放置在页面的右上角。 能直接地定位元素很方便,但作用也不大。</p>
              
<p>这里真正要做的是将 div-1a <em>相对于</em> div-1 定位,这就又要讲到 relative 属性了。</p>
              
<h3></h3>
              
<ul>
                
<li>IE浏览器Bug:设置了相对宽度(如 "width:50%"),该宽度将基于父元素而非自身。</li>
              
</ul>
            
</div>
            
<div id="text-4" class="tabbertab" title="4">
              
<h2>4. position:relative + position:absolute</h2>
              
<p>设置div-1的位置为 <em>relative</em> , div-1中元素的定位都将相对于div-1。现将div-1a的position设为:absolute,可以实现将其置于div-1的右上角:</p>
              
<pre>#div-1 {
 position:relative;
}
#div-1a {
 position:absolute;
 top:0;
 right:0;
 width:200px;
}
</pre>
            
</div>
            
<div id="text-5" class="tabbertab" title="5">
              
<h2>5. 两列绝对定位</h2>
              
<p>接下来使用relative 和absolute 实现两列的绝对定位:</p>
              
<pre>#div-1 {
 position:relative;
}
#div-1a {
 position:absolute;
 top:0;
 right:0;
 width:200px;
}
#div-1b {
 position:absolute;
 top:0;
 left:0;
 width:200px;
}
</pre>
              
<p>使用绝对定位(absolute positioning)的优点就是不需考虑元素在html中的位置,可以对元素任意放置,此处故意将div-1b放到div-1a之前;</p>
              
<p>注意,还有个元素被绝对定位的元素遮住了,怎么办?</p>
            
</div>
            
<div id="text-6" class="tabbertab" title="6">
              
<h2>6. two column absolute height</h2>
              
<p>一种办法是设置固定高度。</p>
              
<p>但不是万全之策,因为元素的高度、字体的大小并不总是确定的。</p>
              
<pre>#div-1 {
 position:relative;
 height:250px;
}
#div-1a {
 position:absolute;
 top:0;
 right:0;
 width:200px;
}
#div-1b {
 position:absolute;
 top:0;
 left:0;
 width:200px;
}
</pre>
            
</div>
            
<div id="text-7" class="tabbertab" title="7">
              
<h2>7. float(浮动)</h2>
              
<p>针对高度不定的情况,绝对定位不好用,于是想到另一方案。</p>
              
<p>可以尽量使用向左或向右浮动来实现文字环绕,特别是环绕图片,此处用于更复杂的布局工作(也只有用这种方法)。</p>
              
<pre>#div-1a {
 float:left;
 width:200px;
}
</pre>
            
</div>
            
<div id="text-8" class="tabbertab" title="8">
              
<h2>8. 多列浮动</h2>
              
<p>将两列都像左浮动,可以实现两列并列。</p>
              
<pre>#div-1a {
 float:left;
 width:150px;
}
#div-1b {
 float:left;
 width:150px;
}
</pre>
            
</div>
            
<div id="text-9" class="tabbertab" title="9">
              
<h2>9. 多列浮动后清除浮动</h2>
              
<p>将元素浮动后,再使用"clear" 清除浮动,后面内容拉向下。</p>
              
<pre>#div-1a {
 float:left;
 width:190px;
}
#div-1b {
 float:left;
 width:190px;
}
#div-1c {
 clear:both;
}
</pre>
            
</div>
            
<div id="text-10" class="tabbertab" title="10">
              
<h2>10. Disclaimer & Resources</h2>
              
<p>These examples are extremely simplified and do not trigger some of the CSS bugs in the Windows IE browser (of which there are <em>many</em>).</p>
              
<p>The following page was invaluable:<br />
                
<href="http://www.autisticcuckoo.net/archive.php?id=2004/12/07/relatively-absolute">Relatively Absolute</a></p>
              
<p>While you're here check out the following:</p>
              
<ul>
                
<li><href="http://www.barelyfitz.com/projects/">BarelyFitz Designs Open-Source Software Projects</a></li>
                
<li><href="http://www.barelyfitz.com/screencast/">BarelyFitz Designs Screencasts</a></li>
              
</ul>
            
</div>
          
</div>
          
<!-- /class=tabber -->
        
        
</div>
        
<!-- /id="description -->
        
<div id="example">
          
<div id="div-before">
            
<p>id = div-before</p>
          
</div>
          
<div id="div-1">
            
<div id="div-1-padding">
              
<p>id = div-1</p>
              
<div id="div-1a">
                
<p>id = div-1a</p>
                
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.</p>
              
</div>

抱歉!评论已关闭.