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

CSS: отображение: встроенный блок и позиционирование: абсолютный

Обратите внимание на следующий код:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <style type="text/css">
        .section {
            display: block;
            width: 200px;
            border: 1px dashed blue;
            margin-bottom: 10px;
        }
        .element-left,
        .element-right-a,
        .element-right-b {
            display: inline-block;
            background-color: #ccc;
            vertical-align: top;
        }
        .element-right-a,
        .element-right-b {
            max-width: 100px;
        }
        .element-right-b {
            position: absolute;
            left: 100px;
        }
    </style>
    <title>test</title>
</head>
<body>
    <div class="section">
        <span class="element-left">some text</span>
        <span class="element-right-a">some text</span>
    </div>
    <div class="section">
        <span class="element-left">some text</span>
        <span class="element-right-a">some more text to force line wrapping</span>
    </div>
    <div class="section">
        <span class="element-left">some text</span>
        <span class="element-right-b">some text</span>
    </div>
    <div class="section">
        <span class="element-left">some text</span>
        <span class="element-right-b">some more text to force line wrapping</span>
    </div>
    <div class="section">
        <span class="element-left">some text</span>
        <span class="element-right-b">some more text to force line wrapping</span>
    </div>
</body>
</html>

Элемент с абсолютным позиционированием автоматически заставляет поле "забыть", какая высота ему нужна.

Мне нужно абсолютное позиционирование внутри поля "section", есть ли другое решение для этого?

спасибо заранее, Джеронимо

изменить

Использование таблиц на самом деле не вариант, мне нужен какой-то "многоуровневый" / "вложенный" макет, где второй col всегда находится в одной и той же позиции:

| some text in first column       | some text in 2nd column
  | some indented text            | 2nd column
  | also indented                 | 2nd col
    | even more indent            | 2nd column with a lot of text that
                                  |  makes it wrap
  | text                          | ...
| blah blah                       | ...

(конечно, без "|" s)

4b9b3361

Ответ 1

Когда вы используете position:absolute;, элемент извлекается из обычного потока страниц. Поэтому он больше не влияет на расположение его элемента контейнера. Таким образом, элемент контейнера не учитывает его высоту, поэтому, если нет ничего, чтобы установить высоту, тогда контейнер будет иметь нулевую высоту.

Кроме того, установка display:inline-block; не имеет никакого смысла для элемента position:absolute;. Опять же, это потому, что абсолютное позиционирование выводит элемент из потока страниц. Это противоречит inline-block, который существует только для того, чтобы повлиять на то, как элемент вписывается в поток страниц. Все элементы position:absolute; автоматически обрабатываются как display:block, так как это единственный режим логического отображения для абсолютного позиционирования.

Если вам требуется абсолютное позиционирование, единственным решением проблемы с высотой является установка высоты контейнера.

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

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

Это классическая проблема CSS. В "плохих старых днях" веб-дизайнеры сделали бы это, используя таблицу с фиксированной шириной на ячейках таблицы. Это, очевидно, не является ответом для веб-дизайнеров сегодня, но это вызывает много вопросов.

Существует несколько способов сделать это с помощью CSS.

Проще всего установить оба элемента <span> на display:inline-block; и дать им как фиксированную ширину.

например:

<div class='section'>
    <span class="element-left">some text</span>
    <span class="element-right">some text</span>
</div>

со следующим CSS:

.section span  {display:inline-block;}
.element-left  {width:200px;}
.element-right {width:150px;}

[EDIT] после того, как вопрос обновлен

Вот как я мог бы достичь того, что вы сейчас спрашиваете:

<div class='section'>
    <span class="element-left"><span class='indent-0'>some text</span></span>
    <span class="element-right">some text</span>
</div>
<div class='section'>
    <span class="element-left"><span class='indent-1'>some text</span></span>
    <span class="element-right">some text</span>
</div>
<div class='section'>
    <span class="element-left"><span class='indent-2'>some text</span></span>
    <span class="element-right">some text</span>
</div>

со следующим CSS:

.section span  {display:inline-block;}
.element-left  {width:200px;}
.indent-1 {padding:10px;}
.indent-2 {padding:20px;}
.element-right {width:150px;}

Небольшое количество дополнительной разметки, но оно действительно достигает желаемого эффекта.

Ответ 2

Нет.

Вы можете позиционировать абсолютно то же самое, что и экземпляр элемента внутри поля раздела с visible: none, но абсолютное позиционирование по определению делает его "плавающим" элементом, который не взаимодействует с элементами над ним.

Предполагая, что ваш макет страницы исправлен, вы можете использовать padding-left: #px; для достижения своей цели, поскольку я не думаю, что относительное позиционирование - это то, что вы хотите.

В качестве альтернативы вы можете использовать display: table-*, чтобы заставить его сохранить более строгую форму, не затрагивая структуру документа, как показано здесь

Однако, в зависимости от того, хотите ли вы, чтобы ячейки были текучими, вам может потребоваться изменить div .section на display: table-row, если вам не нравится настройка заданной ширины и хотите, чтобы отдельная секция выстраивалась в линию.

Ответ 3

На самом деле это можно сделать легко и просто с помощью div. Вам просто нужно поместить div с позицией: относительно внутри встроенного или блочного дисплея div. Установите его ширину и высоту так же, как и содержащий div. Затем вы обнаружите, что вы можете позиционировать еще один div внутри него.