【问题标题】:2 div columns: fixed and liquid. Fixed one must be removable. Liquid one must be the first in code2 div 列:固定和液体。固定的必须是可移动的。液体必须是代码中的第一个
【发布时间】:2011-07-14 15:59:11
【问题描述】:

考虑以下 2 cols html 结构:

<div id="container">
    <div class="left">some text</div>
    <div class="right">some text</div>
</div>

CSS:

#container { overflow: hidden; }
.left { float: left; width: 200px; background: red; }
.right { overflow: hidden; background: green; }

jsFiddle 中的相同代码 - http://jsfiddle.net/vny2H/

所以我们有 2 列。左边的列宽是固定的,右边的宽度是液体。 如果我们从 html 中删除左列,右列会拉伸到父级#container 宽度的 100%。

问题是:我们可以改变左右列的顺序吗? (我需要它来进行 SEO)

<div id="container">
    <div class="right"></div>
    <div class="left"></div>
</div>

谢谢。


添加

有一种有趣的方法可以达到我想要的效果,但固定列变得不可移动。该方法基于负边距。 http://jsfiddle.net/YsZNG/

HTML

<div id="container">

    <div id="mainCol">
        <div class="inner">
            <p>Some text</p>
            <p>Some text</p>
            <p>Some text</p>
            <p>Some text</p>
        </div><!-- .inner end -->
    </div><!-- .mainCol end -->

    <div id="sideCol">
        <p>Some text</p>
        <p>Some text</p>
        <p>Some text</p>
        <p>Some text</p>
    </div><!-- .sideCol end -->

</div><!-- #container end -->

CSS

#container { overflow: hidden; width: 100%; }

#mainCol { float: right; width: 100%; margin: 0 0 0 -200px; }
#mainCol .inner { margin: 0 0 0 200px; background: #F63; }

#sideCol { float: left; width: 200px; background: #FCF; }

所以我们有两种方法:

  1. 对固定列使用“float”,对液体使用“overflow: hidden”。固定柱变得可移动。但液体在代码中排在第二位。
  2. 使用负边距。液体列在代码中排在第一位。但固定的不可拆卸。

是否有第三种方法,当固定柱是可移动的并且液体柱是代码中的第一个时?


添加

@lnrbob 建议半决定。主要思想 - 使用类似表格的 div。 http://jsfiddle.net/UmbBF/1/

HTML

<div id="container">
    <div class="right">some text</div>
    <div class="left">some text</div>
</div>

СSS

#container { display: table; width: 100%; }
.right { display: table-cell; background: green; }
.left { display: table-cell;  width: 200px; background: red; }

此方法适用于在站点右侧放置固定列的情况。但是如果我们需要它在左边 - 这似乎是不可能的。

【问题讨论】:

  • 我不确定这是否是您需要的,但这是新的,不适用于旧版浏览器。 quirksmode.org/css/multicolumn.html
  • 这是一件了不起的事情,但它似乎只是对一个块的修改。所以它不适合网站栏结构。
  • 毕竟“网站栏结构”本身就在 div 或 body 中。我相信它是专门为网站结构而设计的。它会更好地融入浏览器,因此会更可靠:) 它比管理浮动 div 和所有内容要容易得多:D 我使用它,我花了大约 5 分钟来理解和实现它
  • 好的,但是我没有看到任何示例,当每列中有多个 div 块时,如何形成多列。请你写这样的例子好吗?
  • 我没有看到复杂性.. :O 像你一样简单地写,将一列视为一个单独的 div :) 正如你所说的那样,它只是结构正确的浮动 div。将单列视为单独的 div,你应该很好

标签: html css xhtml


【解决方案1】:

首先考虑您要标记的内容的语义,这几乎总是会产生一个既具有良好标记又对搜索引擎友好的解决方案。

比如.right是页面的主要内容,.left是一些补充信息还是导航?在这种情况下,将其标记为这样,搜索引擎将按照您希望的方式很好地解释它。 HTML5 提供了许多用于此目的的元素:

<div id="container">
    <nav>
        <ul>
            <li><a href="index.html">Home</a></li>
            <li><a href="#">etc.</a></li>
        </ul>
    </nav>
    <article>
        <h1>My nice, juicy content</h1>
        <p>Cool stuff, huh?!</p>
    <article>
</div>

或者对于补充内容,您可以考虑&lt;aside&gt; 或干脆&lt;div role="supplementary"&gt;

Google 会很高兴地挖掘并识别导航和实际内容之间的差异,源顺序很重要的想法不再像几年前那样适用于 SEO。

【讨论】:

  • +1 用于击中钉子。没有 SEO 压力,只写好内容。
  • 是的,你是对的:.right 是页面的主要内容,.left 是导航。我毫不怀疑,谷歌正确地理解了语义结构良好的网站。但是除了谷歌还有很多其他的搜索引擎。我的 SEO 经验告诉我,页面上的主要内容越高,网站在搜索结果中的位置就越高。此外,如果一个网站很年轻并且页面很大,搜索机器人可以在它索引整个内容之前简单地消失。但真正的问题是——是否不可能做出符合我要求的结构?
【解决方案2】:

因为您的元素具有相同的高度,您可以这样做:

#container { overflow: hidden; position:relative; }
.left { float: left; width: 200px; height: 200px; background: red; position:absolute; top:0; left:0; }
.right { overflow: hidden; height: 200px; background: green; margin-left:200px;}

小提琴页面:http://jsfiddle.net/Ptm3R/9/

【讨论】:

  • 在网站栏结构中使用“位置:绝对”是个坏主意。首先,想象一种情况,当右列高度小于左列高度时。左栏将被页脚或窗口剪切。其次,在您的变体中,当我们从 html 中删除左列时 - 我们看到左列所在的位置有一个空白区域,但右列必须拉伸到父 #container 宽度的 100%。但无论如何感谢您的回答。为它+1。 :)
  • 如果你没有“身高”,我不会建议 position:absolute ;)
  • 请原谅我的困惑 :) 这只是为了可视化,因为它们没有内容。
【解决方案3】:

我仍然认为这是一项毫无意义的努力,因为尝试的唯一原因是为了获得可疑的 SEO 好处。但是,我被拖回这个问题太多次了,所以我要提出一些问题。

如果我迫于死亡的痛苦想出一个纯 CSS 解决方案,就是这样 - 但我不推荐它:

http://jsfiddle.net/RbWgr/

魔法是transform: scaleX(-1);。这应用于.container 以翻转视觉顺序,然后也应用于子divs,这样每个div内容 不会被翻转。

  • 它在 IE7 中不起作用,因为我使用的是display: table-cell
  • 在 IE8 中并没有那么热 - 任何文本看起来都很可怕,就像 filters 一样。但是,它确实有效。
  • 需要额外的 div 包装器才能使其在 Opera 中运行 - 文本看起来并不完美。

它在其他现代浏览器(IE9、Chrome、Safari、Firefox)中运行良好,但将transforms 应用于“每个元素”的父级可能会产生无法预料的后果。

【讨论】:

  • 太棒了!我见过的最好的答案。但是你怎么知道,负值会翻转单元格?其次,在我看来,所有浏览器都需要嵌套 div,而不仅仅是歌剧。我说的对吗?
  • 我“只知道”负值会这样做。这就像 Photoshop - 如果在转换某些东西时将其设置为具有-100% 的宽度,它就会被翻转。嵌套的divs 仅适用于 Opera - 这是一个没有嵌套 divs 的版本,它在 Opera 中已损坏,但在其他任何地方都可以使用原始版本:jsfiddle.net/RbWgr/1。无需深入研究,Opera 似乎无法将transforms 应用于表格单元格。
  • 是的,现在我明白了。我尊重答案!
【解决方案4】:

说实话,我不知道你为什么把它归结为只需要使用两个 id ( [#left / #right] OR [#mainCol / # sideCol] )...

使用您在 JSFiddle http://jsfiddle.net/YsZNG/ 中的 mainCol/sideCol 解决方案并引入第三个类,在没有 sideCol 的情况下以编程方式应用于主 div 会不会容易得多。

http://jsfiddle.net/biznuge/aAE3q/4/

对不起。我很可能错过了这一切的重点,但我之前曾因尝试在流体/固定混合物站点工作而感到痛苦,所以只是想就此事分享我自己的感受......

更新

现在我认为可行,我对此提供了第二个答案。很抱歉重复回答,但它似乎与我最初的反应有很大不同,我认为它会站起来。

【讨论】:

  • 感谢您对问题的关注。我知道,这是最简单的方法。甚至可以在您的示例中删除 .inner 以使代码更加清晰。但我想知道,如果有一些 css-guru,只用 css 解决了这个问题。
【解决方案5】:

取决于您的浏览器支持要求。对于 IE8 及更高版本(以及所有现代浏览器),您可以使用 display: 设置表格布局(当然仍然使用您的 &lt;div /&gt;。)

Here is an example - 我只添加了 javascript,因此您可以轻松切换元素是否隐藏:)

【讨论】:

  • 难以置信!遗憾的是,大多数网站仍然支持 IE7。不过,如果客户不是很细致,可以用 JS 修复。 :) 我对您的代码有疑问。不是需要带有“display: table-row”的div吗?
  • 我不认为表格行是严格要求的 - 记住这纯粹是视觉效果,如果它看起来正确跨浏览器,你很好!我似乎记得 safari 可能更喜欢表格行显示,但 Chrome 对我来说很好。只是测试它:)
  • 此方法适用于在站点右侧放置固定列的情况。但是如果我们需要它在左边——这似乎是不可能的。 :(
  • 哦,我明白了,很混乱。所以你希望&lt;div class="right" /&gt; 出现在右边,但实际上是 dom 中的第一个?
  • 对不起,我想我现在已经理解了这个问题。你能告诉你如何删除左栏吗?这可能是一种更简单的解决方法
【解决方案6】:

把左列放在右列的底部怎么样?

http://jsfiddle.net/vny2H/32/

【讨论】:

  • 有趣的想法。但是: 1)它在 IE7 中不起作用。 2)在实践中,大多数情况下都会有块,而不是单独的文本。你可以看到,如果我们在 .rightCol 中放置一个块会发生什么 :) jsfiddle.net/fHg5t 无论如何,谢谢。
【解决方案7】:

http://jsfiddle.net/biznuge/aAE3q/12/

这似乎满足了我的想法。无论如何都可以在 FF 中工作,但我不确定其他浏览器会如何对表格类型显示属性做出反应。

更新

已在 FireFox(4)、IE(9)、Opera(11)、Safari(5)[Win] 和 Chrome(12) 中对此进行了测试,并且布局似乎在所有浏览器中都很健壮。

真的很令人惊讶……

澄清后更新

感谢@thirtydot

http://jsfiddle.net/biznuge/aAE3q/19/

据我所知,仅在 Firefox 4 中有效,经过一些简短的检查......但这是一个开始......

【讨论】:

  • 这与@lnrbob 的答案相同(仔细查看已编辑到问题中的@lnrbob 答案的版本,特别是HTML 与演示不匹配的原因),问题完全相同.这是您的答案中的演示版本,还有一些额外的&lt;p&gt; 来启发您:jsfiddle.net/aAE3q/13
  • @thirtydot - 看看你对左/右的意思是什么......我似乎忽略了元素的方向是错误的......嗯嗯......
  • 等一下...jsfiddle.net/biznuge/aAE3q/16 即使我将另一个元素添加到列式布局中,它们在标记中的位置也与它们在渲染中的位置直接相关。这不是 Webbars 所要求的吗?
  • 他希望 HTML 为RIGHT LEFT,但视觉显示为LEFT RIGHT。以他的原始演示:jsfiddle.net/vny2H/31 并尝试使其功能和看起来完全相同(您可以在该演示中删除 LEFT),但在 HTML 中首先使用 RIGHT .这就是任务,我 99% 确信使用“纯 CSS”是不可能的(除非有一些时髦且未被广泛支持的 CSS3 方法可以提供帮助)。
  • @thirtydot - 嗯......所以你是说他希望左边的 div 在左侧的渲染中“直观地”显示,无论元素在标记中的位置如何?是这样的场景吗?
猜你喜欢
  • 2011-06-12
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多