วิธีจัดแนวภาพใน div ในแนวตั้ง


1456

คุณจะจัดแนวรูปภาพภายในของที่บรรจุได้divอย่างไร?

ตัวอย่าง

ในตัวอย่างของฉันฉันจำเป็นต้องตั้งศูนย์ให้<img>ตรง<div>กับclass ="frame":

<div class="frame" style="height: 25px;">
    <img src="http://jsfiddle.net/img/logo.png" />
</div>

.frameความสูงของภาพได้รับการแก้ไขและไม่ทราบความสูงของภาพ ฉันสามารถเพิ่มองค์ประกอบใหม่ได้.frameถ้านั่นเป็นทางออกเดียว ฉันพยายามทำสิ่งนี้บน Internet Explorer 7 และใหม่กว่า WebKit, Gecko

ดู jsfiddle ที่นี่

.frame {
    height: 25px;      /* Equals maximum image height */
    line-height: 25px;
    width: 160px;
    border: 1px solid red;

    text-align: center;
    margin: 1em 0;
}
img {
    background: #3A6F9A;
    vertical-align: middle;
    max-height: 25px;
    max-width: 160px;
}
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=250 />
</div>
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=25 />
</div>
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=23 />
</div>
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=21 />
</div>
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=19 />
</div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=17 />
</div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=15 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=13 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=11 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=9 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=7 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=5 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=3 />
 </div>


3
สวัสดีขอโทษ แต่ฉันไม่เห็นด้วยกับการใช้ตัวช่วยที่นี่เป็นวิธีแก้ปัญหาที่ได้รับการประเมินค่ามากที่สุด แต่มันไม่ใช่วิธีเดียว เบราว์เซอร์อื่น ๆ รองรับเหมือนกัน ฉันเสนอวิธีแก้ไขปัญหาที่นี่ลง stackoverflow.com/a/43308414/7733724 และ W3C.org เกี่ยวกับข้อมูล คุณสามารถตรวจสอบ ไชโย
แซม

การอ่านบทความเกี่ยวกับการตั้งศูนย์ที่ W3C จะเป็นประโยชน์: w3.org/Style/Examples/007/center.en.html
QMaster

คำแนะนำที่สมบูรณ์แบบสำหรับจัดตำแหน่งcss-tricks.com/centering-css-complete-guide
Michael Yurin

คำตอบ:


2128

วิธีเดียว (และเบราว์เซอร์ที่ดีที่สุด) เท่าที่ฉันรู้คือการใช้inline-blockผู้ช่วยที่มีheight: 100%และvertical-align: middleในองค์ประกอบทั้งสอง

ดังนั้นจึงมีทางออกคือ: http://jsfiddle.net/kizu/4RPFa/4570/

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

วิธีแก้ปัญหาด้วย:beforeและexpression()สำหรับ Internet Explorer: http://jsfiddle.net/kizu/4RPFa/4571/


มันทำงานอย่างไร:

  1. เมื่อคุณมีinline-blockองค์ประกอบสองอย่างที่อยู่ใกล้กันคุณสามารถจัดเรียงของกันและกันเข้าหากันดังนั้นvertical-align: middleคุณจะได้สิ่งนี้:

    สองบล็อกชิด

  2. เมื่อคุณมีบล็อกที่มีความสูงคงที่ (ในpx, emหรืออีกหน่วยแน่นอน) %คุณสามารถตั้งค่าความสูงของตึกด้านใน

  3. ดังนั้นการเพิ่มหนึ่งinline-blockที่มีheight: 100%ในบล็อกมีความสูงคงที่จะจัดอีกinline-blockองค์ประกอบในนั้น ( <img/>ในกรณีของคุณ) ในแนวตั้งอยู่ใกล้มัน

2
คุณสามารถเห็นด้วยตัวคุณเอง: jsfiddle.net/kizu/Pw9NL - เฉพาะกล่องแบบอินไลน์ไม่ได้สร้างกล่อง แต่กรณีอื่น ๆ ทั้งหมดก็ใช้ได้
kizu

3
คำตอบที่ดีมาก ผมดิ้นรนที่มีช่องว่างระหว่างองค์ประกอบแบบอินไลน์บล็อกที่มีความหมายระหว่างและ.frame .frame:beforeวิธีการแก้ปัญหาที่นำเสนอที่นี่คือการเพิ่มการmargin-left: -4px .frameหวังว่านี่จะช่วยได้
มิค

111
จ่ายความสนใจที่: <img src=""/>ไม่ได้อยู่ใน<span></span>ผู้ช่วยที่เพิ่มเข้ามา มันอยู่ข้างนอก ฉันเพิ่งจะดึงเส้นผมของเราทุกเส้นโดยไม่ได้ตระหนักถึงสิ่งนี้
ไรอัน

50
ดูเหมือนคุณจะต้องเพิ่ม "white-space: nowrap;" ไปที่เฟรมหรือคุณจะพบปัญหาหากคุณมีเส้นแบ่งระหว่างภาพและตัวช่วยขยาย ฉันใช้เวลาหนึ่งชั่วโมงว่าทำไมวิธีนี้ไม่ได้ผลสำหรับฉัน
juminoz

2
ในกรณีของฉันรูปภาพของฉันมีความสูงสูงสุดและความกว้างสูงสุดตั้งไว้ที่ 100% ดังนั้นรูปภาพจะขยายขนาดคอนเทนเนอร์และวิธีนี้ใช้ไม่ได้ โซลูชันของฉันคือเปลี่ยนค่าเหล่านี้เป็น 90% (ซึ่งในกรณีของฉันไม่เป็นไรในสถานการณ์อื่นคุณอาจต้องปรับขนาดคอนเทนเนอร์ตาม) และเพิ่มผู้ช่วยไปยังอีกด้านหนึ่งของภาพเพื่อให้การขยายยังคงอยู่ ทั้งสองด้าน.
Eric Dubé

513

สิ่งนี้อาจมีประโยชน์:

div {
    position: relative;
    width: 200px;
    height: 200px;
}
img {
    position: absolute;
    top: 0;
    bottom: 0;
    margin: auto;
}
.image {
    min-height: 50px
}

74
หากคุณต้องการจัดแนวภาพในแนวนอนให้เพิ่มไปทางซ้าย: 0; ขวา: 0; ถึง img
jameskind

อันนี้ไม่ทำงานใน IE10 เหรอ? ฉันชอบที่จะใช้สิ่งนี้ทุกที่
Max Yari

ใช้ได้กับฉันด้วย div container ด้วยposition:fixed;
PJ Brunet

1
วิธีแก้ปัญหาที่ง่ายที่สุดและสะอาดที่สุดขอบคุณ!
KDT

ขอบคุณ! ทำงานให้ฉัน !!
Alexander Malygin

486

ทางออกของ matejkramny เป็นการเริ่มต้นที่ดี แต่รูปภาพที่มีขนาดใหญ่มีอัตราส่วนที่ไม่ถูกต้อง

นี่คือทางแยกของฉัน:

การสาธิต: https://jsbin.com/lidebapomi/edit?html,css,output

ภาพตัวอย่าง


HTML:

<div class="frame">
  <img src="foo"/>
</div>

CSS:

.frame {
    height: 160px; /* Can be anything */
    width: 160px; /* Can be anything */
    position: relative;
}
img {
    max-height: 100%;
    max-width: 100%;
    width: auto;
    height: auto;
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
}

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

หากเราต้องการให้มันทำงานสำหรับการจัดตำแหน่งแนวตั้งด้านล่างแทนตรงกลางรหัสอะไรที่ควรแก้ไข?
bobo

1
@bobo top: 0;เพียงแค่ลบ ส่งผลให้มีbottom: 0;การใช้งานในแนวตั้งเท่านั้น
jomo

คำตอบที่ดีที่สุด!
user315338

276

โซลูชันสามบรรทัด:

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

สิ่งนี้ใช้ได้กับทุกสิ่ง

จากที่นี่


คำนำหน้า: -ms- หรือ -webkit- (ก่อนการแปลง) w3schools.com/cssref/css3_pr_transform.asp
Jorge Orpinel

3
คำนำหน้าสำหรับ IE9 แต่ไม่ทำงานเลยใน IE8 และที่ต่ำกว่า: caniuse.com/#search=transformแต่ความคิดเห็นของฉัน: ฉันไม่สนใจเกี่ยวกับ IE8
Reign.85

ไม่มีใครสังเกตเห็นว่าเกิดอะไรขึ้นเมื่อเด็กที่จะอยู่กึ่งกลางสูงกว่าหน้าจออุปกรณ์และผู้ปกครองเป็นลูกคนแรกใน DOM ... ?
เทา

3
เป็นสิ่งที่ดีเมื่อคุณไม่สามารถใช้งานได้position: absolute;เพราะคุณต้องการความกว้างที่ลื่นไหล
plong0

2
ทางออกที่ดีที่สุดจนถึงดีกว่า flexbox ด้วยการรองรับเบราว์เซอร์ทุกรุ่นทั้งเก่าและใหม่
โหวตขึ้นจาก

141

บริสุทธิ์แก้ปัญหา CSS:

.frame {
  margin: 1em 0;
  height: 35px;
  width: 160px;
  border: 1px solid red;
  position: relative;
}

img {
  max-height: 25px;
  max-width: 160px;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  margin: auto;
  background: #3A6F9A;
}
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=250 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=25 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=23 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=21 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=19 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=17 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=15 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=13 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=11 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=9 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=7 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=5 />
</div>
<div class=frame>
  <img src="http://jsfiddle.net/img/logo.png" height=3 />
</div>

สิ่งสำคัญ

// position: relative; - in .frame holds the absolute element within the frame
// top: 0; bottom: 0; left: 0; right: 0; - this is key for centering a component
// margin: auto; - centers the image horizontally & vertically

โปรดให้ฉันแนะนำคุณถึงคำแนะนำที่นี่ที่ใช้งานได้กับ IE5 (หักจากสิ่งที่ฉันได้อ่านในโพสต์) webmasterworld.com/css/3350566.htm
Matej

วิธีนี้คือการเริ่มต้นที่ดี แต่ภาพขนาดใหญ่ได้รับการปรับขนาดที่มีอัตราส่วนที่ไม่ถูกต้อง โปรดดูคำตอบของฉัน
jomo

@ HansWürstchenใช่ แต่ประเด็นคือศูนย์กลางไม่ว่าจะได้รับขนาดใหญ่เป็นตัวเลือกการออกแบบ เพิ่มมากขึ้น CSS = ยุ่งเหยิงมากขึ้น :)
มาเตจ์

1
@matejkramny มันไม่ได้รับขนาดใหญ่หากภาพมีขนาดใหญ่เกินไปจะมีอัตราส่วนผิด นั่นหมายถึงมันยืดตัวสูงและดูไม่เหมาะสม
jomo

✔ว้าวใช้ได้กับภาพที่ล้น (ขนาดใหญ่กว่าเสื้อคลุม) คำตอบที่ยอมรับไม่ได้
Cedric Reichenbach

120

สำหรับโซลูชันที่ทันสมัยกว่าและหากไม่จำเป็นต้องสนับสนุนเบราว์เซอร์รุ่นเก่าคุณสามารถทำได้:

.frame {
    display: flex;
    /**
    Uncomment 'justify-content' below to center horizontally.
    ✪ Read below for a better way to center vertically and horizontally.
    **/

    /* justify-content: center; */
    align-items: center;
}

img {
    height: auto;

    /**
    ✪ To center this image both vertically and horizontally,
    in the .frame rule above comment the 'justify-content'
    and 'align-items' declarations,
    then  uncomment 'margin: auto;' below.
    **/

    /* margin: auto; */
}

/* Styling stuff not needed for demo */
.frame {
    max-width: 900px;
    height: 200px;
    margin: auto;
    background: #222;
}
p {
    max-width: 900px;
    margin: 20px auto 0;
}
img {
    width: 150px;
}
<div class="frame">
    <img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/9988/hand-pointing.png">
</div>

นี่คือปากกา: http://codepen.io/ricardozea/pen/aa0ee8e6021087b6e2460664a0fa3f3e


3
สิ่งนี้มีประโยชน์อย่างยิ่งหากไม่ได้ตั้งค่าความสูงของภาชนะ
เดฟบาร์เน็ตต์

หรือalign-selfสำหรับแต่ละรายการ
Michael

ปัญหาalign-selfคือไอเท็ม flex จะยืดความสูงของคอนเทนเนอร์พาเรนต์
Ricardo Zea

101

วิธีนี้คุณสามารถจัดกึ่งกลางภาพตามแนวตั้ง ( สาธิต ):

div{
  height: 150px; // Internet Explorer 7 fix
  line-height: 150px;
}
img{
  vertical-align: middle;
  margin-bottom: 0.25em;
}

4
แปลกฉันไม่ได้รับคำตอบที่ยอมรับในการทำงานในสถานการณ์ของฉัน (ฉันยังครอบตัดภาพด้วยล้น: ซ่อน) สิ่งนี้ได้ผลอย่างสมบูรณ์
Luca Spiller

3
ฉันเพิ่งทดสอบสิ่งนี้ใน Chrome แต่ความสูงของบรรทัดดูเหมือนจะเป็นกุญแจสำคัญ ฉันใส่แอททริบิวในแนวตั้งใน div แทนที่จะเป็น img เนื่องจาก img ของฉันอยู่ในจุดยึด (<a/>)
Todd Price

1
ใช่แล้ววิธีที่ได้รับการยอมรับนั้นง่ายกว่ามากและใช้งานได้อย่างสวยงาม ฉันยังพบวิธีแก้ปัญหานี้ใน jsfiddle
vdboor

1
ถ้าคุณรู้ว่าอะไรที่จะรองรับได้ความสูงนี้ใช้ได้ดีทีเดียว
KrekkieD

จาก expierence ฉันแก้ปัญหานี้เท่านั้นทำงานร่วมกับสำหรับfont-size: 0 divสำหรับตู้คอนเทนเนอร์ที่ค่อนข้างใหญ่คุณสามารถพลาดได้ แต่ถ้าdiv100px และ img ของคุณคือ 80px มันจะลดลงสักสองสามพิกเซล
alTus

38

นอกจากนี้คุณสามารถใช้ Flexbox เพื่อให้ได้ผลลัพธ์ที่ถูกต้อง:

.parent {
  align-items: center; /* For vertical align */
  background: red;
  display: flex;
  height: 250px;
  /* justify-content: center; <- for horizontal align */
  width: 250px;
}
<div class="parent">
  <img class="child" src="https://cdn2.iconfinder.com/data/icons/social-icons-circular-black/512/stackoverflow-128.png" />
</div>


28

มีเรื่องง่ายสุด ๆทางออกด้วยflexbox!

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

5
ใช่ แต่คุณแทบจะไม่สามารถเห็นได้ในคำตอบทั้งหมด ฉันพยายามเน้นอย่างชัดเจนและชัดเจนเพราะมันเป็นทางออกที่ง่ายกว่าคำตอบอื่น ๆ ทั้งหมด
BBlackwo

นี่เป็นคำตอบที่ดีที่สุดสำหรับฉันเช่นกัน แต่ในกรณีของฉันในเฟรม "inline-flex" ทำงานได้ดีขึ้นสำหรับฉัน และสำหรับภาพที่อยู่ข้างในฉันเพิ่ม: "vertical-align: middle"
โซฟี Cooperman

22

คุณสามารถลองตั้งค่า CSS ของ PI เป็น display: table-cell; vertical-align: middle;


ฉันเคยเห็นวิธีการต่าง ๆ แต่วิธีนี้เป็นของใหม่ (แม้แต่ในปี 2013) สำหรับฉัน
Mike Ebert

ดีกว่าวางภาพไว้ในตารางเพื่อจัดกึ่งกลาง
Jonats

3
แสดงผล: ตารางเซลล์ไม่ได้ปรับขนาดอย่างถูกต้องหากคุณต้องการความกว้างเป็น 100%
Redtopia

1
" PI" คืออะไร
Peter Mortensen


14

โซลูชันภาพพื้นหลัง

ฉันลบองค์ประกอบภาพทั้งหมดและตั้งเป็นพื้นหลังของ div ด้วยคลาส .frame

http://jsfiddle.net/URVKa/2/

อย่างน้อยก็ทำงานได้ดีบน Internet Explorer 8, Firefox 6 และ Chrome 13

ฉันตรวจสอบแล้วและโซลูชันนี้จะไม่ทำงานเพื่อลดขนาดรูปภาพที่มีขนาดสูงกว่า 25 พิกเซล มีคุณสมบัติที่เรียกว่าเป็นbackground-sizeซึ่งกำหนดขนาดขององค์ประกอบ แต่เป็น CSS 3 ซึ่งจะขัดแย้งกับข้อกำหนดของ Internet Explorer 7

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


วิธีแก้ปัญหาที่ดีมาก แต่ฉันคาดว่าภาพบางภาพจะใหญ่กว่าภาชนะและในกรณีนี้ฉันวางแผนที่จะใช้ความสูงสูงสุด / ความกว้างสูงสุดกับพวกเขา มีวิธีทำอย่างไรกับภาพพื้นหลัง?
Arnaud Le Blanc

นี้ไม่ได้เป็น "องค์ประกอบเฟรม" มันเป็น "div กับชั้นเรียนของเฟรม"
JGallardo

ถ้าความสูงของภาพไม่เกินความสูงของกรอบ div นี้เป็นที่ดีที่สุดและง่ายที่สุดในการแก้ปัญหา ...
efirat

13

ลองนึกภาพคุณ

<div class="wrap">
    <img src="#">
</div>

และ CSS:

.wrap {
    display: flex;
}
.wrap img {
    object-fit: contain;
}

Uau! Flex rulzzzz จริงๆ! ขอบคุณ!
Pedro Ferreira

ใช้ฝาครอบแบบสวมวัตถุหากคุณต้องการให้เด็กใช้ความกว้างแบบเต็มของพาเรนต์และยังคงจัดแนวในแนวตั้งไว้ตรงกลาง ดูcss-tricks.com/snippets/css/a-guide-to-flexboxเพื่อย้ายภาพไปรอบ ๆ แม่โดยใช้ flex-box
mattdlockyer

11

คุณสามารถทำได้:

การสาธิต

http://jsfiddle.net/DZ8vW/1

CSS

.frame {
    height: 25px;      /* Equals maximum image height */
    line-height: 25px;
    width: 160px;
    border: 1px solid red;

    text-align: center; 
    margin: 1em 0;
    position: relative; /* Changes here... */
}
img {
    background: #3A6F9A;
    max-height: 25px;
    max-width: 160px;
    top: 50%;           /* Here.. */
    left: 50%;          /* Here... */
    position: absolute; /* And here */
}    


JavaScript

$("img").each(function(){
    this.style.marginTop = $(this).height() / -2 + "px";
})

ดี มีโอกาสสำหรับโซลูชัน CSS บริสุทธิ์หรือไม่?
Arnaud Le Blanc

น่าเสียดายที่ไม่มีเว้นแต่คุณต้องการใช้ตารางหรือปล่อยความเข้ากันได้กับ IE เวอร์ชันเก่ากว่า :( ถ้าคุณรู้ขนาดที่แน่นอนของภาพก่อนมือมันจะแตกต่างกัน แต่ถ้าไม่มีก็ไม่สามารถทำได้ด้วย CSS เพียงอย่างเดียว
Joseph Marikle

@Joseph คุณจะแก้ไขด้วยตารางได้อย่างไร
Benjamin Udink Cate สิบ

@Benjamin Udink ten Cate มันยุ่ง แต่ก็สามารถทำได้ด้วยวิธีนี้: jsfiddle.net/DZ8vW/2 (สิ่งนี้ไม่แนะนำ แต่ควรจะได้ผล)
Joseph Marikle

1
มันเหมาะกับความต้องการอย่างสมบูรณ์แบบ ไม่มี JS เฉพาะ CSS และ HTML
Benjamin Udink ten Cate

11

http://jsfiddle.net/MBs64/

.frame {
    height: 35px;      /* Equals maximum image height */
    width: 160px;
    border: 1px solid red;
    text-align: center;
    margin: 1em 0;
    display: table-cell;
    vertical-align: middle;
}
img {
    background: #3A6F9A;
    display: block;
    max-height: 35px;
    max-width: 160px;
}

คุณสมบัติที่สำคัญคือสำหรับdisplay: table-cell; จะแสดงเป็นแบบอินไลน์กับสิ่งนี้ดังนั้นคุณต้องห่อมันในองค์ประกอบบล็อก.frameDiv.frame

สามารถใช้งานได้ใน Firefox, Opera, Chrome, Safari และ Internet Explorer 8 (และใหม่กว่า)

UPDATE

สำหรับ Internet Explorer 7 เราจำเป็นต้องเพิ่มการแสดงออกของ CSS:

*:first-child+html img {
    position: relative;
    top: expression((this.parentNode.clientHeight-this.clientHeight)/2+"px");
}

ยิ่งใหญ่ มีแฮ็คสำหรับ IE7 ที่จะหลีกเลี่ยงจาวาสคริปต์หรือไม่
Arnaud Le Blanc

ฉันไม่แน่ใจ แต่อาจแสดงออก css อาจช่วย แต่พวกเขาก็เป็นจาวาสคริปต์ด้วย ข้อแตกต่างอย่างเดียวคือคุณเขียนมันลงในไฟล์ css ไม่ใช่ js
Webars

ใช่เป็นความคิดที่ดี ที่จะจัดการได้มากขึ้น (สคริปต์จะทำงานโดยอัตโนมัติตามความจำเป็น) และตามที่ควรจะเป็น IE7 เท่านั้นเท่านั้นก็โอเค
Arnaud Le Blanc

7

โซลูชันของฉัน: http://jsfiddle.net/XNAj6/2/

<div class="container">
    <div class="frame">
        <img src="http://jsfiddle.net/img/logo.png" class="img" alt="" />
    </div>
</div>

.container {
    display: table;
    float: left;
    border: solid black 1px;
    margin: 2px;
    padding: 0;
    background-color: black;
    width: 150px;
    height: 150px;
}
.frame {
    display: table-cell;
    text-align: center;
    vertical-align: middle;
    border-width: 0;
}
.img {
    max-width: 150px;
    max-height: 150px;
    vertical-align: middle;
}

7

ใช้งานได้กับเบราว์เซอร์สมัยใหม่ (2016 ขณะแก้ไข) ดังที่แสดงในตัวอย่างนี้สำหรับ codepen

.frame {
    height: 25px;
    line-height: 25px;
    width: 160px;
    border: 1px solid #83A7D3;          
}
.frame img {
    background: #3A6F9A;
    display:inline-block;
    vertical-align: middle;
}

มันสำคัญมากที่คุณจะต้องให้คลาสของรูปภาพหรือใช้การสืบทอดเพื่อกำหนดเป้าหมายรูปภาพที่คุณต้องการให้อยู่กึ่งกลาง ในตัวอย่างนี้เราใช้.frame img {}เพื่อให้เฉพาะภาพที่ถูกล้อมรอบด้วย div ที่มีคลาส.frameเป็นเป้าหมาย


เฉพาะ ie7 เพียงแค่ใส่ line-height: 25px;
anglimasS

1
ดูเหมือนว่าจะไม่ได้รับการจัดวางอย่างเหมาะสมแม้ใน firefox และ chrome ( jsfiddle.net/4RPFa/19 )
Arnaud Le Blanc

7

ลองใช้วิธีนี้ด้วย CSS บริสุทธิ์ http://jsfiddle.net/sandeep/4RPFa/72/

อาจเป็นปัญหาหลักกับ HTML ของคุณ คุณไม่ได้ใช้เครื่องหมายคำพูดเมื่อคุณกำหนด c lass&image heightใน HTML ของคุณ

CSS:

.frame {
    height: 25px;      /* Equals maximum image height */
    width: 160px;
    border: 1px solid red;
    position: relative;
    margin: 1em 0;
    top: 50%;
    text-align: center;
    line-height: 24px;
    margin-bottom: 20px;
}

img {
    background: #3A6F9A;
    vertical-align: middle;
    line-height: 0;
    margin: 0 auto;
    max-height: 25px;
}

เมื่อผมทำงานรอบกับimgแท็กก็ออก 3 แสนพิกเซล 2 topพื้นที่พิกเซลจาก ตอนนี้ฉันลดลงline-heightและมันใช้งานได้

CSS:

    .frame {
        height: 25px;      /* Equals maximum image height */
        width: 160px;
        border: 1px solid red;
        margin: 1em 0;
        text-align: center;
        line-height: 22px;
        *:first-child+html line-height:24px; /* For Internet Explorer 7 */
    }

    img {
        background: #3A6F9A;
        vertical-align: middle;
        line-height: 0;    
        max-height: 25px;
        max-width: 160px;
    }
@media screen and (-webkit-min-device-pixel-ratio:0) {
    .frame {
        line-height:20px; /* WebKit browsers */
    }

line-heightคุณสมบัติการแสดงผลที่แตกต่างกันในเบราว์เซอร์ที่แตกต่างกัน ดังนั้นเราต้องกำหนดความแตกต่างline-heightเบราว์เซอร์คุณสมบัติที่

ตรวจสอบตัวอย่างนี้: http://jsfiddle.net/sandeep/4be8t/11/

ตรวจสอบตัวอย่างนี้เกี่ยวกับline-heightเบราว์เซอร์ที่แตกต่างกัน: ความแตกต่างของความสูงของ Firefox และ Chrome


2
ไม่ทำงาน (อย่างน้อยใน Firefox) สำหรับเครื่องหมายคำพูดที่หายไปจะอนุญาตให้ใช้ใน HTML5 (ไม่ทราบว่าใช้ประเภทไหนใน jsfiddle)
Arnaud Le Blanc

7

ฉันไม่แน่ใจเกี่ยวกับ Internet Explorer แต่ภายใต้ Firefox และ Chrome หากคุณมีimgในdivคอนเทนเนอร์เนื้อหา CSS ต่อไปนี้ควรใช้งานได้ อย่างน้อยสำหรับฉันมันใช้งานได้ดี:

div.img-container {
    display: table-cell;
    vertical-align: middle;
    height: 450px;
    width: 490px;
}

div.img-container img {
    max-height: 450px;
    max-width: 490px;
}

IE8 + น่าเสียดาย สบายดีสำหรับฉัน แต่อาจจะไม่ใช่เพื่อคนอื่น
TheCarver

โปรดทราบด้วยว่าdisplay:table-cell;ไม่ยอมรับ% ความกว้าง
Mutmatt

7

วิธีการแก้ปัญหาโดยใช้เซลล์ตารางและตาราง

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

เคล็ดลับที่ใช้ที่นี่คือ:

  • คอนเทนเนอร์ตำแหน่งแน่นอนแสดงเป็นตาราง
  • จัดเรียงตามแนวตั้งให้ตรงกับเนื้อหากึ่งกลางที่แสดงเป็นเซลล์ตาราง

.container {
    position: absolute;
    display: table;
    width: 100%;
    height: 100%;
}
.content {
    display: table-cell;
    vertical-align: middle;
}
<div class="container">
  <div class="content">
    <h1 style="text-align:center">Peace in the world</h1>
 </div>
</div>

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


6

วิธีง่ายๆที่ใช้ได้ผลกับฉัน:

img {
    vertical-align: middle;
    display: inline-block;
    position: relative;
}

มันใช้งานได้กับ Google Chrome ได้เป็นอย่างดี ลองใช้อันนี้ในเบราว์เซอร์อื่น


6

สำหรับการจัดกึ่งกลางภาพภายในคอนเทนเนอร์ (อาจเป็นโลโก้) นอกเหนือจากข้อความเช่นนี้:

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

โดยทั่วไปแล้วคุณห่อภาพ

.outer-frame {
  border: 1px solid red;
  min-height: 200px;
  text-align: center; /* Only to align horizontally */
}

.wrapper{
  line-height: 200px;
  border: 2px dashed blue;
  border-radius: 20px;
  margin: 50px
}

img {
  /* height: auto; */
  vertical-align: middle;   /* Only to align vertically */
}
<div class="outer-frame">
  <div class="wrapper">
    some text
    <img src="http://via.placeholder.com/150x150">
  </div>
</div>


4

ถ้าคุณสามารถมีชีวิตที่มีอัตรากำไรพิกเซลขนาดเพียงแค่เพิ่มไปยังfont-size: 1px; .frameแต่จำไว้ว่าตอนนี้ใน.frame 1em = 1px ซึ่งหมายความว่าคุณต้องกำหนดระยะขอบเป็นพิกเซลด้วย

http://jsfiddle.net/feeela/4RPFa/96/

ตอนนี้มันไม่ได้อยู่ตรงกลางอีกต่อไปใน Opera ...


3

ผมมีปัญหาเดียวกัน. สิ่งนี้ใช้ได้กับฉัน:

<style type="text/css">
    div.parent {
        position: relative;
    }

    img.child {
        bottom: 0;
        left: 0;
        margin: auto;
        position: absolute;
        right: 0;
        top: 0;
    }
</style>

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

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

2

คุณสามารถใช้สิ่งนี้:

 .loaderimage {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 60px;
    height: 60px;
    margin-top: -30px; /* 50% of the height */
    margin-left: -30px;
 }

1

การใช้tableและtable-cellวิธีการทำงานโดยเฉพาะอย่างยิ่งเพราะคุณกำหนดเป้าหมายเบราว์เซอร์เก่าเช่นกันฉันสร้างตัวอย่างสำหรับคุณซึ่งคุณสามารถเรียกใช้และตรวจสอบผลลัพธ์:

.wrapper {
  position: relative;
  display: table;
  width: 300px;
  height: 200px;
}

.inside {
  vertical-align: middle;
  display: table-cell;
}
<div class="wrapper">
  <div class="inside">
    <p>Centre me please!!!</p>
  </div>
  <div class="inside">
    <img src="https://cdn2.iconfinder.com/data/icons/social-icons-circular-black/512/stackoverflow-128.png" />
  </div>
</div> 


0

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

jsfiddle

<div class='container'>
  <img src='image.jpg' />
</div>

.container {
  padding: 20%;
  background-color: blue;
}

img {
  width: 100%;
}

0

ทางออกที่ดีที่สุดคือ

.block{
    /* Decor */
    padding:0 20px;
    background: #666;
    border: 2px solid #fff;
    text-align: center;
    /* Important */
    min-height: 220px;
    width: 260px;
    white-space: nowrap;
}
.block:after{
    content: '';
    display: inline-block;
    height: 220px; /* The same as min-height */
    width: 1px;
    overflow: hidden;
    margin: 0 0 0 -5px;
    vertical-align: middle;
}
.block span{
    vertical-align: middle;
    display: inline-block;
    white-space: normal;
}

0

ใช้อันนี้:

position: absolute;
top: calc(50% - 0.5em);
left: calc(50% - 0.5em);
line-height: 1em;

และคุณสามารถเปลี่ยนแปลงfont-sizeได้


0

ต้องการจัดแนวรูปภาพที่มีหลังจากข้อความ / ชื่อเรื่องและทั้งสองอยู่ใน div หรือไม่?

ดูที่JSfiddleหรือ Run Code Snippet

เพียงให้แน่ใจว่ามี ID หรือคลาสในทุกองค์ประกอบของคุณ (div, img, title, ฯลฯ )

สำหรับฉันใช้งานได้กับเบราว์เซอร์ทั้งหมด (สำหรับอุปกรณ์มือถือคุณต้องปรับรหัสของคุณด้วย: @media)

h2.h2red {
    color: red;
    font-size: 14px;
}
.mydivclass {
    margin-top: 30px;
    display: block;
}
img.mydesiredclass {
    margin-right: 10px;
    display: block;
    float: left; /* If you want to allign the text with an image on the same row */
    width: 100px;
    heght: 100px;
    margin-top: -40px /* Change this value to adapt to your page */;
}
<div class="mydivclass">
    <br />
    <img class="mydesiredclass" src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Wikipedia-logo-v2-en.svg/2000px-Wikipedia-logo-v2-en.svg.png">
    <h2 class="h2red">Text aligned after image inside a div by negative manipulate the img position</h2>
</div>

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