CSS wyrównaj w pionie pływające elementy DIV


89

Mam element div (#wrapper) zawierający 2 elementy div stojące obok siebie.

Chciałbym, aby prawy element div był wyrównany w pionie. Próbowałem wyrównać w pionie: do środka na moim głównym opakowaniu, ale to nie działa. Doprowadza mnie do szału!

Mam nadzieję, że ktoś może pomóc.

http://cssdesk.com/LWFhW

HTML:

<div id="wrapper">
  <div id="left-div">
    <ul>
      <li>One</li>
      <li>Two</li>
    </ul>
  </div>  
  <div id="right-div">
    Here some text...
  </div>
</div>

CSS:

#wrapper{
  width:400px;
  float:left;
  height:auto;
  border:1px solid purple;}

#left-div{
  width:40px;
  border:1px solid blue;
  float:left;}

#right-div{
  width:350px;
  border:1px solid red;
  float:left;}

ul{
  list-style-type: none;
  padding:0;
  margin:0;}

Odpowiedzi:


67

Nie masz szczęścia z elementami pływającymi. Nie przestrzegają wyrównania w pionie,

potrzebujesz display:inline-blockzamiast tego:

http://cssdesk.com/2VMg8

STRZEC SIĘ


Uważaj, display: inline-block;ponieważ interpretuje odstępy między elementami jako rzeczywiste odstępy. Nie ignoruje tego tak jak display: blockrobi.

Polecam:

Ustaw font-sizeelement zawierający na 0(zero) i zresetuj font-sizedo wymaganej wartości w takich elementach

ul {
    margin: 0;
    padding: 0;
    list-style: none;
    font-size: 0;
}
ul > li {
    font-size: 12px;
}

Zobacz demonstrację tutaj: http://codepen.io/HerrSerker/pen/mslay


CSS

#wrapper{
  width:400px;
  height:auto;
  border:1px solid green;
  vertical-align: middle;
  font-size: 0;
}

#left-div{
  width:40px;
  border:1px solid blue;
  display: inline-block;
  font-size: initial;
  /* IE 7 hack */
  *zoom:1;
  *display: inline;
  vertical-align: middle;
}

#right-div{
  width:336px;
  border:1px solid red;
  display: inline-block;  
  font-size: initial;
  /* IE 7 hack */
  *zoom:1;
  *display: inline;
  vertical-align: middle;
}
  

To nie zadziała, jeśli wysokość #wrapper jest stała. # Right-div jest wyśrodkowany względem # left-div , a nie względem elementu wrapper. ( inline-blocksprawia, że ​​zachowuje się jak inline imgz alignustawionym atrybutem)
Costa

@Costa Myślę, że tak powinno być.
yunzen

nie ma znaczenia, w jaki sposób powinien być, jest wiele przypadków, w których MUSISZ użyć elementu pływającego, a zawsze JEST sposób na zrobienie czegoś w CSS. zawsze. w najprostszym przypadku wyrównanie w pionie tekstu zmiennoprzecinkowego
vsync

11
ale twoje rozwiązanie również nie zadziała, ponieważ nie możesz po prostu zdecydować, aby NIE używać pływaków ... chodzi o to, aby jakoś wyrównać w pionie podczas używania pływaków.
vsync,

2
Chodziło mi tylko o to, że czasami inline-block nie było opcją i dawałem przypadek użycia, aby pomóc innym, którzy mogli skończyć na tej stronie z Google. Nie było potrzeby być niegrzecznym.
Jamie Barker

21

Możesz to zrobić dość łatwo za pomocą wyświetlania tabeli i wyświetlania tabeli-komórki.

#wrapper {
    width: 400px;
    float: left;
    height: auto;
    display: table;
    border: 1px solid green;
}

#right-div {
    width: 356px;
    border: 1px solid red;
    display: table-cell;
    vertical-align: middle;
}

EDYCJA: Właściwie szybko pomieszałem w CSS Desk - http://cssdesk.com/RXghg

KOLEJNA EDYCJA: Użyj Flexbox. To zadziała, ale jest dość przestarzałe - http://www.cssdesk.com/davf5

#wrapper {
    display: flex;
    align-items: center;
    border:1px solid green;
}

#left-div {
    border:1px solid blue;
}

#right-div {
    border:1px solid red;
}

1
Witaj SpaceBeers. Twoja sugestia nie działa dla mnie, ponieważ ukrywam przepełnienie right-div (właśnie dodałem kod do pulpitu css). W Twoim rozwiązaniu przepełnienie nie jest ukryte, element div rozszerza swoją szerokość ...
Marc,

11

Zdaję sobie sprawę, że to odwieczne pytanie, ale pomyślałem, że przydatne byłoby opublikowanie rozwiązania problemu z pionowym wyrównaniem pływaka.

Tworząc otokę wokół treści, która ma być umieszczona w dowolnym miejscu, możesz użyć pseudoselektorów :: after lub :: before, aby wyrównać zawartość w pionie. Możesz dowolnie dostosowywać rozmiar tej zawartości bez wpływu na wyrównanie. Jedynym haczykiem jest to, że owijka musi wypełniać 100% wysokości swojego pojemnika.

http://jsfiddle.net/jmdrury/J53SJ/

HTML

<div class="container">
    <span class="floater">
        <span class="centered">floated</span>
    </span>
    <h1>some text</h1>
</div>

CSS

div {
    border:1px solid red;
    height:100px;
    width:100%;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
.floater {
    float:right;
    display:inline-block;
    height:100%;
    box-sizing: border-box;
}
.centered {
    border:1px solid blue;
    height: 30px;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
h1 {
    margin:0;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
.container:after, .floater:after, .centered:after, h1:after {
    height:100%;
    content:'';
    font-size:0;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}

Nie jestem pewien, co zamierzasz, ale po usunięciu centeredklasy i oczyszczeniu wielu zbędnych rzeczy z tego CSS nadal wyrównuje w pionie, z tylko (przepraszam za utratę formatowania! ...):div { border:1px solid red; height:100px; } .floater { float:right; height:100%; } h1 { vertical-align:middle; } .container:after, .floater:after, .centered:after { height:100%; content:''; font-size:0; vertical-align:middle; display:inline-block; }
Sz.


2

Staram się unikać używania pływaków ... ale - w razie potrzeby wyrównuję pionowo do środka za pomocą następujących linii:

position: relative;
top: 50%;
transform: translateY(-50%);

-1

Jedynym minusem moich modyfikacji jest to, że masz ustawioną wysokość div ... Nie wiem, czy to dla ciebie problem, czy nie.

http://cssdesk.com/kyPhC


1
Cześć Sean. Dzięki, ale próbuję użyć elastycznego rozwiązania i mam nadzieję, że uniknę tego rodzaju rozwiązania ...
Marc
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.