Pozycja względna czy bezwzględna?


155

Jaka jest różnica między position: relativei position: absolutew CSS? A kiedy należy użyć których?


2
Przedstawiłem tutaj szczegółowe wyjaśnienie ich działania
Mr. Alien,

Poradnik w3schools na temat stanowiska ładnie to wyjaśnia.
gnsb

1
Względnie ustawiony element jest ustawiony względem swojego normalnego położenia. Element pozycjonowany bezwzględnie jest określany względem pierwszego kontenera nadrzędnego, który ma pozycjonowanie bezwzględne lub względne. Jest tutaj świetny artykuł kolosek.com/css-position-relative-vs-position-absolute, wyjaśniający szczegółowo pozycje względne i bezwzględne.
Nesha Zoric

Odpowiedzi:


160

Bezwzględne pozycjonowanie CSS

position: absolute;

Pozycjonowanie bezwzględne jest najłatwiejsze do zrozumienia. Zaczynasz od positionwłaściwości CSS :

position: absolute;

To mówi przeglądarce, że wszystko, co ma zostać umieszczone, powinno zostać usunięte z normalnego przepływu dokumentu i zostanie umieszczone w dokładnym miejscu na stronie. Nie wpłynie to na to, jak elementy przed nim lub za nim w kodzie HTML są pozycjonowane na stronie internetowej, jednak będzie podlegać pozycjonowaniu jego rodziców, chyba że go zastąpisz.

Jeśli chcesz umieścić element w odległości 10 pikseli od góry okna dokumentu, możesz użyć topprzesunięcia do positionniego z absolutepozycjonowaniem:

position: absolute;
top: 10px;

Ten element będzie wtedy zawsze wyświetlany 10pxod góry strony, niezależnie od tego, jaka zawartość przechodzi przez, pod lub nad elementem (wizualnie).

Cztery właściwości pozycjonowania to:

  1. top
  2. right
  3. bottom
  4. left

Aby ich użyć, musisz myśleć o nich jako o właściwościach odsunięcia. Innymi słowy, umieszczony element right: 2pxnie jest przesuwany w prawo 2px. Jego prawa strona jest odsunięta od prawej strony okna (lub jego pozycji nadrzędnej nadrzędnej) o 2px. To samo dotyczy pozostałych trzech.

Względne pozycjonowanie

position: relative;

Względne pozycjonowanie wykorzystuje te same cztery właściwości absolutepozycjonowania co pozycjonowanie. Ale zamiast opierać pozycję elementu na porcie widoku przeglądarki, zaczyna się od miejsca, w którym znajdowałby się element, gdyby nadal znajdował się w normalnym przepływie .

Na przykład, jeśli masz trzy akapity na swojej stronie internetowej, a trzeci ma position: relativestyl umieszczony na nim, jego pozycja zostanie przesunięta w oparciu o jego bieżącą lokalizację, a nie od oryginalnych stron portu widoku.

Paragraf 1.

Pkt 2.

Pkt 3.

W powyższym przykładzie trzeci akapit zostanie umieszczony 3emod lewej strony elementu kontenera, ale nadal będzie znajdował się poniżej pierwszych dwóch akapitów. Pozostałby w normalnym obiegu dokumentu i zostałby nieznacznie przesunięty. Jeśli zmienisz to na position: absolute;, wszystko, co następuje po nim, będzie wyświetlane nad nim, ponieważ nie będzie już znajdować się w normalnym obiegu dokumentu.

Uwagi:

  • wartością domyślną widthelementu, który jest pozycjonowany absolutnie, jest szerokość zawartej w nim zawartości, w przeciwieństwie do elementu, który jest pozycjonowany względnie, gdzie domyślnie widthzajmuje 100%przestrzeń, którą może wypełnić.

  • Możesz mieć elementy, które nakładają się na elementy pozycjonowane absolutnie, podczas gdy nie możesz tego zrobić z elementami pozycjonowanymi względnie (natywnie, tj. Bez użycia ujemnych marginesów / pozycjonowania)


wiele wyciągniętych z: tego zasobu


159
Twierdzenia o pozycjonowaniu bezwzględnym są mylące. Elementy z pozycjonowaniem bezwzględnym są umieszczane względem pierwszego elementu nadrzędnego z pozycjonowaniem względnym lub bezwzględnym. Może to być najbardziej zewnętrzny element, ale nie musi (<html>). Wszystko zależy od tego, jakie elementy zawierają pozycję pozycjonowaną bezwzględnie. Inną dużą różnicą jest to, że elementy pozycjonowane bezwzględnie są usuwane z normalnego przepływu dokumentów, a elementy pozycjonowane względnie nie. Więc jeśli masz trzy <div> jeden na drugim i ustawisz środkowy na pozycjonowanie bezwzględne, górny i dolny <div> s zwiną się razem.
d512

11
@ user1334007 masz bardzo rację, nie krępuj się edytować mojego posta, ponieważ jestem obecnie zbyt kacowany, aby to zrobić sam.
Michael Zaporozhets

@ user1334007 tak, więc nie mogę zaakceptować recenzji ani niczego innego, ale dziś wieczorem dokonam kilku zmian ze względu na kilka punktów, które próbowałeś podnieść. Wyjaśniam wszystko w bardzo swobodny sposób, ponieważ nie jest to zbyt „podręcznikowe”, jednak treść, na którą się zgadzam, powinna być jak najbardziej dokładna.
Michael Zaporozhets

2
Ta odpowiedź nie wyraża tego stanowiska: absolutne; jest umieszczony względem najbliższego przodka
Savy Jcript

@AndreyMarushkevych zapraszam do zaproponowania zmiany odpowiedzi.
Michael Zaporozhets

52

Zarówno pozycjonowanie „względne”, jak i „absolutne” są naprawdę względne, tylko z różnymi ramami. Pozycjonowanie „bezwzględne” odnosi się do pozycji innego, otaczającego elementu. Pozycjonowanie „względne” odnosi się do pozycji, jaką sam element miałby bez pozycjonowania.

To zależy od Twoich potrzeb i celów, z których korzystasz. Pozycja „względna” jest odpowiednia, gdy chcesz przesunąć element z pozycji, którą miałby w innym przypadku w przepływie elementów, np. Aby niektóre znaki pojawiały się w pozycji indeksu górnego. Pozycjonowanie „absolutne” jest odpowiednie do umieszczenia elementu w jakimś układzie współrzędnych wyznaczonych przez inny element, np. W celu „nadrukowania” obrazu jakimś tekstem.

W szczególności użyj pozycjonowania „względnego” bez przemieszczenia (tylko ustawienie position: relative), aby uczynić element ramką odniesienia, tak aby można było użyć pozycjonowania „bezwzględnego” dla elementów, które się w nim znajdują (w znacznikach).


Relative positioning is relative to the position that the element itself would have without positioning?? Element bez pozycjonowania byłby domyślnie „statyczny”, ale nie względny
kittu

21

Kolejną rzeczą wartą uwagi jest to, że jeśli chcesz, aby element absolutny był ograniczony do elementu nadrzędnego, musisz ustawić pozycję elementu nadrzędnego na względną. To zachowa element potomny zawarty w elemencie nadrzędnym i nie będzie „względny” w stosunku do całego okna.

Napisałem post na blogu, który daje prosty przykład, który wywołuje następujący efekt:

wprowadź opis obrazu tutaj

Ma zielony element DIV, który jest bezwzględnie umieszczony na dole nadrzędnego żółtego elementu DIV.

1 http://blog.troygrosfield.com/2013/02/11/working-with-css-positions-creating-a-simple-progress-bar/


4
Element nadrzędny musi być „nie statyczny” - więc element nadrzędny może być względny, bezwzględny itp. ... Zaletą używania elementu względnego nadrzędnego jest to, że nie usuwa elementu z dokumentu.
Fernando,

19

Pozycja względna:

Jeśli określisz położenie: względne, możesz użyć opcji góra lub dół i lewo lub prawo, aby przesunąć element względem miejsca, w którym normalnie występowałby w dokumencie.

Pozycja bezwzględna:

Kiedy określisz położenie: bezwzględne, element jest usuwany z dokumentu i umieszczany dokładnie tam, gdzie mu polecisz.

Oto dobry poradnik http://www.barelyfitz.com/screencast/html-training/css/positioning/ z przykładowym użyciem obu pozycji z pozycjonowaniem bezwzględnym i względnym.


12

Względne: w odniesieniu do aktualnej pozycji, ale można je przenieść. Lub WZGLĘDNIE pozycjonowany element jest umieszczony względem SIEBIE.

Absolutne: element pozycjonowany BEZWZGLĘDNIE jest pozycjonowany względem SWOJEJ NAJBLIŻSZEJ POZYCJI RODZICIELSKIEJ. jeśli jest obecny, to działa jak ustalony ..... względem okna.

<div style="position:relative"> <!--2nd parent div-->
    <div>   <!--1st parent div-->
        <div style="position:absolute;left:10px;....."> <!--Middle div-->
          Md. Arif
       </div>
    </div>
</div>

Tutaj druga divpozycja nadrzędna jest względna, więc środek divzmieni swoją pozycję względem drugiego rodzica div. Jeśli pierwsza divpozycja nadrzędna byłaby względna, środek divzmieniłby swoją pozycję w stosunku do pierwszego rodzica div. Detale


2

Odpowiadam, bo moja reputacja nie wystarczy do komentarza. Ale nie traktuj tego jako odpowiedzi, tylko dodatkowe informacje, jak ja, miałem pewne problemy zarówno ze stopką, jak i pozycją.

Podczas konfigurowania strony tak, aby moja stopka zawsze znajdowała się na dole, z pozycją bezwzględną, a główny kontener / opakowanie z pozycją względną.

Następnie znalazłem pewne problemy z zawartością tekstu i menu w tej samej treści (biała część strony między nagłówkiem a stopką), po ustawieniu ich na wartość bezwzględną stopka nie pozostaje już opuszczona.

Postycjonowanie to, jak mówisz, złożony temat.

Moim rozwiązaniem, aby treść, którą chciałem w pozycji `` absolutnej '' na mojej stronie internetowej, i nie był zepchnięty na bok, gdy w przykładzie otwierając menu rozwijane, było faktycznie nadanie jej pozycji względnej i umieszczenie jej 35em poniżej mojego rozwijanego menu menu. (35em to wysokość mojego menu rozwijanego, gdy jest w pełni rozwinięte)

Następnie u góry: -35em, za treść, która wcześniej była wypychana na bok. A potem dodanie margin-bottom: -35em. W ten sposób zawartość znajduje się „pod” moim menu rozwijanym, ale wizualnie jest obok mojego menu rozwijanego! A biała przestrzeń poniżej do stopki ma tylko 10em marginesu, tak jak to było przed rozpoczęciem zabawy. Więc moje rozwiązanie było takie:

 html, body {
    margin:0;
    padding:0;
    height:100%;

}
h1 {
    margin:0;
}
    #webpage {
    position:relative;
    min-height:100%;
    margin:0;
    overflow:auto;
}
     #header {
    height:5em;
    width:100%;
    padding:0;
    margin:0;
}
     #text {
    position:relative;
   margin-bottom:-32em;
    padding-top:2em;
    padding-right:2em;
    padding-bottom:10em;
    background-repeat:no-repeat;
    width:70%;
    padding-left:auto;
    margin-left:auto;
    margin-right:auto;
    right:10em;
    float:right;
    top:-32em;
      }
#dropdown {

position:absolute;
    left:0;
    width:20%;
    clear:both;
    display:block;
    position:relative;
    top:1em;
    height:35em;

}
    #footer {
    position:absolute;
    width:100%;
    right:0;
    bottom:0;
    height:5em;
    margin:0;
     margin-top:5em;
}

Widzę, że odpowiedź na twoje pytanie jest dobra, ale po wielu kłopotach stwierdziłem, że jest to bardzo dobre rozwiązanie i sposób na lepsze zrozumienie, jak działa pozycjonowanie. Kiedy umieszczam treść tekstu, poniżej mojego rozwijanego menu, nie. t przesunąć mój tekst na bok. Jeśli zmieniłem tekst na pozycję bezwzględną, stopka nie pozostała na miejscu. Ponieważ mogę wierzyć, że jest to problem dla większej liczby osób niż ja, dodam to tutaj. Co się właściwie dzieje, umieszczam tekst, 35 ems, poniżej listy rozwijanej.

Następnie wizualnie stawiam obok siebie, z pozycją względną i górą: -35em; i wyrównuję ogromną przestrzeń poniżej, z marginesem: -35em;

wartości ujemne są czasami niedoceniane, bardzo dobra funkcjonalność, gdy lepiej zrozumie się te pozycje!

Naturalnie stała pozycja również wydawała się logiczna dla mojej stopki, ale naprawdę chcę, aby stopka znajdowała się poniżej widoku, jeśli tekst lub zawartość są dłuższe niż obszar roboczy. I pozostać na dole, jeśli na stronie jest mało treści.

Ten setupp naprawił to bardzo ładnie i pamiętaj, aby użyć 'em', a nie 'px', aby uzyskać bardziej płynny / dynamiczny układ strony! :)

(mogą być lepsze rozwiązania, ale to działa dla mnie na różnych platformach, a także na urządzeniach).


2

Względne a bezwzględne:

  • Różnica: w stosunku do siebie samego, w stosunku do najbliższego przodka.
  • Różnica: inne elementy wokół niego honorują jego stare istnienie, inne elementy wokół niego NIE szanują jego starego istnienia.
  • Podobieństwo: Inne elementy wokół niego NIE szanują jego nowego istnienia, inne elementy wokół niego NIE szanują jego nowego istnienia.

1

Omówmy scenariusz wyjaśniający różnicę między wartością bezwzględną a względną.

Powiedzmy, że wewnątrz elementu body masz element nagłówka, którego wysokość wynosi 95% wysokości widoku, czyli 95 vh. W tym kontenerze umieściłeś obraz i zmniejszyłeś jego krycie do 0,5. A teraz chcesz umieścić obraz logo w lewym górnym rogu. Mam nadzieję, że zrozumiałeś scenariusz. Będziesz miał więc jaśniejszy obraz w sekcji nagłówka z logo na górze w określonym miejscu.

Ale przed rozpoczęciem ustawiłem margines i dopełnienie na 0 w ten sposób

*{
   margin:0px;
   padding:0px;
   box-sizing: border-box; 
}

Dzięki temu do elementów nie są stosowane żadne domyślne marginesy i dopełnienie.

Możesz więc spełnić swoje wymagania na dwa sposoby.

Pierwszy sposób

  • dajesz klasę obrazowi powiedz logo.
  • w css piszesz

    .logo{ float:left; margin-top:40px; margin-left:40px; }

  • to umieściło logo na 40px od góry i po lewej stronie otaczającego elementu nadrzędnego, którym jest nagłówek. Obraz będzie wyglądał tak, jakby został umieszczony zgodnie z życzeniem.

Ale mój przyjacielu, to zły projekt, ponieważ umieszczanie obrazu, który niepotrzebnie pochłaniał tyle miejsca, daje mu pewien margines, gdy nie był potrzebny. Wszystko, czego potrzebujesz, to umieścić obraz w tej lokalizacji. Udało ci się to amortyzując marginesami dookoła. Margines zajął miejsce i wypchnął zawartość głębiej, dając wrażenie, że jest umieszczony dokładnie tam, gdzie chciałeś. Mam nadzieję, że zrozumiałeś problem, rozwiązując go w ten sposób. Zajmujesz więcej miejsca niż jest to wymagane, aby umieścić tylko obraz w wybranym miejscu.

Teraz spróbujmy innego podejścia.

Drugi sposób

  • obraz z klasą logo znajduje się wewnątrz elementu nagłówka, na przykład z klasą nagłówka. Więc klasa nadrzędna to nagłówek, a klasa podrzędna to logo, jak poprzednio.
  • ustawiasz właściwość position klasy nagłówka na względną w ten sposób

    .header{ position: relative; }

  • następnie dodano następujące właściwości do klasy logo

    .logo{ position:absolute; top:40px; left:40px }

Proszę bardzo. Obraz umieściłeś dokładnie w tym samym miejscu. Nie będzie widocznej różnicy w pozycjonowaniu gołym okiem między pierwszym a drugim podejściem. Ale jeśli przyjrzysz się elementowi obrazu, zobaczysz, że nie zajął on dodatkowej przestrzeni. Zajmuje dokładnie ten sam obszar, co jego własna szerokość i wysokość.

Więc jak to jest możliwe? Powiedziałem klasie image logo, że zostaniesz umieszczony względem klasy header, ponieważ jesteś dzieckiem tej klasy i specjalnie wspomniałem, że pozycja jest względna . Aby każde jego dziecko zostało umieszczone względem jego lewego górnego rogu. I że Twoja pozycja musi być ustalona wewnątrz tego elementu nadrzędnego. więc masz absolutne. I że musisz przesunąć się trochę od góry i od lewej do pozycji, w której chcę, żebyś się znalazł. W związku z tym otrzymujesz właściwość górną i lewą z wartością 40 pikseli. W ten sposób zostaniesz umieszczony w stosunku tylko do swojego rodzica. Więc jeśli jutro przeniosę twojego rodzica w górę, w dół lub gdziekolwiek, zawsze będziesz mieć 40 pikseli na górze i na lewo od lewego górnego rogu nagłówka twojego rodzica. Więc twoja pozycja jest ustalona wewnątrz twojego rodzica, bez względu na to, czy pozycja twojego rodzica jest stała, czy nie w przyszłości (ponieważ nie jest absolutna jak ty).

Dlatego użyj wartości względnej i bezwzględnej odpowiednio dla rodzica i dziecka. Po drugie, użyj go, jeśli chcesz umieścić element podrzędny tylko w jakimś miejscu wewnątrz elementu nadrzędnego. Nie używaj wypełniaczy, takich jak marginesy, aby wymusić nacisk. Podaj wartość względną rodzica i dziecko, które chcesz przenieść, wartość bezwzględną. Określ właściwość górną, lewą dolną lub prawą dla klasy podrzędnej, aby umieścić ją wewnątrz elementu nadrzędnego w dowolnym miejscu.

Dzięki.


0

Marco Pellicciotta: Pozycja elementu wewnątrz innego elementu może być względna lub absolutna, w odniesieniu do elementu, w którym się on znajduje.

Jeśli chcesz ustawić element w widoku okna przeglądarki, najlepiej użyć position: fixed

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.