2013-09-08 9 views
13

Po powrocie do programowania po czteroletniej przerwie, mam trudny czas w pionie wyrównując zawartość kolumny bootstrap 3 do następnej kolumny. Próbowałem przeszukać tę witrynę, jak również ogólne wyszukiwania ogólnie i nie znalazłem odpowiedniego rozwiązania ... lub moje wyszukiwane hasła są słabe.Wyrównaj pionowo zawartość kolumny Bootstrap 3

W poniższym kodzie HTML/CSS chciałbym wyśrodkować tekst "Tytuł strony" w lewej kolumnie. Chciałbym, aby HTML i CSS były jak najbardziej zwięzłe podczas korzystania z Bootstrap 3 CSS, więc myślę, że kompletnie brakuje mi czegoś prostego.

HTML

<div class="row page-header-box"> 
<div class="col-md-2 col-sm-2 col-xs-3 page-header-title">Page Title</div> 
<div class="col-md-10 col-sm-10 col-xs-9 page-header-seperator"> 
    <div class="page-header-description"><small>Standard Text Description</small></div> 
    <div class="page-header-alt"><small>Additional Text Description</small></div> 
</div> 

CSS

 
    .page-header-box { 
     background-color:#3D3D3D; 
     border-bottom:5px solid #b3b5b8; 
     margin-bottom:10px; 
    } 
    .page-header-title { color:#f79239;text-align:right;vertical-align:middle;margin:10px 0; } 
    .page-header-seperator { border-left:5px solid #4e2f91;margin:10px 0; } 
    .page-header-description { color:#febe10; } 
    .page-header-alt { margin-top:5px;color:#0093b2; } 

Oto jsFiddle ... http://jsfiddle.net/E6LcY/8/

Jest to jeden z niewielu razy, jaką kiedykolwiek napisanych, więc wskazując mnie w dobrym kierunku byłoby wspaniale.

+0

możliwy duplikat [wyrównanie w pionie elementów w div] (http://stackoverflow.com/questions/79461/vertical-alignment-elements-in-a-div) –

+0

Widziałem post, który był połączone wewnątrz tego SO ... "zrozumienie pionowego wyrównania ..." Jeśli to możliwe, chcę pozostać w ramach Bootstrap 3. Jeśli to nie jest możliwe, ponieważ mogę nie rozumieć użycia funkcji vertical-align, to po prostu zostawię css z wyrównanym tytułem u góry lewej kolumny. – ACG

+0

Zazwyczaj zignorowałem posty, które mają 5 lat, ponieważ założyłem, że stare status quo mogło się zmienić. Wygląda na to, że się mylę i powinienem zjeść wronę (która jest dość smaczna z wystarczająco ostrym sosem). Miałem nadzieję, że po prostu przegapiłem coś głupiego i naprawdę potrzebuję RTFM! Ponieważ tak naprawdę nie chcę zmieniać bootstrapu, mogę po prostu pozostać przy tym końcowym wydaniu i mieć tekst wyrównany do góry, a nie próbować wyrównywać go w pionie. http://jsfiddle.net/E6LcY/8/ Przepraszamy za zmarnowanie Twojego czasu. Może powinienem po prostu usunąć pytanie? – ACG

Odpowiedz

8

Uważałem usunięcie tego pytanie, ale myślę, że odpowiedź może być przydatna dla kogoś innego (jak ja), który szuka możliwego rozwiązania.

Chciałem pozostać w ramach Bootstrap 3 ... i skończyło się na dodaniu trochę kodu JavaScript, aby "uśredniony" był wyśrodkowany. Doszedłem do wniosku, że Bootstrap 3 w zasadzie wymaga jQuery dla pewnej funkcjonalności, więc było OK.

Teraz jestem pewien, że może być lepszy sposób, ale nie podobały mi się inne rozwiązania. Dzięki wszystkim, którzy usiłowali wprowadzić mnie na właściwe tory.

HTML

<div class="row page-header-box"> 
<div class="col-md-2 col-sm-2 col-xs-3 page-header-title" id="header-title">Page Title</div> 
<div class="col-md-10 col-sm-10 col-xs-9 page-header-seperator" id="header-seperator"> 
    <div class="page-header-description"><small>Standard Text Description Standard Text Description Standard Text Description Standard Text Description Standard Text Description Standard Text Description</small></div> 
    <div class="page-header-alt"><small>Additional Text Description</small></div> 
</div> 
</div> 

CSS

.page-header-box { 
background-color:#3D3D3D; 
border-bottom:5px solid #b3b5b8; 
margin-bottom:10px; 
} 
.page-header-title { color:#f79239;text-align:right;margin-bottom:10px; vertical-align: middle; } 
.page-header-seperator { border-left:5px solid #4e2f91;margin:10px 0; } 
.page-header-description { color:#febe10; } 
.page-header-alt { margin-top:5px;color:#0093b2; } 

JS (jQuery)

var sep_height = ''; 
$(window).on("load resize", function(e) { 
var seperatorHeight = $('#header-seperator').height(); 
if (seperatorHeight != sep_height) { 
    sep_height = seperatorHeight; 
    var titleHeight = $('#header-title').height(); 
    var difference = ((seperatorHeight - titleHeight)/2) + 5; 
    $('#header-title').css('margin-top', difference + 'px'); 
} 
}); 

Uwaga: "sep_height" jest po prostu tak, że nie robią niepotrzebnych obliczeń i zmieniaj tylko wysokość tytułu, kiedy zajdzie taka potrzeba. Dodaję również dodatkowe 5 pikseli do górnego marginesu, aby zrekompensować marginesy w tekście opisu.

Oto najnowszy skrzypce (z poprawką na zdarzenia onload): http://jsfiddle.net/E6LcY/15/

Jeszcze raz dziękujemy wszystkim, którzy pomogli.

+12

Używanie JS do formatowania to szaleństwo. Musi istnieć lepszy sposób osiągnięcia tego w ramach programu bootstrap 3. – Houman

+1

Chciałbym również lepsze rozwiązanie ... ale nie dostałem wielu sugestii, kiedy po raz pierwszy opublikowałem zapytanie. Powiedziałem nawet: "Teraz jestem pewny, że może być lepszy sposób, ale nie podobały mi się inne rozwiązania, dzięki wszystkim, którzy próbowali postawić mnie na właściwych ścieżkach". ... Jeśli masz lepsze rozwiązanie, to jestem wszystkim za to :) – ACG

+1

@Hooman Właściwie tam * jest * [lepszy sposób] (http://stackoverflow.com/questions/20547819/vertical-align-with- bootstrap-3/25517025 # 25517025), który jest nie tylko dla Twittera Bootstrap 3. Jeśli nie interesują Cię stare przeglądarki internetowe. –

0

Dodaj regułę: line-height: 45px; do klasy

UPDATED FIDDLE

+0

Nie zadziała, kiedy zmieni się właściwa zawartość "div". –

+0

Prawidłowo. Właściwy dział będzie rósł zgodnie z jego treścią. – ACG

+0

To jest pomocne - i jako osoba, która wciąż czuje się komfortowo z css, jest to [wersja oddzielona CSS] (http://jsfiddle.net/E6LcY/70/) – max

0

kol-MD-2, to jak to zrobić, możesz spróbować tego:

.Parentdiv{ 
position:relative; 
width:100%; 
height:100%; 
} 

.Parentdiv .childdiv{ 
position: absolute; 
top:0; 
bottom:0; 
margin:auto; 
} 
+0

Nie jasne, czy można zrobić dla tego JSFiddle? – Houman

+1

To nie działa. – Pere

0

W pewnym sensie zaczynam znużać się bootstrapem. Czasami ilość hakowania wymagana do osiągnięcia określonych funkcji nie jest warta rzekomych korzyści, jakie możesz uzyskać z jej używania.

W tym przypadku, zakończony archiwizacji funkcjonalność co potrzebne rezygnując bootstrap i stosując kombinację flexboxes z tych właściwości stosuje się do dominującej:

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

zagrożeń dla dzieci:

.parent > div { 
    display: inline-block; 
    vertical-align: middle; 
} 

i zapytanie o nośnik:

@media all and (max-width: 500px) { 
    .parent { 
    /* for small screens, we use column direction rather than row */ 
    flex-direction: column !important; 
    } 
} 

Podany html jest jak to:

<div class="parent"> 
    <div></div> 
    <div></div> 
    <div></div> 
    <div></div> 
    <div></div> 
</div> 

Użyłem tego na przykład dla stopki responsywnej. Gra z kombinacją pewnej ustalonej szerokości i marginesu (tak samo dla każdego), są ładnie wyrównane względem innych w różnych ilościach na wiersz, w zależności od szerokości ekranu, dopóki nie jest wystarczająco wąska, aby pokazać je tylko w jednym rzędzie .

Moim zdaniem, o wiele jaśniejsze, łatwiejsze, czystsze i mniej kodu, z lepszą reakcją, lepszą obsługą układu, unika używania javascript i bez całego narzutu i kłopotów z bootstrapem.