จัดแนวตั้งด้วย Bootstrap 3


889

ฉันใช้ Twitter Bootstrap 3 และฉันมีปัญหาเมื่อฉันต้องการจัดตำแหน่งแนวตั้งสองdivตัวอย่าง - ลิงค์ JSFiddle :

<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">

<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap-theme.min.css">

<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<div class="row">
  <div class="col-xs-5">
    <div style="height:5em;border:1px solid #000">Big</div>
  </div>
  <div class="col-xs-5">
    <div style="height:3em;border:1px solid #F00">Small</div>
  </div>
</div>

ระบบกริดใน Bootstrap ใช้float: leftไม่ใช่display:inline-blockดังนั้นคุณสมบัติvertical-alignจึงไม่ทำงาน ฉันพยายามใช้margin-topเพื่อแก้ไข แต่ฉันคิดว่านี่ไม่ใช่ทางออกที่ดีสำหรับการออกแบบที่ตอบสนองได้


1
ไม่มีผมต้องการที่จะจัดในแนวตั้ง 2 divไม่มีภายในข้อความบางอย่างเช่นนี้jsfiddle.net/corinem/Aj9H9แต่ในตัวอย่างนี้ผมไม่ได้ใช้บูต
corinem


6
สำคัญ: ทั้งสองคอลัมน์ต้องการคลาส "vcenter" มิฉะนั้นจะไม่ทำงาน ใช้เวลาหนึ่งชั่วโมงต่อชั่วโมงเพียงแค่หาว่า
Cymro

ไม่มีใครของคำตอบที่ทำงานได้อย่างสมบูรณ์ในโครเมี่ยม IE8 และโทรศัพท์มือถือสำหรับฉันกับแถวที่มี 5 col- (และ 3 col- บนมือถือ)
amdev

ใน Bootstrap 4 การจัดแนวกึ่งกลางแนวตั้งนั้นแตกต่างกันมาก: stackoverflow.com/a/41464397/171456
Zim

คำตอบ:


938

คำตอบนี้นำเสนอการแฮ็ก แต่ฉันขอแนะนำให้คุณใช้ flexbox (ดังที่ระบุไว้ใน@Haschem answer ) เนื่องจากขณะนี้รองรับทุกที่

ลิงก์สาธิต:
- Bootstrap 3
- Bootstrap 4 alpha 6

คุณยังสามารถใช้คลาสที่กำหนดเองเมื่อคุณต้องการ:

.vcenter {
    display: inline-block;
    vertical-align: middle;
    float: none;
}
<div class="row">
    <div class="col-xs-5 col-md-3 col-lg-1 vcenter">
        <div style="height:10em;border:1px solid #000">Big</div>
    </div><!--
    --><div class="col-xs-5 col-md-7 col-lg-9 vcenter">
        <div style="height:3em;border:1px solid #F00">Small</div>
    </div>
</div>

Bootply

การใช้inline-blockเพิ่มช่องว่างพิเศษระหว่างบล็อกถ้าคุณให้ช่องว่างจริงในโค้ดของคุณ (เช่น...</div> </div>...) พื้นที่พิเศษนี้แบ่งตารางของเราถ้าขนาดคอลัมน์รวมกันสูงสุด 12:

<div class="row">
    <div class="col-xs-6 col-md-4 col-lg-2 vcenter">
        <div style="height:10em;border:1px solid #000">Big</div>
    </div>
    <div class="col-xs-6 col-md-8 col-lg-10 vcenter">
        <div style="height:3em;border:1px solid #F00">Small</div>
    </div>
</div>

ที่นี่เรามีช่องว่างเพิ่มเติมระหว่าง<div class="[...] col-lg-2">และ<div class="[...] col-lg-10">(การขึ้นบรรทัดใหม่และ 2 แท็บ / 8 ช่องว่าง) และดังนั้น ...

ป้อนคำอธิบายภาพที่นี่

มาเพิ่มพื้นที่พิเศษกันเถอะ !!

<div class="row">
    <div class="col-xs-6 col-md-4 col-lg-2 vcenter">
        <div style="height:10em;border:1px solid #000">Big</div>
    </div><!--
    --><div class="col-xs-6 col-md-8 col-lg-10 vcenter">
        <div style="height:3em;border:1px solid #F00">Small</div>
    </div>
</div>

ป้อนคำอธิบายภาพที่นี่

สังเกตดูเหมือนความเห็นที่ไร้ประโยชน์<!-- ... -->? พวกมันมีความสำคัญ - หากไม่มีพวกเขาช่องว่างระหว่าง<div>องค์ประกอบจะใช้พื้นที่ในรูปแบบทำลายระบบกริด

หมายเหตุ: Bootply ได้รับการปรับปรุง


18
สิ่งนี้จะหยุดถ้าคุณระบุกริดคอลัมน์ที่เพิ่มได้สูงสุด 12 (เช่นการใช้col-lg-2และcol-lg-10) ที่น่าสนใจถ้าคุณเพิ่มรหัส JS ต่อไปนี้ (สมมติว่า jQuery) มันจะจัดการแก้ไขเอง:$('.row').html($('.vcenter'));
Jake Z

8
@pasemes นี้เกิดจากการที่ (ที่รู้จักกันดี) พื้นที่พิเศษinline-block ฉันให้ทางออกในการแก้ไขของฉัน
zessx

92
ส่วนที่มีความคิดเห็นว่างเปล่าให้ความรู้สึกเหมือนเวทย์มนตร์ลึกมืดมน และมันคือ. แต่บางคนตัดสินใจว่ามันควรจะทำงานได้
cfstras

5
แปลกใจที่ไม่มีใครพูดถึงเรื่องนี้ แต่แทนที่จะเป็นสิ่งความคิดเห็นคุณสามารถตั้งค่า "ขนาดตัวอักษร: 0;" บนพาเรนต์ของ div แบบอินไลน์บล็อกเพื่อลบ "พื้นที่ลึกลับ"
Poff

4
ไม่จำเป็นต้องใช้ความคิดเห็น html <! - -> หรือรหัสจาวาสคริปต์ใด ๆ เพื่อแก้ไขปัญหาพื้นที่พิเศษมีเคล็ดลับ CSS ที่ง่ายและมีประสิทธิภาพ: เคล็ดลับเชิงลบ เพียงเพิ่มระยะขอบขวา: -4px; กับคลาส. vcenter ผ่านการทดสอบและทำงานกับเบราว์เซอร์ทั้งหมด (ยกเว้น IE6 และ IE7 เก่า ... แต่ใครสนใจยุคก่อนประวัติศาสตร์))
Frank

897

เค้าโครงกล่องที่ยืดหยุ่น

กับการถือกำเนิดของCSS กล่องที่มีความยืดหยุ่นมากของฝันร้ายนักออกแบบเว็บ1ได้รับการแก้ไข หนึ่งในผู้ที่แฮ็คมากที่สุดคือการจัดเรียงในแนวตั้ง ตอนนี้มันเป็นไปได้ในความสูงที่ไม่รู้จัก

"การแฮ็กโครงร่างสองทศวรรษกำลังจะมาถึงจุดจบบางทีอาจไม่ใช่พรุ่งนี้ แต่ในไม่ช้าและตลอดชีวิตที่เหลือของเรา"

- CSS Legendary Eric MeyerในงานW3Conf 2013

กล่องที่ยืดหยุ่น (หรือเรียกสั้น ๆ ว่า Flexbox) เป็นระบบโครงร่างใหม่ที่ออกแบบมาโดยเฉพาะเพื่อวัตถุประสงค์ด้านการจัดวาง เปครัฐ :

เลย์เอาต์แบบยืดหยุ่นคล้ายกับบล็อกเลย์เอาต์ มันขาดคุณสมบัติข้อความหรือเอกสารเป็นศูนย์กลางที่ซับซ้อนมากขึ้นที่สามารถใช้ในรูปแบบบล็อกเช่นลอยและคอลัมน์ ในทางกลับกันจะได้รับเครื่องมือที่ง่ายและมีประสิทธิภาพสำหรับการกระจายพื้นที่และจัดเรียงเนื้อหาในแบบที่เว็บแอพพลิเคชั่นและเว็บเพจที่ซับซ้อนมักต้องการ

ในกรณีนี้มีประโยชน์อย่างไร เรามาดูกันดีกว่า


คอลัมน์จัดแนวตั้ง

ใช้ Twitter Bootstrap เรามี.rows มีบางส่วน.col-*ของ สิ่งที่เราต้องทำคือการแสดง.row2ที่ต้องการเป็นกล่องคอนเทนเนอร์แบบยืดหยุ่นแล้วจัดเรียงรายการดิ้นของมัน(คอลัมน์) ในแนวตั้งตามalign-itemsคุณสมบัติ

ตัวอย่างที่นี่ (โปรดอ่านความคิดเห็นด้วยความระมัดระวัง)

<div class="container">
    <div class="row vertical-align"> <!--
                    ^--  Additional class -->
        <div class="col-xs-6"> ... </div>
        <div class="col-xs-6"> ... </div>
    </div>
</div>
.vertical-align {
    display: flex;
    align-items: center;
}

ผลลัพธ์

คอลัมน์แนวตั้งในแนวตั้งใน Twitter Bootstrap

พื้นที่สีแสดงช่องว่างภายในของคอลัมน์

ชี้แจงเกี่ยวกับ align-items: center

8.3 การจัดแนวแกน: align-itemsคุณสมบัติ

รายการ Flexสามารถจัดตำแหน่งในแกนไขว้ของบรรทัดปัจจุบันของคอนเทนเนอร์ flex คล้ายกับjustify-contentแต่ในทิศทางตั้งฉาก align-itemsกำหนดจัดตำแหน่งเริ่มต้นสำหรับรายการทั้งหมดที่ภาชนะดิ้นรวมทั้งที่ไม่ระบุชื่อรายการดิ้น

align-items: center; ตามค่ากลางกล่องเฟล็กซ์ของสินค้ายืดหยุ่นจะอยู่กึ่งกลางในแกนไขว้ภายในบรรทัด


การแจ้งเตือนครั้งใหญ่

หมายเหตุสำคัญ # 1: Bootstrap Twitter ไม่ได้ระบุwidthคอลัมน์ในอุปกรณ์ขนาดเล็กพิเศษเว้นแต่คุณจะให้หนึ่งใน.col-xs-#คลาสของคอลัมน์

ดังนั้นในการสาธิตนี้ฉันใช้.col-xs-*คลาสเพื่อให้คอลัมน์แสดงอย่างถูกต้องในโหมดมือถือเพราะมันระบุwidthคอลัมน์อย่างชัดเจน

แต่คุณสามารถปิดเค้าโครง Flexbox ได้ง่ายๆโดยเปลี่ยนdisplay: flex;เป็นdisplay: block;ขนาดหน้าจอเฉพาะ ตัวอย่างเช่น

/* Extra small devices (767px and down) */
@media (max-width: 767px) {
    .row.vertical-align {
        display: block; /* Turn off the flexible box layout */
    }
}

หรือคุณอาจจะระบุ.vertical-align เพียงในขนาดหน้าจอที่เฉพาะเจาะจงเช่นดังนั้น:

/* Small devices (tablets, 768px and up) */
@media (min-width: 768px) {
    .row.vertical-align {
        display: flex;
        align-items: center;
    }
}

ในกรณีที่ผมไปกับ@KevinNelson 's วิธี

หมายเหตุสำคัญ # 2:คำนำหน้าผู้ขายละเว้นเนื่องจากความกะทัดรัด มีการเปลี่ยนแปลงไวยากรณ์ Flexbox ในช่วงเวลานั้น ไวยากรณ์ที่เขียนขึ้นใหม่จะไม่ทำงานบนเว็บเบราว์เซอร์เวอร์ชันเก่า (แต่ไม่เก่าเช่น Internet Explorer 9! Flexbox ได้รับการสนับสนุนบน Internet Explorer 10 และใหม่กว่า)

ซึ่งหมายความว่าคุณควรใช้คุณสมบัตินำหน้าผู้ขายเช่นdisplay: -webkit-boxในโหมดการผลิต

หากคุณคลิกที่"Toggle Compiled View"ในการสาธิตคุณจะเห็นการประกาศ CSS รุ่นนำหน้า (ขอบคุณAutoprefixer )


คอลัมน์ความสูงเต็มพร้อมเนื้อหาแนวตั้งแนวตั้ง

ดังที่คุณเห็นในการสาธิตก่อนหน้าคอลัมน์ (รายการเฟล็กซ์) ไม่สูงเท่ากับคอนเทนเนอร์ (กล่องเฟล็กซ์คอนเทนเนอร์อีกต่อไป).rowองค์ประกอบ)

นี่คือเนื่องจากการใช้centerค่าสำหรับalign-itemsคุณสมบัติ ค่าเริ่มต้นคือstretchเพื่อให้รายการสามารถเติมเต็มความสูงทั้งหมดขององค์ประกอบหลัก

ในการแก้ไขนั้นคุณสามารถเพิ่มลงdisplay: flex;ในคอลัมน์ได้เช่นกัน:

ตัวอย่างที่นี่ (อีกครั้งโปรดคำนึงถึงความคิดเห็น)

.vertical-align {
  display: flex;
  flex-direction: row;
}

.vertical-align > [class^="col-"],
.vertical-align > [class*=" col-"] {
  display: flex;
  align-items: center;     /* Align the flex-items vertically */
  justify-content: center; /* Optional, to align inner flex-items
                              horizontally within the column  */
}

ผลลัพธ์

คอลัมน์ความสูงเต็มพร้อมเนื้อหาแนวตั้งแนวตั้งใน Twitter Bootstrap

พื้นที่สีแสดงช่องว่างภายในของคอลัมน์

สุดท้ายขอให้สังเกตว่าการสาธิตและตัวอย่างโค้ดที่นี่มีจุดประสงค์เพื่อให้คุณมีแนวคิดที่แตกต่างเพื่อให้แนวทางที่ทันสมัยเพื่อให้บรรลุเป้าหมาย โปรดทราบส่วน "การแจ้งเตือนครั้งใหญ่ " หากคุณจะใช้วิธีการนี้ในเว็บไซต์หรือแอปพลิเคชันในโลกแห่งความเป็นจริง


สำหรับการอ่านเพิ่มเติมรวมถึงการสนับสนุนเบราว์เซอร์ทรัพยากรเหล่านี้จะเป็นประโยชน์:


1. จัดแนวตั้งภาพภายใน div มีความสูงตอบสนองได้ดี 2. .rowจะดีกว่าที่จะใช้ชั้นเพิ่มเติมเพื่อไม่ให้เปลี่ยนค่าเริ่มต้นของเงินทุน


9
หลังจากการวิจัยเล็กน้อยฉันพบว่า HTML5Please.com บอกว่ามีการสนับสนุนเพียงพอที่จะใช้ มันช่างน่ากลัวจริงๆ! html5please.com/#flexbox
Alec Moore

6
นี่เป็นทางออกที่ดีที่สุดและควรได้รับการสนับสนุนเพิ่มเติม และแน่นอนเรานักพัฒนาจะต้องใช้มันให้มากที่สุดเท่าที่จะทำได้เพื่อเผยแพร่มัน
Mateus Neves

12
ฉันลองสิ่งนี้และไม่ได้ผลกับฉันตามที่คาดหวังจนกว่าฉันจะไขปริศนาของคุณและรู้ว่าสิ่งนี้เป็นสิ่งที่ไม่สมควรและเสียเวลาเปล่า การทำเช่นนี้ทำให้พลาดจุดที่ตอบสนองต่อการออกแบบอย่างสมบูรณ์เนื่องจากคอลัมน์จะไม่เรียงซ้อนกันอีกต่อไปเมื่อคอลัมน์เหล่านั้นไม่พอดีกับหน้าจอดังนั้นจึงจำเป็นต้องใช้ bootstrap โดยไม่จำเป็นทั้งหมดและทำให้เว็บไซต์ของคุณไม่ตอบสนอง หากต้องการดูสิ่งที่ฉันหมายถึงให้เปลี่ยน col-xs- * เป็น col-xs-12 ในตัวอย่างที่เกี่ยวข้องทำให้หน้าจอเบราว์เซอร์ของคุณเล็กมาก (เช่นอุปกรณ์พกพา) และดูผลลัพธ์: ไม่มีการตอบสนองมากขึ้น
Pere

8
@HashemQolami แม้ว่าคุณจะใช้คลาสที่ชื่อcol-*ซอ / codepens ของคุณไม่ได้ใช้ bootstrap ดังนั้นพวกเขาจึงทำให้เข้าใจผิด ตัวอย่างของคุณใช้ไม่ได้กับ bootstrap ระบบกริดของมันไม่ได้มีพื้นฐานมาจากflexดังนั้นจึงไม่เข้ากัน ลองใช้ตัวอย่างของคุณในหน้าบู๊ทสแตรปและคุณจะรู้ว่ามันไม่ทำงาน
Pere

5
@Hashem Qolami ยังไม่พบกรณีการใช้งานสำหรับคำแนะนำของคุณ หนึ่งในแกนหลักของ Bootstrap คุณสมบัติที่น่าสะพรึงกลัวก็คือคอลัมน์จะเรียงซ้อนกันเมื่อไม่พอดีในแนวนอน แต่นั่นไม่ได้เกิดขึ้นอีกต่อไปด้วยโซลูชันของคุณ ระบบกริดทำงานได้แม้ว่าคุณจะโหลดสไตล์ตามที่คุณเห็นในซอนี้ ไม่มี js; เพียงแค่ CSS เปลี่ยนขนาดของพื้นที่การเรนเดอร์และมันจะตอบสนอง นั่นไม่ได้เกิดขึ้นในตัวอย่างใด ๆ ของคุณ วิธีการแบบ "มือถือก่อน" หายไปทำให้ Bootstrap ไม่จำเป็น ดังนั้นคำตอบนี้มันไม่ถูกต้องทำให้เข้าใจผิดหรือไม่สมบูรณ์
Pere

48

รหัสด้านล่างใช้งานได้สำหรับฉัน:

.vertical-align {
    display: flex;
    align-items: center;
}

4
วิธีที่ง่ายที่สุด IMHO
saiyancoder

3
ใครมีวิธีแก้ปัญหาที่ทำงานกับคอลัมน์เดียวได้หรือไม่ ฉันได้แถวแล้วเข้าไปข้างใน col-md-6 วิธีการแก้ปัญหานี้และส่วนที่เหลือของกล่องเฟล็กบ็อกซ์นั้นใช้ได้เมื่อมี 2 คอลัมน์เท่านั้น
Ka Mok

36

อัพเดท 2020

ฉันรู้ว่าคำถามดั้งเดิมนั้นสำหรับ Bootstrap 3 แต่ตอนนี้ Bootstrap 4 ได้เปิดตัวแล้วนี่คือคำแนะนำที่ได้รับการอัปเดตในศูนย์แนวตั้ง

สิ่งสำคัญ! แนวตั้งศูนย์กลางสัมพันธ์กับความสูงของผู้ปกครอง

หากผู้ปกครองขององค์ประกอบพยายามไปยังศูนย์ได้กำหนดไม่มี ความสูง , ไม่มีในโซลูชั่นที่ตรงกลางแนวตั้งจะทำงาน!

Bootstrap 4

ตอนนี้เงินทุน 4 เป็นflexbox โดยค่าเริ่มต้นมีหลายวิธีที่แตกต่างกันในการจัดตำแหน่งแนวตั้งโดยใช้: อัตโนมัติอัตรากำไรขั้นต้น , utils flexboxหรือutils จอแสดงผลพร้อมกับutils จัดแนวตั้ง ในตอนแรก "แนวการจัดแนวตั้ง" ดูเหมือนชัดเจน แต่สิ่งเหล่านี้ใช้ได้กับองค์ประกอบการแสดงผลแบบอินไลน์และตารางเท่านั้น ต่อไปนี้เป็นตัวเลือกการจัดกึ่งกลางแนวตั้ง Bootstrap 4 ..


1 - ศูนย์แนวตั้งโดยใช้ระยะขอบอัตโนมัติ:

my-autoวิธีการศูนย์แนวตั้งก็คือการใช้ สิ่งนี้จะอยู่ตรงกลางองค์ประกอบภายในคอนเทนเนอร์ ตัวอย่างเช่นh-100ทำให้แถวมีความสูงเต็มและmy-autoจะจัดแนวcol-sm-12คอลัมน์เป็นแนวตั้ง

<div class="row h-100">
    <div class="col-sm-12 my-auto">
        <div class="card card-block w-25">Card</div>
    </div>
</div>

Bootstrap 4 - ศูนย์กลางแนวตั้งโดยใช้การสาธิตระยะขอบอัตโนมัติ

my-auto แสดงระยะขอบบนแกน y ในแนวตั้งและเทียบเท่ากับ:

margin-top: auto;
margin-bottom: auto;

2 - ศูนย์แนวตั้งพร้อม Flexbox:

คอลัมน์กริดแนวตั้งแนวตั้ง

เนื่องจาก Bootstrap 4 .rowเป็นตอนนี้display:flexคุณสามารถใช้align-self-centerในคอลัมน์ใดก็ได้เพื่อจัดกึ่งกลางแนวตั้ง ...

       <div class="row">
           <div class="col-6 align-self-center">
                <div class="card card-block">
                 Center
                </div>
           </div>
           <div class="col-6">
                <div class="card card-inverse card-danger">
                    Taller
                </div>
          </div>
    </div>

หรือใช้align-items-centerทั้งหมด.rowเพื่อจัดกึ่งกลางแนวตั้งทั้งหมดcol-*ในแถว ...

       <div class="row align-items-center">
           <div class="col-6">
                <div class="card card-block">
                 Center
                </div>
           </div>
           <div class="col-6">
                <div class="card card-inverse card-danger">
                    Taller
                </div>
          </div>
    </div>

Bootstrap 4 - แนวตั้งตรงกลางคอลัมน์ความสูงที่แตกต่างกันสาธิต


3 - ศูนย์กลางแนวตั้งโดยใช้ประโยชน์จากการแสดงผล:

Bootstrap 4 มีutils จอแสดงผลที่สามารถนำมาใช้สำหรับdisplay:table, display:table-cell, display:inlineฯลฯ .. เหล่านี้สามารถใช้กับutils แนวตั้งที่จะจัดแบบอินไลน์, อินไลน์บล็อกหรือตารางองค์ประกอบของเซลล์

<div class="row h-50">
    <div class="col-sm-12 h-100 d-table">
        <div class="card card-block d-table-cell align-middle">
            I am centered vertically
        </div>
    </div>
</div>

Bootstrap 4 - ศูนย์กลางแนวตั้งโดยใช้อุปกรณ์แสดงผลสาธิต

ดูเพิ่มเติมที่: จัดแนวกึ่งกลางใน Bootstrap 4


Bootstrap 3

วิธี Flexbox บนคอนเทนเนอร์ของรายการถึงกึ่งกลาง:

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

เปลี่ยนวิธีการแปล Y:

.transform-center-parent {
    position: relative;
    transform-style: preserve-3d;
}

.transform-center {
    position: relative;
    top: 50%;
    transform: translateY(-50%);
}

แสดงวิธีการแบบอินไลน์:

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

ตัวอย่างวิธีการตั้งศูนย์กลาง Bootstrap 3


1
นี่คือเอกสาร Bootstrap สำหรับmx-auto(การจัดกึ่งกลางแนวนอน) ดังนั้นจึงเหมาะสมที่วางmy-autoแนวตั้ง (แกน y)
xinthose


21

ฉันคิดว่าฉันจะแบ่งปัน "โซลูชัน" ของฉันในกรณีที่ช่วยเหลือคนอื่นที่ไม่คุ้นเคยกับ @media

ต้องขอบคุณคำตอบของ @ HashemQolami ฉันได้สร้างข้อความค้นหาสื่อบางอย่างที่จะทำงานแบบเคลื่อนที่ได้เช่นคลาส col- * เพื่อให้ฉันสามารถวาง col- * สำหรับโทรศัพท์มือถือได้ แต่แสดงในแนวตั้งตรงกลางสำหรับหน้าจอขนาดใหญ่เช่น

<div class='row row-sm-flex-center'>
    <div class='col-xs-12 col-sm-6'></div>
    <div class='col-xs-12 col-sm-6'></div>
</div>

.

.row-xs-flex-center {
    display:flex;
    align-items:center;
}
@media ( min-width:768px ) {
    .row-sm-flex-center {
        display:flex;
        align-items:center;
    }
}
@media ( min-width: 992px ) {
    .row-md-flex-center {
        display:flex;
        align-items:center;
    }
}
@media ( min-width: 1200px ) {
    .row-lg-flex-center {
        display:flex;
        align-items:center;
    }
}

โครงร่างที่ซับซ้อนมากขึ้นซึ่งต้องการจำนวนคอลัมน์ที่แตกต่างกันต่อความละเอียดหน้าจอ (เช่น 2 แถวสำหรับ -xs, 3 สำหรับ -sm, และ 4 สำหรับ -md ฯลฯ ) จะต้องใช้การสร้างขั้นสูงเพิ่มเติม แต่สำหรับหน้าแบบง่ายด้วย -xs stacked และ -sm และใหญ่กว่าในแถวสิ่งนี้ใช้ได้ดี


ในกรณีของฉันฉันต้องเพิ่มclear: both;คลาสลงในเคียวรีสื่อบันทึกเพื่อให้สิ่งนี้ทำงานได้
motaa

1
@motaa, ขออภัยในความสับสน ... ใน BS3 แฟชั่นที่คุณสามารถเห็นในตัวอย่าง HTML ของฉันฉันใช้เป็น.rowตัวปรับแต่ง ... class="row row-sm-flex-center"ดังนั้นจึงควรมีลักษณะเช่น .rowคำจำกัดความของBS3 จัดการได้clear:both;
Kevin Nelson

ฉันควรวิเคราะห์โค้ด html ของคุณให้ละเอียดยิ่งขึ้น :) ฉันใช้. mod ปรับปรุงเช่นกัน แต่ในกรณีของฉัน (wordpress) มันมีการเปลี่ยนแปลงในชุดรูปแบบหลักซึ่งท้ายที่สุดก็ทำให้ฉันเพิ่มclear: both;อีกครั้ง
motaa

21

ทำตามคำตอบที่ยอมรับหากคุณไม่ต้องการปรับแต่งมาร์กอัปเพื่อแยกข้อกังวลหรือเพียงเพราะคุณใช้ CMS โซลูชันดังต่อไปนี้ใช้ได้ดี:

.valign {
  font-size: 0;
}

.valign > [class*="col"] {
  display: inline-block;
  float: none;
  font-size: 14px;
  font-size: 1rem;
  vertical-align: middle;
}
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet"/>
<div class="row valign">
   <div class="col-xs-5">
      <div style="height:5em;border:1px solid #000">Big</div>
   </div>
   <div class="col-xs-5">
       <div style="height:3em;border:1px solid #F00">Small</div>
   </div>
 </div>

ข้อ จำกัด ที่นี่คือคุณไม่สามารถสืบทอดขนาดแบบอักษรจากองค์ประกอบหลักได้เนื่องจากแถวตั้งค่าขนาดแบบอักษรเป็น 0 เพื่อลบช่องว่าง


20

ฉันชอบวิธีนี้ตามศูนย์ CSS แนวตั้งของ David Walsh :

.children{
    position: relative;
    top: 50%;
    transform: translateY(-50%);
}

transformไม่จำเป็น; เพียงแค่พบว่าศูนย์กลางมีความแม่นยำมากขึ้นอีกเล็กน้อย Internet Explorer 8 อาจอยู่กึ่งกลางผลลัพธ์เล็กน้อย แต่ก็ยังไม่เลว - ฉันสามารถใช้ - แปลง 2dได้หรือไม่


17

นี่คือทางออกของฉัน เพียงเพิ่มคลาสนี้ในเนื้อหา CSS ของคุณ

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

จากนั้น HTML ของคุณจะเป็นดังนี้:

<div class="col-xs-12 align-middle">
  <div class="col-xs-6" style="background-color:blue;">
    <h3>Item</h3>
    <h3>Item</h3>
  </div>
  <div class="col-xs-6" style="background-color:red;">
    <h3>Item</h3>
  </div>
</div>

.align-middle {
  display: flex;
  justify-content: center;
  align-items: center;
}
<html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<!DOCTYPE html>
    <title>Title</title>
  </head>
  <body>
    <div class="container">
      <div class="row">
        <div class="col-xs-12 align-middle">
          <div class="col-xs-6" style="background-color:blue;">
            <h3>Item</h3>
            <h3>Item</h3>
          </div>
          <div class="col-xs-6" style="background-color:red;">
            <h3>Item</h3>
          </div>
        </div>
      </div>
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
  </body>
</html>


1
นี่เป็นการแบ่งคลาสที่ตอบสนองเช่น col-md-6
Lucas Bustamante

15

ฉันเพิ่งทำสิ่งนี้และทำในสิ่งที่ฉันต้องการจะทำ

.align-middle {
  margin-top: 25%;
  margin-bottom: 25%;
}

และตอนนี้หน้าของฉันดูเหมือน

<div class='container-fluid align-middle'>
    content

 +--------------------------------+
 |                                |
 |  +--------------------------+  |
 |  |                          |  |
 |  |                          |  |
 |  |                          |  |
 |  |                          |  |
 |  |                          |  |
 |  +--------------------------+  |
 |                                |
 +--------------------------------+

ปัญหาของวิธีนี้คือดูเหมือนว่าจะไม่ทำงานเมื่อ DIV มีความสูงที่ระบุไว้: jsfiddle.net/4bpxen25/1 ฉันขอแนะนำ: stackoverflow.com/a/28519318/1477388
1477388

10

ฉันพบว่ารหัสต่อไปนี้ใช้งานได้จริงโดยใช้ Chrome ไม่ใช่เบราว์เซอร์อื่นที่ไม่ใช่คำตอบที่เลือกในปัจจุบัน:

.v-center {
    display:table!important; height:125px;
}

.v-center div[class*='col-'] {
   display: table-cell!important;
   vertical-align:middle;
   float:none;
}
.v-center img {
   max-height:125px;
}

เชื่อมโยงอย่างรวดเร็ว

คุณอาจต้องแก้ไขความสูง (โดยเฉพาะใน.v-center) และลบ / เปลี่ยน div div[class*='col-']ตามความต้องการของคุณ


8

ฉันพบปัญหาเดียวกันนี้ ในกรณีของฉันฉันไม่ทราบความสูงของคอนเทนเนอร์ด้านนอก แต่นี่เป็นวิธีที่ฉันแก้ไข:

ก่อนอื่นให้ตั้งค่าความสูงสำหรับองค์ประกอบhtmlและของคุณbodyเพื่อให้ได้ 100% นี้เป็นสิ่งสำคัญ! หากปราศจากสิ่งนี้องค์ประกอบhtmlและbodyองค์ประกอบก็จะสืบทอดความสูงของลูก ๆ

html, body {
   height: 100%;
}

จากนั้นฉันมีคลาสคอนเทนเนอร์ด้านนอกด้วย:

.container {
  display: table;
  width: 100%;
  height: 100%; /* For at least Firefox */
  min-height: 100%;
}

และสุดท้ายภาชนะภายในกับคลาส:

.inner-container {
  display: table-cell;
  vertical-align: middle;
}

HTML นั้นง่ายเหมือน:

<body>
   <div class="container">
     <div class="inner-container">
        <p>Vertically Aligned</p>
     </div>
   </div>
</body>

นี่คือทั้งหมดที่คุณต้องจัดแนวเนื้อหา ตรวจสอบในซอ:

Jsfiddle


8

ไม่จำเป็นต้องมีตารางและเซลล์ตารางใด ๆ สามารถทำได้อย่างง่ายดายโดยใช้การแปลงรูป

ตัวอย่าง: http://codepen.io/arvind/pen/QNbwyM

รหัส:

.child {
  height: 10em;
  border: 1px solid green;
  position: relative;
}
.child-content {
  position: absolute;
  top: 50%;
  left: 50%;
  -webkit-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" />
<div class="row parent">
  <div class="col-xs-6 col-lg-6 child">
    <div class="child-content">
      <div style="height:4em;border:1px solid #000">Big</div>
    </div>
  </div>
  <div class="col-xs-6 col-lg-6 child">
    <div class="child-content">
      <div style="height:3em;border:1px solid #F00">Small</div>
    </div>
  </div>
</div>


7

หากคุณใช้Bootstrap เวอร์ชันน้อยลงและรวบรวมเป็น CSS ด้วยตัวคุณเองคุณสามารถใช้คลาสยูทิลิตี้บางอย่างเพื่อใช้กับคลาส Bootstrap

ฉันพบว่าสิ่งเหล่านี้ทำงานได้ดีอย่างน่าอัศจรรย์ที่ฉันต้องการรักษาการตอบสนองและความสามารถในการกำหนดค่าของระบบกริดสแตรป (เช่นการใช้-mdหรือ-sm ) แต่ฉันต้องการคอลัมน์ทั้งหมดในแถวที่กำหนดให้ทุกคนมีความสูงแนวตั้งเท่ากัน จากนั้นจัดแนวเนื้อหาของพวกเขาในแนวตั้งและให้คอลัมน์ทั้งหมดในแถวแบ่งปันกลางทั่วไป)

CSS / หัก:

.display-table {
    display: table;
    width: 100%;
}
.col-md-table-cell {
    @media (min-width: @screen-md-min) {
        display: table-cell;
        vertical-align: top;
        float: none;
    }
}
.col-sm-table-cell {
    @media (min-width: @screen-sm-min) {
        display: table-cell;
        vertical-align: top;
        float: none;
    }
}
.vertical-align-middle {
    vertical-align: middle;
}

HTML:

<div class="row display-table">
    <div class="col-sm-5 col-sm-table-cell vertical-align-middle">
        ...
    </div>
    <div class="col-sm-5 col-sm-table-cell vertical-align-middle">
        ...
    </div>
</div>

6

ฉันได้อธิบายเล็กน้อยเกี่ยวกับคำตอบของ zessxเพื่อให้ง่ายต่อการใช้งานเมื่อผสมขนาดคอลัมน์ต่างๆกับขนาดหน้าจอที่แตกต่างกัน

หากคุณใช้Sassคุณสามารถเพิ่มไฟล์นี้ในไฟล์ scss ของคุณ:

@mixin v-col($prefix, $min-width) {
    @media (min-width: $min-width) {
        .col-#{$prefix}-v {
            display: inline-block;
            vertical-align: middle;
            float: none;
        }
    }
}

@include v-col(lg, $screen-lg);
@include v-col(md, $screen-md);
@include v-col(sm, $screen-sm);
@include v-col(xs, $screen-xs);

ซึ่งสร้าง CSS ต่อไปนี้ (ซึ่งคุณสามารถใช้โดยตรงในสไตล์ชีทของคุณหากคุณไม่ได้ใช้ Sass):

@media (min-width: 1200px) {
    .col-lg-v {
        display: inline-block;
        vertical-align: middle;
        float: none;
    }
}

@media (min-width: 992px) {
    .col-md-v {
        display: inline-block;
        vertical-align: middle;
        float: none;
    }
}

@media (min-width: 768px) {
    .col-sm-v {
        display: inline-block;
        vertical-align: middle;
        float: none;
    }
}

@media (min-width: 480px) {
    .col-xs-v {
        display: inline-block;
        vertical-align: middle;
        float: none;
    }
}

ตอนนี้คุณสามารถใช้มันในคอลัมน์ตอบสนองของคุณเช่นนี้:

<div class="container">
    <div class="row">
        <div class="col-sm-7 col-sm-v col-xs-12">
            <p>
                This content is vertically aligned on tablets and larger. On mobile it will expand to screen width.
            </p>
        </div><div class="col-sm-5 col-sm-v col-xs-12">
            <p>
                This content is vertically aligned on tablets and larger. On mobile it will expand to screen width.
            </p>
        </div>
    </div>
    <div class="row">
        <div class="col-md-7 col-md-v col-sm-12">
            <p>
                This content is vertically aligned on desktops and larger. On tablets and smaller it will expand to screen width.
            </p>
        </div><div class="col-md-5 col-md-v col-sm-12">
            <p>
                This content is vertically aligned on desktops and larger. On tablets and smaller it will expand to screen width.
            </p>
        </div>
    </div>
</div>

นี่เป็นสิ่งที่ดีจริงๆ!
Pietro Coelho

เพิ่มขึ้นเพียงเพราะไวยากรณ์สั้นและการใช้ตัวแปรน้อย
Eduard Luca

5

พฤติกรรมการทำงานของ Flex ได้รับการสนับสนุนตั้งแต่ Bootstrap 4 เพิ่มd-flex align-items-centerในrow div คุณไม่จำเป็นต้องแก้ไขเนื้อหา CSS อีกต่อไป

ตัวอย่างง่าย ๆ : http://jsfiddle.net/vgks6L74/

<!-- language: html -->
<div class="row d-flex align-items-center">
  <div class="col-5 border border-dark" style="height:10em">  Big </div>
  <div class="col-2 border border-danger" style="height:3em"> Small </div>
</div>

ด้วยตัวอย่างของคุณ: http://jsfiddle.net/7zwtL702/

<!-- language: html -->
<div class="row d-flex align-items-center">
    <div class="col-5">
        <div class="border border-dark" style="height:10em">Big</div>
    </div>
    <div class="col-2">
        <div class="border border-danger" style="height:3em">Small</div>
   </div>
</div>

ที่มา: Flex · Bootstrap


4

ตกลงโดยไม่ได้ตั้งใจฉันผสมโซลูชันสองสามอย่างเข้าด้วยกันและในที่สุดมันก็ใช้งานได้ในขณะนี้สำหรับเค้าโครงที่ฉันพยายามสร้างตาราง 3x3 ด้วยคอลัมน์ Bootstrap ด้วยความละเอียดที่เล็กที่สุด

/* Required styles */

#grid a {
  display: table;
}

#grid a div {
  display: table-cell;
  vertical-align: middle;
  float: none;
}


/* Additional styles for demo: */

body {
  padding: 20px;
}

a {
  height: 40px;
  border: 1px solid #444;
}

a > div {
  width: 100%;
  text-align: center;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />

<div id="grid" class="clearfix row">
  <a class="col-xs-4 align-center" href="#">
    <div>1</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>2</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>3</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>4</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>5</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>6</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>7</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>8</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>9</div>
  </a>
</div>



1

ลองนี้

.exe {
  font-size: 0;
}

.exe > [class*="col"] {
  display: inline-block;
  float: none;
  font-size: 14px;
  font-size: 1rem;
  vertical-align: middle;
}
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet"/>
<div class="row  exe">
   <div class="col-xs-5">
      <div style="height:5em;border:1px solid grey">Big</div>
   </div>
   <div class="col-xs-5">
       <div style="height:3em;border:1px solid red">Small</div>
   </div>
 </div>


1

มีหลายวิธีที่คุณสามารถทำได้:

  1. ใช้ 

    display: table-cell;
    vertical-align: middle;

    และ CSS ของคอนเทนเนอร์เพื่อ

    display: table;
  2. ใช้การขยายพร้อมกับหน้าจอสื่อบันทึกสำหรับการเปลี่ยนการขยายเมื่อเทียบกับขนาดหน้าจอ หน้าจอ Google @media เพื่อทราบข้อมูลเพิ่มเติม

  3. ใช้ช่องว่างภายใน

    คือระบุการเติมเต็มในรูปแบบของ%


0

ด้วย Bootstrap 4 (ซึ่งอยู่ใน alpha ปัจจุบัน) คุณสามารถใช้.align-items-centerคลาส ดังนั้นคุณสามารถรักษาการตอบสนองของ Bootstrap ได้ ทำงานได้ทันทีสำหรับฉัน ดูBootstrap 4 เอกสาร


ใช้งานได้กับบางรายการเมื่อองค์ประกอบที่มีแสดงเป็นแบบยืดหยุ่น
ซิม


-4

ฉันวิ่งเข้าไปในสถานการณ์เดียวกันกับที่ฉันต้องการจัดวางองค์ประกอบ div สองสามตัวในแนวตั้งและพบว่าคลาส Bootstrap col-xx-xx ใช้สไตล์กับ div เป็น float: left

ฉันต้องใช้สไตล์กับองค์ประกอบ div เช่น style = "Float: none" และองค์ประกอบ div ของฉันทั้งหมดเริ่มเรียงในแนวตั้ง นี่คือตัวอย่างการทำงาน:

<div class="col-lg-4" style="float:none;">

JsFiddle Link

ในกรณีที่มีคนต้องการอ่านเพิ่มเติมเกี่ยวกับคุณสมบัติลอย:

W3Schools - ลอยตัว


มันไม่ทำงานสำหรับฉัน ฉันทดสอบใน Firefox และ Chrome แผงทั้งหมดจะเรียงซ้อนกันในแนวตั้ง
Alf

ลอย: ไม่มีจะทำให้พวกเขาซ้อนกันในแนวตั้งนี่คือวิธีการทำงาน
อื่น ๆ

1
จากนั้นเป็นคำตอบที่ถูกต้องสำหรับคำถามอื่น ;)
Alf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.