จัดแนวข้อความถัดจากภาพ?


1967

ทำไมถึงไม่vertical-align: middleทำงาน และยังvertical-align: top ใช้งานได้

span{
  vertical-align: middle;
}
<div>
  <img src="http://lorempixel.com/30/30/" alt="small img" />
  <span>Doesn't work.</span>
</div>


12
นี่เป็นบทความที่น่าสนใจ: ความเข้าใจvertical-align
Phaedrus

คำตอบ:


2252

ที่จริงแล้วในกรณีนี้มันค่อนข้างง่าย: ใช้การจัดเรียงแนวตั้งกับภาพ เนื่องจากมันมีทั้งหมดในหนึ่งบรรทัดมันเป็นภาพที่คุณต้องการจัดแนวไม่ใช่ข้อความ

<!-- moved "vertical-align:middle" style from span to img -->
<div>
  <img style="vertical-align:middle" src="https://placehold.it/60x60">
  <span style="">Works.</span>
</div>

ทดสอบใน FF3

ตอนนี้คุณสามารถใช้ flexbox สำหรับเค้าโครงประเภทนี้

.box {
   display: flex;
   align-items:center;
}
<div class="box">
    <img src="https://placehold.it/60x60">
    <span style="">Works.</span>
</div>


188
"เนื่องจากมีทั้งหมดในหนึ่งบรรทัดมันเป็นภาพที่คุณต้องการจัดแนวไม่ใช่ตัวอักษร" - ไม่ภาพนั้นดีเมื่ออยู่ที่ เราต้องการจัดแนวข้อความ ไม่ใช่ภาพ - ฉันเข้าใจว่ามันใช้งานได้ (ในบางสถานการณ์เช่นเมื่อคุณไม่ได้ใช้ "ลอย: ซ้าย" บนภาพ ... ) แต่มันแปลกประหลาดและไม่ได้ใช้งานง่ายที่จะย้ายข้อความไปที่กึ่งกลางแนวตั้งคุณ จะต้องใช้แอตทริบิวต์กับภาพถัดจากรูปภาพแทน
BrainSlugs83

35
@ BrainSlug83 มันไม่ใช่เรื่องแปลก แต่ฉันเห็นว่าผู้มาใหม่สามารถสะดุดได้อย่างไร โดยค่าเริ่มต้นภาพจะถูกวางไว้บนพื้นฐานข้อความ สิ่งที่คุณกำลังทำคือการย้ายที่ภาพแนบกับข้อความ สำหรับการใช้ float: left คุณควรทำเช่นนั้นบนบล็อกที่มีรูปภาพและข้อความหรือบนข้อความ
jamesrom

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

6
มันไม่ทำงานหากคุณเพิ่มspanขนาดตัวอักษร ดูคำตอบของฉัน
Mori

2
แต่ถ้าคุณตั้งค่าขนาดภาพให้เล็กลง (เช่นwidth:16px;height:16px) คุณจะเห็นภาพนั้นต่ำเกินไป ...
Matthieu Charbonnier

340

นี่คือเทคนิคง่ายๆสำหรับแนวตั้ง:

จัดเรียงแนวตั้งหนึ่งบรรทัด: กลาง

อันนี้ง่าย: ตั้งค่าความสูงบรรทัดขององค์ประกอบข้อความให้เท่ากับของคอนเทนเนอร์

<div>
  <img style="width:30px; height:30px;">
  <span style="line-height:30px;">Doesn't work.</span>
</div>

จัดเรียงแนวตั้งหลายบรรทัด: ด้านล่าง

วางตำแหน่ง div ภายในที่สัมพันธ์กับคอนเทนเนอร์

<div style="position:relative;width:30px;height:60px;">
  <div style="position:absolute;bottom:0">This is positioned on the bottom</div>
</div>

จัดเรียงแนวตั้งหลายบรรทัด: กลาง

<div style="display:table;width:30px;height:60px;">
  <div style="display:table-cell;height:30px;">This is positioned in the middle</div>
</div>

หากคุณต้องสนับสนุน IE เวอร์ชันโบราณ <= 7

เพื่อให้สิ่งนี้ทำงานได้อย่างถูกต้องทั่วกระดานคุณจะต้องแฮ็ก CSS สักเล็กน้อย โชคดีที่มีข้อผิดพลาด IE ที่ทำงานในความโปรดปรานของเรา การตั้งค่าtop:50%บนคอนเทนเนอร์และtop:-50%บน div ภายในคุณสามารถบรรลุผลลัพธ์เดียวกัน เราสามารถรวมคุณสมบัติทั้งสองเข้าด้วยกันโดยใช้ฟีเจอร์อื่นที่ IE ไม่รองรับ: ตัวเลือก CSS ขั้นสูง

<style type="text/css">
  #container {
    width: 30px;
    height: 60px;
    position: relative;
  }
  #wrapper > #container {
    display: table;
    position: static;
  }
  #container div {
    position: absolute;
    top: 50%;
  }
  #container div div {
    position: relative;
    top: -50%;
  }
  #container > div {
    display: table-cell;
    vertical-align: middle;
    position: static;
  }
</style>

<div id="wrapper">
  <div id="container">
    <div><div><p>Works in everything!</p></div></div>
  </div>
</div>

ความสูงภาชนะตัวแปรแนวตั้ง - แนวตั้ง: กลาง

โซลูชันนี้ต้องการเบราว์เซอร์ที่ทันสมัยกว่าโซลูชันอื่น ๆ เล็กน้อยเนื่องจากใช้ประโยชน์จากtransform: translateYคุณสมบัติ ( http://caniuse.com/#feat=transforms2d )

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

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

15
display:tableและdisplay:table-cellCSS เตอร์ทำงานได้ดียกเว้นของหลักสูตรใน 7 และด้านล่าง หลังจากฉีกผมออกไปหลายชั่วโมงฉันตัดสินใจว่าฉันไม่จำเป็นต้องจัดการกับใครก็ตามที่ยังคงใช้ IE7-
banncee

2
display:tableมีข้อ จำกัด บางอย่างในเบราว์เซอร์ต่าง ๆ (ใน IE11 max-heightไม่ทำงานหากองค์ประกอบอยู่ภายในเซลล์ตาราง) ดังนั้นในบางกรณีขอบจึงไม่ควรจัดแนวตั้งโดยใช้เซลล์ตาราง
jahu

97

เปลี่ยนของคุณdivให้เป็นเฟล็กซ์คอนเทนเนอร์:

div { display:flex; }


ขณะนี้มีสองวิธีในการจัดแนวศูนย์สำหรับเนื้อหาทั้งหมด:

วิธีที่ 1:

div { align-items:center; }

การสาธิต


วิธีที่ 2:

div * { margin-top:auto; margin-bottom:auto; }

การสาธิต


ลองใช้ค่าความกว้างและความสูงที่imgแตกต่างกันในและขนาดตัวอักษรที่แตกต่างกันในspanและคุณจะเห็นพวกเขายังคงอยู่ในช่วงกลางของภาชนะ


เพื่อไปยังศูนย์ข้อความต่อไปหรือระหว่างภาพ (แนวนอนบนหน้าเว็บ) คุณจะต้องยังเพิ่มjustify-content: center;และระยะห่าง (โดยไม่ใช้แท็ก <br/>) padding: 1em;คุณอาจต้องการที่จะโยนใน การปรับปรุงที่ดีสำหรับเรา devs เบราว์เซอร์ที่ทันสมัย
CSS

มันใช้งานได้ดี ฉันลองคำตอบอื่น ๆ และทุกคนและในขณะที่พวกเขาทำงานในระดับหนึ่งมันไม่ได้ผลสำหรับฉัน ฉันมีข้อความประมาณ 3 บรรทัดเพื่อจัดแนวและคำตอบนี้ใช้ได้อย่างสมบูรณ์แบบ ขอบคุณ @Mori
semaj0

87

คุณต้องนำไปใช้vertical-align: middleกับองค์ประกอบทั้งสองเพื่อให้มันอยู่กึ่งกลางอย่างสมบูรณ์

<div>
  <img style="vertical-align:middle" src="http://lorempixel.com/60/60/">
  <span style="vertical-align:middle">Perfectly centered</span>
</div>

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

การเปรียบเทียบไอคอนกึ่งกลาง

ด้านซ้ายข้อความจะไม่จัดแนวทางด้านขวาจะแสดงตามด้านบน การสาธิตสดสามารถพบได้ในนี้บทความเกี่ยวกับแนวตั้งชิด

มีใครพูดคุยเกี่ยวกับเหตุผลที่vertical-align: topทำงานในสถานการณ์หรือไม่ รูปภาพในคำถามน่าจะสูงกว่าข้อความและกำหนดขอบด้านบนของกล่องเส้น vertical-align: topในองค์ประกอบการขยายจากนั้นเพียงแค่วางตำแหน่งไว้ที่ด้านบนของกล่องสาย

ความแตกต่างที่สำคัญในพฤติกรรมระหว่างvertical-align: middleและtopคือการเคลื่อนไหวครั้งแรกที่องค์ประกอบสัมพันธ์กับพื้นฐานของกล่อง (ซึ่งจะถูกวางไว้ที่ใดก็ได้ที่จำเป็นเพื่อตอบสนองการจัดตำแหน่งแนวตั้งทั้งหมดและทำให้รู้สึกค่อนข้างคาดเดาไม่ได้ ) และครั้งที่สอง มีตัวตนมากขึ้น)


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

61

เทคนิคที่ใช้ในคำตอบที่ยอมรับนั้นใช้ได้กับข้อความที่มีแถวเดียวเท่านั้น ( สาธิต) ) แต่ไม่ใช่ข้อความที่มีหลายบรรทัด ( สาธิต ) - ดังที่ระบุไว้ที่นั่น

หากทุกคนต้องการจัดกึ่งกลางข้อความในแนวตั้งให้ตรงกับภาพนี่คือสองสามวิธี (วิธีที่ 1 และ 2 ได้รับแรงบันดาลใจ บทความ CSS-Tricks นี้ )

วิธีที่ # 1: ตาราง CSS ( FIDDLE ) (IE8 + ( caniuse ))

CSS:

div {
    display: table;
}
span {
    vertical-align: middle;
    display: table-cell;
}

วิธีที่ # 2: องค์ประกอบหลอกบนคอนเทนเนอร์ ( FIDDLE ) (IE8 +)

CSS:

div {
   height: 200px; /* height of image */
}

div:before {
  content: '';
  display: inline-block;
  height: 100%;
  vertical-align: middle;
  margin-right: -0.25em; /* Adjusts for spacing */
}

img {
    position: absolute;
}

span {
  display: inline-block;
  vertical-align: middle;
  margin-left: 200px;  /* width of image */
}

วิธีที่ # 3: Flexbox ( FIDDLE ) ( caniuse )

CSS (ซอด้านบนมีคำนำหน้าผู้ขาย):

div {   
    display: flex; 
    align-items: center;    
}
img {
    min-width: 200px; /* width of image */
}

3
วิธีการทำงานได้ดีถ้าภาพมีขนาดใหญ่ (สูง) กว่าตัวอักษร แต่ถ้าภาพมีขนาดเล็กกว่านั้นทั้งหมด แต่สุดท้ายที่น่าเศร้าล้มเหลว
โทมัส

28

รหัสนี้ทำงานใน IE เช่นเดียวกับ FF:

<div>
  <img style="width:auto; height:auto;vertical-align: middle;">
  <span>It does work on all browsers</span>
</div>

19

เพราะคุณต้องตั้งค่าline-heightความสูงของ div เพื่อให้ทำงานได้


2
ฉันลองตั้งค่า line-height เป็น 30px แต่ก็ยังใช้งานไม่ได้
sam


11

สำหรับบันทึกการจัดตำแหน่ง "คำสั่ง" ไม่ควรทำงานบน SPAN เนื่องจากเป็นแท็กในบรรทัดไม่ใช่แท็กระดับบล็อก สิ่งต่างๆเช่นการจัดตำแหน่งระยะขอบการเว้นระยะห่าง ฯลฯ จะไม่ทำงานบนแท็กในบรรทัดเนื่องจากจุดอินไลน์ไม่ได้ขัดขวางการไหลของข้อความ

CSS แบ่งแท็ก HTML ออกเป็นสองกลุ่ม: ในบรรทัดและระดับบล็อก ค้นหา "css block vs inline" และบทความที่ดีแสดงขึ้น ...

http://www.webdesignfromscratch.com/html-css/css-block-and-inline/

(การทำความเข้าใจหลักการของ CSS เป็นกุญแจสำคัญในการที่จะไม่น่ารำคาญนัก)


2
text-alignและvertical-align(ยกเว้นของการประยุกต์ใช้ในtdองค์ประกอบเพื่อวัตถุประสงค์เดิม) มีความหมายเฉพาะสำหรับinlineและinline-blockองค์ประกอบ ( span, imgฯลฯ )
Kevin Peno

11

ใช้line-height:30pxสำหรับการขยายเพื่อให้ข้อความสอดคล้องกับภาพ:

<div>
  <img style="width:30px; height:30px;">
  <span style="line-height:30px;">Doesn't work.</span>
</div>

11

สิ่งที่คุณสามารถทำได้ก็คือการตั้งค่าของข้อความกับขนาดของภาพภายในที่line-height <div>จากนั้นตั้งค่าภาพเป็นvertical-align: middle;

นั่นเป็นวิธีที่ง่ายที่สุดอย่างจริงจัง


3
โปรดทราบว่าสิ่งนี้ไม่ทำงานอย่างถูกต้องหากเนื้อหาของคุณกระจายไปหลายบรรทัด
Ahmad Alfy

แล้วทำไมไม่ลองแค่ความสูงของเส้น: 100% ล่ะ?
Jean Paul AKA el_vete

8

ยังไม่เห็นวิธีแก้ไขmarginในคำตอบใด ๆ เลยดังนั้นนี่คือวิธีแก้ปัญหาของฉัน

วิธีนี้ใช้ได้เฉพาะเมื่อคุณทราบความกว้างของภาพ

HTML

<div>
    <img src="https://placehold.it/80x80">
    <span>This is my very long text what should align. This is my very long text what should align.</span>
</div>

CSS

div {
  overflow:hidden;
}
img {
   width:80px
   margin-right:20px;
   display:inline-block;
   vertical-align:middle;
}
span {
   width:100%;
   margin-right:-100px;
   padding-right:100px;
   display:inline-block;
   vertical-align:middle;
   box-sizing:border-box;
   -moz-box-sizing:border-box;
   -webkit-box-sizing:border-box;
}

1
นี่คือทางออกที่แน่นอน มันใช้งานได้กับข้อความหลายบรรทัดเช่นกัน ... Aboves ไม่เหมาะสำหรับหลายบรรทัด
efirat

6
background:url(../images/red_bullet.jpg) left 3px no-repeat;

ฉันมักใช้ 3PX topในสถานที่ของ โดยการเพิ่ม / ลดค่านั้นภาพสามารถเปลี่ยนเป็นความสูงที่ต้องการ


ไม่ช่วยในสถานการณ์ที่ขนาดภาพไม่เป็นที่รู้จักหรือเป็นแบบไดนามิก
ด่าน

6

เขียนคุณสมบัติการขยายเหล่านี้

span{
    display:inline-block;
    vertical-align:middle;
}

ใช้display:inline-block;เมื่อคุณใช้vertical-alignคุณสมบัติเหล่านี้คือคุณสมบัติการแยกส่วน


6

คุณสามารถตั้งค่าภาพinline elementโดยใช้displayคุณสมบัติ

<div>
  <img style="vertical-align: middle; display: inline;" src="https://placehold.it/60x60">
  <span style="vertical-align: middle; display: inline;">Works.</span>
</div>


3

ยกตัวอย่างเช่นบนปุ่มใน jQuery mobile คุณสามารถปรับแต่งได้เล็กน้อยโดยใช้สไตล์นี้กับภาพ:

.btn-image {
    vertical-align:middle;
    margin:0 0 3px 0;
}

2

วิธีการแก้ปัญหาหลายเส้น:

http://jsfiddle.net/zH58L/6/

<div style="display:table;width:30px;height:160px;">
    <img style="display:table-cell;width:30px;height:60px;padding:50px" src='...' />
    <div style="display:table-cell;height:30px;vertical-align:middle">
      Multiline text centered vertically
    </div>
</div>
<!-- note: img (height + 2x padding) must be equal to root div height -->

ใช้งานได้กับทุกเบราว์เซอร์และ ie9 +


2

ฉันอาจเห็นว่าสับสน ลองใช้คุณสมบัติตาราง ฉันใช้เคล็ดลับ CSS ง่าย ๆ นี้เพื่อวางโมดัลไว้ที่กึ่งกลางของหน้าเว็บ มันรองรับเบราว์เซอร์ขนาดใหญ่:

<div class="table">
    <div class="cell">
        <img src="..." alt="..." />
        <span>It works now</span>
    </div>
</div>

และส่วน CSS:

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

โปรดทราบว่าคุณต้องจัดรูปแบบและปรับขนาดของรูปภาพและคอนเทนเนอร์ตารางเพื่อให้ทำงานตามที่คุณต้องการ สนุก.


0

CSS แบบอินไลน์แรกไม่แนะนำให้ใช้เลยทำให้ HTML ของคุณเลอะจริงๆ

vertical-align:middleสำหรับภาพที่สอดคล้องและช่วงคุณก็สามารถทำได้

.align-middle {
  vertical-align: middle;
}
<div>
  <img class="align-middle" src="https://i.stack.imgur.com/ymxaR.png">
  <span class="align-middle">I'm in the middle of the image! thanks to CSS! hooray!</span>
</div>


2
มีเหตุผลที่ดีมากมายในการใช้ CSS แบบอินไลน์ ตอบสนอง: CSS ใน JSเช่น
jlyonsmith

0

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

https://output.jsbin.com/jeqorahupo

            <hgroup style="display:block; text-align:center;  vertical-align:middle;  margin:inherit auto; padding:inherit auto; max-height:inherit">

            <header style="background:url('http://lorempixel.com/30/30/') center center no-repeat; background-size:auto; display:inner-block; vertical-align:middle; position:relative; position:absolute; top:inherit; left:inherit; display: -webkit-box; display: -webkit-flex;display: -moz-box;display: -ms-flexbox;display: flex;-webkit-flex-align: center;-ms-flex-align: center;-webkit-align-items: center;align-items: center;">

            <image src="http://lorempixel.com/60/60/" title="Img title" style="opacity:0.35"></img>
                    http://lipsum.org</header>
                    </hgroup>

-4

คุณอาจต้องการสิ่งนี้:

<div>
   <img style="width:30px; height:30px;">
   <span style="vertical-align:50%; line-height:30px;">Didn't work.</span>
</div>

ตามที่คนอื่นแนะนำให้ลองvertical-alignกับภาพ:

<div>
   <img style="width:30px; height:30px; vertical-align:middle;">
   <span>Didn't work.</span>
</div>

CSS ไม่น่ารำคาญ คุณเพียงแค่ไม่ได้อ่านเอกสาร ; P


6
และถ้าความสูงของภาพเป็นแบบไดนามิก? ฉันเมา :( PS เพียงเพราะเอกสารที่มีอยู่สำหรับ CSS ไม่ได้ทำให้มันน่ารำคาญหรือ unintuitive.
sam

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

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