การเปลี่ยนขนาดรูปภาพตามสัดส่วนโดยใช้ CSS?


110

ฉันพยายามมาสองสามวันแล้วเพื่อกำหนดค่าแกลเลอรีภาพขนาดย่อของฉันเพื่อให้ภาพทั้งหมดมีความสูงและความกว้างเท่ากัน อย่างไรก็ตามเมื่อฉันเปลี่ยนรหัส Css เป็น

max-height: 150px;
max-width: 200px;
width: 120px;
height: 120px;

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

ขอบคุณล่วงหน้า!

คำตอบ:


187

นี่เป็นปัญหาที่ทราบแล้วเกี่ยวกับการปรับขนาด CSS เว้นแต่รูปภาพทั้งหมดจะมีสัดส่วนเท่ากันคุณไม่มีทางดำเนินการผ่าน CSS ได้

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

หากคอนเทนเนอร์มีขนาดที่ระบุ (ในตัวอย่างของฉันคือความกว้าง) เมื่อบอกให้รูปภาพมีความกว้าง 100% มันจะทำให้เต็มความกว้างของคอนเทนเนอร์ autoที่ความสูงจะทำให้ภาพมีสัดส่วนความสูงความกว้างใหม่

เช่น:

HTML:

<div class="container">
<img src="something.png" />
</div>

<div class="container">
<img src="something2.png" />
</div>

CSS:

.container {
    width: 200px;
    height: 120px;
}

/* resize images */
.container img {
    width: 100%;
    height: auto;
}

42

คุณต้องแก้ไขอีกด้านหนึ่ง (เช่นสูง) และการตั้งค่าอื่น ๆ autoเพื่อ

เช่น

 height: 120px;
 width: auto;

ซึ่งจะปรับขนาดภาพตามด้านเดียวเท่านั้น หากคุณพบว่าการครอบตัดรูปภาพเป็นที่ยอมรับคุณสามารถตั้งค่าได้

overflow: hidden; 

ไปยังองค์ประกอบหลักซึ่งจะครอบตัดสิ่งที่เกินขนาด


ฉันได้ลองแล้ว แต่ก็ยังให้ภาพที่มีขนาดและรูปร่างต่างกันฉันต้องการให้แกลเลอรีมีลักษณะเหมือนกัน [] [] [] [] ไม่เหมือน [] [] [] [] []
Beaniie

2
ใช้การรวมกันของทั้งสองด้านบน: ตั้งค่าความสูงเป็นตัวเลข (พร้อมความกว้างอัตโนมัติเพื่อรักษามาตราส่วน) และ จำกัด พาเรนต์ไว้ที่ความกว้างเฉพาะoverflow: hiddenเพื่อตัดส่วนที่เกิน
Nick Andriopoulos

25

คุณสามารถใช้object-fitคุณสมบัติ css3 ได้เช่น

<!doctype html>
<html>

<head>
  <meta charset='utf-8'>
  <style>
    .holder {
      display: inline;
    }
    .holder img {
      max-height: 200px;
      max-width: 200px;
      object-fit: cover;
    }
  </style>
</head>

<body>
  <div class='holder'>
    <img src='meld.png'>
  </div>
  <div class='holder'>
    <img src='twiddla.png'>
  </div>
  <div class='holder'>
    <img src='meld.png'>
  </div>
</body>

</html>

ไม่ใช่คำตอบของคุณอย่างแน่นอนเพราะมันไม่ได้ยืดตู้คอนเทนเนอร์ แต่มันก็เหมือนแกลเลอรี่และคุณสามารถจัดแต่งทรงผมimgได้

ข้อเสียเปรียบอีกประการหนึ่งของโซลูชันนี้ยังคงเป็นการสนับสนุนคุณสมบัติ css3 ที่ไม่ดี รายละเอียดเพิ่มเติมมีอยู่ที่นี่: http://www.steveworkman.com/html5-2/javascript/2012/css3-object-fit-polyfill/ โซลูชัน jQuery สามารถพบได้ที่นั่นเช่นกัน


ขอบคุณทางออกที่ดี :)
Bibhu

นี่เป็นเรื่องแปลกที่จะตอบด้วยคุณสมบัติที่รองรับเฉพาะในตู้เอทีเอ็มของโอเปร่า! caniuse.com/object-fit
Simon Dragsbæk

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

1
เมื่อมาถึงหน้านี้หลายปีต่อมาฉันมีความสุขที่ได้พบคำตอบ 'อนาคต' นี้!
petzi

8

ในการปรับภาพ / ยืดหยุ่นคุณสามารถใช้สิ่งนี้:

/* fit images to container */
.container img {
    max-width: 100%;
    height: auto;
}

5

ใส่เป็นพื้นหลังบนตัวยึดของคุณเช่น

<div style="background:url(path/to/image/myimage.jpg) center center; width:120px; height:120px;">
&nbsp;
</div>

สิ่งนี้จะจัดกึ่งกลางภาพของคุณภายในขนาด 120x120 div เพื่อตัดส่วนที่เกินของภาพออกไป


3

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

  1. ภาพจะไม่ถูกครอบตัด
  2. อัตราส่วนภาพจะยังคงเหมือนเดิม

HTML:

<div id="app">
    <div id="container">
      <img src="#" alt="something">
    </div>
    <div id="container">
      <img src="#" alt="something">
    </div>
    <div id="container">
      <img src="#" alt="something">
    </div>
</div>

CSS:

div#container {
    height: 200px;
    width: 200px;
    border: 1px solid black;
    margin: 4px;
}
img {
    max-width: 100%;
    max-height: 100%;
    display: block;
    margin: 0 auto;
}


-1

หากคุณทราบอัตราส่วนสเปกตรัมคุณสามารถใช้ padding-bottom กับเปอร์เซ็นต์เพื่อตั้งค่าความสูงโดยขึ้นอยู่กับค่าต่าง

<div>
   <div style="padding-bottom: 33%;">
      i have 33% height of my parents width
   </div>
</div>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.