pozycja: względna pozostawia puste miejsce

88

Kod jest tutaj: http://lasers.org.ru/vs/example.html

Jak usunąć puste miejsce pod głównym blokiem (#strona)?

Kir
źródło
Masz na myśli dolną wyściółkę, czy też całość ma wyśrodkować w pionie?
Alex
Czy masz na myśli spację między tekstem w div #page a obramowaniem? W przeciwnym razie nie jestem pewien, o jakiej przestrzeni mówisz.
Jeremy Battle
@Jeremy Battle Ja też nie mogę tego rozgryźć , chociaż wydaje się, że Guffa tak .
Alex
Ktoś jeszcze nie widzi tego problemu?
Myles Gray,
Zapoznaj się z odpowiedzią oznaczoną na [ stackoverflow.com/questions/13722095/… [1]: stackoverflow.com/questions/13722095/…
Sohel Pathan

Odpowiedzi:

36

Więc nie używaj pozycjonowania względnego. Element nadal zajmuje miejsce w miejscu, w którym był pierwotnie podczas korzystania z pozycjonowania względnego, i nie można się tego pozbyć. Możesz na przykład zamiast tego użyć pozycjonowania bezwzględnego lub sprawić, by elementy unosiły się obok siebie.

Bawiłem się trochę układem i proponuję zmienić te trzy zasady na:

#layout { width: 636px; margin: 0 auto; }
#menu { position: absolute; width: 160px; margin-left: 160px; }
#page { width: 600px; padding: 8px 16px; border: 2px solid #404241; }
Guffa
źródło
27
„i nie możesz się tego pozbyć”. - możesz. Po prostu użyj ujemnego marginesu, jak w odpowiedzi plang.
Michał K
5
@ MichałK: Nie, to tylko oznacza, że ​​nakładasz się na pustą przestrzeń innym elementem, a nie, że pozbywasz się pustej przestrzeni. Możesz używać tylko marginesów ujemnych, aby nakładać się na puste miejsce z pozycjonowania względnego o wielkości odpowiadającej rozmiarowi elementu.
Guffa
@ MichałK: Przegłosowanie tej odpowiedzi i innych zupełnie niezwiązanych ze sobą odpowiedzi nie pomaga, nadal nie możesz pozbyć się przestrzeni spowodowanej pozycjonowaniem względnym.
Guffa,
1
@ MichałK: Ponieważ można tylko zakryć przestrzeń i się jej nie pozbyć, trzeba mieć inne elementy, które są co najmniej tak duże, jak pusta przestrzeń, aby ją zakryć. Jeśli na przykład masz puste miejsce z elementu o wysokości 200 pikseli i masz tylko element o wysokości 100 pikseli do zakrycia otworu, nadal będziesz mieć 100 pikseli na lewo od otworu.
Guffa
1
Dlaczego głos przeciw? Jeśli nie wyjaśnisz, co Twoim zdaniem jest niewłaściwe, nie poprawi to odpowiedzi.
Guffa
183

Inną sztuczką, która działała dobrze, jest użycie ujemnego dołu marginesu we względnym elemencie, który przesunąłeś. Nie ma potrzeby stosowania pozycjonowania absolutnego.

Coś jak:

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

Podobne (jeśli nie identyczne) do rozwiązania, które widzę teraz, od zielonego.

plang
źródło
30
Świetna, prosta odpowiedź. I doskonały dowód na to, że HTML / CSS to freakshow.
Synesso
1
@plang, nie wydaje się działać. Zobacz jsfiddle.net/u7sq8rL7/1 . Zielone tło rozciąga się poza ostatni element.
Pacerier
1
@Pacerier Nie używaj margin-bottom. To oczywiście nie działa (pomyśl o tym); potrzebujesz marginesu.
William
2
To działa doskonale. I tak, używasz margin-bottomz liczbą ujemną, ponieważ chcesz pozbyć się dodatkowej przestrzeni na dole.
phocks
dobry, jeśli układ jest w dobrym stanie, będzie działał dobrze
Vitaliy Terziev
2

Wypróbuj tę regułę:

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

Zmieniłem pozycję na bezwzględną, co pozwala na korzystanie z bottom: 0nieruchomości.

Salman A
źródło
1
#page {
  padding-bottom: 0;
}

brak wyściółki na dole

Alex
źródło
To jest prawidłowa odpowiedź, ale powiedziałbym, że prawdopodobnie lepiej Ci będzie DZIĘKI dopełnieniem, ponieważ jest łatwiejsze do odczytania i bardziej standardowe w Internecie, aby mieć dopełnienie.
Bitwa Jeremy'ego
@Jeremy Battle Zdecydowanie wypełnienie wygląda znacznie lepiej.
alex
@Kir Możesz po prostu zmodyfikować swój obecny styl na dopełnienie: 8px 16px 0px; aby uniknąć dodatkowego wiersza w CSS.
Jeremy Battle
Uważam, że problemem jest 300px przestrzeń poniżej kontenera zawartości, a nie przestrzeń wewnątrz kontenera ...
Guffa
Scenariusz utworzy anonimowe pudełko wewnątrz elementu div (#page) i zgodnie ze specyfikacją CSS nie ma innego sposobu, aby bezpośrednio kontrolować anonimowe pudełko, a to anonimowe pudełko odziedziczy właściwość po swoim nadrzędnym (w tym przypadku #page). Dlatego lepiej zmienić nadrzędny element div, zmieniając jego właściwość, jak mówi @alex. Jeśli powyższe nie spełnia kryteriów, rozwiązaniem w tym scenariuszu jest również zastosowanie ujemnej marży.
kta
1

Miałem podobny problem. Najprostszym sposobem jest zastąpienie na górę margin-topdo #page.

Zielony
źródło
margin-top z wartością ujemną, zamiast top + margin-bottom, to najlepszy sposób
xtian
1

Miałem ten sam problem. Ujemny margines nie działał w moim przypadku, ponieważ pozostawiał ogromny biały obszar w miejscu, w którym był. Rozwiązałem ten problem w moim przypadku ręcznie wpisując wysokość.

.maincontent {
    height: 675px;
}
UkrVolk11
źródło
1

Moja odpowiedź jest spóźniona, ale może pomóc innym z podobnym problemem, który miałem.

Miałem <div>z, position: relative;gdzie wszystkie elementy potomne mają position: absolute;styl. Spowodowało to, że na mojej stronie pojawiło się około 20 pikseli białego miejsca.

Aby obejść ten problem, dodałem margin-top: -20px;do następnego elementu rodzeństwa po <div>with position: relative;.

Jeśli masz wcześniej element rodzeństwa, możesz użyć 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>

Gabriel Gates
źródło
0

Udało mi się pozbyć białych znaków za pomocą następującego frameworka:

Framework HTML-CSS

A oto znaczniki

<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>
Abel Callejo
źródło
0

Wydaje się, że odpowiedź na to pytanie jest dobra - jednak wszystkie powyższe odpowiedzi miały złe skutki uboczne w moim układzie. Oto, co naprawdę zadziałało dla mnie:

.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>

Gerfried
źródło
0

Najlepsze rozwiązanie, jeśli nie chcesz zostawiać spacji poniżej (względne)

Czy użyć marginesu góry i pozycji: lepka

#page {
     margin-top: -280px;
     position: sticky;
}
ztvmark
źródło