Wyrównaj obraz do środka i środka w obrębie div

302

Mam następujące div

<div id="over" style="position:absolute; width:100%; height:100%>
 <img src="img.png">
</div>

Jak wyrównać obraz, aby znajdował się na środku i środku div?

Dro1n2
źródło
12
Duplikat zadał 2 minuty temu: CSS: obraz w środku
Pekka
1
Podobny temat tutaj: stackoverflow.com/questions/18516317/…
Hashem Qolami
Rozważ wybranie jednej odpowiedzi jako poprawnej.
McSonk,

Odpowiedzi:

406

body {
  margin: 0;
}

#over img {
  margin-left: auto;
  margin-right: auto;
  display: block;
}
<div id="over" style="position:absolute; width:100%; height:100%">
  <img src="http://www.garcard.com/images/garcard_symbol.png">
</div>

JSFiddle

Gurpreet Singh
źródło
4
display: block;była moja pułapka. TnX
Ujjwal Singh
2
Obserwowanie nie działa. Jaki popełniam błąd. <html> <head> <style> #over img {display: block; margines lewy: auto; margines z prawej: auto; } </style> </head> <body> <div id = "over" style = "pozycja: bezwzględna; szerokość: 100%; wysokość: 100%"> <img src = " img8a.flixcart.com/image/ tablet / f / k / t /… "> </div> </body> </html>
nizam.sp
1
Jeśli nie użyjemy display: blockdomyślnej wartości, display: inlinezgodnie z w3schools.com/cssref/pr_class_display.asp . Dlaczego musimy korzystać z bloku? Pracowałem dla siebie, ale nie jestem pewien, dlaczego blok wyśrodkuje obraz, a wbudowany nie.
user3731622,
ponieważ inline nie porusza się w linii, tak naprawdę jest w linii. więc auto margines jest nieskuteczne.
netalex
12
To nie wyrównuje się w pionie
alpadev
170
<div style="display:table-cell; vertical-align:middle; text-align:center">
<img src="img.png">
</div>
John K.
źródło
6
najlepsza odpowiedź, bardzo pomocna!
Ilian Andreev
1
Bardzo krótkie i łatwe rozwiązanie, ale wydaje się, że działa tylko ze stałą, nie procentową szerokością i wysokością. Działa z floatami, więc +1 za to. - jsfiddle.net/2s2nY/2
magnetronnie
1
ale robi to tylko wyrównanie w pionie, ale nie poziomo, prawda?
V-SHY,
1
Nie zadziała, jeśli szerokość obrazu będzie większa niż szerokość div.
Davuz
5
Jeśli usuniemy display: komórka tabeli; działa idealnie.
Ahesanali Suthar
103

Można to również zrobić za pomocą układu Flexbox:

ROZMIAR STATYCZNY

.parent {
    display: flex;
    height: 300px; /* Or whatever */
    background-color: #000;
}

.child {
    width: 100px;  /* Or whatever */
    height: 100px; /* Or whatever */
    margin: auto;  /* Magic! */
}
<div class="parent">
    <img class="child" src="https://i.vimeocdn.com/portrait/58832_300x300"/>
</div>

ROZMIAR DYNAMICZNY

html, body {
  width: 100%;
  height: 100%;
  display: flex;
  background-color: #999;
}

* {
  margin: 0;
  padding: 0;
}

.parent {
  margin: auto;
  background-color: #000;
  display: flex;
  height: 80%;
  width: 80%;
}

.child {
  margin: auto;  /* Magic! */
  max-width: 100%;
  max-height: 100%;
}
<div class="parent">
  <img class="child" src="https://i.vimeocdn.com/portrait/58832_300x300"/>
</div>

Znalazłem przykład w tym artykule , który świetnie się spisuje, wyjaśniając, jak używać układu.

aerdman
źródło
W rozmiarze statycznym nie ma potrzeby szerokości i wysokości dla dziecka (przynajmniej w mojej wersji Firefoksa).
Rodrigo
91

Wydaje mi się, że chciałeś również, aby ten obraz był wyśrodkowany pionowo w kontenerze. (Nie widziałem żadnej odpowiedzi, która to dałaby)

Working Fiddle:

  1. Rozwiązanie Pure CSS
  2. Nie przerywa przepływu dokumentów (brak pływaków lub pozycjonowanie bezwzględne)
  3. Kompatybilność z różnymi przeglądarkami (nawet IE6)
  4. Całkowicie responsywny.

HTML

<div id="over">
    <span class="Centerer"></span>
    <img class="Centered" src="http://th07.deviantart.net/fs71/200H/f/2013/236/d/b/bw_avlonas_a5_beach_isles_wallpaper_image_by_lemnosexplorer-d6jh3i7.jpg" />
</div>

CSS

*
{
    padding: 0;
    margin: 0;
}
#over
{
    position:absolute;
    width:100%;
    height:100%;
    text-align: center; /*handles the horizontal centering*/
}
/*handles the vertical centering*/
.Centerer
{
    display: inline-block;
    height: 100%;
    vertical-align: middle;
}
.Centered
{
    display: inline-block;
    vertical-align: middle;
}

Uwaga: to rozwiązanie dobrze jest wyrównać dowolny element w dowolnym elemencie. w przypadku IE7, gdy zastosujesz .Centeredklasę do elementów blokowych, będziesz musiał użyć innej sztuczki, aby uzyskać inline-blockdziałanie. (ponieważ ponieważ IE6 / IE7 nie działa dobrze z wbudowanym blokiem na elementach bloku)

avrahamcool
źródło
Zamiast mieć dodatkowe span, możesz użyć pseudoelementu :before: jsfiddle.net/xaliber/cj6zhtp0
deathlock
@deathlock to dobrze znane. ale celowałem w stare przeglądarki IE (które nie obsługiwały pseudo elementów).
avrahamcool
1
Nie jest, ale HTML powinien być używany tylko do struktury, a nie do prezentacji. Zadanie to pozostawiono CSS, stąd pseudoelement.
deathlock
1
Co masz na myśli mówiąc „Nie przerywanie przepływu dokumentów (brak pływaków lub pozycjonowanie bezwzględne)”? Co to jest #over { position:absolute; width:100%; height:100%;?
Rodrigo
1
@Rodrigo rzeczywiście, jeśli nie musisz celować w starsze przeglądarki, to Flexbox jest zalecanym podejściem.
avrahamcool,
62
img.centered {
   display: block;
   margin: auto auto;
}
Nitin
źródło
1
jest to bardzo podobne do tej odpowiedzi
suhailvs
32

Możesz to zrobić z łatwością za pomocą właściwości display: flex css

#over {
  height: 100%;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}
tanveer ahmad dar
źródło
To dla mnie działa. Obraz głęboko zagnieżdżony w PUG / SCSS. Dzięki.
Mogens TrasherDK
29
#over {position:relative; text-align:center; 
       width:100%; height:100%; background:#CCC;}

#over img{
    position: absolute;
    margin: auto;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
}
reż
źródło
To jest prawidłowa odpowiedź, która faktycznie koncentruje się zarówno pionowo, jak i poziomo.
Alexander Kim
Najlepsza jak dotąd odpowiedź.
kiran puppala
13

Nadal miałem problemy z innym rozwiązaniem przedstawionym tutaj. Wreszcie to działało najlepiej dla mnie:

<div class="parent">
    <img class="child" src="image.png"/>
</div>

css3:

.child {
 display: block;
 position: absolute;
 top: 50%;
 left: 50%;
 transform: translate(-50%, -50%);
 -webkit-transform: translate(-50%, -50%); /* Safari and Chrome */
 -moz-transform: translate(-50%, -50%); /* Firefox */
 -ms-transform: translate(-50%, -50%); /* IE 9 */
 -o-transform: translate(-50%, -50%); /* Opera */
 // I suppose you may like those too:
 // max-width: 80%;
 // max-height: 80%;
}

Możesz przeczytać więcej o tym podejściu na tej stronie .

pawel7318
źródło
Musiałem także dodać nadrzędny css, ale twój kod działał idealnie! pozycja: względna; szerokość: 100%; float: left; przelew: ukryty; min-wysokość: 189px;
user2593040,
10

Zasadniczo ustawienie prawego i lewego marginesu na auto spowoduje wyrównanie obrazu do środka.

<div id="over" style="position:absolute; width:100%; height:100%>
<img src="img.png" style="display: block; margin: 0 auto;">
</div>
Garconis
źródło
8

To byłoby prostsze podejście

#over > img{
    display: block;
    margin:0 auto; 
}
Sujay sreedhar
źródło
7

Odpowiedź Daaawx działa, ale myślę, że byłoby czystsze, gdybyśmy wyeliminowali wbudowany css.

body {
	margin: 0;
}

#over img {
	margin-left: auto;
	margin-right: auto;
	display: block;
}
div.example {
  position: absolute;
  width: 100%;
  height: 100%;
}
<div class="example" id="over">
	<img src="http://www.garcard.com/images/garcard_symbol.png">
</div>

Jaszczurka KG
źródło
6

ustawienie img do display: inline-block podczas Po ustawieniu najwyższej div do text-align: center również wykona zadanie

EDYCJA: do tych, którzy bawią się z displayem: blok wbudowany >>> nie zapomnij, że np. Dwa divy lubią

<div>Div1 content</div>NOSPACEHERE<div>Div2 content</div>

naprawdę nie ma między nimi spacji (jak widać tutaj).

Po prostu podstawowe, aby uniknąć tych (nieodłącznych bloków) luk między nimi. Luki te można zobaczyć między każdymi dwoma słowami, które piszę teraz! :-) Więc .. mam nadzieję, że to pomoże niektórym z was.

Sasha
źródło
6

PROSTY. 2018. FlexBox. Aby sprawdzić obsługę przeglądarki - czy mogę użyć

minimalnego rozwiązania:

div#over { 
   display: flex; 
   justify-content: center; 
   align-items: center; 
}


Aby uzyskać możliwie najszerszą obsługę przeglądarki:

div#over { 
   display: -webkit-flex;
   display: -ms-flex; 
   display: flex; 
   justify-content: center; 
   -ms-align-items: center; 
   align-items: center; 
}
Nadav
źródło
5

Próbowałem wielu podejść, ale tylko ten działa dla wielu elementów śródliniowych wewnątrz div kontenera. Oto kod do wyrównania wszystkiego w div na środku.

CSS

.divContainer
{
    vertical-align: middle;
    text-align: center; <!-- If you want horizontal center alignment -->
}
.divContainer > *
{
    vertical-align: middle;
}

HTML

<div class="divContainer">
    <span>Middle Text</span>
    <img src="test.png"/>
</div>

Przykładowy kod jest tutaj: https://jsfiddle.net/yogendrasinh/2vq0c68m/

Jogee
źródło
5

Plik CSS

.over {
    display : block;
    margin : 0px auto;
Sabarish R.
źródło
3

Wypróbuj ten minimalny kod:

<div class="outer">
    <img src="image.png"/>
</div>

I CSS:

.outer{
  text-align: center;
}
.outer img{
  display: inline-block;
}
luchopintado
źródło
3

Jesteśmy w 2016 roku ... dlaczego nie skorzystać z Flexboksa? Jest również responsywny. Cieszyć się.

#over{
display:flex;
align-items:center;
justify-content:center;
}
<div id="over">
	<img src="http://www.garcard.com/images/garcard_symbol.png">
</div>

GabMic
źródło
1
Uwielbiam css3! Dziękuję Ci. Warto jednak zauważyć, że będzie to działać tylko w nowoczesnych przeglądarkach (oprócz IE). Wszystkie inne przeglądarki nie będą działać.
Neel
2

wiele odpowiedzi sugeruje użycie, margin:0 autoale działa to tylko wtedy, gdy element, który próbujesz wyśrodkować, nie unosi się po lewej lub prawej stronie, to znaczy floatatrybut css nie jest ustawiony. Aby to zrobić, zastosuj displayatrybut do, table-cella następnie zastosuj margines lewy i prawy do auto, aby Twój styl wyglądałstyle="display:table-cell;margin:0 auto;"

Vikas Devde
źródło
2
    <div>
    <p style="text-align:center; margin-top:0px; margin-bottom:0px; padding:0px;">
    <img src="image.jpg" alt="image"/>
    </p>    
    </div>
betty.88
źródło
2

HTML:

<div id="over">
    <img src="img.png">
</div>

CSS:

#over {
  text-align: center;
}

#over img {
  vertical-align: middle;
}
Lahori
źródło
Najlepiej jest dodać komentarz, a nie tylko podrzucić kod.
Parkash Kumar
2

Do centrum poziomo Po prostu połóż

#over img {
    display: block;
    margin: 0 auto;
    clear:both;
}

Inna metoda:

#over img {
    display: inline-block;
    text-align: center;
}

Dla środka w pionie Wystarczy umieścić:

   #over img {

           vertical-align: middle;
        }
Sanjib Debnath
źródło
2

To działało dla mnie:

#image-id {
    position: absolute;
    top: 0; left: 0; right: 0; bottom: 0;
    width: auto;
    margin: 0 auto;
}
Sileria
źródło
2

to załatwiło sprawę.

<div class="CenterImage">
         <asp:Image ID="BrandImage" runat="server" />
</div>

„Uwaga: w tym przypadku nie należy przypisywać klasy css do„ BrandImage ”

CSS:

.CenterImage {
    position:absolute; 
    width:100%; 
    height:100%
}

.CenterImage img {
    margin: 0 auto;
    display: block;
}
julian9876
źródło
2

To zadziałało dla mnie, gdy musisz wyśrodkować wyrównywanie obrazu, a Twój div div do obrazu ma cały ekran. tj. wysokość: 100% i szerokość: 100%

#img{
    position:absolute;
    top:50%;
    left:50%;
    transform:translate(-50%,-50%);
}
Akshay Bande
źródło
1

Użyj pozycjonowania. Poniższe działało dla mnie ...

Przy powiększeniu do środka obrazu (obraz wypełnia div):

div{
    display:block;
    overflow:hidden;
    width: 70px; 
    height: 70px;  
    position: relative;
}
div img{
    min-width: 70px; 
    min-height: 70px;
    max-width: 250%; 
    max-height: 250%;    
    top: -50%;
    left: -50%;
    bottom: -50%;
    right: -50%;
    position: absolute;
}

Bez powiększenia do środka obrazu (obraz nie wypełnia div):

   div{
        display:block;
        overflow:hidden;
        width: 100px; 
        height: 100px;  
        position: relative;
    }
    div img{
        width: 70px; 
        height: 70px; 
        top: 50%;
        left: 50%;
        bottom: 50%;
        right: 50%;
        position: absolute;
    }
ThomasAFink
źródło
1

Zaznaczona odpowiedź nie spowoduje wyrównania obrazu w pionie. Odpowiednim rozwiązaniem dla nowoczesnych przeglądarek jest Flexbox. Elastyczny pojemnik można skonfigurować tak, aby wyrównywał jego elementy zarówno w poziomie, jak i w pionie.

<div id="over" style="position:absolute; width:100%; height:100%; display: flex; align-items: center; justify-content: center;">
    <img src="img.png">
</div>
WDuffy
źródło
To rozwiązanie odpowiada na pytanie i działa inaczej niż zaznaczona odpowiedź. Być może głosujący na głosujący mógłby podać szczegóły swojej decyzji o przegłosowaniu?
WDuffy
6
Z kolejki recenzji : Czy mogę prosić o dodanie kontekstu wokół kodu źródłowego. Odpowiedzi zawierające tylko kod są trudne do zrozumienia. Pomoże zarówno pytającemu, jak i przyszłym czytelnikom, czy możesz dodać więcej informacji w swoim poście.
RBT
1
To nie usprawiedliwia przegłosowania. Odpowiedź jest technicznie poprawna i pomogłaby przyszłym czytelnikom. Zaktualizowałem treść odpowiedzi, aby uszanować zasady obowiązujące w domu, ale być może zespół podstawowy powinien wdrożyć bardziej bezpośrednie rozwiązanie, ponieważ identyfikacja odpowiedzi zawierających tylko kod jest trywialnym zadaniem.
WDuffy
0

Możesz rzucić okiem na to rozwiązanie:

Centrowanie w poziomie i w pionie obrazu w pudełku

<style type="text/css">
.wraptocenter {
    display: table-cell;
    text-align: center;
    vertical-align: middle;
    width: ...;
    height: ...;
}
.wraptocenter * {
    vertical-align: middle;
}
.wraptocenter {
    display: block;
}
.wraptocenter span {
    display: inline-block;
    height: 100%;
    width: 1px;
}
</style>
<!--[if lt IE 8]-->
<style>
.wraptocenter span {
    display: inline-block;
    height: 100%;
}
</style>
<!--[endif]-->

<div class="wraptocenter"><span></span><img src="..." alt="..."></div>
fpauer
źródło
0

Prostym sposobem byłoby utworzenie osobnych stylów dla div i obrazu, a następnie ich niezależne ustawienie. Powiedz, że jeśli chcę ustawić pozycję obrazu na 50%, to mam kod, który wygląda następująco ....

#over{
  position:absolute;
  width:100%;
  height:100%;
}
#img{
  position:absolute;
  left:50%;
  right:50%;
}
<div id="over">
 <img src="img.png" id="img">
</div>

KSJ10
źródło
Po prostu powiedz mi, czy działa z wszystkimi rodzajami przeglądarek, mimo że jest to podstawowa rzecz, którą każda przeglądarka musi obsługiwać (w przeciwnym razie nie nazywaj jej przeglądarką)
KSJ10
0
#over {
    display: table-cell; 
    vertical-align: middle; 
    text-align: center;
    height: 100px;
}

Zmodyfikuj wartość wysokości do swoich potrzeb.

Terry Lin
źródło
0

To powinno działać.

WAŻNE DO TESTU: Aby uruchomić fragment kodu, kliknij lewy przycisk URUCHOM fragment kodu , a następnie prawy link Pełna strona

#fader{
position:fixed;z-index: 10;
top:0;right:0;bottom:0;left:0;
opacity: 0.8;background: black;
width:100%;height:100%;
text-align: center;
}
.faders{display:inline-block;height:100%;vertical-align:middle;}
.faderi{display:inline-block;vertical-align:middle;}
<div id="fader">
<span class="faders"></span>
<img class="faderi" src="https://i.stack.imgur.com/qHF2K.png" />
</div>

Intacto
źródło