2个div列:固定和流动。固定的必须可移动。流动的必须是代码中的第一个。

4
考虑以下的2个列的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/ 所以我们有两列。左列宽度固定,右列宽度是流体的。 如果我们从html中删除左列,则右列会拉伸到父级#container宽度的100%。
问题是:我们能否更改左右列的顺序? (我需要它来进行搜索引擎优化)
<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; }

当网站中需要将固定列置于右侧时,此方法适用。但如果我们需要将其置于左侧,则似乎无法实现。


1
我不确定这是否是你所需要的,但这是新的,无法在旧浏览器上运行。http://www.quirksmode.org/css/multicolumn.html - Achshar
这是一件很棒的事情,但它似乎只是一个块的修改。因此它不适用于网站列结构。 - Arsen K.
毕竟,“站点列结构”本身会在div或body内部。我认为它是专门为网站结构而设计的。并且最好将其嵌入浏览器中,因此更可靠 :) 它比管理浮动div和所有其他东西要容易得多:D 我使用它,并且只需要大约5分钟就可以理解和实现它。 - Achshar
我不觉得有什么复杂的地方.. :O 就像平常一样简单地编写,将列视为单独的 div :) 正如你所说,这只是正确处理浮动 div 的结构。将单个列视为单独的 div,你就可以做得很好。 - Achshar
但是需要注意的是,这种方法在像IE 6、7、8、9甚至可能是FF 3.*这样的旧版浏览器中无法正常工作。不过对于FF而言就不确定了。 - Achshar
显示剩余6条评论
7个回答

6
考虑标记内容的语义,这几乎总是会导致既有良好标记又适合搜索引擎的解决方案。
例如,.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>

或者对于补充内容,您可以考虑使用<aside>或简单地使用<div role="supplementary">

谷歌很高兴地抓取并识别导航和实际内容之间的差异,源代码顺序的重要性不再像几年前那样适用于SEO。


1
+1 为命中要害点赞。不要过于强调SEO,只需写出优质内容即可。 - NGLN
是的,你说得对:.right 是页面的主要内容,而 .left 是导航。我毫不怀疑,Google 正确地理解了语义上良好的网站。但除了 Google 之外,还有很多其他搜索引擎。我的 SEO 经验告诉我,页面上主要内容越高,网站在搜索结果中的排名就越高。此外,如果一个网站很年轻,页面很大,搜索机器人可能在索引整个内容之前就会离开。但真正的问题是,是否不可能制作出符合我的要求的这样的结构? - Arsen K.

3
因为您的元素高度相同,因此您可以这样做:
#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/


在网站列结构中使用“position: absolute”是一个不好的想法。首先,想象一种情况,当右侧列高度小于左侧列高度时。左侧列将被页脚或窗口截断。其次,在您的变体中,当我们从html中删除左列时 - 我们会看到一个空白的空间,但右列必须拉伸到父级#container宽度的100%。但无论如何感谢您的回答。为此加上+1。 :) - Arsen K.
如果你没有“height”,我不会建议使用position:absolute ;) - Mo Valipour
抱歉造成混淆 :) 这只是为了可视化而没有内容。 - Arsen K.

2
说实话,我不确定为什么你要将它简化为只能使用两个id([#left / #right] OR [#mainCol / #sideCol])......

使用JSFiddle中的mainCol/sideCol解决方案http://jsfiddle.net/YsZNG/并引入第三个类,可以在程序中应用于主div在缺少sideCol的情况下。

就像这样http://jsfiddle.net/biznuge/aAE3q/4/

抱歉。我可能错过了所有这些的重点,但我之前曾经尝试在流体/固定混合站点上工作,并感到非常痛苦,所以我想分享一下自己的感受......

更新

我现在提供了第二个答案,我认为它有效。很抱歉双重回答,但它似乎与我的初始响应有足够的不同之处,因此我认为它可以自立脚跟。

感谢您关注这个问题。我知道,这是最简单的方法。甚至在您的示例中,.inner也可以被删除,以使代码更清晰。但我想知道,是否有一些CSS大师仅使用CSS解决了这个问题。 - Arsen K.

2
我仍然认为这是一个相当无意义的努力,因为唯一的尝试原因是为了可疑的SEO好处。但是,我已经被拖回到这个问题上很多次了,所以我要提出一些东西。

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

http://jsfiddle.net/RbWgr/

魔法是transform: scaleX(-1);。它被应用于.container来翻转视觉顺序,然后也被应用于子div,以使每个div的内容不被翻转。
  • 在IE7中无法工作,因为我使用了display: table-cell
  • 在IE8中效果不太好 - 任何文本看起来都很糟糕,这通常是由于filter造成的。但是,确实可以工作。
  • 在Opera中需要额外的div包装才能使其工作 - 文字看起来并不完美。

在其他现代浏览器(IE9、Chrome、Safari、Firefox)中运行得非常好,但对“每个元素”的父级应用transform可能会有意想不到的后果。


太棒了!这是我见过的最好的答案。但是你怎么知道负值会翻转单元格呢?其次,我认为嵌套的div对于所有浏览器都是必需的,不仅仅是Opera。我对吗? - Arsen K.
我“只是知道”负值会这样做。就像Photoshop - 如果在对某些东西进行转换时,将其设置为宽度为-100%,它就会翻转。嵌套的div仅对Opera有效 - 这是一个没有嵌套div的版本,在Opera中有问题,但在原始版本可以正常工作的所有其他地方都有效:http://jsfiddle.net/RbWgr/1/。没有深入研究,似乎Opera不能将`transform`应用于表格单元格。 - thirtydot
是的,现在我明白了。感谢您的回答! - Arsen K.

1

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

我认为这似乎满足要求。在火狐浏览器中可以工作,但我不确定其他浏览器对表格类型显示属性的反应如何。

更新

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

真的很惊讶...

澄清后更新

感谢@thirtydot提供的信息

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

据我所知,仅适用于 Firefox 4,在进行一些简短的检查后... 但这是一个开始...


1
这与@lnrbob的答案完全相同(仔细查看已编辑到问题中的@lnrbob答案的版本,特别是HTML与演示不匹配的方式),存在完全相同的问题。以下是您答案中的演示版本,其中包含一些额外的<p>以启发您:http://jsfiddle.net/aAE3q/13/ - thirtydot
@thirtydot - 我明白你所说的左/右问题...我似乎忽略了元素的顺序不对...嗯嗯嗯... - BizNuge
请稍等...http://jsfiddle.net/biznuge/aAE3q/16/ 即使我在列式布局中添加另一个元素,它们在标记中的位置直接关联到它们在渲染中的位置。这就是Webars所要求的,不是吗? - BizNuge
2
他希望HTML是RIGHT LEFT,但视觉显示是LEFT RIGHT。参考他的原始演示:http://jsfiddle.net/vny2H/31/,并尝试使其功能和外观*完全相同*(可以在该演示中删除LEFT),但在HTML中首先使用RIGHT。这就是任务,我99%确定使用“纯CSS”是不可能的(除非有一些时髦且不被广泛支持的CSS3方法可以帮助)。 - thirtydot
我已经时不时地思考这个问题一年了。 :) 因为我有一个伴侣,他主要在Photoshop中工作,但也通常了解CSS。他对网站的想法常常是疯狂和不可能实现的。但正因为如此,我作为CSS设计师在不断地提高自己。 :) - Arsen K.
显示剩余5条评论

1

有趣的想法。但是:1)它在IE7中无效。2)从实践看,大多数情况下会存在块,而不是单独的文本。而且,如果我们在.rightCol中放置一个块,你可以看到会发生什么 :) http://jsfiddle.net/fHg5t/ 无论如何,谢谢你。 - Arsen K.

1

根据您的浏览器支持要求。对于IE8及以上版本(以及所有现代浏览器),您可以使用display:来设置表格布局(当然仍然使用您的<div />)。

这里有一个例子 -我只添加了JavaScript,以便您可以轻松切换元素是否隐藏 :)


太棒了!可惜大多数网站仍然支持IE7。不过,如果客户不是非常挑剔,可以用JS解决。 :) 我有一个关于你的代码的问题。难道不需要一个带有"display: table-row"的div吗? - Arsen K.
我认为表格行不是必需的 - 记住这仅仅是视觉效果,如果在各种浏览器中看起来正确,那就没问题了!我记得Safari可能更喜欢表格行显示,但对我来说Chrome也很好。只需要测试一下 :) - Stuart Burrows
当一个固定列放在网站的右侧时,这种方法是适用的。但如果我们需要它在左侧,似乎无法做到这一点。 :( - Arsen K.
哦,我明白了,有点混乱。所以你想让<div class="right" />出现在右边,但实际上它是DOM中的第一个? - Stuart Burrows
@Webars 让我们在聊天室里继续这个讨论 - Stuart Burrows
显示剩余2条评论

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