如何使用DIV创建类似表格的CSS布局?

3

更新2

我在Mac OS X上的Chrome浏览器中找到了一个临时解决方案,您可以查看下面的答案获取详细信息。对于那些仍在尝试使用纯CSS或JavaScript解决方案的人,请继续努力并让我知道您想到了什么!请 :)

更新

下面的答案非常接近全CSS解决方案,所以我将尝试使其工作。同时,我也开放此问题以寻求JavaScript解决方案。您会如何使用JavaScript解决它?现在欢迎所有解决方案 :)


让我们一起来解决这个问题吧!

我正在尝试设置一个布局,请查看图片...

layout

我正在使用“粘性底部”技术,它非常有效。我已经按照这篇文章中所描述的方法设置了它,使两列中的一列变高时,另一列也会匹配其高度。然而,问题是这两列无法自然地达到页脚。我通过JavaScript强制设置了高度。
总之,所有相关代码都可以在fiddle中看到...

代码

http://jsfiddle.net/UnsungHero97/XrJMa/embedded/result/

问题

  1. 第一个大问题:我该如何设置使得这些列的高度达到下面的页脚?我希望当页面加载时,粉色和蓝色列都能自动到达底部。

  2. 当粉色列超出当前高度时,如何让本地滚动条出现?当蓝色列超出当前高度时,如何让整个页面的滚动条出现并将页脚向下推动?

- basically, I want the height of the pink and blue columns to ALWAYS be the same height but the height is only determined by the blue column; blue is dominant so it can expand the height of both columns; pink cannot expand the height, just be at the same height as blue
  1. 这个功能能否仅使用CSS实现?

如果需要澄清任何事情,请告诉我。


你不想坚持使用JS选项的原因是什么?JS确实是处理复杂垂直间距和对齐的最佳方式,因为CSS在这个领域的能力有限。 - DA.
嘿DA...实际上我之所以这样做,唯一的原因是因为我想尝试只使用CSS来完成它,这对我来说是一种挑战;如果能够仅使用CSS完成它将非常棒。不过,我会更新我的问题,这样你就可以使用JavaScript进行操作了。让我们看看你能做到什么 :) - Hristo
@Hristo,这个盒子的宽度会一直保持不变吗? - Marko
@Marko... 你指的是哪个框?暂时先选是。 - Hristo
好的,这肯定是一个挑战,但我喜欢实用主义的网页设计。 ;o) 当 CSS 是锤子时,这是一个螺丝刀的解决方案。JS 逻辑将计算两个 div 的高度,然后通过设置其高度来更改较短的 div 以匹配较长的 div。可以添加其他逻辑来处理其他变量。您在使用 jQuery 吗? - DA.
@DA... 我知道怎么做,但是语法上我不太清楚。我的意思是我不知道如何在JavaScript中实际获取元素的高度和位置,但我知道如何解决问题的逻辑 :) 话虽如此,当然我正在使用jQuery :) - Hristo
4个回答

2
有很多问题,所以我重写了它。我已经创造了你想要的东西。享受吧。=)

http://jsfiddle.net/hRkx8/53/

诀窍是让您的主区域具有与页脚相同高度的下边距(您绝对定位)。因此,随着您的蓝色元素变得越来越大,它将开始比通常情况下更早地推动页面底部。 (编辑:此版本移动了页脚,这更难做到;但是问题要求将蓝色区域初始化为尽可能大,请参见下面的一种方法)

我们开始吧!不幸的是,我必须将它内联包含,因为jsfiddle存在一些严重的错误,导致无法正确显示。这个版本的蓝色区域从底部开始。

绝对定位的元素似乎在页面变大时自动滚动存在一些问题,所以我创建了一个虚拟的#main div,就像你做的那样,并让它填充整个视口,然后在其中包含了#footer和#content(你的蓝色和红色内容)。#footer是绝对定位的,因此它不占用空间/文档不关心它。随着#content的扩展,#main容器也会随之扩展,同时拖动页脚。使用margin-bottom是必要的,以防止页脚隐藏文本。

实际上需要的CSS量非常少,如果删除演示内容,只有大约5行和虚拟元素。

<html>
<head>

<style>

body {
    margin:0; padding:0;
}

* { /* just for demonstration */
    box-sizing:border-box;
    padding:5px;
    border:1px dashed red;
    -webkit-border-radius:10px; -moz-border-radius:10px;
    background-color:hsla(0,50%,50%, 0.1);
}

/*important to use min-height not height*/

#main {
    position:relative; width:100%; min-height:100%;
    border:3px solid green;
}
#footer {
    position:absolute;
    left:0px; right:0px; bottom:0px; height:5em; /*can be anything*/
    background-color:lightgrey;
}

#content {
    position:relative;
    box-sizing:border-box;
    background-color:skyblue;
    margin-left:auto; margin-right:auto;
    padding-bottom:5em; /*must be same as #footer's height*/
    margin-top:10%; /*browser bug: actually acts like 20%*/
    width:50%;
    min-height:80%; /*should equal 100%-marginTop*/
    border:3px solid blue;
}
/* dependent elements */
#sidebar {
    position:absolute;
    top:0px; bottom:0px;
    right:100%; width:7em;
    background-color:pink;
overflow-y:scroll;
}
#topbar {
    position:absolute;
    bottom:100%; height:3em;
    right:-10%; left:10%;    
}

</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script>

setTimeout("$('pre').animate({height:1500}, 3000)", 1000);  

</script>

</head>
<body>

<div id="everything">
    <div id="main">

        <div id="content">
            <div id="sidebar">
                alpha
                <br/>
                beta
                <br/>
                gamma
                <br/>
                etc.
            </div>
            <div id="topbar">
                Menu1 * Menu2 * Menu3 * ...
            </div>
            This is my site.
            Yay.
            <pre>
            etc.
            etc.
            etc.
            etc.
            etc.
            etc.
            etc.
            etc.
            etc.
            etc.
            etc.
            etc.
            etc.
            etc.
            etc.
            etc.
            etc.
            </pre>
        </div>

        <div id="footer">
            footer
        </div>
    </div>
</div>

</body>
</html>

@ninjagecko... 慢慢想吧 :) 除了希望让这个工作起来之外,没有什么急迫的。 - Hristo
解决,享受 =)(您可以微调一下值,使滚动条不会在开始时出现)编辑:刚刚添加了overflow-y:scroll; - ninjagecko
@ninjagecko... 看起来很正常。我会尝试将其与我的东西集成在一起。如果它有效,我会告诉你的。同时,您能否简要解释一下您所做的事情? - Hristo
绝对定位的元素似乎在页面变大时自动滚动存在一些问题,因此我创建了一个虚拟的#main div,就像您所做的那样,并让它填满整个视口,然后在其中放置#footer和#content(您的蓝色和红色内容)。 #footer是绝对定位的,因此不占用空间/文档不关心它。随着#content的扩展,#main容器也会扩展,并拉动页脚。使用margin-bottom是必要的,以防止页脚隐藏文本。 - ninjagecko
一个随机的提示:请记得始终包含一个文档类型声明,以确保您的页面不处于 Quirks 模式。有关更多信息,请参见我的一些答案:http://stackoverflow.com/search?tab=votes&q=user%3a405015%20%5bdoctype%5d - 就像这个:http://stackoverflow.com/questions/5669077/internet-explorer-css-problem-hidden-padding/5669132#5669132 - thirtydot
显示剩余3条评论

2

是不是只有我一个人发现房间里的粉色大象坐在...

< T A B L E >

???

更新(4月20日,上午11:40):以下是<table>版本:

http://juliusdavies.ca/stackoverflow/pink_elephant.html

一定要多次调整浏览器窗口大小以查看其效果。

  • IE8-完美
  • Chrome-完美
  • Safari-没有滚动条,其他方面还好
  • Firefox-没有滚动条,其他方面还好

不要看到任何大象,尤其是粉色的。 - Hristo
1
<TABLE>?可能不是最好的选择。显示:Table?当然是一个有效的选项。 - DA.
+1 到 DA.... ROTFL!让我看看我是否理解正确?<table> 不好,但是 <div class='table'><div class='tr'><div class='td'> 就可以了吗??? - Julius Musseau
如果我们在CSS中将<table>设置为除display: table之外的任何内容,那么它是否变得可接受? 'display:block'的表格可以吗? - Julius Musseau

1

根据你的最近的回答,我理解你不需要页脚是全宽的(只需粘性,尽管你的不是),而且我假设你知道你的版本只有在你知道“foo - 不太重要的内容”的高度时才能工作,因为你需要该高度来设置侧边栏的顶部坐标。

你的版本存在问题,当你缩窄窗口时,内容会消失在两侧...但基于其中的思路-我使用了你的逻辑并扩展了它,并加入了粘性页脚、顶部菜单-原始示例链接中的所有内容。

页脚不是全宽的,但你可以通过在html元素上放置背景图像来使其看起来像是全宽的,我在我的fiddle中有一个简单的虚拟图像,但它没有显示出来,无论如何,你可以制作一个与页脚相同高度/颜色的带有1像素边框的图像

这绝对依赖于你能够修复/计算粉红/蓝色列上方的所有内容的高度。

这样做所需的容器div要少得多,而且现在源代码中的内容位于侧边栏之前。

这是 JSFiddle 的链接:fullsizeto edit


@clairesuzy... 这不是我想要的。1)感谢您指出我的解决方案在缩小窗口时失败,这可以轻松通过使用“min-width”来修复。2)我的解决方案确实有一个粘性页脚,但在Firefox中似乎无法正常工作。3)当蓝色区域中的内容变得太大时,您的解决方案会失败... http://jsfiddle.net/UnsungHero97/qe6P8/2/embedded/result/ ... 当我说粘性页脚时,我并不是指始终位于底部,而是只有在没有足够的内容将其推到底部时才会出现。请查看http://www.cssstickyfooter.com/。 - Hristo
@clairesuzy... 哈哈太棒了。我认为这是正确的,但我需要再试一下。我会回来告诉你的。感谢你做出的更改! - Hristo
1
顺便说一句...干得好!我希望我可以给你点赞多次。它在你的示例中很好地运行,正是我要找的东西。我将尝试将其与我的项目集成,并希望一切都能顺利进行。非常感谢! - Hristo
@clairesuzy... xheight 是什么 CSS 属性? - Hristo
@Hristo 没有这个属性.. 我的错.. 在测试时我添加了一个x以便快速删除一个属性 - 你只需将其删除即可.. 在添加选项卡之前,我将顶部div设置为固定高度 对不起 - clairesuzy
显示剩余4条评论

0

我认为这个设计有一个顶部、一个中间和一个页脚。中间部分包含了粉色和蓝色两栏。

  1. 使用CSS,在中间部分的左右两栏后面放置一个重复的背景图片。这个图片将显示两栏的边缘。希望你的设计能够适应这个要求。我承认,如果不深入代码,我不知道如何使中间部分完全展开到底部。我想应该有一些不同的方法来解决这个问题。

  2. 对于粉色栏,使用css overflow: auto;;对于蓝色栏,在 <div><section> 标签上设置 overflow: auto;。

  3. 希望这可以帮助到你...


@Greg...感谢您的回复。这不是像顶部、中间和底部那么简单。我希望是这样的:) 它更像是一个大的顶部和一个页脚,两者相互依存。 - Hristo
@Hristo...这是我几周前解决某个问题的方法。我认为它可能符合你的需求。在我的解决方案中,我需要让顶部和底部具有特殊的外观。但它漂浮在页面的中间而不是整个页面上,与你的需求不完全相同。祝好。 - gmiller
@Greg...谢谢。我很高兴它对你有用。然而,我需要继续努力解决我的问题。 - Hristo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接