CSS arka planını genişletme ve ölçeklendirme


653

CSS'de kapını dolduracak şekilde germek veya ölçeklendirmek için bir arka plan edinmenin bir yolu var mı?

Yanıtlar:


267

Modern tarayıcılar için bunu kullanarak şunları yapabilirsiniz background-size:

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

cover görüntüyü dikey veya yatay olarak uzatmak anlamına gelir, böylece hiçbir zaman döşemez / tekrarlamaz.

Safari 3 (veya üstü), Chrome, Opera 10+, Firefox 3.6+ ve Internet Explorer 9 (veya üstü) için işe yarar.

Internet Explorer'ın daha düşük sürümleriyle çalışabilmesi için şu CSS'yi deneyin:

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

2
Clement to: Önceki IE: s filtreleri için önerileriniz sadece kısmen çalışır. Resim genişliğini ölçeklendirir, ancak yükseklik ölçeklemesi hiçbir şeyle kısıtlanmadan yanlış olur. Sayfa yüksek yani arka plan resmi .. = (Ben IE8 üzerinde denedim. Ayrıca, yine de bu 'kapak' komutları kullanmak mümkün olabilir ve bir şekilde bu iphone gibi cep telefonları ile uyumlu hale getirmek? Görünüm var biliyorum sorun ama görünüm arka planı burada ölçeklendirilecek şekilde tüm ekrana ölçeklemek mümkün olabilir? Yanıtlar için teşekkürler!

3
IE'ye özgü filtreler ideal çözüm değildir, bu nedenle CSS alternatifleriyle IE için koşulsuz çekinmeyin. Kişisel olarak CSS3 "kapağını" kendi sitemde kullanıyorum ve iOS cihazlarda iyi çalışıyor, sadece cihaz genişliğini tanımladığınızdan emin olun.
Clement

9
Kapak bg'yi germez. % 100% 100 evet.
neoswf

Bu çözümler, görüntüyü gerçek çözünürlüğünden daha fazla yatay veya dikey olarak uzatmak istemediğim yerde en iyi sonucu verdi. Teşekkürler..!!
Bay Noddy

1
Not: Krom 78.0.3904.97'den itibaren, svg görüntülerini her eksen boyunca bağımsız olarak ölçeklemek mümkün değildir. Ölçeklendirmeniz ve bir raster görüntüsüne dönüştürmeniz gerekebilir.
Mike

567

CSS 3 özelliğini kullanın background-size:

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

Bu, 2012'den beri modern tarayıcılar için kullanılabilir.


93
Görüntünün en boy oranını korumak için "background-size: cover;" veya "arka plan boyutu: içerir;". Bir polyfill inşa ettik uygular IE8'de bu değerler: github.com/louisremi/background-size-polyfill
Louis-Rémi

6
Bunun bir yaşında olduğunu biliyorum ama 'iyi tarayıcılar' bölümüne (gülmek ve) katılıyorum. Tüm tarayıcılarınızı kontrol edin, ancak IE ile bunlardan herhangi birinden daha fazla sorun yaşadım.
ErocM

36
background-size: 100% 100%;Başkalarına yardımcı olursa, istediğim etkiyi elde etmek için ayarlamam gerekiyordu.
guanome

1
MDN açıklaması coverve açıklamasıcontain
mohas

2
bu aslında işe yaramıyor. Soru, kabı doldurmaktır , yani tekrarlamaması için gerilmesini istiyoruz. Öte yandan, yükseklik alanı kaplamıyorsa, bu cevap yükseklik yönünde tekrarlanır. "Doldurmak için uzat" germek anlamına gelir ancak tekrarlamanız gerekmez. Doğru cevap aşağıdan "kapak" tır. Aslında bu durum böyle değildir.
gman

171

Bir görüntüyü CSS ile ölçeklemek tam olarak mümkün değildir, ancak benzer bir etki aşağıdaki şekilde elde edilebilir.

Bu işaretlemeyi kullanın:

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

aşağıdaki CSS ile:

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

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

ve bitirmelisin!

Görüntüyü "tam taşma" olacak şekilde ölçeklendirmek ve en boy oranını korumak için bunun yerine bunu yapabilirsiniz:

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

Oldukça güzel çalışıyor! Bununla birlikte, bir boyut kırpılırsa, görüntünün her iki tarafında eşit olarak kırpılmak (ve ortalanmak) yerine yalnızca bir tarafına kırpılır. Firefox, Webkit ve Internet Explorer 8'de test ettim .


2
Bu iyi çalışıyor ... ama aynı zamanda ortalayan ve resmin manzara veya portre olup olmadığına göre ayarlanan biraz daha sağlam (muhtemelen javascript ile) bir şey arıyordu. Herkesin bu damarda bir çözümü varsa bir bağlantı isterdim ... teşekkürler!
Brian Armstrong

4
Başka birinin ilgilenmesi durumunda, bu iyi çalışıyor gibi görünüyordu: buildinternet.com/project/supersized
Brian Armstrong

1
Yatay merkezleme ile yapılabilir margin: 0 autoüzerinde .stretch. Yalnızca widthveya ayarlandığında height, en boy oranı aynı kalır. Zum faktörünü sınırlamak için max-widthve kullanmayı deneyin max-height...
Ronald

1
Bu benim için ie8 / ie9'da işe yaramaz, ama ie6 / ie7'de (ve elbette diğer tüm tarayıcılarda) çalışır. İe8 / ie9'da, görüntü yalnızca divın yaklaşık 3/4'ü için gösterilir. Aynı sorunu olan var mı?

3
SO'lu bir kusur: artık doğru olmayan cevapları işaretlemenin bir yolu yok, @Ullas gibi insanların yoldan çıkmasına yol açıyor. Tüm modern tarayıcılarda arka planları ölçeklendirmek kolaydır. developer.mozilla.org/tr/CSS/background-size
Glenn Maynard

161

CSS3'te arka plan boyutu özelliğini kullanın :

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

DÜZENLEME: Modernizr destekler arka boyutlu destek saptanmasını . Çalışmak için yazılmış bir JavaScript geçici çözümü kullanabilirsiniz, ancak buna ihtiyacınız vardır ve destek olmadığında dinamik olarak yükleyebilirsiniz. Bu, belirli tarayıcılar için müdahaleci CSS saldırılarına başvurmadan kodun korunmasını sağlar.

Şahsen ben jQuery, onun imgsizer bir uyarlaması kullanarak başa çıkmak için bir komut dosyası kullanın . Artık tasarımların çoğunda, cihazlardaki akışkan düzenleri için genişlik% 'leri kullandığımdan, döngülerden birine hafif bir adaptasyon var (her zaman% 100 olmayan boyutları hesaba katar):

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;
}

EDIT: Ayrıca ilginizi çekebilir jQuery CSS3 Finaliz [s] e .


3
Sadece vurgulamak gerekirse, Modernizr yerel olarak desteklemeyen tarayıcılarda arka plan boyutu için desteği etkinleştirmez. Bunun için uygun bir çapraz tarayıcı testine sahiptir. Test yanlış döndürdüğünde sahte yapmak size kalmıştır.
Chris Moschini

34

Makalenin arka plan boyutunu deneyin . Aşağıdakilerin tümünü kullanırsanız, Internet Explorer dışındaki çoğu tarayıcıda çalışır.

.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
Teşekkür ederim! Bu, "arka plan boyutu: kapak" dan farklı
Pavel Vlasov

1
bu benim için ipad üzerinde uzanıyordu, ama ölçek vermedi. Göndermek için teşekkürler.
Don Cote

1
Bu, arka planı daraltmak için harika. Teşekkürler!
beingalex

1
Arka plan resmi bir SVG ise preserveAspectRatio="none", SVG içinde belirtmek de gereklidir . Bu konuda daha fazla bilgi burada . Burada demo .
Mentalist

arka plan boyutunu kullanabilirsiniz: kapak; arka plan eki: sabit; ölçekleyebilirsiniz
Siraj Ahmed

15

Şu an değil. CSS 3'te mevcut olacak , ancak çoğu tarayıcıda uygulanması biraz zaman alacaktır.


2
A List Apart'ta mevcut harika bir makale: Bu Arka Planı Supersize Edin, Lütfen!
jensgram

3
-1 Bu cevabın çok alakalı olduğunu sanmıyorum ... ve herhangi bir çözüm sunmuyor .
Potherca

1
@Potherca bu cevap o zamanlar doğruydu (neredeyse 3 yıl önce).
Eran Galperin

4
Tarihin gösterilmesinin bir nedeni var. Tarihsel referanslar için saklanmalıdır. Sitedeki tüm eski cevapların üzerinden mi geçiyorsunuz? o zamandan beri daha fazla bilgi eklenmiş olsa bile cevap hala doğrudur. Ayrıca, buradaki diğer cevapların temel olarak aynı olduğunu (ve bazılarının gerçekten yanlış olduğunu - imkansız olduğunu belirttiklerini) unutmayın. Bazı oyları olduğu için bu konuda seçtiğiniz hissi alıyorum.
Eran Galperin

3
Hayır, 2008'de bile bu soruna çeşitli çözümler olsa da, "Bilgisayar hayır deyin" dediği için bunu
seçtim

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;
}

Çalıştığı yerler:

  • Safari 3+
  • Chrome +
  • IE 9+
  • Opera 10+ (Opera 9.5, arka plan boyutunu destekledi ancak anahtar kelimeleri desteklemedi)
  • Firefox 3.6+ (Firefox 4, satıcı olmayan ön ekli sürümü destekler)

Ayrıca bunu bir başka çözüm için deneyebilirsiniz

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

Bu makaleye Chris Coyier tarafından verilen http://css-tricks.com/perfect-full-page-background-image/


Bu, "arka plan boyutu: kapak" tan daha iyi veya farklı mı?
PKHunter

@PKHunter, tam olarak neye referans yaptığınızdan emin değilim. Bu, background-size: covertarayıcı
önekleri

8

Tek kelimeyle: hayır. Bir görüntüyü uzatmanın tek yolu <img>etiketi kullanmaktır. Yaratıcı olmalısın.

Bu, cevabın yazıldığı 2008'de doğruydu. Bugün background-sizebu sorunu çözen modern tarayıcılar desteklenmektedir . IE8'in desteklemediğine dikkat edin.


6
@Blowsie - Sevimli. Yanıt tarihini kontrol edin. Tarayıcı ortamı son 5 yılda biraz değişti.
Vilx-

5

"Uzat ve ölçeklendir" i tanımlayın ...

Bir bitmap formatınız varsa, onu uzatmak ve çekmek için genellikle harika (grafiksel olarak konuşulur) değildir. Aynı efektin yanılsamasını vermek için tekrarlanabilir desenler kullanabilirsiniz. Örneğin, sayfanın altına doğru hafifleyen bir gradyanınız varsa, tek bir piksel genişliğinde ve kapınızla aynı yükseklikte (veya tercihen ölçeklendirmeyi hesaba katmak için daha büyük) bir grafik kullanırsınız ve ardından sayfa. Benzer şekilde, degrade sayfa boyunca yayınlanırsa, konteynerinizden bir piksel yüksekliğinde ve daha geniş olur ve sayfayı tekrarlar.

Normalde, kap büyüdüğünde veya küçüldüğünde kabı doldurmak için gerilme yanılsamasını vermek için görüntüyü kaptan daha büyük yaparsınız. Herhangi bir çakışma konteynerin sınırları dışında gösterilmez.

Kavisli kenarları olan bir kutu gibi bir şeye dayanan bir efekt istiyorsanız, kutunuzun sol tarafını konteynerinizin sol tarafına, konteynerin ne kadar büyük olursa olsun (dolayısıyla) yeterince örtüşmeyle yapıştıracaksınız, asla arka plan biterse ve sonra kutunun sağ tarafının bir görüntüsünü kavisli kenarlarla katmanlar ve kabın sağına yerleştirirsiniz. Böylece konteyner küçüldükçe veya büyüdükçe, kavisli kutu etkisi küçülüyor veya onunla büyüyor gibi görünüyor - aslında değil, ama olan yanılsamayı veriyor.

Görüntünün kapla gerçekten küçülmesini ve büyümesini sağlamak için, görüntünün arka plan olarak işlev görmesi için bazı katmanlama hileleri ve kapla yeniden boyutlandırmak için bazı javascript kullanmanız gerekir. Bunu CSS ile yapmanın güncel bir yolu yok ...

Vektör grafikleri kullanıyorsanız, korktuğum uzmanlık alanımın çok dışındasınız.


Stretch = Görüntünün en boy oranını bağımsız olarak değiştiren x ve y boyutlarını değiştirin, Ölçek = görüntünün en boy oranını koruyarak x ve y boyutlarını değiştirin.
Lawrence Dol

@YazılımMonkey: Arka plan olarak hayır olarak, gerginliği ve ölçeği terimlerin gerçek anlamda düz CSS'de değiştiremezsiniz. Tarif ettiğim gibi olan şey olduğu yanılsamasını vermek için çeşitli CSS hileleri kullanmalısınız.
BenAlabaster

4

Ben bunu yaptım. Streç sınıfında, yüksekliği sadece olarak değiştirdim auto. Bu şekilde arka plan resminiz her zaman ekranın genişliği ile aynı boyuta sahip olur ve yükseklik her zaman doğru boyuta sahip olur.

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

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

2

background-attachmentSatır ekleyin :

#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

Bu yapmaya eşdeğer olduğunu belirtmek istiyorum:

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

2

Bunun için bir başka harika çözüm, vücuda veya sayfadaki herhangi bir öğeye uygulanabilen Srobbin'in Backstretch'i - http://srobbin.com/jquery-plugins/backstretch/


Nick, genellikle cevabınızdaki göze çarpan parçaları sağlamanızı ve yalnızca daha fazla ayrıntı için harici bir bağlantı sağlamanızı istiyoruz - bu, cevapların bağlantı çürümesi durumunda yararlı kalmasına yardımcı olur.
Lawrence Dol

1
Benim hatam. Genel olarak, belgenizin <head> öğesine geri gerdirme ekledikten sonra şu şekilde başlatın: $ (". Öğeniz"). Backstretch ("path / to / image.jpg");
nickff

2

Bunu dene

http://jsfiddle.net/5LZ55/4/

body
{ 
    background: url(http://p1.pichost.me/i/40/1639647.jpg) no-repeat fixed; 
    background-size: cover;
    -webkit-background-size: cover;
    -moz-background-size: cover;
    -o-background-size: cover;
}

1

SolidSmile'ın hile için ek bir ipucu, bir genişlik ayarlayarak ve yükseklik için otomatik kullanarak ölçeklendirmektir (orantılı yeniden boyutlandırma).

Ör:

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

0

Kullan border-image : yourimageGörüntünüzü ayarlamak ve ekranınızın veya pencerenizin tüm kenarlığına kadar ölçeklendirmek özelliği .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.