我无法弄清楚如何使用CSS实现以下布局(可能是因为我实际上并不知道CSS)。
我有一堆像这样的div:
<div class="right"> <p>1</p> </div>
<div class="left"> <p>2</p> </div>
<div class="left"> <p>3</p> </div>
<div class="left"> <p>4</p> </div>
<div class="right"> <p>5</p> </div>
<div class="right"> <p>6</p> </div>
(不是真实的内容)
现在我希望布局看起来像两个相等的div列,右边是“右边”,左边是“左边”,因此:
2 1
3 5
4 6
[编辑:在这个问题的先前版本中,我在div中有textareas,并且div都有不同的名称,如“one”和“xyz”。] 我试过像
这样的东西div.right { width:50%; float:right; clear:right; }
div.left { width:50%; float:left; clear:left;}
但它不太起作用:它产生类似的东西:
2 1
3
4 5
6
(没有“清楚”的,它轻快地产生
2 1
3 4
6 5
这不是想要的东西。)
很明显,如果div的排序方式不同,可以使它工作,但我不想这样做(因为如果浏览器有Javascript,我会动态生成这些div,我不想改变出于语义原因,在没有Javascript的情况下显示的实际顺序。是否仍然可以实现我想要的布局?
[对于它的价值,我愿意让它无法在IE或其他浏览器的旧版本上运行,所以如果有一个解决方案仅适用于符合标准的浏览器,那没关系: - )]
答案 0 :(得分:3)
以下适用于Firefox 3:
div {
width: 198px;
border: 1px solid black;
}
div.onediv, div.tendiv, div.xyzdiv { float: right; }
div.twodiv, div.abcdiv, div.pqrdiv { float: left; }
<div style="width: 400px;">
<div class="onediv"><p>One name</p> <textarea id="one"></textarea></div>
<div class="twodiv"><p>Two name</p> <textarea id="two"></textarea></div>
<div class="tendiv"><p>Ten name</p> <textarea id="ten"></textarea></div>
<div class="abcdiv"><p>Abc name</p> <textarea id="abc"></textarea></div>
<div class="xyzdiv"><p>Xyz name</p> <textarea id="xyz"></textarea></div>
<div class="pqrdiv"><p>Pqr name</p> <textarea id="pqr"></textarea></div>
</div>
快速说明一下:将div
放在你的班级名称(即abcdiv)中有点多余和奇怪。如果没有对正确的课堂使用情况进行大量的抨击,我会把它留下来。
如果您只是说“col1”和“col2”,您实际上可以简化代码。这样你甚至可以在以后交换列:
div {
width: 198px;
border: 1px solid black;
}
div.col1 { float: right; }
div.col2 { float: left; }
<div style="width: 400px;">
<div class="col1"><p>One name</p> <textarea id="one"></textarea></div>
<div class="col2"><p>Two name</p> <textarea id="two"></textarea></div>
<div class="col1"><p>Ten name</p> <textarea id="ten"></textarea></div>
<div class="col2"><p>Abc name</p> <textarea id="abc"></textarea></div>
<div class="col1"><p>Xyz name</p> <textarea id="xyz"></textarea></div>
<div class="col2"><p>Pqr name</p> <textarea id="pqr"></textarea></div>
</div>
答案 1 :(得分:2)
您尝试将输入流分成两个独立的流,我认为CSS不允许您这样做。使用左右浮动是一个聪明的想法,但它并不总是有效。 CSS spec在9.5.1规则5中说:
浮箱的外顶部可以 不高于外面的顶部 由...生成的任何块或浮动框 源中较早的元素 文档。
所以,你的花车可以向左,向右和向下跳,但不能向上跳。
你可以通过绝对定位来实现所有目标,但没有任何关于它的自动。
编辑:我在评论中说,我不希望CSS3支持这样的功能,因为它违反了内容和布局的分离。后来,我记得CSS3 plans to have footnotes。因此,如果用“float:note”标记一些div,则所选的div将流入页面的单独“脚注”区域。我想你可以将它们放在布局其余部分的右侧。答案 2 :(得分:2)
我将留下这个答案的其余部分,以便其他人可以看到我最初的想法,但这种方法实际上失败了,并且要求总是有更多浮动元素而不是浮动元素。
我认为这是你的解决方案(未经测试)。
.left { width: 51%; float: left; }
.right { width: 49%; }
51%阻止他们彼此浮动,然后让所有.right内容围绕那些浮动的块包围。
不经常思考会给你带来更多的HTML / css,再次 - 没有使用表格进行布局。
=== [编辑] ===
我对此进行了测试,它确实可以进行一些调整,如果你知道第一个项目是向左浮动(或者是向右反转行为)。
<style>
div div { text-align: center; padding: 20px 0; overflow: hidden; }
.left { width: 251px; float: left; background: red; }
.right { width: 249px; background: green; }
</style>
<div style="width: 500px;" >
<div class="left"> <p>1</p> </div>
<div class="right"> <p>2</p> </div>
<div class="left"> <p>3</p> </div>
<div class="left"> <p>4</p> </div>
<div class="right"> <p>5</p> </div>
<div class="right"> <p>6</p> </div>
</div>
答案 3 :(得分:2)
如果你有能力复制HTML:
.left-column .right, .right-column .left {
display: none;
}
稍等片刻,直到浏览器支持CSS3:
.right {
position: flow(side);
}
如果您的div具有相同的高度,请使用indirect adjacent sibling combinator。即使它属于CSS Level 3,它已经是well-supported:
.container {
position: relative;
}
.left, .right {
position: absolute;
top : 0;
width: 50%;
}
.left {
left: 0;
}
.right {
left: 50%;
}
.left ~ .left, .right ~ .right {
top : 100px;
}
.left ~ .left ~ .left, .right ~ .right ~ .right {
top : 200px;
}
.left ~ .left ~ .left ~ .left, .right ~ .right ~ .right ~ .right {
top : 300px;
}
... /* you need to include as many rules as the maximum possible height */
答案 4 :(得分:1)
当我遇到这种问题时,我通常会使用桌子。
<table>
<tr>
<td>
<p>One name</p> <textarea id="one"></textarea>
</td>
<td>
<p>XYZ name</p> <textarea id="xyz"></textarea>
</td>
</tr>
....
</table>
Alignement与所有浏览器完美配合。
答案 5 :(得分:1)
你这样说:
如果浏览器有Javascript,这些div是动态生成的,出于语义原因,我不想更改在没有Javascript的情况下显示的实际顺序......
如果用户使用Javascript,您只显示这些<div>
- 为什么不使用Javascript重新排列它们?如果您将#4移到#5之后,它看起来很好用你当前的CSS。
所以(使用jQuery):
$("div:eq(3)").remove().insertAfter("div:eq(4)");
答案 6 :(得分:0)
如果你摆脱了清除它可以正常工作。无论出于何种原因,看起来中间都有一些重叠(舍入错误?)。
答案 7 :(得分:0)
表格是这个恕我直言的完全可以接受的解决方案。
针对表格的强烈反对意味着将它们用于整个网站布局。但是如果你需要在行和列中显示数据......那就是为表格制作的表格:)
如果您仍然对可行的跨浏览器CSS解决方案感兴趣,我会考虑使用框架。它可以节省您花费数小时的时间来让您的页面看起来正确。
http://www.blueprintcss.org/是一个很好的框架恕我直言。
答案 8 :(得分:0)
也许你可以选择绝对定位?它当然取决于页面结构的其余部分,但通常这是非常可行的。
答案 9 :(得分:0)
我感到内疚,纯粹的css方法不起作用,但是如果你不介意使用JavaScript来获得你所追求的东西,那么这里有一些jQuery可行(其他人可能会清理)如果你不喜欢臃肿,这就是你。
<style>
#container { width: 500px; border: 1px grey solid; overflow: hidden; }
#container .rightSide { width: 250px; float: right; }
#container .left { width: 250px; background: red; padding: 20px 0; overflow: hidden; text-align: center; }
#container .right { width: 250px; background: green; padding: 20px 0; overflow: hidden; text-align: center; }
</style>
<script type="text/javascript">
$(document).ready(function() {
$('#container').prepend('<div class="rightSide"></div>');
$('#container div.right').each(function() {
var $rightContent = $(this).remove().html();
$('.rightSide').append('<div class="right">' + $rightContent + '</div>');
});
});
</script>
<div id="container" >
<div class="right"> <p>1</p> </div>
<div class="left"> <p>2</p> </div>
<div class="left"> <p>3</p> </div>
<div class="left"> <p>4</p> </div>
<div class="right"> <p>5</p> </div>
<div class="right"> <p>6</p> </div>
</div>
答案 10 :(得分:0)
查看960 Grid System。我过去在项目上使用过这个,我不得不说它的效果非常好。不仅如此,它易于使用且在浏览器中保持一致:D
使用此框架:
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" />
<link rel="stylesheet" type="text/css" media="all" href="css/text.css" />
<link rel="stylesheet" type="text/css" media="all" href="css/960.css" />
</head>
<body>
<div class="container_16">
<div class="grid_1 alpha" style="text-align:center;">
2
</div>
<div class="grid_1 omega" style="text-align:center;">
1
</div>
<div class="clear"></div>
<div class="grid_1 alpha" style="text-align:center;">
4
</div>
<div class="grid_1 omega" style="text-align:center;">
3
</div>
<div class="clear"></div>
<div class="grid_1 alpha" style="text-align:center;">
5
</div>
<div class="grid_1 omega" style="text-align:center;">
4
</div>
</div>
</body>
</html>
alt text http://img40.imageshack.us/img40/6889/cd3cc920a04b80e06b8efef.png
文本顶部的栏位于我的浏览器中,而不是CSS或布局的一部分。