ฉันจะใส่รูปภาพ (img) ภายใน div และคงอัตราส่วนไว้ได้อย่างไร


136

ฉันมี 48x48 div และข้างในนั้นมีองค์ประกอบ img ฉันต้องการให้พอดีกับ div โดยไม่สูญเสียส่วนใดในเวลาที่อัตราส่วนถูกเก็บไว้มันสามารถทำได้โดยใช้ html และ css หรือไม่?

คำตอบ:


70

คุณจะต้องมี JavaScript เพื่อป้องกันการครอบตัดหากคุณไม่ทราบขนาดของรูปภาพในขณะที่คุณเขียน css

HTML & JavaScript

<div id="container">
    <img src="something.jpg" alt="" />
</div>

<script type="text/javascript">
(function() {

var img = document.getElementById('container').firstChild;
img.onload = function() {
    if(img.height > img.width) {
        img.height = '100%';
        img.width = 'auto';
    }
};

}());
</script>

CSS

#container {
   width: 48px;
   height: 48px;
}

#container img {
   width: 100%;
}

หากคุณใช้ไลบรารี JavaScript คุณอาจต้องการใช้ประโยชน์จากมัน


2
คำตอบของ Michael นั้นง่ายกว่ามากและไม่ได้ใช้ Javascript ฉันไม่รู้เกี่ยวกับความเข้ากันได้ของเบราว์เซอร์
weberc2

3
ไม่คำตอบของ Michael ทำงานได้ตราบใดที่ภาพนั้นใหญ่กว่า div หากคุณต้องการให้ภาพกรอก div เกี่ยวกับขนาดภาพ (และถ้าคุณไม่ทราบขนาดภาพล่วงหน้าคุณต้องทำ) นี่คือวิธีที่จะไป
Rémy DAVID

2
คุณไม่สามารถใช้ความสูงสูงสุดได้: 100%; ความกว้างสูงสุด: 100%; นาทีความกว้าง: 100%; ความสูงขั้นต่ำ: 100% และได้รับผลลัพธ์เดียวกันหรือไม่ คำถามที่ซื่อสัตย์
Daniel Casserly

ไม่การบังคับให้คุณใช้ความกว้างและความสูงเท่ากับ 100% ดังนั้นคุณจึงเปลี่ยนอัตราส่วนภาพ
gztomas

onload จะไม่ถูกเรียกใช้เมื่อรูปภาพถูกแคชในเบราว์เซอร์ดังนั้นสิ่งนี้จะใช้ได้เฉพาะเมื่อโหลดรูปภาพในครั้งแรกเท่านั้น
Redtopia

314

ใช้max-height:100%; max-width:100%;สำหรับภาพภายใน div


4
@ZoveGames ไม่ใช่เบราว์เซอร์ที่เปิดใช้งาน JS? สถิติ Yahoo จากปี 2010 แสดงค่าเฉลี่ย 1.3% ฉันคิดว่ามันปลอดภัยที่จะสันนิษฐานว่า มันอาจจะลดลงในวันนี้และข programmers.stackexchange.com/questions/26179/…
EasyCo

5
มันไม่ทำงานสำหรับฉัน ... มันทำให้ภาพ 100% ของขนาดตัวมันเอง (เช่น: ความกว้าง 300px สำหรับภาพที่จริง ๆ แล้วความกว้าง 300px)
Tomáš Zato - Reinstate Monica

1
มีข้อผิดพลาดบางประการเกี่ยวกับ Chrome-on-Windows ที่น่ากลัว อาจมีการโต้ตอบที่ไม่ดีกับปลั๊กอิน Smoothscroll บางอย่างที่ฉันมี มันจบลงด้วยการพยายามเลื่อนร่างแม้ว่าเมาส์จะอยู่เหนือoverflow:scrolldiv ด้วยภาพขนาดใหญ่ อยากรู้อยากเห็น แปลกกว่าเดิม: โซลูชันของ Max แก้ไขได้จริง ฉันค่อนข้างเบื่อหน่ายกับ CSS จริงๆ เคยมีพลังและเท่ห์ ตอนนี้การใช้งานเพียงแค่สร้างความไม่สอดคล้องกันของ buggy หลังจากความไม่สอดคล้องกันของ buggy
Steven Lu

21
ใช้งานได้เฉพาะเมื่อลดขนาดรูปภาพ ถ้าคุณต้องการให้พอดีกับภาพขนาดเล็กในภาชนะที่ใหญ่กว่านี้จะไม่ทำงาน
Yossi Shasho

2
ไม่รักษาอัตราส่วนภาพดั้งเดิมของภาพ
Ĭsααc t իεβöss

78

น่าเสียดายที่ความกว้างสูงสุด + ความสูงสูงสุดไม่ครอบคลุมงานของฉันอย่างเต็มที่ ... ดังนั้นฉันจึงได้พบวิธีแก้ไขปัญหาอื่น:

หากต้องการบันทึกอัตราส่วนภาพในขณะที่ปรับขนาดคุณสามารถใช้object-fitCSS3 propperty

บทความที่มีประโยชน์: การควบคุมอัตราส่วนภาพด้วย CSS3

img {
    width: 100%; /* or any custom size */
    height: 100%; 
    object-fit: contain;
}

ข่าวร้าย: ไม่รองรับ IE ( ฉันสามารถใช้งานได้ )


6
สิ่งนี้จะต้องทำเครื่องหมายเป็นคำตอบ .. "พอดีกับวัตถุ" ทำงานได้อย่างสมบูรณ์
Ĭsααc t իεβöss

ดูเหมือนว่าจะมีการสนับสนุนใน iOS 8.1 ไม่ใช่ 8.0
เรย์

2
object-fit: cover; ทำงานให้ฉัน ที่นี่: stackoverflow.com/questions/9071830/…
Deke

1
หากคุณต้องการให้ภาพอยู่ด้านบนซ้ายแทนที่จะอยู่กึ่งกลางคุณต้องใช้ตำแหน่งวัตถุ 0 0
Chris Rae

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


17

HTML

<div>
    <img src="something.jpg" alt="" />
</div>

CSS

div {
   width: 48px;
   height: 48px;
}

div img {
   display: block;
   width: 100%;
}

สิ่งนี้จะทำให้ภาพขยายเพื่อเติมเต็มพาเรนต์ซึ่งมีการตั้งขนาดในdivCSS


2
อย่าเพิ่มheight: 100%นั่นจะเป็นการบิดเบือนอัตราส่วนภาพ - OP ต้องการรักษาอัตราส่วนไว้
casablanca

ฉันไม่แน่ใจว่า OP หมายถึงอะไร แต่คุณจะไม่รักษาอัตราส่วนไว้ใช่ไหม?
Trufa

ฉันจะทำอย่างไรเพื่อรักษาอัตราส่วน? หากฉันลบความสูง: 100% ภาพจะถูกครอบตัด
Bin Chen

7

ฉันมีปัญหามากมายในการทำงานนี้ทุกวิธีแก้ปัญหาที่ฉันพบไม่ทำงาน

ฉันรู้ว่าฉันต้องตั้งค่าการแสดง div ให้ยืดหยุ่นดังนั้นโดยทั่วไปนี่คือ CSS ของฉัน:

div{
display: flex;
}

div img{ 
max-height: 100%;
max-width: 100%;
}

ภาพของฉันบิดเบี้ยวด้วยโซลูชันนี้ใน Chrome เวอร์ชัน 61
Yevgeniy Afanasyev

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

จุดของฉันถูกต้อง .. ภาพผิดเพี้ยนไปเนื่องจากคุณตั้งค่าความกว้างและความสูงใน <div class = "w"> ของคุณ
Bartho Bernsmann

สำหรับตัวอย่างของคุณ .. ฉันเชื่อว่าคุณกำลังมองหาบางอย่างเช่นภาพของคุณ CSS: height: auto; ความกว้าง: 100%;
Bartho Bernsmann

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


3

สำหรับฉันแล้ว CSS ต่อไปนี้ใช้งานได้ (ทดสอบใน Chrome, Firefox และ Safari)

มีหลายสิ่งที่ทำงานร่วมกัน:

  • max-height: 100%;, max-width: 100%;และheight: auto;,width: auto;ทำให้ img ขนาดไปแล้วแต่จำนวนใดมิติต้นน้ำแรก 100% ขณะที่การรักษาอัตราส่วน
  • position: relative;ในภาชนะและposition: absolute;ในเด็กร่วมกับtop: 50%;และleft: 50%;ศูนย์ด้านบนซ้ายมุม img ในภาชนะ
  • transform: translate(-50%, -50%); ย้าย img กลับไปทางซ้ายและด้านบนโดยครึ่งหนึ่งของขนาดจึงอยู่ตรงกลางของ img ในคอนเทนเนอร์

CSS:

.container {
    height: 48px;
    width: 48px;

    position: relative;
}

.container > img {
    max-height: 100%;
    max-width: 100%;
    height: auto;
    width: auto;

    position: absolute;
    top: 50%;
    left: 50%;

    transform: translate(-50%, -50%);
}

1

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

ด้านล่างหากเราต้องการให้ div เป็นอัตราส่วนเดียวกันกับภาพถ่ายตัวยึดตำแหน่งจะเป็นภาพโปร่งใสขนาดเล็กที่มีอัตราส่วนกว้างยาวเท่ากับ photo.jpg หากภาพถ่ายเป็นสี่เหลี่ยมจัตุรัสแสดงว่าเป็นตัวยึดตำแหน่ง 1px x 1px หากภาพถ่ายนั้นเป็นภาพขนาดย่อของวิดีโอจะเป็นตัวยึด 16x9 เป็นต้น

เฉพาะคำถามใช้ตัวยึด 1x1 เพื่อรักษาอัตราส่วนกำลังสองของ div โดยใช้ภาพพื้นหลังbackground-sizeเพื่อรักษาอัตราส่วนภาพของภาพ

ฉันใช้background-position: center center;เพื่อให้ภาพจะอยู่กึ่งกลางใน div (การจัดแนวภาพถ่ายที่กึ่งกลางแนวตั้งหรือด้านล่างจะน่าเกลียดด้วยรูปถ่ายในแท็ก img)

div {
    background: url(photo.jpg) center center no-repeat;
    background-size: contain;
    width: 48px; // or a % in responsive layout
}
img {
    width: 100%;
}

<div><img src="placeholder.png"/></div>

เพื่อหลีกเลี่ยงการร้องขอ http พิเศษแปลงภาพตัวยึดเพื่อข้อมูล: URL

<img src="data:image/png;base64,..."/>

0

คุณสามารถใช้ระดับ"img ของเหลว"สำหรับรุ่นใหม่เช่นเงินทุน v4

และสามารถใช้ระดับ"img ตอบสนอง"สำหรับรุ่นเก่าเช่นBootstrap v3

การใช้งาน : -

แท็กimgด้วย: -

class = "img- ของเหลว"

src = "... "


0

นี่คือวิธีการของ JavaScript ทั้งหมด มันปรับขนาดภาพทีละน้อยจนพอดี คุณเลือกว่าจะย่อขนาดมันแต่ละครั้งที่ล้มเหลว ตัวอย่างนี้ย่อขนาดลง 10% ทุกครั้งที่ล้มเหลว:

let fit = function (el, w, h, percentage, step)
{
    let newH = h;
    let newW = w;

    // fail safe
    if (percentage < 0 || step < 0) return { h: h, w: w };
    if (h > w)
    {
        newH = el.height() * percentage;
        newW = (w / h) * newH;
        if (newW > el.width())
        {
            return fit(el, w, h, percentage - step, step);
        }
    }
    else
    {
        newW = el.width() * percentage;
        newH = (h / w) * newW;
        if (newH > el.height())
        {
            return fit(el, w, h, percentage - step, step);
        }
    }

    return { h: newH, w: newW };
};

img.bind('load', function ()
{
    let h = img.height();
    let w = img.width();
    let newFit = fit($('<img-wrapper-selector>'), w, h, 1, 0.1);

    img.width(newFit.w);
    img.height(newFit.h);
});

รู้สึกฟรีเพื่อคัดลอกและวางโดยตรง


0

สิ่งที่ทำงานให้ฉันคือ:

<div style='display: inline-flex; width: 80px; height: 80px;'>
<img style='max-width: 100%; max-height: 100%' src='image file'>
</div>

จำเป็นต้องมีอินไลน์เฟล็กซ์เพื่อป้องกันไม่ให้ภาพออกไปนอก div

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