Blok CSS wyświetla wbudowany blok?

207

Mam działający kod tutaj: http://jsfiddle.net/WVm5d/ (może być konieczne powiększenie okna wyników, aby zobaczyć efekt wyrównania do środka)

Pytanie

Kod działa dobrze, ale nie lubię go mieć display: table;. To jedyny sposób, aby uczynić centrum wyrównania klasy zawijania. Myślę, że byłoby lepiej, gdyby istniał sposób użycia display: block;lub display: inline-block;. Czy można rozwiązać centrum wyrównywania w inny sposób?

Dodanie stałej z do kontenera nie jest dla mnie opcją.

Wkleję też tutaj swój kod, jeśli łącze JS Fiddle zostanie zerwane w przyszłości:

body {
    background: #bbb;
}

.wrap {
    background: #aaa;
    margin: 0 auto;
    display: table;
    overflow: hidden;
}

.sidebar {
    width: 200px;
    float: left;
    background: #eee;
}

.container {
    margin: 0 auto;
    background: #ddd;
    display: block;
    float: left;
    padding: 5px;
}

.box {
    background: #eee;
    border: 1px solid #ccc;
    padding: 10px;
    margin: 5px;
    float: left;
}

.box:nth-child(3n+1) {
    clear: left;
}
<div class="wrap">
    <div class="sidebar">
        Sidebar
    </div>
    <div class="container">
        <div class="box">
            Height1
        </div>
        <div class="box">
            Height2<br />
            Height2
        </div>
        <div class="box">
            Height3<br />
            Height3<br />
            Height3
        </div>
        <div class="box">
            Height1
        </div>
        <div class="box">
            Height2<br />
            Height2
        </div>
        <div class="box">
            Height3<br />
            Height3<br />
            Height3
        </div>
    </div>
    <div class="sidebar">
        Sidebar
    </div>
</div>

Jens Törnell
źródło

Odpowiedzi:

79

Zaakceptowane rozwiązanie nie działałoby dla mnie, ponieważ potrzebuję elementu potomnego, który display: inline-blockpowinien być wyśrodkowany zarówno w poziomie, jak i w pionie w rodzicu o szerokości 100%.

Użyłem Flexboksa justify-contenti align-itemswłaściwości, które odpowiednio pozwalają wyśrodkować elementy poziomo i pionowo. Ustawiając oba elementy centerna obiekcie nadrzędnym, element potomny (lub nawet wiele elementów!) Będzie idealnie na środku.

To rozwiązanie nie wymaga stałej szerokości, co byłoby dla mnie nieodpowiednie, ponieważ tekst mojego przycisku zmieni się.

Oto demo CodePen i fragment odpowiedniego kodu poniżej:

.parent {
  display: flex;
  justify-content: center;
  align-items: center;
}

.child {
  display: inline-block;
}
<div class="parent">
  <a class="child" href="#0">Button</a>
</div>

EdA
źródło
1
To pytanie powstało przed Flexboksem, ale teraz to podejście jest lepsze, więc zaakceptowałem je jako odpowiedź.
Jens Törnell,
@ JensTörnell użycie bloku wbudowanego jest bezużyteczne w tym przypadku można je usunąć
Temani Afif
Jest to o wiele lepsze niż użycie centrum wyrównywania tekstu. Ta implementacja przecieka centrowanie tekstu do wszystkich komponentów potomnych. Nie rób tego
Śledź
265

Spróbuj tego. Dodałem text-align: centerdo ciała i display:inline-blockowinąć, a następnie usunąłem twojedisplay: table

body {
    background: #bbb;
    text-align: center;
}

.wrap {
    background: #aaa;
    margin: 0 auto;
    display: inline-block;
    overflow: hidden;
}
Bazzz
źródło
27
@zack divs działa jak tekst, gdy jest wyświetlany jako blok wbudowany. Możesz także używać takich rzeczy jak white-space: nowrap;na nich.
Użytkownik 2
5
a co jeśli nie chcę, aby WSZYSTKIE moje elementy bodybyły wyśrodkowane na tekst? dla mnie to brzmi jak ogromna przesada
phil294
4
@Blauhirn, po prostu stwórz opakowanie blokowe wokół elementu inline-block, a następnie ustaw właściwość css text-align: center; użył tagu ciała jako przykładu.
Arsalan Sheikh
71

Jeśli masz znak „ <div>a” text-align:center;, tekst w środku będzie wyśrodkowany względem szerokości tego elementu kontenera. inline-blockelementy są w tym celu traktowane jak tekst, więc zostaną również wyśrodkowane.

Spudley
źródło
2
Co powiesz na display: elementy wbudowane? Testowałem, że nie działa tak, jak się spodziewam
geckob
11

Możesz to również zrobić z pozycjonowaniem, ustawić div rodzica na względny i div dziecka na absolutny.

.wrapper {
      position: relative;
  }
.childDiv {
      position: absolute;
      left: 50%;
      transform: translateX(-50%);
  }
vijayscode
źródło
1

Nie musisz używać „display: table”. Powodem, dla którego twoja próba automatycznego wyśrodkowania marginesu 0 nie działa, jest to, że nie podałeś szerokości.

To będzie działać dobrze:

.wrap {
    background: #aaa;
    margin: 0 auto;
    width: some width in pixels since it's the container;
}

Nie musisz określać display: block, ponieważ ten div będzie domyślnie blokowany. Prawdopodobnie możesz także utracić przepełnienie: ukryte.


źródło
1

Podobnie jak w przypadku odpowiedzi @ vijayscode, poziomo wyśrodkuje on element wbudowanego bloku (ale bez konieczności modyfikowania stylów jego rodzica):

  display: inline-block;
  position: relative;
  left: 50%; // Move the element to the left by 50% of the container's width
  transform: translateX(-50%); // Calculates 50% of the element's width and moves it by that amount across the X-axis to the left
CodeBiker
źródło
0

Właśnie zmieniłem 2 parametry:

.wrap {
    display: block;
    width:661px;
}

Demo na żywo

Myles Gray
źródło
8
Ustawienie stałej za pomocą nie jest dla mnie opcją. Znaleziono inne rozwiązanie. W każdym razie dzięki.
Jens Törnell
2
Co to było?
RichieHH,
-6

Świetnym artykułem, który okazał się dla mnie najlepszy, było dodanie% do rozmiaru

.wrap {
margin-top:5%;
margin-bottom:5%;
height:100%;
display:block;}
Mitch
źródło
-9

Po prostu użyj:

line-height:50px

Zamień „50px” na tę samą wysokość co div.

użytkownik2694412
źródło
1
Dokładniej określ, gdzie dodać line-height.
Marcel Gwerder
Pierwotne pytanie dotyczyło centrowania poziomego, na co wskazuje użycie text-align: center;. Regulacja wysokości linii jest rozwiązaniem do centrowania w pionie, ale niezbyt solidnym rozwiązaniem dla bloku wbudowanego.
cdaddr