Potrzebuję pomocy w nałożeniu jednej osoby div
na drugą div
.
Mój kod wygląda następująco:
<div class="navi"></div>
<div id="infoi">
<img src="info_icon2.png" height="20" width="32"/>
</div>
Niestety nie mogę zagnieździć div#infoi
ani pierwszego img
, ani pierwszego div.navi
.
div
Muszą to być dwa oddzielne s, jak pokazano, ale muszę wiedzieć, w jaki sposób mogę umieścić div#infoi
nad div.navi
i po prawej stronie i wyśrodkować na górze div.navi
.
overflow: hidden
, użyjoverflow: visible
zamiast niego.Odpowiedzi:
Sugerowałbym poznanie
position: relative
elementów dziecięcychposition: absolute
.źródło
absolute
ly pozycjonowane elementy są pozycjonowane względem ich najbliższego jawnie pozycjonowanego (position:absolute|relative|fixed
) elementu nadrzędnego. tylko dalsze wyjaśnienia ... jsfiddle.net/p5jkc8gzPrzyjęte rozwiązanie działa świetnie, ale IMO nie wyjaśnia, dlaczego działa. Poniższy przykład jest sprowadzony do podstaw i oddziela ważny CSS od nieistotnego CSS w stylu. Jako bonus zamieściłem również szczegółowe wyjaśnienie, jak działa pozycjonowanie CSS.
TLDR; jeśli chcesz tylko kod, przewiń w dół do wyniku .
Problem
Istnieją dwa oddzielne elementy, rodzeństwem, a celem jest, aby umieścić drugi element (o
id
oinfoi
) tak, że jest widoczny w poprzednim elementem (jednego zclass
znavi
). Struktury HTML nie można zmienić.Proponowane rozwiązanie
Aby osiągnąć pożądany rezultat, będziemy przesuwać lub ustawiać drugi element, który nazwiemy,
#infoi
aby pojawił się w pierwszym elemencie, który nazwiemy.navi
. W szczególności chcemy#infoi
znaleźć się w prawym górnym rogu.navi
.Wymagana wiedza na temat pozycji CSS
CSS ma kilka właściwości dla elementów pozycjonujących. Domyślnie wszystkie elementy są
position: static
. Oznacza to, że element zostanie umieszczony zgodnie ze swoją kolejnością w strukturze HTML, z kilkoma wyjątkami.Pozostałe
position
wartości sąrelative
,absolute
,sticky
, ifixed
. Ustawiając element naposition
jedną z tych innych wartości, można teraz zastosować kombinację następujących czterech właściwości do pozycjonowania elementu:top
right
bottom
left
Innymi słowy, ustawiając
position: absolute
, możemy dodać,top: 100px
aby ustawić element w odległości 100 pikseli od góry strony. I odwrotnie, jeśli ustawimy,bottom: 100px
element zostanie umieszczony 100 pikseli od dołu strony.Tutaj gubi się wielu początkujących CSS -
position: absolute
ma punkt odniesienia. W powyższym przykładzie ramką odniesienia jestbody
element.position: absolute
otop: 100px
oznacza, że element jest umieszczony 100 pikseli z górybody
elementu.Ramkę odniesienia lub kontekst pozycji można zmienić, ustawiając
position
element nadrzędny na dowolną wartość inną niżposition: static
. Oznacza to, że możemy utworzyć nowy kontekst pozycji, podając element nadrzędny:position: relative;
position: absolute;
position: sticky;
position: fixed;
Na przykład, jeśli
<div class="parent">
podano elementposition: relative
, wszystkie elementy potomne używają<div class="parent">
jako kontekstu pozycji. Gdyby podano element potomnyposition: absolute
itop: 100px
, element zostałby umieszczony 100 pikseli od góry<div class="parent">
elementu, ponieważ<div class="parent">
jest to teraz kontekst pozycji.Innym czynnikiem, o którym należy pamiętać, jest kolejność stosów - lub sposób układania elementów w kierunku Z. Trzeba tutaj wiedzieć, że kolejność elementów jest domyślnie definiowana przez odwrotność ich kolejności w strukturze HTML. Rozważ następujący przykład:
W tym przykładzie, jeśli dwa
<div>
elementy zostałyby umieszczone w tym samym miejscu na stronie,<div>Top</div>
element obejmowałby ten<div>Bottom</div>
element. Ponieważ<div>Top</div>
pojawia się<div>Bottom</div>
w strukturze HTML, ma wyższą kolejność układania.Pokaż fragment kodu
Kolejność układania można zmienić za pomocą CSS przy użyciu właściwości
z-index
luborder
.W tym wydaniu możemy zignorować kolejność układania, ponieważ naturalna struktura HTML elementów oznacza, że element, na którym chcemy się pojawić,
top
pojawia się po drugim elemencie.Wróćmy więc do problemu - użyjemy kontekstu pozycji, aby rozwiązać ten problem.
Rozwiązanie
Jak wspomniano powyżej, naszym celem jest takie umieszczenie
#infoi
elementu, aby pojawił się w.navi
elemencie. W tym celu zawiniemy elementy.navi
i#infoi
w nowy element<div class="wrapper">
, abyśmy mogli utworzyć nowy kontekst pozycji.Następnie należy utworzyć nowy kontekst pozycji dając .
.wrapper
position: relative
Dzięki temu nowemu kontekstowi pozycji możemy pozycjonować
#infoi
wewnątrz.wrapper
. Po pierwsze, daje , co pozwala nam na pozycji absolutnie .#infoi
position: absolute
#infoi
.wrapper
Następnie dodaj
top: 0
i,right: 0
aby ustawić#infoi
element w prawym górnym rogu. Pamiętaj, ponieważ ponieważ#infoi
element używa.wrapper
jako kontekstu pozycji, znajdzie się w prawym górnym rogu.wrapper
elementu.Ponieważ
.wrapper
jest to tylko pojemnik na.navi
, pozycjonowanie#infoi
w prawym górnym rogu.wrapper
daje efekt pozycjonowania w prawym górnym rogu.navi
.I mamy to,
#infoi
teraz wydaje się być w prawym górnym rogu.navi
.Wynik
Poniższy przykład sprowadza się do podstaw i zawiera minimalną stylizację.
Pokaż fragment kodu
Alternatywne rozwiązanie (siatka)
Oto alternatywne rozwiązanie z wykorzystaniem CSS Grid do pozycjonowania
.navi
elementu z#infoi
elementem po prawej stronie. Użyłem pełnychgrid
właściwości, aby było to jak najbardziej jasne.Pokaż fragment kodu
Alternatywne rozwiązanie (bez opakowania)
W przypadku, gdy nie możemy edytować żadnego HTML, co oznacza, że nie możemy dodać elementu opakowania, nadal możemy osiągnąć pożądany efekt.
Zamiast używać
position: absolute
na#infoi
elemencie użyjemyposition: relative
. To pozwala nam zmienić położenie#infoi
elementu z jego domyślnej pozycji poniżej.navi
elementu. Za pomocąposition: relative
możemy użyćtop
wartości ujemnej, aby przesunąć ją w górę z jej domyślnej pozycji, aleft
wartości100%
minus kilka pikseli, używającleft: calc(100% - 52px)
, aby ustawić ją w pobliżu prawej strony.Pokaż fragment kodu
źródło
Za pomocą
div
styluz-index:1;
iposition: absolute;
można nakładać swojejdiv
na dowolny innydiv
.z-index
określa kolejność, w jakiej div tworzy „stos”. Div z wyższymz-index
pojawi się przed div z niższymz-index
. Uwaga: ta właściwość działa tylko z elementami pozycjonowanymi .źródło
Nowa specyfikacja Grid CSS zapewnia znacznie bardziej eleganckie rozwiązanie. Używanie
position: absolute
może prowadzić do nakładania się lub problemów ze skalowaniem, podczas gdy Siatka uratuje cię przed brudnymi włamaniami CSS.Przykład minimalnej nakładki siatki:
HTML
CSS
Otóż to. Jeśli nie budujesz dla Internet Explorera, najprawdopodobniej twój kod będzie działał.
źródło
Oto proste rozwiązanie w 100% oparte na CSS. „Sekretem” jest użycie
display: inline-block
elementu otoki.vertical-align: bottom
Na obrazie jest hack do pokonania padding 4PX że niektóre przeglądarki dodać po elemencie.Rada : jeśli element przed opakowaniem jest w linii, mogą zostać zagnieżdżone. W takim przypadku możesz „owinąć opakowanie” wewnątrz pojemnika
display: block
- zwykle dobrym i starymdiv
.źródło
Oto, czego potrzebujesz:
źródło
Nie jestem zbytnim programistą ani ekspertem w dziedzinie CSS, ale nadal używam twojego pomysłu w moich projektach internetowych. Próbowałem też różnych rozdzielczości:
Oczywiście wokół nich będzie owijka. Możesz kontrolować lokalizację menu div, które będzie wyświetlane w div div nagłówka z lewym marginesem i górnymi pozycjami. Możesz także ustawić menu div tak, aby unosiło się w prawo, jeśli chcesz.
źródło
Oto prosty przykład na dodanie efektu nakładki z ikoną ładowania nad innym divem.
Wypróbuj tutaj: http://jsbin.com/fotozolucu/edit?html,css,output
źródło