พื้นหลัง CSS ยืดและปรับขนาด


653

มีวิธีในการรับพื้นหลังใน CSS เพื่อขยายหรือขยายเพื่อเติมในคอนเทนเนอร์หรือไม่

คำตอบ:


267

สำหรับเบราว์เซอร์สมัยใหม่คุณสามารถทำได้โดยใช้background-size:

body {
    background-image: url(bg.jpg);
    background-size: cover;
}

cover หมายถึงการยืดภาพไม่ว่าจะเป็นแนวตั้งหรือแนวนอนดังนั้นจึงไม่เคยเรียงต่อ / ซ้ำ

สิ่งนี้จะใช้ได้กับ Safari 3 (หรือใหม่กว่า), Chrome, Opera 10+, Firefox 3.6+ และ Internet Explorer 9 (หรือใหม่กว่า)

เพื่อให้ทำงานได้กับ verion ที่ต่ำกว่าของ Internet Explorer ให้ลองใช้ CSS เหล่านี้:

filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='.myBackground.jpg', sizingMethod='scale');
-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='myBackground.jpg', sizingMethod='scale')";

2
การผ่อนปรน: สิ่งที่คุณแนะนำสำหรับตัวกรองสำหรับ IE ก่อนหน้านี้ทำงานได้เพียงบางส่วนเท่านั้น มันปรับขนาดความกว้างของภาพให้ดี แต่การปรับความสูงผิดไปโดยไม่ จำกัด สิ่งใด ยิ่งหน้าสูงขึ้นเท่าไหร่ก็จะเป็นภาพพื้นหลัง .. = (ฉันลองใช้มันใน IE8 และมันอาจจะเป็นไปได้ในการใช้คำสั่ง 'cover' เหล่านี้และอาจทำให้มันเข้ากันได้กับโทรศัพท์มือถือเช่น iPhone ปัญหา แต่อาจเป็นไปได้หรือไม่ที่จะปรับขนาดวิวพอร์ตให้เต็มหน้าจอในแบบที่ปรับขนาดพื้นหลังที่นี่ ?? ขอบคุณสำหรับการตอบกลับ!

3
ตัวกรองเฉพาะ IE ไม่ใช่โซลูชันที่สมบูรณ์แบบดังนั้นอย่าลังเลที่จะปรับเงื่อนไขสำหรับ IE ด้วยตัวเลือก CSS ฉันใช้ CSS3 "cover" บนเว็บไซต์ของฉันเองและใช้งานได้ดีกับอุปกรณ์ iOS ต้องแน่ใจว่าได้กำหนดความกว้างของอุปกรณ์
ผ่อนผัน

9
ปกไม่ยืด bg 100% 100% ใช่
neoswf

โซลูชันนี้ทำงานได้ดีที่สุดสำหรับฉันที่ฉันไม่ต้องการยืดภาพทั้งแนวนอนหรือแนวตั้งมากกว่าความละเอียดจริง ขอบคุณ .. !!
Mr. Noddy

1
หมายเหตุ: ตั้งแต่ Chromium 78.0.3904.97 คุณไม่สามารถปรับขนาด svg ภาพแยกตามแต่ละแกนได้ คุณอาจต้องขยายและแปลงเป็นภาพแรสเตอร์
Mike

567

ใช้คุณสมบัติCSS 3background-size :

#my_container {
    background-size: 100% auto; /* width and height, can be %, px or whatever. */
}

สิ่งนี้สามารถใช้ได้กับเบราว์เซอร์ที่ทันสมัยตั้งแต่ปี 2012


93
ในการรักษาอัตราส่วนภาพของภาพคุณควรใช้ "background-size: cover;" หรือ "ขนาดพื้นหลัง: contain;" ฉันได้สร้าง polyfill ที่ใช้ค่าเหล่านั้นใน IE8: github.com/louisremi/background-size-polyfill
Louis-Rémi

6
ฉันรู้ว่านี่เป็นปี แต่ฉันต้อง (หัวเราะและ) เห็นด้วยกับส่วน 'เบราว์เซอร์ที่เหมาะสม' ตรวจสอบเบราว์เซอร์ทั้งหมดของคุณ แต่ฉันมีปัญหากับ IE มากกว่าเบราว์เซอร์ใด ๆ
ErocM

36
ฉันต้องตั้งค่าbackground-size: 100% 100%;ให้ได้ผลตามที่ต้องการถ้าหากช่วยคนอื่น
guanome

1
คำอธิบายcoverและcontain ใน MDN
mohas

2
มันใช้งานไม่ได้จริง คำถามคือเติมภาชนะซึ่งหมายความว่าเราต้องการยืดมันจึงไม่ทำซ้ำ คำตอบนี้จะทำซ้ำในทิศทางความสูงหากความสูงไม่ครอบคลุมพื้นที่ "ยืดเพื่อเติม" หมายถึงยืด แต่คุณต้องทำไม่ซ้ำ คำตอบที่ถูกต้องคือ "cover" จากด้านล่าง ที่จริงจัดการกรณีที่ไม่
gman

171

ไม่สามารถปรับขนาดรูปภาพด้วย CSS ได้ แต่สามารถทำเอฟเฟกต์ที่คล้ายกันได้ในลักษณะต่อไปนี้

ใช้มาร์กอัปนี้:

<div id="background">
    <img src="img.jpg" class="stretch" alt="" />
</div>

ด้วย CSS ต่อไปนี้:

#background {
    width: 100%; 
    height: 100%; 
    position: absolute; 
    left: 0px; 
    top: 0px; 
    z-index: 0;
}

.stretch {
    width:100%;
    height:100%;
}

และคุณควรจะทำ!

ในการปรับขนาดภาพให้เป็น "เต็มขอบ" และคงอัตราส่วนไว้คุณสามารถทำได้ดังนี้:

.stretch { min-width:100%; min-height:100%; width:auto; height:auto; }

มันออกมาค่อนข้างดี! หากมีการตัดส่วนข้อมูลหนึ่งส่วนข้อมูลนั้นจะถูกครอบตัดด้านเดียวของรูปภาพแทนที่จะถูกครอบตัดทั้งสองด้านอย่างสม่ำเสมอ (และอยู่กึ่งกลาง) ฉันทดสอบใน Firefox, Webkitและ Internet Explorer 8 แล้ว


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

4
ในกรณีที่คนอื่นสนใจสิ่งนี้ดูเหมือนจะทำงานได้ดี: buildinternet.com/project/supersized
Brian Armstrong

1
ตรงกลางแนวนอนที่สามารถทำได้ด้วยบนmargin: 0 auto .stretchโดยการตั้งค่าwidthหรือheightอัตราส่วนภาพยังคงเท่าเดิม ลองใช้max-widthและmax-heightจำกัด การซูมปัจจัย ...
Ronald

1
สิ่งนี้ใช้ไม่ได้กับฉันใน ie8 / ie9 แต่ใช้งานได้ใน ie6 / ie7 (และแน่นอนว่าเบราว์เซอร์อื่น ๆ ทั้งหมด) ใน ie8 / ie9 ภาพจะปรากฏขึ้นประมาณ 3/4 ของ div ใครมีปัญหาเดียวกัน

3
ข้อบกพร่องที่มี SO: ไม่มีวิธีการทำเครื่องหมายคำตอบที่ไม่ถูกต้องอีกต่อไปนำไปสู่คนเช่น @Ullas ที่ถูกนำไปในทางที่ผิด ง่ายต่อการปรับขนาดพื้นหลังในเบราว์เซอร์สมัยใหม่ทั้งหมด developer.mozilla.org/en/CSS/background-size
Glenn Maynard

161

ใช้แอตทริบิวต์ background-size ใน CSS3:

.class {
     background-image: url(bg.gif);
     background-size: 100%;
}

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

ส่วนตัวผมใช้สคริปต์เพื่อจัดการกับมันใช้ jQuery, การปรับตัวของimgsizer เนื่องจากการออกแบบส่วนใหญ่ตอนนี้ฉันใช้ความกว้าง% สำหรับโครงร่างของเหลวในอุปกรณ์จึงมีการปรับเล็กน้อยในลูปหนึ่ง (การบัญชีสำหรับขนาดที่ไม่เสมอ 100%):

for (var i = 0; i < images.length; i++) {
    var image = images[i],
        width = String(image.currentStyle.width);

    if (width.indexOf('%') == -1) {
        continue;
    }

    image.origWidth = image.offsetWidth;
    image.origHeight = image.offsetHeight;

    imgCache.push(image);
    c.ieAlpha(image);
    image.style.width = width;
}

แก้ไข: คุณอาจจะสนใจในjQuery CSS3 Finaliz [s]อี


3
เพื่อเน้นย้ำ Modernizr ไม่เปิดใช้งานการสนับสนุนขนาดพื้นหลังในเบราว์เซอร์ที่ไม่สนับสนุน มันมีการทดสอบข้ามเบราว์เซอร์ที่สะดวกสบาย มันขึ้นอยู่กับคุณที่จะปลอมมันเมื่อการทดสอบกลับคืนเป็นเท็จ
Chris Moschini

34

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

.foo {
    background-image: url(bg-image.png);
    -moz-background-size: 100% 100%;
    -o-background-size: 100% 100%;
    -webkit-background-size: 100% 100%; 
    background-size: 100% 100%;
} 

1
ขอบคุณ! สิ่งนี้แตกต่างจาก "ขนาดพื้นหลัง: ปก"
Pavel Vlasov

1
สิ่งนี้ยืดสำหรับฉันบน iPad แต่ไม่ได้ปรับขนาด ขอบคุณสำหรับการโพสต์
Don Cote

1
นี่เป็นสิ่งที่ยอดเยี่ยมสำหรับทำให้พื้นหลังเล็กเกินไป ขอบคุณ!
Beingalex

1
หากภาพพื้นหลังเป็น SVG ก็จำเป็นต้องระบุpreserveAspectRatio="none"ภายใน SVG ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่ สาธิตที่นี่
Mentalist

คุณสามารถใช้ขนาดพื้นหลัง: ปก; พื้นหลังแนบ: แก้ไข; คุณสามารถปรับขนาดได้
Siraj Ahmed

15

ไม่ใช่ในปัจจุบัน มันจะพร้อมใช้งานในCSS 3แต่จะใช้เวลาสักครู่จนกว่าจะมีการใช้งานในเบราว์เซอร์ส่วนใหญ่


2
บทความที่ดีมีอยู่ในรายการนอกเหนือ: เพิ่มความเป็นมาของพื้นหลังโปรด!
jensgram

3
-1 ผมไม่คิดว่าคำตอบนี้มีความเกี่ยวข้องมาก ... และมันไม่ได้มีวิธีการแก้ปัญหาของใด ๆทุกชนิด
Potherca

1
@Perca คำตอบนี้ถูกต้องในเวลา (เกือบ 3 ปีที่ผ่านมา)
Eran Galperin

4
มีเหตุผลที่แสดงวันที่ ควรเก็บไว้เป็นข้อมูลอ้างอิงทางประวัติศาสตร์ คุณจะตอบคำตอบเก่าทั้งหมดในไซต์และทำการ downvoting พวกเขาหรือไม่? คำตอบยังคงถูกต้องแม้ว่าข้อมูลเพิ่มเติมจะถูกเพิ่มตั้งแต่นั้นมา นอกจากนี้โปรดทราบว่าคำตอบอื่น ๆ ที่นี่โดยทั่วไประบุเหมือนกัน (และบางคำตอบไม่ถูกต้อง - พวกเขาระบุว่าเป็นไปไม่ได้) ฉันได้รับความรู้สึกที่คุณเลือกในรายการนี้เนื่องจากมีคะแนนเสียงบางส่วน
Eran Galperin

3
ไม่ฉันเลือกสิ่งนี้เนื่องจากมันไม่ได้บอกว่า "คอมพิวเตอร์บอกว่าไม่มี" แม้ว่าจะมีวิธีแก้ไขปัญหานี้ได้หลายครั้งในปี 2008 ;-)
Potherca

15
.style1 {
        background: url(images/bg.jpg) no-repeat center center fixed;
        -webkit-background-size: cover;
        -moz-background-size: cover;
        -o-background-size: cover;
        background-size: cover;
}

ทำงานใน:

  • Safari 3+
  • Chrome ไม่ว่าจะ +
  • IE 9+
  • Opera 10+ (รองรับ 9.5 ขนาดพื้นหลัง แต่ไม่ใช่คำหลัก)
  • Firefox 3.6+ (Firefox 4 รองรับเวอร์ชันนำหน้าที่ไม่ใช่ผู้ขาย)

นอกจากนี้คุณสามารถลองวิธีนี้เพื่อหาวิธีแก้ปัญหาเช่น

    filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='.myBackground.jpg', sizingMethod='scale');
    -ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='myBackground.jpg', sizingMethod='scale')";
    zoom:1;

ให้เครดิตกับบทความนี้โดย Chris Coyier http://css-tricks.com/perfect-full-page-background-image/


สิ่งนี้ดีกว่าหรือแตกต่างจาก "ขนาดพื้นหลัง: ปก" อย่างไร
PKHunter

@PKHunter ฉันไม่แน่ใจว่าสิ่งที่คุณอ้างถึง นี่คือการใช้background-size: coverยกเว้นกับคำนำหน้าเบราว์เซอร์และวิธีการแก้ปัญหา IE
Blowsie

8

คำเดียว: ไม่ วิธีเดียวที่จะยืดภาพคือใช้<img>แท็ก คุณจะต้องมีความคิดสร้างสรรค์

สิ่งนี้เคยเป็นจริงในปี 2008 เมื่อคำตอบถูกเขียน ปัจจุบันเบราว์เซอร์รุ่นใหม่รองรับการbackground-sizeแก้ไขปัญหานี้ ระวังว่า IE8 ไม่รองรับ


6
@Blowsie - น่ารัก ตรวจสอบวันที่คำตอบ ภูมิทัศน์ของเบราว์เซอร์เปลี่ยนไปเล็กน้อยในช่วง 5 ปีที่ผ่านมา
Vilx-

5

กำหนด "ยืดและขยาย" ...

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

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

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

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

หากคุณใช้กราฟิกแบบเวกเตอร์แสดงว่าคุณมีความเชี่ยวชาญ


การยืด = เปลี่ยนขนาด x และ y อย่างอิสระเปลี่ยนสัดส่วนภาพของภาพ, มาตราส่วน = เปลี่ยน x และ y มิติตามสัดส่วนการคงสัดส่วนของภาพ
Lawrence Dol

@SoftwareMonkey: ในฐานะที่เป็นพื้นหลังแล้วไม่คุณไม่สามารถเปลี่ยนการยืดและสเกลในแง่ที่แท้จริงของคำใน CSS แบบตรง คุณต้องใช้เทคนิค CSS ต่าง ๆ เพื่อให้เข้าใจว่านี่คือสิ่งที่เกิดขึ้นตามที่ฉันอธิบาย
BenAlabaster

4

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

#background {
    width: 100%;
    height: 100%;
    position: absolute;
    margin-left: 0px;
    margin-top: 0px;
    z-index: 0;
}

.stretch {
    width:100%;
    height:auto;
}

2

เพิ่มbackground-attachmentบรรทัด:

#background {
    background-attachment:fixed;
    width: 100%; 
    height: 100%; 
    position: absolute; 
    margin-left: 0px; 
    margin-top: 0px; 
    z-index: 0;
}

.stretch {
    width:100%;
    height:auto;
}

2

ฉันต้องการจะชี้ให้เห็นว่าสิ่งนี้เทียบเท่ากับการทำ:

html { width: 100%; height: 100%; }
body { width: 100%; height: 100%; /* Add background image or gradient to stretch here. */}

2

ทางออกที่ยอดเยี่ยมอีกข้อหนึ่งสำหรับเรื่องนี้คือ Backstretch ของ Srobbin ซึ่งสามารถนำไปใช้กับร่างกายหรือองค์ประกอบใด ๆ ในหน้า - http://srobbin.com/jquery-plugins/backstretch/


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

1
ความผิดฉันเอง. โดยทั่วไปคุณเพิ่ม backstretch ไปที่ <head> ของเอกสารจากนั้นเริ่มต้นดังนี้: $ (". your-element"). backstretch ("path / to / image.jpg");
nickff


1

เคล็ดลับเพิ่มเติมสำหรับการโกงของ SolidSmile คือการปรับขนาด (การปรับขนาดตามสัดส่วน) โดยการตั้งค่าความกว้างและการใช้ความสูงอัตโนมัติ

Ex:

#background {
    width: 500px;
    height: auto;
    position: absolute; 
    left: 0px; 
    top: 0px; 
    z-index: 0;
}

0

ใช้border-image : yourimageคุณสมบัตินี้เพื่อตั้งค่าภาพของคุณและปรับให้กว้างจนสุดขอบของหน้าจอหรือหน้าต่าง

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