position: relative оставляет пустое место

87

Код здесь: http://lasers.org.ru/vs/example.html

Как убрать пустое место под основным блоком (# страница)?

Кир
источник
Вы имеете в виду нижнюю обивку или чтобы все было по центру вертикально?
Alex
Вы имеете в виду пробел между текстом в div #page и рамкой? В противном случае я не уверен, о каком пространстве вы говорите.
Джереми Бэттл
@Jeremy Battle Я тоже не могу понять, хотя Гуффа, кажется, догадался .
Alex
Кто-нибудь еще не видит этой проблемы?
Майлс Грей
См. Ответ, помеченный на [ stackoverflow.com/questions/13722095/… [1]: stackoverflow.com/questions/13722095/…
Sohel Pathan

Ответы:

35

Тогда не используйте относительное позиционирование. Элемент по-прежнему занимает место там, где он был изначально при использовании относительного позиционирования, и вы не можете от этого избавиться. Вы можете, например, использовать вместо этого абсолютное позиционирование или заставить элементы плавать рядом друг с другом.

Я немного поигрался с макетом и предлагаю вам изменить эти три правила на:

#layout { width: 636px; margin: 0 auto; }
#menu { position: absolute; width: 160px; margin-left: 160px; }
#page { width: 600px; padding: 8px 16px; border: 2px solid #404241; }
Гуффа
источник
27
"и вы не можете избавиться от этого". - вы можете. Просто используйте отрицательный запас, как в ответе на планга.
Michał K
5
@ MichałK: Нет, это означает только то, что вы перекрываете пустое пространство другим элементом, а не то, что вы избавляетесь от пустого пространства. Вы можете использовать только отрицательные поля, чтобы перекрыть пустое пространство от относительного позиционирования с размером элемента.
Guffa
@ MichałK: Голосование против этого ответа и других совершенно несвязанных ответов не помогает, вы все равно не можете избавиться от пространства, вызванного относительным позиционированием.
Guffa
1
@ MichałK: Поскольку вы можете только покрыть пространство, но не избавиться от него, у вас должны быть другие элементы, размер которых не меньше размера пустого пространства, чтобы покрыть его. Если у вас, например, есть пустое пространство от элемента высотой 200 пикселей и только элемент высотой 100 пикселей, чтобы закрыть отверстие, у вас все равно останется 100 пикселей слева от отверстия.
Guffa
1
Почему голос против? Если вы не объясните, что вы считаете неправильным, это не улучшит ответ.
Guffa
181

Другой трюк, который у меня отлично сработал, - использовать отрицательное поле margin-bottom в относительном элементе, который вы переместили. Нет необходимости использовать абсолютное позиционирование.

Что-то типа:

position: relative;
left: 100px
top: -200px;
margin-bottom: -200px;

Подобно (если не идентично) решению, которое я вижу сейчас, зеленым цветом.

удар
источник
28
Отличный простой ответ. И прекрасное доказательство того, что HTML / CSS - это шоу уродов.
Synesso
1
@plang, вроде не работает. См. Jsfiddle.net/u7sq8rL7/1 . Зеленый фон выходит за пределы последнего элемента.
Pacerier
1
@Pacerier Не используйте нижнее поле. Это явно не работает (подумайте); вам нужна маржа сверху.
Уильям
2
Это прекрасно работает. И да, вы используете margin-bottomс отрицательным числом, потому что вы хотите избавиться от лишнего места внизу.
phocks
хороший, если ваш макет в хорошем состоянии, он будет работать нормально
Виталий Терзиев
1
#page {
  padding-bottom: 0;
}

без нижней прокладки

Алекс
источник
Это правильный ответ, но я бы сказал, что вам, вероятно, лучше использовать отступы, поскольку их легче читать и они более стандартны в Интернете, чтобы иметь некоторые отступы.
Джереми Бэттл,
@Jeremy Battle Определенно, набивка выглядит намного лучше.
Alex
@Kir Фактически вы можете просто изменить свой текущий стиль на padding: 8px 16px 0px; чтобы избежать лишней строки в вашем CSS.
Джереми Бэттл
Я считаю, что проблема заключается в пространстве в 300 пикселей под контейнером с контентом, а не в пространстве внутри контейнера ...
Гуффа
Сценарий создаст анонимный блок внутри div (#page), и, согласно спецификации CSS, нет другого способа напрямую управлять анонимным блоком, и этот анонимный блок унаследует свойство от своего родителя (в данном случае #page). Так что лучше изменить родительский div, изменив его свойство, как говорит @alex. Если вышеперечисленное не соответствует критериям, тогда использование отрицательной маржи также является решением в этом сценарии.
kta
1

Попробуйте это правило:

#page {
  border: 2px solid #404241;
  bottom: 0;
  padding: 8px 16px;
  position: absolute;
  top: 70px;
  width: 600px;
}

Я изменил позицию на абсолютную, это позволяет использовать bottom: 0свойство.

Салман А
источник
1

У меня была аналогичная проблема. Самый простой способ заменить сверху на margin-topдля #page.

зеленый
источник
margin-top с отрицательным значением вместо top + margin-bottom
лучший
1

Я была такая же проблема. Отрицательная маржа не сработала для меня, так как оставила огромную белую область там, где она была раньше. В моем случае я решил эту проблему, введя высоту вручную.

.maincontent {
    height: 675px;
}
УкрВолк11
источник
1

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

Я был <div>с , position: relative;где все дочерние элементы имеют position: absolute;стиль. В результате на моей странице появилось около 20 пикселей белого пространства.

Чтобы обойти это, я добавил margin-top: -20px;к следующему элементу-брату после <div>с position: relative;.

Если у вас раньше был родственный элемент, вы можете использовать margin-bottom: -20px;

section {
  height: 200px;
}
<h2>Extra Whitespace</h2>
<section>
  <div>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  </div>
  <div style="position:relative;">
    <div style="position:relative; top: -20px; left:100px;">ABSOLUTE</div>
  </div>
  <div>
    Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </div>
</section>


<h2>No Whitespace margin-top</h2>
<section>
  <div>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  </div>
  <div style="position:relative;">
    <div style="position:relative; top: -20px; left:100px;">ABSOLUTE</div>
  </div>
  <div style="margin-top:-20px;">
    Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </div>
</section>


<h2>No Whitespace margin-bottom</h2>
<section>
  <div style="margin-bottom:-20px;">
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  </div>
  <div style="position:relative;">
    <div style="position:relative; top: -20px; left:100px;">ABSOLUTE</div>
  </div>
  <div>
    Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </div>
</section>

Габриэль Гейтс
источник
0

Мне удалось избавиться от пробелов, используя следующую структуру:

HTML-CSS фреймворк

А вот разметка

<div id="the-force-moved-element>I've been moved</div>
<div id="the-hack-part-1">
    <div id="the-hack-part-2>The quick brown fox jumps over the lazy dog</div>
</div>
<p>Lorem ipsum dolor sit amet...</p>
Абель Кальехо
источник
0

На этот вопрос, кажется, есть хороший ответ, однако все приведенные выше ответы имели плохие побочные эффекты в моем макете. Вот что действительно сработало для меня:

.moveUp {
    position: relative;
}
.moveUp > * {
    position: absolute;
    width: 100%;
    top: -75px;
}

/** This part is just design - ignore it ... ****/
.box1, .box2, .box3 {
    height: 100px;
    color: white;
}
.box1 {
    background: red;
}
.box2 {
    background: blue;
    height: 50px;
}
.box3 {
    background: green;
}
<div class="box1">Box 1</div>
<div class="moveUp"><div class="box2">Box 2 - 75px up</div></div>
<div class="box3">Box 3</div>

Герфрид
источник
0

Лучшее решение, если вы не хотите оставлять пробелы внизу (относительные)

Использовать margin-top и position: sticky

#page {
     margin-top: -280px;
     position: sticky;
}
ztvmark
источник