Подтвердить что ты не робот

Столбцы с соответствующим контентом

Скажем, у меня есть структурированный контент в 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>
4b9b3361

Ответ 1

Если вы хотите, чтобы каждый раздел/подразделение начинался с одинаковой высоты, я бы предложил сделать следующее:

<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 as well to start at the same height</p>
        </div>
    </div>
</div>

То же (почти) как таблица, но с div.

Я не эксперт "flex-box", так что это может быть способ, хотя и с меньшей поддержкой браузера.

Если вы не можете/не хотите использовать элементы "row" (и нет/не можете/не хотите использовать опцию flex), вам понадобится фрагмент javascript, который выполняет итерацию по вашим элементам и вычисляет поля быть установленным.

UPDATE

Проверьте эти 2 ссылки, они помогут вам настроить это, как вам нравится, используя 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/

Ответ 2

Ну, я не знаю, что именно ты хочешь... Я думаю, что тебе могут понадобиться два раздела бок о бок, где можно разместить что-нибудь... То, что я нашел:

сделайте два div <div id="first"> и <div id="second">

и поместите то, что вы хотите в них. Теперь css:

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

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

Убедитесь, что у вас есть body {padding:0; margin:0;}

Ответ 3

Если я правильно понимаю ваш вопрос, вы ищете 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>   

Ответ 4

Спасибо LGSon, я узнал о flex. Я попытался собрать решение. Следующий код как-то работает, но есть некоторые проблемы:

  • Необходимо добавить атрибут `order` для всех элементов.
  • По какой-то причине flex не перекрывает поля, как это делается в стандартной ситуации, поэтому все вертикальные пространства больше.
  • Было бы трудно понять, например, добавьте границу вокруг целого столбца.
<!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>

Ответ 5

Использовать свойство CSS column-count CSS: https://css-tricks.com/almanac/properties/c/columns/

Обновление

После повторного чтения вопроса, я думаю, что если вы хотите, чтобы оба столбца начинались с одинаковой высоты, вы можете использовать минимальную высоту для обоих столбцов, но имейте в виду, что содержимое позже будет подталкивать высоту по мере ее роста.

Чтобы поддерживать высоту даже с содержимым, установите фиксированную высоту, затем примените overflow-y:auto; или overflow-y:scroll. Таким образом, обе коробки будут иметь одинаковую высоту и могут прокручиваться, если контент растет