ขนาดภาพ CSS, วิธีเติม, ไม่ยืด


415

ฉันมีภาพและฉันต้องการตั้งค่าความกว้างและความสูงเฉพาะ (เป็นพิกเซล)

แต่ถ้าฉันตั้งค่าความกว้างและความสูงโดยใช้ CSS (width:150px; height:100px ) รูปภาพจะถูกยืดออกและอาจน่าเกลียด

วิธีเติมภาพให้มีขนาดเฉพาะโดยใช้ CSS และไม่ยืดออกมันได้หรือไม่

ตัวอย่างการเติมและยืดภาพ:

ภาพต้นฉบับ:

เป็นต้นฉบับ

ยืดภาพ:

ยืด

ภาพที่เต็มไป:

ที่เต็มไปด้วย

โปรดทราบว่าในตัวอย่างภาพที่เติมด้านบน: ก่อนอื่นรูปภาพจะถูกปรับขนาดเป็น 150x255 (อัตราส่วนภาพคงที่) จากนั้นภาพจะถูกตัดเป็น 150x100


ลองตั้งค่าwidthและheightควรปรับให้เหมาะสม
NewInTheBusiness

3
มันยืดภาพ ดูสิ่งนี้: jsfiddle.net/D7E3E
Mahdi Ghiasi

มันเป็นส่วนหนึ่งของภาพที่ไม่ปรับขนาด!
Ali Ben Messaoud

3
Chris Coyier's มีวิธีแก้ปัญหาที่ดีเช่นนี้: css-tricks.com/perfect-full-page-background-image
คลุมเครือ

1
สำคัญมาก: นี่เป็นวิธีปฏิบัติที่ไม่ดีอย่างไม่น่าเชื่อสำหรับวัตถุประสงค์ SEO หากคุณใช้มันเป็นภาพพื้นหลังก็ใช้งานได้ แต่ถ้าคุณต้องการให้ Google ค้นพบภาพมันจะไม่ได้รับการจัดทำดัชนีหากเป็นภาพพื้นหลังเท่านั้น
Alex Banman

คำตอบ:


395

หากคุณต้องการใช้ภาพเป็นพื้นหลัง CSS ก็มีทางออกที่สวยงาม เพียงใช้coverหรือcontainในbackground-sizeคุณสมบัติ CSS3

.container {
  width: 150px;
  height: 100px;
  background-image: url("http://i.stack.imgur.com/2OrtT.jpg");
  background-size: cover;
  background-repeat: no-repeat;
  background-position: 50% 50%;
}
<div class="container"></div>

ในขณะที่coverจะให้ภาพที่ปรับขนาดขึ้นคุณcontainจะให้ภาพที่ปรับขนาดลง ทั้งสองจะรักษาอัตราส่วนพิกเซล

http://jsfiddle.net/uTHqs/ (ใช้หน้าปก)

http://jsfiddle.net/HZ2FT/ (ใช้ในการบรรจุ)

วิธีการนี้มีข้อดีของการเป็นมิตรกับจอแสดงผล Retina ตามคู่มือฉบับย่อของ Thomas Fuchs

เป็นมูลค่าการกล่าวขวัญว่าการสนับสนุนเบราว์เซอร์สำหรับคุณสมบัติทั้งสองไม่รวม IE6-8


1
เนื่องจากคุณสามารถปรับขนาดภาพได้อย่างหมดจดใน CSS สิ่งนี้จะช่วยให้คุณใช้ภาพขนาดใหญ่แล้วย่อขนาดลงตามความหนาแน่นของพิกเซลของอุปกรณ์แต่ละชิ้นโดยใช้คำสั่งสื่อ
Marcelo De Polli

1
คุณช่วยอธิบายได้ไหมว่าทำไมในกรณีนี้ตำแหน่งพื้นหลังดูเหมือนจะระบุตำแหน่งของศูนย์กลางของภาพแทนที่จะเป็นมุมซ้ายบน มันเป็นผลมาจากขนาดพื้นหลัง: ปก?
matteo

1
ฉันแค่ครอบคลุม DIV ทั้งหมดที่ขยายภาพ ฉันไม่เห็นเส้นโค้งสิ้นสุด
SearchForKnowledge

3
มีbackground-repeat: no-repeat;ไว้เพื่ออะไร หากภาพครอบคลุมคอนเทนเนอร์มันจะไม่ทำซ้ำตัวเองอยู่ดี
lurkit

3
'ตำแหน่งพื้นหลัง' สามารถตั้งค่าเป็น 'ศูนย์กึ่งกลาง' ได้เช่นกัน เช่น.. container {... background-position: center center; }
Leo Ribeiro

556

object-fitคุณสามารถใช้คุณสมบัติของ CSS

.cover {
  object-fit: cover;
  width: 50px;
  height: 100px;
}
<img src="http://i.stack.imgur.com/2OrtT.jpg" class="cover" width="242" height="363" />

ดูตัวอย่างได้ที่นี่

มี polyfill สำหรับ IE: https://github.com/anselmh/object-fit


11
น่าสนใจที่จะเห็นว่าสิ่งนี้สามารถทำได้ด้วยimgแท็กด้วย (ไม่ใช่เพียงbackground-imageวิธีที่อธิบายไว้ในคำตอบข้างต้น) ขอบคุณ :)
Mahdi Ghiasi

44
เมื่อพิจารณาถึงนี้เป็นตัวเลือกเก็บไว้ในใจว่าจะไม่ได้รับการสนับสนุนในเบราว์เซอร์มากobject-fit
joshreesjones

2
น่าเสียดายbackground-sizeที่โซลูชันของฉันทำงานได้ไม่ค่อยดี คุณมีโอกาสน้อยที่จะได้รับผลประโยชน์ SEO ใด ๆ และไม่สามารถให้แท็ก ALT คำอธิบายภาพ ฯลฯ เพื่อประกอบภาพที่คุณอาจต้องการให้บริบทเพิ่มเติมสำหรับโปรแกรมอ่านหน้าจอ
Markus

3
นี่เจ๋ง แต่ไม่มีการรองรับ IE Polyfills ไม่ทำงานอีกต่อไป
Jake

3
เพียงแค่ใช้object-fit: cover;มัน ขอบคุณมาก
Luka

67

การเพิ่มประสิทธิภาพในคำตอบข้างต้นโดย @afonsoduarte ( ไม่ได้รับการยอมรับอย่างใดอย่างหนึ่ง)
ในกรณีที่คุณใช้bootstrap


มีความแตกต่างสามประการ:

  1. ให้บริการwidth:100%กับสไตล์
    สิ่งนี้มีประโยชน์หากคุณใช้bootstrapและต้องการให้ภาพขยายความกว้างที่มีทั้งหมด

  2. การระบุheightคุณสมบัติเป็นทางเลือกคุณสามารถลบ / เก็บตามที่คุณต้องการ

    .cover {
       object-fit: cover;
       width: 100%;
       /*height: 300px;  optional, you can remove it, but in my case it was good */
    }
  3. โดยวิธีการที่ไม่จำเป็นต้องให้heightและwidthคุณลักษณะในimageองค์ประกอบเพราะพวกเขาจะถูกแทนที่โดยสไตล์
    ดังนั้นก็เพียงพอที่จะเขียนอะไรเช่นนี้

    <img class="cover" src="url to img ..."  />

1
สิ่งที่ฉันกำลังมองหา
francis lanthier

1
คุณต้องจูบ!
ฉินวัง

การปรับแบบวัตถุไม่ทำงานกับ IE?
bgcode

1
มันเป็นปี 2020 ฉันคิดว่ามันเป็นเวลาที่ดีที่จะละทิ้ง IE
Hakan Fıstık

56

วิธีการเดียวที่แท้จริงคือการมีภาชนะรอบภาพและการใช้งานของคุณoverflow:hidden:

HTML

<div class="container"><img src="ckk.jpg" /></div>

CSS

.container {
    width: 300px;
    height: 200px;
    display: block;
    position: relative;
    overflow: hidden;
}

.container img {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
}

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

var conHeight = $(".container").height();
var imgHeight = $(".container img").height();
var gap = (imgHeight - conHeight) / 2;
$(".container img").css("margin-top", -gap);

http://jsfiddle.net/x86Q7/2/


1
ขอบคุณ มันทำงาน แต่มันพืชภาพจากด้านบน (ดูสิ่งนี้: jsfiddle.net/x86Q7 ) ไม่มีวิธีใดที่จะตัดภาพจากกึ่งกลาง ?
Mahdi Ghiasi

1
@MahdiGhiasi: เปลี่ยนคุณสมบัติด้านบนและด้านซ้ายใน. container img css !!
Ali Ben Messaoud

ฉันอาจตั้งค่าmargin-topรูปภาพตามตัวอย่าง50px(ดูสิ่งนี้: jsfiddle.net/x86Q7/1 ) แต่จะตัดมันจากจุดศูนย์กลางจริงได้อย่างไร (ไม่มี jQuery หรือไม่)
Mahdi Ghiasi

2
ขอโทษด้วยที่ไม่เห็นความคิดเห็นของคุณ แต่ฉันเพิ่ม jquery เพิ่งใส่หีบ :)
Dominic Green

1
สุดยอดทางออก! สำหรับฉันการเติมในแนวตั้งมีความสำคัญมากกว่าแนวนอนดังนั้นฉันจึงต้องเปลี่ยน "ความกว้าง: 100%" เป็น "ความสูง: 100%" สำหรับชั้น '.container img' ขอบคุณ!
deebs

26

โซลูชัน CSS ไม่ใช่ JS และไม่มีภาพพื้นหลัง:

วิธีที่ 1 "มาร์จิ้นอัตโนมัติ" (IE8 + - ไม่ใช่ FF!):

div{
  width:150px; 
  height:100px; 
  position:relative;
  overflow:hidden;
}
div img{
  position:absolute; 
  top:0; 
  bottom:0; 
  margin: auto;
  width:100%;
}
<p>Original:</p>
<img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>

<p>Wrapped:</p>
<div>
  <img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
</div>

http://jsfiddle.net/5xjr05dt/

วิธีที่ 2 "แปลง" (IE9 +):

div{
  width:150px; 
  height:100px; 
  position:relative;
  overflow:hidden;
}

div img{
  position:absolute; 
  width:100%;
  top: 50%;
  -ms-transform: translateY(-50%);
  -webkit-transform: translateY(-50%);
  transform: translateY(-50%);
}
<p>Original:</p>
<img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>

<p>Wrapped:</p>
<div>
  <img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
</div>

http://jsfiddle.net/5xjr05dt/1/

วิธีที่ 2 สามารถใช้เพื่อจัดกึ่งกลางภาพในคอนเทนเนอร์ความกว้าง / ความสูงคงที่ ทั้งสองสามารถล้น - และถ้าภาพมีขนาดเล็กกว่าภาชนะมันจะยังคงเป็นศูนย์กลาง

http://jsfiddle.net/5xjr05dt/3/

วิธีที่ 3 "wrapper คู่" (IE8 + - ไม่ใช่ FF!):

.outer{
  width:150px; 
  height:100px; 
  margin: 200px auto; /* just for example */
  border: 1px solid red; /* just for example */
  /* overflow: hidden;	*/ /* TURN THIS ON */
  position: relative;
}
.inner { 
    border: 1px solid green; /* just for example */
    position: absolute;
    top: 0;
    bottom: 0;
    margin: auto;
    display: table;
    left: 50%;
}
.inner img {
    display: block;
    border: 1px solid blue; /* just for example */
    position: relative;
    right: 50%;
    opacity: .5; /* just for example */
}
<div class="outer">
  <div class="inner">
     <img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
  </div>
</div>

http://jsfiddle.net/5xjr05dt/5/

วิธีที่ 4 "double wrapper และ double image" (IE8 +):

.outer{
  width:150px; 
  height:100px; 
  margin: 200px auto; /* just for example */
  border: 1px solid red; /* just for example */
  /* overflow: hidden;	*/ /* TURN THIS ON */
  position: relative;
}
.inner { 
    border: 1px solid green; /* just for example */
    position: absolute;
    top: 50%;
    bottom: 0;
    display: table;
    left: 50%;
}
.inner .real_image {
    display: block;
    border: 1px solid blue; /* just for example */
    position: absolute;
    bottom: 50%;
    right: 50%;
    opacity: .5; /* just for example */
}

.inner .placeholder_image{
  opacity: 0.1; /* should be 0 */
}
<div class="outer">
  <div class="inner">
    <img class="real_image" src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
    <img class="placeholder_image"  src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
  </div>
</div>

http://jsfiddle.net/5xjr05dt/26/

  • วิธีที่ 1 มีการรองรับที่ดีขึ้นเล็กน้อย - คุณต้องกำหนดความกว้างหรือความสูงของภาพ!
  • ด้วยคำนำหน้าวิธีที่ 2 ยังมีการสนับสนุนที่ดี (จาก IE9 ขึ้นไป) - วิธีที่ 2 ไม่รองรับ Opera mini!
  • วิธีที่ 3 ใช้สอง wrappers - สามารถ overflow ความกว้างและความสูง
  • วิธีที่ 4 ใช้ภาพซ้อน (หนึ่งภาพเป็นตัวยึดตำแหน่ง) สิ่งนี้จะให้แบนด์วิดท์เหนือศีรษะเป็นพิเศษ แต่ก็รองรับ crossbrowser ได้ดียิ่งขึ้น

วิธีที่ 1 และ 3 ดูเหมือนจะไม่ทำงานกับ Firefox


นี่เป็นวิธีเดียวที่ใช้งานได้จริง (ลบด้วยวิธี js) ขอบคุณ!
Jake

มันถูก จำกัด ให้ล้นความสูงหรือความกว้าง แต่เป็นทางออกที่น่าสนใจ
Jake

1
@Jake - เป็นไปได้ที่จะล้นความกว้างและความสูงด้วยวิธีที่ 2 ด้านบน - ดูคำตอบที่อัปเดตของฉันด้วยซอเพิ่มเติม
JT Houtenbos

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

1
@ เจค - เจ๋ง - ฉันพบวิธีที่ 3 ในการทำกึ่งกลางแนวนอน ฉันขยายวิธีนี้เพื่อรองรับการจัดกึ่งกลางแนวตั้ง ฉันจะโพสต์การเพิ่มของฉันเป็นวิธีที่ 3 ด้านบน ดูเหมือนว่ามันจะเป็นหลักฐาน IE7 + (อาจต่ำกว่า) นี่คือคำตอบเดิม: stackoverflow.com/questions/3300660/ …
JT Houtenbos

10

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

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

CSS:

.imgContainer {
    display: block;
    width: 150px; 
    height: 100px;
}

.imgContainer img {
    max-width: 100%;
    max-height: 100%;
}

HTML:

<div class='imgContainer'>
    <img src='imagesrc.jpg' />
</div>

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

หากคุณต้องการจัดกึ่งกลางภาพในแนวตั้งและแนวนอนคุณสามารถเปลี่ยนคอนเทนเนอร์ css เป็น:

.imgContainer {
    display: table-cell;
    width: 150px; 
    height: 100px;
    text-align: center;
    vertical-align: middle;
}

นี่คือ JS Fiddle http://jsfiddle.net/9kUYC/2/


มันไม่เหมือนกับปกใน CSS ซึ่งหนึ่งในมิติที่ได้นั้นเกิน 100% เสมอ (หรือเท่ากับในกรณีขอบ)
Miroshko

ไม่โซลูชันนี้ทำให้แน่ใจได้ว่าจะไม่ยืดเกิน 100% ซึ่งเป็นส่วนหนึ่งของคำถามเกี่ยวกับ พวกเขาไม่ต้องการให้ภาพบิดเบี้ยวหรือขยายเกินขนาดดั้งเดิม
earl3s

3
คำถามคือ "วิธีการเติม" ด้วยตัวอย่างของภาพที่เต็มไปซึ่งถูกครอบตัดอย่างเห็นได้ชัด
Miroshko

แต่ถ้าคุณต้องการให้ภาพตอบสนอง การกำหนดความกว้างและความสูงเฉพาะจะไม่สามารถใช้งานได้😕
Ricardo Zea

2
มันเป็นสิ่งที่ฉันต้องการ ขอบคุณ!
Nico Rodsevich

5

การสร้างคำตอบของ @Dominic Green โดยใช้ jQuery นี่เป็นวิธีแก้ปัญหาที่ควรใช้กับรูปภาพที่กว้างกว่าที่เป็นสูงหรือสูงกว่ากว้าง

http://jsfiddle.net/grZLR/4/

อาจมีวิธีการใช้ JavaScript ที่หรูหรากว่า แต่ก็ใช้งานได้

function myTest() {
  var imgH = $("#my-img").height();
  var imgW = $("#my-img").width();
  if(imgW > imgH) {
    $(".container img").css("height", "100%");
    var conWidth = $(".container").width();
    var imgWidth = $(".container img").width();
    var gap = (imgWidth - conWidth)/2;
    $(".container img").css("margin-left", -gap);
  } else {
    $(".container img").css("width", "100%");
    var conHeight = $(".container").height();
    var imgHeight = $(".container img").height();
    var gap = (imgHeight - conHeight)/2;
    $(".container img").css("margin-top", -gap);
  }
}
myTest();

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

ระวังถ้าคุณใช้งานธีมหรือบางอย่างพวกเขามักจะประกาศ img ความกว้างสูงสุดที่ 100% คุณไม่ต้องทำอะไรเลย ทดสอบ :)

https://jsfiddle.net/o63u8sh4/

<p>Original:</p>
<img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>

<p>Wrapped:</p>
<div>
    <img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
</div>


div{
  width:150px; 
  height:100px; 
  position:relative;
  overflow:hidden;
}
div img{
  min-width:100%;
  min-height:100%;
  height:auto;
  position:relative;
  top:50%;
  left:50%;
  transform:translateY(-50%) translateX(-50%);
}

นี่คือคำตอบที่ฉันต้องการ
Marcos Buarque

นี่คือสิ่งที่ฉันต้องการจะทำเป็นเวลานานขอบคุณ;)
บอส COTIGA

4

ฉันช่วยสร้างปลั๊กอิน jQuery ชื่อFillmoreซึ่งจัดการกับbackground-size: coverในเบราว์เซอร์ที่สนับสนุนและมี shim สำหรับผู้ที่ไม่ได้ ลองดูสิ!


4

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

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

HTML:

 <span class="block clear img-card b-b b-light text-center" [ngStyle]="{'background-image' : 'url('+event.image+')'}"></span>

CSS

.img-card {
background-repeat: no-repeat;
background-size: cover;
background-position: 50% 50%;
width: 100%;
overflow: hidden;
}

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

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

3

ลองอะไรเช่นนี้: http://jsfiddle.net/D7E3E/4/

ใช้ภาชนะที่มีมากเกิน: ซ่อน

แก้ไข: @Dominic Green เอาชนะฉัน


ขอบคุณ มันทำงาน แต่มันพืชภาพจากด้านบน (ดูสิ่งนี้: jsfiddle.net/x86Q7 ) ไม่มีวิธีใดที่จะตัดภาพจากกึ่งกลาง ?
Mahdi Ghiasi

อาจจะค่อนข้างยากกับ CSS นี่เป็นสิ่งที่ดีที่สุดที่ฉันสามารถคิดได้กับjsfiddle.net/D7E3E/5
woutr_be

ใช่เพื่อให้อยู่กึ่งกลางอย่างถูกต้องคุณควรใช้ jQuery อาจจะง่ายกว่ามาก
woutr_be

3

นี่จะเป็นการเติมรูปภาพให้มีขนาดเฉพาะโดยไม่ต้องยืดหรือไม่มีการครอบตัด

img{
    width:150px;  //your requirement size
    height:100px; //your requirement size

/*Scale down will take the necessary specified space that is 150px x 100px without stretching the image*/
    object-fit:scale-down;
}


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