Относительно позиционировать элемент, не занимая место в потоке документов

Как относительно расположить элемент, чтобы он не занимал место в потоке документов?


person Web_Designer    schedule 18.05.2011    source источник
comment
Должен ли он быть относительно расположен? Абсолютно позиционированные элементы удаляются из документооборота.   -  person Jason Gennaro    schedule 18.05.2011


Ответы (6)


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

<div style="position: relative; width: 0; height: 0">
    <div style="position: absolute; left: 100px; top: 100px">
        Hi there, I'm 100px offset from where I ought to be, from the top and left.
    </div>
</div>
person Nightfirecat    schedule 18.05.2011
comment
как бы вы унаследовали ширину в этом случае? поскольку относительная ширина div равна 0, абсолютный div не сможет правильно наследовать ширину, если они оба находятся в контейнере. - person Alex H; 20.02.2017
comment
@AlexH К сожалению, этот метод не предлагает способа сделать это. В этом случае я бы посоветовал попробовать метод отрицательной позиции/отрицательной маржи FredK. - person Nightfirecat; 25.02.2017

Добавьте поле, равное пикселям, которые вы переместили:

Пример

.box {
    position: relative;
    top: -30px; 
    margin-bottom: -30px;
}
person Fred K    schedule 11.06.2013
comment
как-то имеет больше смысла для меня, чем другой ответ - person markasoftware; 03.11.2013
comment
Это работает? Я пытаюсь это сделать в хроме и, похоже, не работает. Я использую его для позиционирования кнопок навигации из slidesjs, так что это тоже может с ним связываться. - person Petruza; 19.02.2014
comment
Я попробовал это с left: -25px; margin-right: -25px;, и по какой-то причине он по-прежнему смещает элементы родственного элемента по горизонтали на 2-3 пикселя. - person Mike; 21.05.2015
comment
Включите использование float:right;, если вы хотите сделать это относительно правой стороны экрана, чтобы значения правого или левого были меньше и более управляемыми. - person Damian Green; 26.02.2016
comment
имейте в виду, что для положительных значений top: вам нужно, чтобы margin-bottom: равнялось минусу высоты элемента, а не смещению - person Mr Heelis; 29.08.2018
comment
Это единственный ответ, который работал, когда относительный элемент находится внутри контейнера переполнения с прокруткой. (Ответы, которые помещают элемент в невидимый абсолютный div, не работают, так как он не будет прокручиваться с переполнением) - person Michal Minich; 24.10.2018
comment
Для меня хитрость заключалась в том, чтобы добавить отступ, равный ширине элемента, а не пикселям, на которые я его переместил. Итак, у моего элемента была ширина 40 пикселей, но я переместил его на -70 пикселей, поэтому мне пришлось добавить отступ справа на -40 пикселей, чтобы другие элементы выглядели так, как будто этого элемента не было. - person Mierpo; 28.05.2020
comment
Этот ответ также работает для элементов css ::before. - person Lazerbeak12345; 06.11.2020

Из небольшого чтения кажется, что вы можете абсолютно позиционировать элемент, пока родительский элемент позиционируется относительно. Это означает, что если у вас есть CSS:

.parent { 
    position: relative; 
}
.parent > .child {
    position: absolute;
}

Тогда дочерний элемент вообще не будет занимать место в потоке документов. Затем вы можете расположить его, используя одно из свойств «слева», «снизу» и т. д. Относительное позиционирование родителя обычно не должно влиять на него, потому что по умолчанию он будет расположен в исходном положении, если вы не укажете «слева», «снизу» и т. д.

http://css-tricks.com/absolute-positioning-inside-relative-positioning/

person jeteon    schedule 17.01.2014

Вы просто удаляете этот элемент из потока документа, устанавливая position: absolute, и оставляете его предельную точку свободно перемещаться с динамическим потоком содержимого, не указывая свойства стиля left top right и bottom, которые заставят его использовать относительная конечная точка потока динамически. Таким образом, абсолютно позиционированный элемент будет следовать за потоком документа, не занимая при этом место.

Никакие фиктивные обертки не нужны.

person Bekim Bacaj    schedule 23.08.2017
comment
простой примерный код может помочь гораздо больше, чем читать и понимать весь параграф. Хотя идея ясна - person MR_AMDEV; 05.06.2019
comment
Это работает только в ограниченном случае, когда мы действительно не собираемся использовать координаты для сдвига абсолютного элемента куда-либо. Это кажется неестественным, поскольку, скорее всего, оно будет накладываться на следующие элементы потока. Джон Т. сделал пример здесь, но предложил установить одну из координат, чтобы сместить ее в сторону, если мы того захотим. Относительное решение-оболочка заключается именно в том, чтобы иметь возможность использовать относительные координаты, поэтому необходимость в нем зависит от того, что действительно хотел OP. - person Link-akro; 15.05.2021

У @Bekim Bacaj был идеальный ответ для меня, хотя это может быть не совсем то, что искал ОП (хотя его вопрос оставляет место для интерпретации). При этом Беким не привел примера.

<h1>Beneath this...</h1>
<style>
    .HoverRight {
        background: yellow;
        position: absolute;
        right: 0;
    }
</style>
<div class="HoverRight">Stuff and Things!</div>
<p>but, top = same as this paragraph.</p>

В приведенном выше примере создается элемент, который...

  • использует чистый и простой CSS и ничего больше
  • расположен вертикально, как если бы он был в потоке (настройка по умолчанию top)
  • располагается горизонтально у правого края страницы (right: 0)
  • не занимает места, но будет естественным образом перемещаться по мере прокрутки страницы (position: absolute)
person John T.    schedule 22.03.2018
comment
Результирующая координата зависит от ее самого внутреннего позиционированного родителя (я имею в виду свойство position, а не координаты), которое в вашем примере является телом, но может быть другим. Еще одна оболочка или надоедливое вычисление координат может залезть сюда. - person Link-akro; 15.05.2021
comment
Я не проверял, но думаю, что вы правы; мое упрощенное решение может работать только в этой простейшей форме, но не так сильно, когда оно глубоко зарыто в куче элементов, как на обычной веб-странице. Ах, CSS, почему ты так расстраиваешься? - person John T.; 17.05.2021

Для меня данные решения не работали нормально. Я хочу видеть h3, затем текст и после этого Bootstrap-панели, вертикально синхронизированные с этими панелями, я хочу видеть другие панели с правой стороны,

Мне удалось это с помощью оболочки height:0 и после этого position:relative;left:100% .

<link href="https://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet"/>
<div class="container">

    <div class="row">
        <div class="col-md-9">
            <div class="col-md-12">
                <h3> hello </h3>
            </div>
            <div class="col-md-12">
                <span> whats up? </span>
            </div>
            <div style="height:0" class="col-md-12">
                <div style="left:100%" class="col-md-3">
                    <div class="panel panel-default">
                        <div class="panel-heading">
                            <h3 class="panel-title">Panel title</h3>
                        </div>
                        <div class="panel-body">
                            <p>Panel Body</p>
                        </div>
                    </div>
                </div>
            </div>

            <div class="col-md-12">
                <div class="panel panel-default">
                    <div class="panel-heading">
                        <h3 class="panel-title">Panel title</h3>
                    </div>
                    <div class="panel-body">
                        <p>Panel Body</p>
                    </div>
                </div>
                <div class="panel panel-default">
                    <div class="panel-heading">
                        <h3 class="panel-title">Panel2 title</h3>
                    </div>
                    <div class="panel-body">
                        <p>Panel Body</p>
                    </div>
                </div>
            </div>

        </div>
        <div class="col-md-3">
            <!--placeholder-->
        </div>

    </div>
</div>

person Reiner    schedule 10.11.2016