ปรับขนาดภาพอัตโนมัติใน CSS FlexBox Layout และรักษา Aspect Ratio?


99

ฉันใช้เค้าโครงกล่องดิ้น CSS ซึ่งปรากฏดังที่แสดงด้านล่าง:

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

หากหน้าจอเล็กลงจะเปลี่ยนเป็น:

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

ปัญหาคือรูปภาพไม่ได้ถูกปรับขนาดโดยคงสัดส่วนภาพจากภาพต้นฉบับ

เป็นไปได้ไหมที่จะใช้ CSS บริสุทธิ์และเค้าโครงกล่องดิ้นเพื่อให้ภาพถูกปรับขนาดหากหน้าจอเล็กลง

นี่คือ html ของฉัน:

<div class="content">
  <div class="row"> 
    <div class="cell">
      <img src="http://i.imgur.com/OUla6mK.jpg"/>
    </div>
    <div class="cell">
      <img src="http://i.imgur.com/M16WzMd.jpg"/>
    </div>
  </div>
</div>

CSS ของฉัน:

.content {
    background-color: yellow;    
}

.row {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;

    -webkit-box-orient: horizontal; 
    -moz-box-orient: horizontal;
    box-orient: horizontal;
    flex-direction: row;

    -webkit-box-pack: center;
    -moz-box-pack: center;
    box-pack: center;
    justify-content: center;

    -webkit-box-align: center;
    -moz-box-align: center;
    box-align: center;  
    align-items: center;

    background-color: red;

}

.cell {
    -webkit-box-flex: 1;
    -moz-box-flex: 1;
    box-flex: 1;
    -webkit-flex: 1 1 auto;
    flex: 1 1 auto; 

    padding: 10px;
    margin: 10px;

    background-color: green;
    border: 1px solid red;
    text-align: center;

}

คำตอบ:


87

img {max-width:100%;}เป็นวิธีหนึ่งในการทำเช่นนี้ เพียงเพิ่มลงในโค้ด CSS ของคุณ

http://jsfiddle.net/89dtxt6s/


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

@confile มันขึ้นอยู่กับเลย์เอาต์โค้ดของคุณมาก แต่คุณสามารถลองเพิ่มheight:100%;ลงในimgcss
Omega

height: 100vhheight: 100%จะทำไม่ได้ การจัดแต่งทรงผมเพื่อความสูงเป็นเรื่องยุ่งยากเสมอ
gdbj

1
เหตุใดจึงถูกทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้อง Omega ไม่ได้เปลี่ยนเป็นพฤติกรรมเริ่มต้นของเบราว์เซอร์หรือไม่? jsfiddle.net/89dtxt6s/221
VeeK

74

ฉันมาที่นี่เพื่อหาคำตอบสำหรับภาพที่บิดเบี้ยวของฉัน ไม่แน่ใจทั้งหมดเกี่ยวกับสิ่งที่ op กำลังมองหาข้างต้น แต่ฉันพบว่าการเพิ่มเข้าalign-items: centerจะช่วยแก้ปัญหาให้ฉันได้ การอ่านเอกสารควรลบล้างสิ่งนี้หากคุณกำลังงอรูปภาพโดยตรงเนื่องจากalign-items: stretchเป็นค่าเริ่มต้น อีกวิธีหนึ่งคือการรวมรูปภาพของคุณด้วย div ก่อน

.myFlexedImage {
  display: flex;
  flex-flow: row nowrap;
  align-items: center;
}

12
"ฉันมาที่นี่เพื่อหาคำตอบสำหรับภาพที่บิดเบี้ยวของฉัน" ฉันมาที่นี่ด้วยเหตุผลเดียวกันและวิธีแก้ปัญหาของคุณก็ช่วยฉันได้ (สิ่งที่ระบุว่าเป็นโซลูชันจริงไม่ได้ช่วยฉันเลย)
Wagner Danda da Silva Filho

สิ่งนี้ช่วยฉันด้วยมีใครอธิบายได้ไหมว่าทำไมถึงได้ผล
Jerry B. no.1 นักศึกษาฝึกงาน

นี่เป็นคำตอบที่ถูกต้องสำหรับฉัน ความกว้างสูงสุด: 100%; ไม่ได้แก้ไขความสูง (ความสูงยังคงยืดออกเล็กน้อย) ในกรณีของฉันฉันใช้ align-items: flex-start; เพราะฉันไม่ต้องการให้รูปภาพอยู่กึ่งกลางแนวตั้งในคอนเทนเนอร์ แต่มันยังใช้งานได้เนื่องจากมันจะแทนที่ค่าเริ่มต้นของการจัดตำแหน่ง: ยืด; นี่คือรายการค่าคุณสมบัติทั้งหมดสำหรับการจัดตำแหน่งรายการที่คุณสามารถใช้เพื่อแทนที่: w3schools.com/cssref/css3_pr_align-items.asp
Kyle Vassella

พยายามหลายสิ่งหลายอย่าง แต่รายการจัดแนวของคุณ: ศูนย์กลางอยู่ที่พาเรนต์เป็นสิ่งเดียวที่ทำเคล็ดลับ
Micros

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ การจัดแนวเนื้อหาไม่ได้ผลสำหรับฉันในแง่ของการยืด แต่รายการจัดแนวมีทั้งสองฟังก์ชันที่แตกต่างกัน SE นี้เคลียร์ความแตกต่างระหว่างสอง: stackoverflow.com/questions/27539262/…
John Ernest

45

คุณอาจต้องการลองใช้คุณสมบัติ CSS3 ใหม่และเรียบง่าย:

img { 
  object-fit: contain;
}

มันรักษาอัตราส่วนภาพ (เช่นเดียวกับเมื่อคุณใช้เคล็ดลับภาพพื้นหลัง) และในกรณีของฉันก็ใช้ได้ดีกับปัญหาเดียวกัน

โปรดระวัง IE ไม่รองรับ (ดูรายละเอียดการสนับสนุนที่นี่ )


4
โปรดจำไว้ว่าออบเจ็กต์หลักจะต้องมีความยืดหยุ่น
Lokinou

ฉันลองสิ่งนี้และมันทำงานได้อย่างสมบูรณ์แบบภายใน flex div
Rémy Kaloustian

6

ฉันขอแนะนำให้ดูbackground-sizeตัวเลือกในการปรับขนาดภาพ

แทนที่จะมีภาพในเพจหากคุณตั้งค่าเป็นภาพพื้นหลังคุณสามารถตั้งค่าได้ดังนี้

background-size: contain

หรือ

background-size: cover

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


3

ในภาพที่สองดูเหมือนว่าคุณต้องการให้รูปภาพเต็มช่อง แต่ตัวอย่างที่คุณสร้างขึ้นนั้นยังคงรักษาอัตราส่วนไว้ (สัตว์เลี้ยงดูปกติไม่ผอมหรืออ้วน)

ฉันไม่รู้ว่าถ้าคุณ photoshopped ภาพเหล่านั้นเป็นตัวอย่างหรือภาพที่สองคือ "ควรจะเป็นอย่างไร" เช่นกัน (คุณบอกว่า IS ในขณะที่ตัวอย่างแรกคุณบอกว่า "ควร")

อย่างไรก็ตามฉันต้องถือว่า:

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

หากนั่นเป็นปัญหาของคุณรหัสที่คุณระบุไม่ได้แสดงถึง "ปัญหาของคุณ" แต่เป็นตัวอย่างเริ่มต้นของคุณ

จากสมมติฐานสองข้อก่อนหน้านี้สิ่งที่คุณต้องการไม่สามารถทำได้ด้วยภาพจริงหากความสูงของกล่องเป็นแบบไดนามิก แต่มีภาพพื้นหลัง ไม่ว่าจะโดยใช้ "background-size: contain" หรือเทคนิคเหล่านี้ (สมาร์ทแพดดิ้งเป็นเปอร์เซ็นต์ที่ จำกัด การครอบตัดหรือขนาดสูงสุดที่ใดก็ได้ที่คุณต้องการ): http://fofwebdesign.co.uk/template/_testing/scale-img/scale- img.htm

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

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

แบบนี้:

<div class="content">
  <div class="row">    
      <div class="cell">    
          <img src="http://lorempixel.com/output/people-q-c-320-320-2.jpg"/>
      </div>
      <div class="cell">    
          <img src="http://lorempixel.com/output/people-q-c-320-320-7.jpg"/>
      </div>
    </div>
</div>

และ CSS:

.content {
    background-color: green;
}

.row {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;

    -webkit-box-orient: horizontal; 
    -moz-box-orient: horizontal;
    box-orient: horizontal;
    flex-direction: row;

    -webkit-box-pack: center;
    -moz-box-pack: center;
    box-pack: center;
    justify-content: center;

    -webkit-box-align: center;
    -moz-box-align: center;
    box-align: center;  
    align-items: center;

}

.cell {
    -webkit-box-flex: 1;
    -moz-box-flex: 1;
    box-flex: 1;
    -webkit-flex: 1 1 auto;
    flex: 1 1 auto;
    padding: 10px;
    border: solid 10px red;
    text-align: center;
    height: 300px;
    display: flex;
    align-items: center;
    box-sizing: content-box;
}
img {
    margin: auto;
    width: 100%;
    max-width: 300px;
    max-height:100%
}

http://jsfiddle.net/z25heocL/

รหัสของคุณไม่ถูกต้อง (แท็กเปิดแทนที่จะเป็นแท็กปิดดังนั้นจึงส่งออกเซลล์ NESTED ไม่ใช่พี่น้องเขาใช้ภาพหน้าจอของคุณภายในรหัสที่ผิดพลาดและกล่องดิ้นไม่ได้ถือเซลล์ แต่ทั้งสองตัวอย่างในคอลัมน์ ( คุณตั้งค่า "row" แต่รหัสที่เสียหายที่ซ้อนอยู่ในเซลล์หนึ่งภายในอีกเซลล์หนึ่งส่งผลให้เกิด flex ภายใน flex ในที่สุดก็ทำงานเป็น COLUMNS ฉันไม่รู้ว่าคุณต้องการทำอะไรและคุณสร้างโค้ดนั้นขึ้นมาได้อย่างไร แต่ฉัน ' m เดาว่าสิ่งที่คุณต้องการคือสิ่งนี้

ฉันเพิ่มการแสดงผล: โค้งงอให้กับเซลล์ด้วยดังนั้นภาพจึงอยู่ตรงกลาง (ฉันคิดว่าน่าdisplay: tableจะถูกใช้ที่นี่เช่นกันกับมาร์กอัปทั้งหมดนี้)


ดูเหมือนว่าคุณจะไม่ได้ระแคะระคายเลยแม้แต่น้อยว่าฉันตอบคำถามอย่างไร html และ css ทั้งหมดใน jsfiddle นั้นคือสิ่งที่ผู้ถาม (@confile) ให้ไว้ เพียงอ่านคำถามแล้วคุณจะเห็นว่า วิธีแก้ปัญหาของฉันคือ css img {max-width: 100%;} เพียงบรรทัดเดียวและผู้ถามยอมรับคำตอบของฉันเมื่อหนึ่งปีที่แล้วเนื่องจากมีวิธีแก้ปัญหาที่ถูกถาม ฉันขอให้คุณได้รับสิ่งที่ดีที่สุดที่นี่โปรดพยายามอ่านคำถามให้ถูกต้องแล้วตอบตามนั้นในอนาคตขอบคุณ
Omega

0

HTML:

<div class="container">
    <div class="box">
        <img src="http://lorempixel.com/1600/1200/" alt="">
    </div>
</div>

CSS:

.container {
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: stretch;

  width: 100%;
  height: 100%;

  border-radius: 4px;
  background-color: hsl(0, 0%, 96%);
}

.box {
  border-radius: 4px;
  display: flex;
}

.box img {
  width: 100%;
  object-fit: contain;
  border-radius: 4px;
}

0

นั่นคือวิธีที่ฉันจะจัดการกับภาพต่างๆ (ขนาดและสัดส่วน) ในตารางที่ยืดหยุ่น

.images {
  display: flex;
  flex-wrap: wrap;
  margin: -20px;
}

.imagewrapper {
  display: flex;
  justify-content: center;
  align-items: center;
  width: calc(50% - 20px);
  height: 300px;
  margin: 10px;
}

.image {
  display: block;
  object-fit: cover;
  width: 100%;
  height: 100%; /* set to 'auto' in IE11 to avoid distortions */
}
<div class="images">
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/800x600" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/1024x768" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/1000x800" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/500x800" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/800x600" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/1024x768" />
  </div>
</div>


-6

ฉันใช้ jquery หรือ vw เพื่อรักษาอัตราส่วน

jquery

function setSize() {
    var $h = $('.cell').width();
    $('.your-img-class').height($h);
}
$(setSize);
$( window ).resize(setSize); 

vw

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