วิธีการจัดแนวองค์ประกอบใน div?


792

ฉันมี div ที่มีสองภาพและ h1กับสองภาพและการอื่น ทั้งหมดของพวกเขาจะต้องอยู่ในแนวตั้งภายใน div ถัดจากกันและกัน

หนึ่งในภาพต้องมี absoluteอยู่ในตำแหน่งภายใน div

CSS จำเป็นสำหรับการทำงานกับเบราว์เซอร์ทั่วไปทั้งหมดอย่างไร

<div id="header">
    <img src=".." ></img>
    <h1>testing...</h1>
    <img src="..."></img>
</div>

14
ฉันทำรายการของวิธีทั้งหมดเพื่อจัดแนวตั้ง .. ฉันจะออกจากที่นี่: jsfiddle.net/techsin/FAwku/1
Muhammad Umer

2
นี่คือวิธีการง่ายๆสองวิธีในการจัดองค์ประกอบให้อยู่กึ่งกลางภายใน div, แนวตั้ง, แนวนอนหรือทั้งสอง (CSS บริสุทธิ์): stackoverflow.com/a/31977476/3597276
Michael Benjamin

1
margin-top: auto และ margin-bottom: auto (ทำงานได้หลายกรณี)
CrippledTable

คำตอบ:


932

ว้าวปัญหานี้กำลังเป็นที่นิยม มันขึ้นอยู่กับความเข้าใจผิดในvertical-alignสถานที่ให้บริการ บทความที่ยอดเยี่ยมนี้อธิบาย:

การทำความเข้าใจvertical-alignหรือ "วิธี (ไม่) เพื่อจัดเนื้อหาในแนวตั้ง"โดย Gavin Kistner

“ How to center in CSS”เป็นเครื่องมือบนเว็บที่ยอดเยี่ยมซึ่งช่วยในการค้นหาคุณลักษณะการจัดกึ่งกลาง CSS ที่จำเป็นสำหรับสถานการณ์ที่แตกต่างกัน


สั้น(และเพื่อป้องกันการเชื่อมโยงเน่า) :

  • องค์ประกอบ Inline (และเพียงองค์ประกอบแบบอินไลน์) vertical-align: middleสามารถจัดตำแหน่งในแนวตั้งในบริบทของพวกเขาผ่าน อย่างไรก็ตาม "บริบท" ไม่ใช่ความสูงของคอนเทนเนอร์หลักทั้งหมดเป็นความสูงของบรรทัดข้อความที่มีอยู่ตัวอย่าง jsfiddle
  • สำหรับองค์ประกอบบล็อกการจัดตำแหน่งแนวตั้งจะยากขึ้นและขึ้นอยู่กับสถานการณ์เฉพาะ:
    • ถ้าองค์ประกอบภายในสามารถมีความสูงคงที่คุณสามารถทำให้ตำแหน่งabsoluteและระบุของมันheight, margin-topและtopตำแหน่ง ตัวอย่าง jsfiddle
    • หากองค์ประกอบกึ่งกลางประกอบด้วยบรรทัดเดียว และ ความสูงหลักของมันได้รับการแก้ไขคุณสามารถตั้งค่าคอนเทนเนอร์line-heightให้เติมความสูงได้ วิธีนี้ค่อนข้างหลากหลายในประสบการณ์ของฉัน ตัวอย่าง jsfiddle
    • …มีกรณีพิเศษอีกมากมาย

142
ปัญหาเกี่ยวกับการแก้ปัญหา "ที่ถูกต้อง" (ไม่ใช่vertical-align: middle) คือคุณต้องระบุความสูงคงที่ ไม่สามารถทำได้สำหรับการออกแบบเว็บที่ตอบสนองได้
Emilie

1
ฉันมีโครงสร้างนี้: <div height = "## px"> ข้อความของฉัน </ div> ทำงานให้ฉันตั้ง lineHeight คุณสมบัติโดยใช้ค่าเดียวกับที่ใช้ในคุณสมบัติ div height: '## px' (## เพราะค่านี้ เป็นแบบไดนามิกในกรณีของฉัน) ขอบคุณ
patricK

8
นอกจากนี้ยังใช้งานได้กับinline-blockและtable-cellองค์ประกอบ หากคุณมีปัญหาเกี่ยวกับสิ่งนี้ลองปรับline-heightองค์ประกอบภาชนะ (เช่นบริบท) เนื่องจากมันถูกใช้ในการvertical-alignคำนวณกล่องรายการ
Alex W

1
css-tricks.com/centering-css-complete-guide <- ตัวเลือกที่ดีนำเสนอที่นี่ได้พบว่าตัวเองกำลังหันไปใช้วิธีแก้ปัญหาตาราง / เซลล์ตารางเวลาส่วนใหญ่แม้ว่า
shaunhusain

1
เครื่องมือนี้ (howtocenterincsss.com) นั้นยอดเยี่ยมมากเพราะมันใช้งานได้ดีใน CSS ของฉัน! นั่นหายากสุด ๆ จำวันเก่า ๆ ที่คุณต้องคัดลอกสไตล์ชีททั้งหมดจากตัวอย่างบางครั้งแม้แต่ตัวอย่าง HTML แล้วลบออกและเปลี่ยนชื่อองค์ประกอบทีละชิ้นจนกว่าจะเป็นสิ่งที่ฉันต้องการ ไม่ใช่สำหรับเว็บไซต์นี้!
konstantin

190

ขณะนี้การสนับสนุน flexbox เพิ่มขึ้น CSS นี้นำไปใช้กับองค์ประกอบที่มีจะจัดกึ่งกลางรายการที่มีอยู่ในแนวตั้ง:

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

ใช้รุ่นนำหน้าหากคุณต้องการกำหนดเป้าหมายไปที่ Explorer 10 และเบราว์เซอร์ Android เก่า (<4.4):

.container {
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;

    -ms-flex-align: center;
    -webkit-align-items: center;
    -webkit-box-align: center;

    align-items: center;
}

ทางออกที่ดีขอบคุณ คุณสามารถแนะนำวิธีทำให้ flexbox แสดงแถบเลื่อนแนวนอนในกรณีที่องค์ประกอบภายในใหญ่กว่าคอนเทนเนอร์หรือไม่ (ฉันพยายามที่จะทำให้องค์ประกอบภายใน zoomable / เลื่อนได้ภายในภาชนะเช่นผ้าใบใน PowerPoint)? เป็นไปได้หรือไม่?
Boris Burkov

1
@YazidErman โซลูชันนี้ขึ้นอยู่กับ flexbox ดังนั้นไม่สนับสนุน IE 10 ขึ้นไปเท่านั้นหรือเบราว์เซอร์ที่ทันสมัยอื่น ๆcaniuse.com/#search=flexbox Flexbox นั้นยอดเยี่ยมที่รองรับ แต่ไม่ได้อยู่ทุกที่ ตารางแสดงผลและเซลล์ตารางน่าจะเป็นทางออกที่ดีที่สุดจริง ๆ คอนเทนเนอร์ต้องเป็นตารางองค์ประกอบที่อยู่กึ่งกลางจะถูกห่อองค์ประกอบด้วยเซลล์ตารางแสดงผลจากนั้นก็สามารถจัดกึ่งกลางตามคำตอบอื่น ๆ ที่นี่ชี้ให้เห็น
shaunhusain

1
ทำไมสิ่งนี้จึงยากสำหรับฉันที่จะหา> <ขอบคุณสำหรับคำตอบ! สามารถยืนยันได้ว่านี่ใช้งานได้สำหรับฉันในสถานการณ์ที่คำตอบอื่นไม่ทำงาน
Michael McKenna

1
คำแนะนำเกี่ยวกับเทคนิค CSS ที่มีประโยชน์บน flexboxแล้วดูที่align-itemsส่วน
icc97

1
ในปี 2020 เราสามารถใช้ flexbox caniuse.com/#feat=flexbox
tonygatta

116

ฉันใช้รหัสง่าย ๆ นี้:

HTML:

<div class="ext-box">
    <div class="int-box">
        <h2>Some txt</h2>
        <p>bla bla bla</p>
    </div>
</div>

CSS:

div.ext-box { display: table; width:100%;}
div.int-box { display: table-cell; vertical-align: middle; }

เห็นได้ชัดว่าไม่ว่าคุณจะใช้.classหรือ#idผลจะไม่เปลี่ยนแปลง


3
นี่คือตัวอย่างเต็มรูปแบบของความเป็นไปได้ทั้งเก้าของการจัดแนว (บนกลางล่างสุดและซ้ายกลางขวา): jsfiddle.net/webMac/0swk9hk5
webMac

ในปี 2020 เราสามารถใช้ flexbox caniuse.com/#feat=flexbox
tonygatta

ทำงานที่สมบูรณ์แบบสำหรับฉัน
huynq0911

49

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

.vcontainer {
    min-height: 10em;
    display: table-cell;
    vertical-align: middle;
}

9
ดังนั้นจึงไม่มีองค์ประกอบ "บล็อก" อีกต่อไป
Pacerier

7
ถ้าคุณต้องการจัดแนวนอนด้วยmargin : 0 autoจะไม่ทำงานเพราะdisplay: table-cell
Ortomala Lokni

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

7
ฉันคิดว่าวิธีนี้เป็นวิธีที่เร็วและเข้าใจง่ายที่สุด อาจเป็นเพราะฉันไม่อดทนพอที่จะค้นหาคำตอบที่เลือก Flexbox ทุกสิ่ง!
modulitos

1
การเพิ่มการjustify-content: centerแก้ไขการขาดการจัดกึ่งกลางแนวนอนของฉัน
Samuel Slade

22

เทคนิคจากเพื่อนของฉัน:

HTML:

<div style="height:100px; border:1px solid;">
    <p style="border:1px dotted;">I'm vertically centered.</p>
</div>

CSS:

div:before {content:" "; display:inline-block; height:100%; vertical-align:middle;}
div p {display:inline-block;}

สาธิตที่นี่


1
เทคนิคนี้มีการอธิบายในรายละเอียดเพิ่มเติมได้ที่นี่: css-tricks.com/centering-in-the-unknown
nerdess

18

หากต้องการวางตำแหน่งองค์ประกอบของบล็อกไปที่กึ่งกลาง (ทำงานใน IE9 ขึ้นไป) ให้ใช้กระดาษห่อหุ้มdiv:

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

2
วิธีนี้สามารถทำให้องค์ประกอบเบลอเนื่องจากองค์ประกอบที่วางอยู่บน "ครึ่งพิกเซล" ทางออกสำหรับสิ่งนี้คือการกำหนดมุมมองขององค์ประกอบ เปลี่ยนรูป: เปอร์สเปคทีฟ (1px) translateY (-50%);
Simon

16

พวกเขาทั้งหมดจะต้องจัดตำแหน่งแนวตั้งภายใน div

สอดคล้องกับวิธี ? ท็อปส์ซูของภาพที่สอดคล้องกับด้านบนของข้อความ?

รูปภาพหนึ่งรูปต้องอยู่ในตำแหน่งที่แน่นอนภายใน div

ตำแหน่งที่แน่นอนเมื่อเทียบกับ DIV? บางทีคุณอาจจะร่างสิ่งที่คุณกำลังมองหา ... ?

fd ได้อธิบายขั้นตอนสำหรับการจัดตำแหน่งที่แน่นอนรวมถึงการปรับการแสดงผลของH1องค์ประกอบเพื่อให้ภาพปรากฏในแนวเดียวกัน หากต้องการฉันจะเพิ่มที่คุณสามารถจัดแนวภาพโดยใช้vertical-alignสไตล์:

#header h1 { display: inline; }
#header img { vertical-align: middle; }

... สิ่งนี้จะทำให้ส่วนหัวและรูปภาพเข้าด้วยกันโดยมีขอบด้านบนชิดกัน มีตัวเลือกการจัดตำแหน่งอื่น ๆ ; โปรดดูเอกสาร นอกจากนี้คุณยังอาจพบว่ามีประโยชน์ในการวาง DIV และย้ายรูปภาพภายในH1องค์ประกอบ - ซึ่งจะให้ค่าความหมายไปยังคอนเทนเนอร์และไม่จำเป็นต้องปรับการแสดงผลของH1:

<h1 id=header">
   <img src=".." ></img>
   testing...
   <img src="..."></img>
</h1>

15

ใช้สูตรนี้และมันจะทำงานได้ตลอดเวลาโดยไม่มีรอยแตก:

#outer {height: 400px; overflow: hidden; position: relative;}
#outer[id] {display: table; position: static;}

#middle {position: absolute; top: 50%;} /* For explorer only*/
#middle[id] {display: table-cell; vertical-align: middle; width: 100%;}

#inner {position: relative; top: -50%} /* For explorer only */
/* Optional: #inner[id] {position: static;} */
<div id="outer">
  <div id="middle">
    <div id="inner">
      any text
      any height
      any content, for example generated from DB
      everything is vertically centered
    </div>
  </div>
</div>


2
ฉันไม่เคยเห็นใน css ตัวเลือกประเภทนี้ "#outer [id]" สิ่งที่ควรทำ ถ้าฉันจะมีคลาสแทนที่จะเป็น id ล่ะ
Alexa Adrian

12

วิธีการเกือบทั้งหมดต้องระบุความสูง แต่บ่อยครั้งที่เราไม่มีความสูง
ดังนั้นนี่คือเคล็ดลับบรรทัด CSS3 3 ที่ไม่จำเป็นต้องทราบความสูง

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

มันรองรับแม้ใน IE9

ด้วยคำนำหน้าผู้จัดจำหน่าย:

.element {
    position: relative;
    top: 50%;
    -webkit-transform: translateY(-50%);
    -ms-transform: translateY(-50%);
    transform: translateY(-50%);
}

ที่มา: http://zerosixthree.se/vertical-align-anything-with-just-3-lines-of-css/


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

ใช่มันใช้งานได้เฉพาะในบางกรณีฉันมีปัญหาในภายหลังด้วยวิธีนี้ ... สิ่งนี้คือการมีความเป็นไปได้มากที่สุดเท่าที่จะเป็นไปได้และทันทีที่คุณต้องการสิ่งที่คุณทดสอบทั้งหมดจนกว่าคุณจะได้วิธีที่ดี มีสิ่งที่จะไม่ทำงานในกรณีที่เฉพาะเจาะจง ...
Shadoweb

12

ในสองวิธีคุณสามารถจัดตำแหน่งองค์ประกอบในแนวตั้งและแนวนอน

  1. Bootstrap 4
  2. CSS3

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

1. Bootstrap 4.3.X

สำหรับการจัดตำแหน่งแนวตั้ง: d-flex align-items-center

สำหรับการจัดตำแหน่งแนวนอน: d-flex justify-content-center

.container {
    height: 180px;
    width:100%;
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" 
rel="stylesheet"/>

<div class="d-flex align-items-center justify-content-center bg-info container">
  <div class="bg-light p-2">I am in Center</div>
</div>

2. CSS3

.container {
    display: flex;
    align-items: center;  // verticall center
    justify-content: center; // horizontally center

    background-color: #17a2b8;
    height: 180px;
    width:100%;
}

.child {
  background-color: #f8f9fa;
  padding: 0.5rem;
}
<div class="container">
  <div class="child">I am in Center</div>
</div>


1
โดยทั่วไปแล้วทั้งสองวิธีจะเหมือนกันเนื่องจาก Bootstrap ใช้แอตทริบิวต์ flex แบบเดียวกันในคลาส
Mx

Bootstrap ไม่ใช่เวทมนต์ มันขึ้นอยู่กับข้อ จำกัด CSS เดียวกันที่มีผลกับทุกคน มันแค่ซ่อนสิ่งที่มันทำจากค่าเฉลี่ย ผู้ใช้งาน
JasonGenX

10

เคล็ดลับของฉันคือการวาง div ในตารางที่มี 1 แถวและ 1 คอลัมน์ตั้งค่าความกว้างและความสูง 100% และคุณสมบัติจัดเรียงแนวตั้ง: กลาง

<div>

    <table style="width:100%; height:100%;">
        <tr>
            <td style="vertical-align:middle;">
                BUTTON TEXT
            </td>
        </tr>
    </table>

</div>

ซอ: http://jsfiddle.net/joan16v/sbqjnn9q/


7
นี่เป็นวิธีที่ดีที่สุดในการหลีกเลี่ยงการเกาหัว ฉันยังสับสนว่าทำไม CSS ไม่มีมาตรฐานการจัดตำแหน่งแนวตั้ง
Kokodoko

5

# 3 วิธีทำให้ div center child ใน div parent

  • วิธีการจัดตำแหน่งแบบสัมบูรณ์
  • วิธีการ Flexbox
  • วิธีการแปลง / แปล

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

    การสาธิต

/* 1st way */
.parent1 {
  background: darkcyan;
   width: 200px;
   height: 200px;
   position: relative;
}
.child1 {
  background: white;
  height: 30px;
  width: 30px;
  position: absolute;
  top: 50%;
  left: 50%;
  margin: -15px;
}

/* 2nd way */
.parent2 {
  display: flex;
  justify-content: center;
  align-items: center;
  background: darkcyan;
  height: 200px;
  width: 200px;
}
.child2 {
  background: white;
  height: 30px;
  width: 30px;
}

/* 3rd way */
.parent3 {
  position: relative;
  height: 200px;
  width: 200px;
  background: darkcyan;
}
.child3 {
  background: white;
  height: 30px;
  width: 30px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
<div class="parent1">
  <div class="child1"></div>
</div>
<hr />

<div class="parent2">
  <div class="child2"></div>
</div>
<hr />

<div class="parent3">
  <div class="child3"></div>
</div>


4

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

ฉันซ้อนหลายวัตถุใน JSFiddle สำหรับตัวอย่าง แต่ความคิดหลักเป็นเช่นนี้

HTML

<div class="circle">
  <div class="content">
    Some text
  </div>
</div>

CSS

 .circle {
   /* act as a table so we can center vertically its child */
   display: table;
   /* set dimensions */
   height: 200px;
   width: 200px;
   /* horizontal center text */
   text-align: center;
   /* create a red circle */
   border-radius: 100%;
   background: red;
 }

 .content {
   /* act as a table cell */
   display: table-cell;
   /* and now we can vertically center! */
   vertical-align: middle;
   /* some basic markup */
   font-size: 30px;
   font-weight: bold;
   color: white;
 }

ตัวอย่างวัตถุหลายรายการ:

HTML

<div class="container">
  <div class="content">

    <div class="centerhoriz">

      <div class="circle">
        <div class="content">
          Some text
        </div><!-- content -->
      </div><!-- circle -->

      <div class="square">
        <div class="content">
          <div id="smallcircle"></div>
        </div><!-- content -->
      </div><!-- square -->

    </div><!-- center-horiz -->

  </div><!-- content -->
</div><!-- container -->

CSS

.container {
  display: table;
  height: 500px;
  width: 300px;
  text-align: center;
  background: lightblue;
}

.centerhoriz {
  display: inline-block;
}

.circle {
  display: table;
  height: 200px;
  width: 200px;
  text-align: center;
  background: red;
  border-radius: 100%;
  margin: 10px;
}

.square {
  display: table;
  height: 200px;
  width: 200px;
  text-align: center;
  background: blue;
  margin: 10px;
}

.content {
  display: table-cell;
  vertical-align: middle;
  font-size: 30px;
  font-weight: bold;
  color: white;
}

#smallcircle {
  display: inline-block;
  height: 50px;
  width: 50px;
  background: green;
  border-radius: 100%;
}

ผลลัพธ์

ผลลัพธ์

https://jsfiddle.net/martjemeyer/ybs032uc/1/


3

โดยค่าเริ่มต้น h1 เป็นองค์ประกอบบล็อกและจะแสดงผลบนบรรทัดหลัง img แรกและจะทำให้ img สองปรากฏบนบรรทัดถัดจากบล็อก

หากต้องการหยุดสิ่งนี้ไม่ให้เกิดขึ้นคุณสามารถตั้งค่า h1 ให้มีลักษณะการไหลแบบอินไลน์:

#header > h1 { display: inline; }

สำหรับการวางตำแหน่ง img อย่างชัดเจนใน divคุณจะต้องตั้ง div ที่มี "ขนาดที่รู้จัก" ก่อนจึงจะทำงานได้อย่างถูกต้อง จากประสบการณ์ของฉันคุณต้องเปลี่ยนแอตทริบิวต์ตำแหน่งออกจากตำแหน่งเริ่มต้น -: ญาติทำงานให้ฉัน:

#header { position: relative; width: 20em; height: 20em; }
#img-for-abs-positioning { position: absolute; top: 0; left: 0; }

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

UPDATE:

นี่คือตัวอย่างที่สมบูรณ์ที่ใช้กับ Firefox 3:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <title>Example of vertical positioning inside a div</title>
        <style type="text/css">
            #header > h1 { display: inline; }
            #header { border: solid 1px red; 
                      position: relative; }
            #img-for-abs-positioning { position: absolute;
                                       bottom: -1em; right: 2em; }
        </style>
    </head>

    <body>
        <div id="header">
            <img src="#" alt="Image 1" width="40" height="40" />
            <h1>Header</h1>
            <img src="#" alt="Image 2" width="40" height="40" 
                 id="img-for-abs-positioning" />
        </div>
    </body>
</html>

4
ฉันควรทราบว่าการมี DOCTYPE ที่ถูกต้องในบางครั้งสามารถสร้างความแตกต่างอย่างมากต่อวิธีที่ CSS จะแสดงผลโดยเฉพาะอย่างยิ่งใน Internet Explorer ฉันขอแนะนำให้คุณเลือก DOCTYPE ที่รู้จักกันเพื่อให้สอดคล้องกับโหมดมาตรฐานที่เข้มงวดเพื่อให้คุณสามารถคาดหวังพฤติกรรมที่สอดคล้องกันระหว่างเบราว์เซอร์มากขึ้น
Mike Tunnicliffe

2
ฉันจะไม่ 'คาดหวัง' ความสอดคล้องใด ๆ ระหว่างเบราว์เซอร์ .. วิธีเดียวที่จะตรวจสอบให้แน่ใจคือ: /
Cocowalla

3

เราอาจใช้การคำนวณฟังก์ชั่น CSS เพื่อคำนวณขนาดขององค์ประกอบแล้ววางตำแหน่งองค์ประกอบย่อยตามลำดับ

ตัวอย่าง HTML:

<div class="box">
    <span><a href="#">Some Text</a></span>
</div>

และ CSS:

.box {
    display: block;
    background: #60D3E8;
    position: relative;
    width: 300px;
    height: 200px;
    text-align: center;

}
.box span {
    font: bold 20px/20px 'source code pro', sans-serif;
    position: absolute;
    left: 0;
    right: 0;
    top: calc(50% - 10px);
}
a {
    color: white;
    text-decoration: none;
}

สร้างการสาธิตที่นี่: https://jsfiddle.net/xnjq1t22/

วิธีนี้ใช้ได้ดีกับการตอบสนองdiv heightและwidthเช่นกัน

หมายเหตุ: ฟังก์ชั่นการคำนวณไม่ได้ทดสอบความเข้ากันได้กับเบราว์เซอร์เก่า


3

ตามวันนี้ฉันได้พบวิธีแก้ปัญหาใหม่เพื่อจัดแนวข้อความหลายบรรทัดใน div ในแนวตั้งโดยใช้ CSS3 (และฉันยังใช้ bootstrap v3 grid system เพื่อตกแต่ง UI) ซึ่งเป็นดังนี้:

.immediate-parent-of-text-containing-div{
    height: 50px;         /* or any fixed height that suits you.*/
}

.text-containing-div {
    display: inline-grid;
    align-items: center;
    text-align: center;
    height: 100%;
}

ตามความเข้าใจของฉันผู้ปกครองของข้อความที่มีองค์ประกอบในทันทีต้องมีความสูง ฉันหวังว่ามันจะช่วยคุณได้เช่นกัน ขอบคุณ!


ทางออกที่สะอาดมาก อันนี้เหมาะกับฉันอย่างมาก
Akalonda

2

วิธีที่ฉันชอบใหม่ในการทำคือใช้กับตาราง CSS:

/* technique */

.wrapper {
  display: inline-grid;
  grid-auto-flow: column;
  align-items: center;
  justify-content: center;
}

/* visual emphasis */

.wrapper {
  border: 1px solid red;
  height: 180px;
  width: 400px;
}

img {
  width: 100px;
  height: 80px;
  background: #fafafa;
}

img:nth-child(2) {
  height: 120px;
}
<div class="wrapper">
  <img src="https://source.unsplash.com/random/100x80/?bear">
  <img src="https://source.unsplash.com/random/100x120/?lion">
  <img src="https://source.unsplash.com/random/100x80/?tiger">
</div>


1

เพียงใช้ตารางเซลล์เดียวภายใน div! เพียงตั้งค่าความสูงของเซลล์และตารางและให้เท่ากับ 100% และคุณสามารถใช้การจัดแนวตั้ง

ตารางเซลล์เดียวภายใน div จัดการจัดเรียงแนวตั้งและเข้ากันได้ย้อนหลังกลับไปยุคหิน!


0

ฉันใช้โซลูชันต่อไปนี้ (โดยไม่มีตำแหน่งและไม่มีความสูงของบรรทัด) มานานกว่าหนึ่งปีก็ใช้งานได้กับ IE 7 และ 8 เช่นกัน

<style>
.outer {
    font-size: 0;
    width: 400px;
    height: 400px;
    background: orange;
    text-align: center;
    display: inline-block;
}

.outer .emptyDiv {
    height: 100%;
    background: orange;
    visibility: collapse;
}

.outer .inner {
    padding: 10px;
    background: red;
    font: bold 12px Arial;
}

.verticalCenter {
    display: inline-block;
    *display: inline;
    zoom: 1;
    vertical-align: middle;
}
</style>

<div class="outer">
    <div class="emptyDiv verticalCenter"></div>
    <div class="inner verticalCenter">
        <p>Line 1</p>
        <p>Line 2</p>
    </div>
</div>

0

นี่คือโซลูชันส่วนบุคคลของฉันสำหรับองค์ประกอบ i ใน div

ตัวอย่าง JSFiddle

HTML

<div class="circle">
    <i class="fa fa-plus icon">
</i></div>

CSS

.circle {
   border-radius: 50%;
   color: blue;
   background-color: red;
   height:100px;
   width:100px;
   text-align: center;
   line-height: 100px;
}

.icon {
  font-size: 50px;
  vertical-align: middle;
}

0

สำหรับฉันมันใช้วิธีนี้:

<div style="width:70px; height:68px; float:right; display: table-cell; line-height: 68px">
    <a href="javascript:void(0)" style="margin-left: 4px; line-height: 2" class="btn btn-primary">Login</a>
</div>

องค์ประกอบ "a" ถูกแปลงเป็นปุ่มโดยใช้คลาส Bootstrap และตอนนี้จะอยู่กึ่งกลางแนวตั้งภายใน "div" ด้านนอก


0

ใช้ flex display ก่อนอื่นคุณต้องห่อคอนเทนเนอร์ของรายการที่คุณต้องการจัดตำแหน่ง

<div class="outdiv">
      <div class="indiv">
         <span>test1</span>
         <span>test2</span>
      </div>
    </div>

จากนั้นใช้ css ต่อไปนี้กับ wrapper div หรือ outdiv ในตัวอย่างของฉัน

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

คำตอบรหัสเท่านั้นที่จะหมดกำลังใจ โปรดเพิ่มคำอธิบายเกี่ยวกับวิธีการแก้ไขปัญหาหรือวิธีการนี้แตกต่างจากคำตอบที่มีอยู่ จากการรีวิว
Nick

-3

แค่นี้:

<div>
    <table style="width: 100%; height: 100%">
        <tr>
            <td style="width: 100%; height: 100%; vertical-align: middle;">
               What ever you want vertically-aligned
            </td>
        </tr>
    </table>
</div>

ตารางเซลล์เดียวภายใน div จัดการจัดเรียงแนวตั้งและเข้ากันได้ย้อนหลังกลับไปยุคหิน!


-3
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
    <head>
        <style type="text/css">
            #style_center { position:relative; top:50%; left:50%; }
            #style_center_absolute { position:absolute; top:50px; left:50px; }
            <!--#style_center { position:relative; top:50%; left:50%; height:50px; margin-top:-25px; }-->
        </style>
    </head>

    <body>
        <div style="height:200px; width:200px; background:#00FF00">
            <div id="style_center">+</div>
        </div>
    </body>
</html>

-4

นี่เป็นอีกวิธี (ตอบสนอง):

html,
    body {
        height: 100%;
    }
    body {
        margin: 0;
    }

    .table {
        display: table;
        width:  auto;
        table-layout:auto;
        height: 100%;
    }
        .table:nth-child(even) {
            background: #a9edc3;
        }
        .table:nth-child(odd) {
            background: #eda9ce;
        }

    .tr {
        display: table-row;
    }
    .td {
        display: table-cell;
        width: 50%;
        vertical-align: middle;
    }

http://jsfiddle.net/herrfischerhamburg/JcVxz/


-4

ฉันเป็น. NET คนที่เพิ่งเข้าสู่การเขียนโปรแกรมเว็บ ฉันไม่ได้ใช้ CSS (ดีหน่อย) ฉันใช้จาวาสคริปต์เล็กน้อยเพื่อให้การจัดกึ่งกลางแนวตั้งพร้อมฟังก์ชั่น. ccs ของ jQuery

ฉันแค่โพสต์ทุกอย่างจากการทดสอบของฉัน มันอาจจะไม่หรูหราเกินไป แต่ก็ใช้งานได้ดี

script.

<html>
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>

        <script type="application/javascript">
            function centerElementVertically(id) {
                var btnDivHeight = $(id).outerHeight();
                var prnt = $(id).parent();
                var parentHeight = prnt.outerHeight();

                var newTop = ((parentHeight - btnDivHeight) / 2) + 'px';
                var newPct = newTop / parentHeight+'%;';

                $(id).css({top: newTop});
            }

            function showAlert(){
                alert("alert");
            }

            $(window).load(()=>{
                centerElementVertically('#buttonRight');
                centerElementVertically('#buttonLeft');
                centerElementVertically('#testerbtn')
            });

            $(window).resize(()=>{
                centerElementVertically('#buttonRight');
                centerElementVertically('#buttonLeft');
                centerElementVertically('#testerbtn')
            })
        </script>

        <style>
            #div1 {
                position:relative;
                height: 33%;
                background-color: red;
                overflow: hidden;
            }
            #buttonLeft {
                position: relative;
                float:left;
                width:50%;
                height:20%;
                background-color: cornsilk;
            }
            #buttonRight {
                position: relative;
                float:right;
                width:50%;
                height:50%;
                background-color: darkorchid;
            }
            #testerbtn {
                position: absolute;
            }
            body {
                background-color: aqua;
            }
        </style>

        <body>
            <div id="div1">
                <div id="buttonLeft">
                    <button id="testerbtn">tester</button>
                </div>
                <div id="buttonRight"></div>
            </div>
        </body>
    </head>
</html>

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

-8
<div id="header" style="display: table-cell; vertical-align:middle;">

...

หรือ CSS

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

คุ้มครองเบราว์เซอร์


1
คุณสมบัติการจัดแนวตั้งใช้ไม่ได้เนื่องจาก div แสดง: block ตามค่าเริ่มต้นและไม่มีสิ่งใดที่ดูเหมือนจะถูกทำการเปลี่ยนแปลง
Quentin

3
เห็นได้ชัดว่าจอแสดงผลได้รับการอัปเดตtable-cellซึ่งทำให้ใช้vertical-align: middle;งานได้ ยิ่งไปกว่านั้นมันทำงานได้โดยไม่จำเป็นต้องใช้ wrapper / buffer div ที่ซ้อนกันและใช้ได้กับทั้งข้อความและรูปภาพ (หรือทั้งสองอย่าง) และคุณไม่จำเป็นต้องเปลี่ยนคุณสมบัติตำแหน่ง
MSpreij

3
อันนี้ใช้ได้ผล มันเปลี่ยนการแสดงผลเป็นเซลล์ตารางซึ่งใช้คุณสมบัติจัดแนวตั้ง ไม่มีความคิดว่าทำไมผู้คนถึงลงคะแนนนี้
texasbruce

1
ใช่เท่าที่ฉันรู้ว่านี่เป็นวิธีที่รบกวนน้อยที่สุดในการจัดวางแนวดิ่งใน div +1
Pma

ตกลงบางทีฉันได้อย่างรวดเร็วเกินไปด้วยกับข้อสรุปของฉัน ... การเพิ่มการแสดงผล: ตารางเซลล์ breakes div ขอบและ additionaly ชายแดนจะปรากฏ div นอกชายแดนร่วมกับการแสดง border-radius มุมโค้งมนด้านในของ istead div นอก
วิชาการฯ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.