问题 具有相应内容的列


假设我在HTML中有一些结构化内容 - 例如,段落中的文本分为几个部分。让我们说我有另一个相同结构的实例,我希望使用HTML和CSS将这两个内容并排显示为两列。怎么做?关键是我希望列内的相应元素(段落,部分)对齐,以便它们从相同的高度开始。

这种结构的示例可以是双语页面,或源代码以及行数或对各行的一些侧面评论。

我唯一的想法是使用表格,但我不确定它是最好的解决方案。我希望能够选择内容,就像列是普通网页一样,但是在表格中选择的方式是首先选择一行中的单元格。

一个例子如下。回想一下,我希望相应的元素从相同的高度开始。

<!doctype html>
<html>
    <head>
        <title>Corresponding columns</title>
        <meta charset="utf-8">
        <style type="text/css">
            .main {
                margin: auto;
                width: 500px;
            }
            .column {
                float: left;
                width: 50%;
            }
            .corresponding {
                background-color: #FFFF99;
            }
        </style>
    </head>
    <body>
        <div class="main">
            <div class="column">
                <h1>Section</h1>
                <p>Some text</p>
                <h2 class="corresponding">Subsection</h2>
                <p>Some other text</p>
            </div>
            <div class="column">
                <h1>Section</h1>
                <p>The text translated to another language, which may be longer.</p>
                <h2 class="corresponding">Subsection</h2>
                <p>Some other text</p>
            </div>
        </div>
    </body>
</html>

1310
2017-09-20 14:45


起源

你能发布一些迄今为止你尝试过的代码吗? - Destination Designs
@DestinationDesigns正如我所说,我不知道如何实现所需的功能。只有使用表格,然后才会破坏选择。我的问题不是实现典型的两列布局 - 网络上有很多关于这些布局的教程。我希望列之间的对应关键特征。 - user87690
我认为您需要将需要并行的每个元素分开。因此,如果您有2个段落并且需要翻译它,并且每个段落需要平行,则需要划分每个段落,识别它然后读取每个左段落的位置X-Y并将其位置应用于右段落。这对你有效吗? - Marcos Pérez Gude
@MarcosPérezGude:阅读和更改职位意味着使用javascript。对于这种情况,真的没有标准的声明解决方案吗?请注意,情况还包括源代码的行号,但这通常通过简单地假设行和行号元素具有相同的高度来完成,因此它可以工作。但是如果源代码中的一行太长而被包装呢?这种情况真的没有简单的解决方案吗? - user87690
这很困难,因为你不知道每条线的宽度。我看到这个问题只用javascript解决了。抱歉。 - Marcos Pérez Gude


答案:


如果你希望每个部分/子部分以相同的高度开始,我建议这样做:

<div class="main">
    <div class="row">
        <div class="column">
            <h1>Section</h1>
            <p>Some text</p>
        </div>
        <div class="column">
            <h1>Section</h1>
            <p>The text translated to another language, which may be longer.</p>
        </div>
    </div>
    <div class="row">
        <div class="column">
            <h2 class="corresponding">Subsection</h2>
            <p>Some other text</p>
        </div>
        <div class="column">
            <h2 class="corresponding">Subsection</h2>
            <p>This text might also be longer so you need to push the next section's as well to start at the same height</p>
        </div>
    </div>
</div>

与表格相同(几乎),但有div。

我不是“弹性盒”专家,所以这可能是一种方式,尽管浏览器支持较少。

如果您不能/不想使用“行”元素(并且不能/不能/不想要flex选项),您将需要一个遍历元素并计算要设置的边距的javascript片段。

UPDATE

检查这两个链接,它们将帮助您根据需要使用flex进行设置:
- https://chriswrightdesign.com/experiments/using-flexbox-today/#card-layout
- http://codepen.io/imohkay/pen/PwPwWd/

未使用javascript的未来证明方式。

更新2

这个有一些非常酷的网格解决方案:
- https://philipwalton.github.io/solved-by-flexbox/demos/grids/


8
2017-09-23 09:11



是的,它就像一张桌子,但是它与表格混淆选择的问题。我希望能够在单个列中进行选择,就像只有一列一样。 - user87690
当你说“选择”时,你的意思是用鼠标标记/选择子及其子部分中的文本吗? ......或者让他们在“css悬停”规则中做出反应? - LGSon
LGSon:是的。例如,在“源代码示例的行号”中,我希望能够通过鼠标选择源代码,以便能够使用正确的空格提取它。 - user87690
更新了我的答案,你会发现一个“非javascript”的方式如何处理我链接到的那两个页面。 - LGSon
谢谢,这看起来很有希望。 - user87690


好吧,我不知道你到底想要什么...我想你可能想要两个并排的部分,你可以放置任何东西......这就是我找到的东西:

制作两个div <div id="first"> 和 <div id="second">

并把你想要的东西放在里面。现在css:

#first {float:left;width:50%;}

#second {float:right;width:50%;}

确保你有 body {padding:0; margin:0;}


2
2017-09-20 15:29



关键是这些div包含一些对应的内容,例如左栏中有一个段落,第二栏中有相应的段落。我希望这些段落对齐,即两者都从相同的高度开始。它不仅仅是段落,而是整个HTML结构。 - user87690


如果我正确理解了您的问题,那么您正在搜索一个HTML结构,该结构显示彼此相邻的两个项目。该项目的每个属性(即子部分)应具有相同的高度。并且,当用户选择文本时,应该选择整行(即来自两个项目的相同属性)。

我觉得为了让用户能够按照你想要的方式选择内容,结构需要正确,因为我相信浏览器会根据结构选择内容(不确定,但这总是正确的) 。

问题是,如果您可以自由使用任何您喜欢的HTML结构?

当我尝试下面的例子时,它对我有用。解决方案是使用列表(ul 同 li)每个“财产”(行),制作 li显示为 inline-block。这样,他们就不会破坏,就像他们一样 block元素,它们每条“线”的高度始终相同。同 vertical-align: top; 所有内容都从元素的开头开始。

我调整了内容,所以我们肯定有不同的线高和包装,只是为了确保它有效。

造型:

<style>
    ul {
        list-style: none;   
    }

    ul li {
        display: inline-block;
        vertical-align: top;
        width: 20%;
    }
</style>

HTML:

<ul>
    <li>Section 1</li>
    <li>Section 2<br/>(with new line)</li>
</ul>
<ul>
    <li>Some text</li>
    <li>The text translated to another language, which may be longer.<br /><br />
    The text translated to another language, which may be longer. 
    The text translated to another language, which may be longer. 
    The text translated to another language, which may be longer. 
    The text translated to another language, which may be longer. 
    The text translated to another language, which may be longer. </li>
</ul>
<ul>
    <li>The text translated to another language, which may be longer. 
        The text translated to another language, which may be longer.</li>
    <li>Some text</li>
</ul>   

2
2017-09-23 11:23



我希望选择以另一种方式工作 - 能够选择整个列。这是问题的核心。如果我们将结构更改为包含包含相应元素的行的大列,那么我们就会对齐,但是我们会丢失选择。如果我们有两个大的列包含整个相应的结构,那么我们有选择但我们不能水平对齐相应的元素。 - user87690
我懂了。在这种情况下,我很抱歉误解了这个问题。我要去的是行,而不是列。我不知道有任何方法可以实现这一点,除了使用JavaScript并将较小元素的高度设置为较大的“伙伴”元素的高度。根据其他答案,可能有一个解决方案。祝你好运! - PzYon
PzYon:谢谢。 - user87690


感谢LGSon,我已经了解了flex。我试图整理一个解决方案。以下代码以某种方式工作,但有一些问题:

  1. 必须为所有元素添加`order`属性。
  2. 由于某些原因,flex不会像在标准情况下那样重叠边距,因此所有垂直空间都更大。
  3. 很难知道例如在整列周围添加边框。
<!doctype html>
<html>
    <head>
        <title>Corresponding columns</title>
        <meta charset="utf-8">
        <style type="text/css">
            .container {
                margin: auto;
                width: 500px;
                display: flex;
                flex-wrap: wrap;
            }
            .container > * {
                flex: 0 0 50%;
            }
            .corresponding {
                background-color: #FFFF99;
            }
        </style>
    </head>
    <body>
        <div class="container">
            <h1 style="order: 1">Section</h1>
            <p style="order: 2">Some text</p>
            <h2 style="order: 3" class="corresponding">Subsection</h2>
            <p style="order: 4">Some other text</p>

            <h1 style="order: 1">Section</h1>
            <p style="order: 2">The text translated to another language, which may be longer.</p>
            <h2 style="order: 3" class="corresponding">Subsection</h2>
            <p style="order: 4">Some other text</p>
        </div>
    </body>
</html>

2
2017-09-23 17:53



正如我所写,当你真的需要两个“单独”列,其中一个项目可以与另一个项目配对时,需要javascript来实现这一点,并且可以毫不费力地完成。对于p.3,您可以使用psuedo类轻松地执行此操作:在容器之后的/:之前。将它们设置为绝对值,边框,宽度50%,高度100%,顶部0和一个左边0,另一个左边50%... zindex on:低于列项之后 - LGSon
您无需添加内联 style="order: n",你可以用css做到这一点: .container h1 { order: 1 } .container h2 { order: 3 } .container p:nth-of-type(1n) { order: 2 } .container p:nth-of-type(2n) { order: 4 } - LGSon
@LGSon:但这种风格只适用于我的特定内容,对吗? - user87690
它适用于h1,h2和p元素,它们是.container元素的子元素,如您的答案所示 - LGSon
我想说的是,“尽可能避免使用内联样式”,并使用CSS和类来设置html的样式。如果您想要进行更改,那么Soooo更容易维护。 - LGSon


使用CSS column-count CSS属性: https://css-tricks.com/almanac/properties/c/columns/

更新

重新阅读问题之后,我想如果你想让两个列都以相同的高度开始,你可以在两列上使用min-height,但要注意内容随后会随着它的增长而推高。

为了保持高度,即使有内容,放一个固定的高度然后适用 overflow-y:auto; 要么 overflow-y:scroll。这样,两个盒子将具有相同的高度,并且可以在内容增长的情况下滚动


0
2017-09-30 07:56



它与我的问题有什么关系? - user87690
您想将内容拆分为列,不是吗? - William
不,我有两个相同HTML结构的实例,我想在两列中显示它们。关键是我希望相应的元素从相同的高度开始。 - user87690
@ user87690我已经更新了上面的答案,希望有所帮助 - William
我不仅希望整个列具有相同的高度,还希望包含在该列中的所有对应元素对。例如,您可以在问题中重新编写示例。我正在寻找一种方法使相应的h2s垂直对齐,因此它们并排显示。 - user87690