Kéo dài và mở rộng nền CSS


653

Có cách nào để có được một nền tảng trong CSS để kéo dài hoặc mở rộng để lấp đầy vùng chứa của nó không?

Câu trả lời:


267

Đối với các trình duyệt hiện đại, bạn có thể thực hiện điều này bằng cách sử dụng background-size:

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

cover có nghĩa là kéo dài hình ảnh theo chiều dọc hoặc chiều ngang để nó không bao giờ bị gạch / lặp lại.

Điều đó sẽ hoạt động cho Safari 3 (hoặc mới hơn), Chrome, Opera 10+, Firefox 3.6+ và Internet Explorer 9 (hoặc mới hơn).

Để nó hoạt động với các phiên bản thấp hơn của Internet Explorer, hãy thử các CSS sau:

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

2
To Clement: Những gì bạn đề xuất cho các bộ lọc cho IE trước: chỉ hoạt động một phần. Nó chia tỷ lệ chiều rộng hình ảnh ok nhưng tỷ lệ chiều cao bị sai bằng cách không giới hạn nó vào bất cứ điều gì. Trang càng cao thì ảnh nền càng cao .. = (Tôi đã thử điều này trên IE8. Ngoài ra, dù sao thì cũng có thể sử dụng các lệnh 'che' này và bằng cách nào đó làm cho nó tương thích với điện thoại di động như iphone? Tôi biết có chế độ xem có vấn đề nhưng có thể có khả năng mở rộng khung nhìn cho toàn màn hình theo cách mà tỷ lệ nền được chia tỷ lệ ở đây không? Cảm ơn bạn đã phản hồi!

3
Các bộ lọc dành riêng cho IE không phải là giải pháp lý tưởng, vì vậy hãy thoải mái tạo điều kiện cho IE với các lựa chọn thay thế CSS. Cá nhân tôi sử dụng "bìa" CSS3 trên trang web của riêng tôi và nó hoạt động tốt trên các thiết bị iOS, chỉ cần đảm bảo xác định chiều rộng của thiết bị.
Clement

9
Che không kéo dài bg. 100% 100% có.
neoswf

Giải pháp này hoạt động tốt nhất với tôi khi tôi không muốn kéo dài hình ảnh theo chiều ngang hoặc chiều dọc hơn độ phân giải thực tế. Cảm ơn..!!
Ông Noddy

1
Lưu ý: Kể từ Chromium 78.0.3904.97, không thể chia tỷ lệ hình ảnh svg độc lập dọc theo mỗi trục. Bạn có thể phải mở rộng nó và chuyển đổi nó thành một hình ảnh raster.
Mike

567

Sử dụng CSS 3 bất động sản background-size:

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

Điều này có sẵn cho các trình duyệt hiện đại, kể từ năm 2012.


93
Để duy trì tỷ lệ khung hình của hình ảnh, bạn nên sử dụng "kích thước nền: bìa;" hoặc "kích thước nền: chứa;". Tôi đã xây dựng một polyfill thực hiện các giá trị đó trong IE8: github.com/louisremi/background-size-polyfill
Louis-Rémi

6
Tôi biết đây là một năm tuổi nhưng tôi phải (cười và) đồng ý với phần 'trình duyệt phong nha'. Kiểm tra tất cả các trình duyệt của bạn nhưng tôi gặp nhiều vấn đề với IE hơn bất kỳ trình duyệt nào.
ErocM

36
Tôi đã phải thiết lập background-size: 100% 100%;để có được hiệu quả mong muốn mà tôi sẽ làm, nếu điều đó giúp được ai khác.
guanome

1
giải thích về covercontain trên MDN
mohas

2
Điều này không thực sự hoạt động. Câu hỏi là điền vào thùng chứa có nghĩa là chúng tôi muốn nó kéo dài để nó không lặp lại. Mặt khác, câu trả lời này sẽ lặp lại theo chiều cao nếu chiều cao không bao phủ khu vực. "Kéo dài để lấp đầy" có nghĩa là kéo dài tuy nhiên bạn phải lặp lại. Câu trả lời đúng là "che" từ bên dưới. Điều đó thực sự xử lý trường hợp này không.
gman 23/2/2015

171

Thu nhỏ hình ảnh bằng CSS là không hoàn toàn có thể, nhưng một hiệu ứng tương tự có thể đạt được theo cách sau, mặc dù.

Sử dụng đánh dấu này:

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

với CSS sau:

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

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

và bạn nên được thực hiện!

Để chia tỷ lệ hình ảnh thành "toàn màn hình" và duy trì tỷ lệ khung hình, bạn có thể thực hiện việc này thay thế:

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

Nó hoạt động khá độc đáo! Tuy nhiên, nếu một chiều bị cắt, nó sẽ bị cắt chỉ ở một bên của hình ảnh, thay vì được cắt đều ở cả hai bên (và ở giữa). Tôi đã thử nghiệm nó trong Firefox, Webkit và Internet Explorer 8.


2
Điều này hoạt động tốt ... nhưng đã tìm kiếm một cái gì đó mạnh mẽ hơn một chút (có thể bằng javascript) cũng tập trung vào nó và điều chỉnh dựa trên nếu hình ảnh là phong cảnh hoặc chân dung. Nếu bất cứ ai có một giải pháp trong đó sẽ thích một liên kết ... cảm ơn!
Brian Armstrong

4
Trong trường hợp bất kỳ ai khác quan tâm, điều này dường như hoạt động tốt: buildiNET.com/project/supersized
Brian Armstrong

1
Định tâm ngang có thể được thực hiện với margin: 0 autotrên .stretch. Bằng cách chỉ đặt widthhoặc height, tỷ lệ khung hình vẫn giữ nguyên. Hãy thử sử dụng max-widthmax-heightđể giới hạn hệ số thu phóng ...
Ronald

1
Điều này không hoạt động với tôi trong eg8 / eg9, nhưng hoạt động trong eg6 / eg7 (và tất nhiên tất cả các trình duyệt khác). Trong eg8 / eg9, hình ảnh chỉ hiển thị trong khoảng 3/4 div. Bất cứ ai cũng có cùng một vấn đề?

3
Một lỗ hổng với SO: không có cách nào để đánh dấu các câu trả lời không còn đúng nữa, dẫn đến những người như @Ullas bị dẫn dắt lạc lối. Thật dễ dàng để mở rộng nền trong tất cả các trình duyệt hiện đại. developer.mozilla.org/en/CSS/background-size
Glenn Maynard

161

Sử dụng thuộc tính kích thước nền trong CSS3:

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

EDIT: Modernizr hỗ trợ phát hiện hỗ trợ kích thước nền . Bạn có thể sử dụng một cách giải quyết JavaScript được viết để làm việc tuy nhiên bạn cần nó và tải nó một cách linh hoạt khi không có hỗ trợ. Điều này sẽ giữ cho mã có thể duy trì mà không cần dùng đến các bản hack CSS xâm nhập cho một số trình duyệt nhất định.

Cá nhân tôi sử dụng một tập lệnh để đối phó với nó bằng cách sử dụng jQuery, đó là một sự thích ứng của trình giả lập . Như hầu hết các thiết kế hiện nay tôi sử dụng %% chiều rộng cho bố cục chất lỏng trên các thiết bị, có một chút thích ứng với một trong các vòng lặp (chiếm kích thước không phải lúc nào cũng 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;
}

EDIT: Bạn cũng có thể quan tâm đến jQuery CSS3 Finaliz [s] e .


3
Chỉ cần nhấn mạnh, Modernizr KHÔNG cho phép hỗ trợ kích thước nền trong các trình duyệt không hỗ trợ nó. Nó chỉ có một bài kiểm tra trình duyệt chéo thuận tiện cho nó. Tùy thuộc vào bạn để giả mạo nó khi thử nghiệm trả về sai.
Chris Moschini

34

Hãy thử kích thước bài viết nền . Nếu bạn sử dụng tất cả những điều sau đây, nó sẽ hoạt động trong hầu hết các trình duyệt trừ 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
Cảm ơn bạn! Điều này khác với "kích thước nền: bìa"
Pavel Vlasov

1
Điều này kéo dài cho tôi trên ipad, nhưng không mở rộng. thx để đăng.
Don Côte

1
Điều này là tuyệt vời để làm cho nó thu nhỏ nền quá. Cảm ơn!
Beingalex

1
Nếu hình nền là một SVG, thì cũng cần phải chỉ định preserveAspectRatio="none" trong SVG. Thông tin thêm về điều này ở đây . Demo tại đây .
Mentalist

bạn có thể sử dụng kích thước nền: bìa; đính kèm nền: cố định; bạn có thể mở rộng nó
Siraj Ahmed

15

Không phải hiện tại. Nó sẽ có sẵn trong CSS 3 , nhưng sẽ mất một thời gian cho đến khi nó được triển khai trong hầu hết các trình duyệt.


2
Bài viết tuyệt vời có sẵn tại A List Apart: Supersize Bối cảnh đó, xin vui lòng!
jensgram

3
-1 Tôi không nghĩ câu trả lời này rất phù hợp ... và nó không đưa ra giải pháp dưới bất kỳ hình thức nào.
Potherca

1
@Potherca câu trả lời này là đúng vào thời điểm đó (gần 3 năm trước).
Eran Galperin

4
Có một lý do ngày được hiển thị. Nó nên được giữ lại để tham khảo lịch sử. Bạn đang đi qua tất cả các câu trả lời cũ trên trang web và hạ thấp chúng? câu trả lời vẫn đúng ngay cả khi có thêm thông tin được thêm vào từ đó. Cũng lưu ý rằng các câu trả lời khác ở đây về cơ bản đều giống nhau (và một số thực sự không chính xác - chúng nói rằng điều đó là không thể). Tôi có cảm giác bạn đã chọn cái này vì nó có một số phiếu bầu.
Eran Galperin

3
Không, tôi đã chọn cái này vì tất cả những gì nó nói là "Máy tính nói không" mặc dù có một số giải pháp cho vấn đề này ngay cả vào năm 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;
}

Hoạt động trong:

  • Safari 3+
  • Chrome bất cứ điều gì +
  • IE 9+
  • Opera 10+ (Opera 9.5 hỗ trợ kích thước nền nhưng không phải từ khóa)
  • Firefox 3.6+ (Firefox 4 hỗ trợ phiên bản tiền tố không phải của nhà cung cấp)

Ngoài ra, bạn có thể thử điều này cho một giải pháp tức là

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

Tín dụng cho bài viết này của Chris Coyier http://css-tricks.com/perinf-full-page-background-image/


Làm thế nào điều này tốt hơn hoặc khác hơn là chỉ "kích thước nền: bìa"?
PKHunter

@PKHunter, tôi không chắc chính xác những gì bạn đang tham gia. Điều này đang sử dụng background-size: coverngoại trừ tiền tố trình duyệt và giải pháp IE
Blowsie

8

Trong một từ: không. Cách duy nhất để kéo dài hình ảnh là với <img>thẻ. Bạn sẽ phải sáng tạo.

Điều này đã từng đúng trong năm 2008, khi câu trả lời được viết. Ngày nay các trình duyệt hiện đại hỗ trợ background-sizegiải quyết vấn đề này. Coi chừng IE8 không hỗ trợ nó.


6
@Blowsie - Dễ thương. Kiểm tra ngày trả lời. Bối cảnh trình duyệt đã thay đổi một chút trong 5 năm qua.
Vilx-

5

Xác định "độ giãn và tỷ lệ" ...

Nếu bạn đã có một định dạng bitmap, nói chung sẽ không tuyệt vời (nói bằng đồ họa) để kéo dài nó và kéo nó về. Bạn có thể sử dụng các mẫu lặp lại để tạo ảo giác về hiệu ứng tương tự. Chẳng hạn, nếu bạn có một dải màu nhạt hơn ở cuối trang, thì bạn sẽ sử dụng một hình ảnh có chiều rộng một pixel và cùng chiều cao với thùng chứa của bạn (hoặc tốt hơn là lớn hơn để tính tỷ lệ) và sau đó xếp nó ngang qua trang. Tương tự, nếu gradient chạy ngang qua trang, nó sẽ cao một pixel và rộng hơn so với vùng chứa của bạn và lặp lại xuống trang.

Thông thường để tạo ảo giác cho nó kéo dài để lấp đầy vật chứa khi vật chứa phát triển hoặc co lại, bạn làm cho hình ảnh lớn hơn vật chứa. Bất kỳ sự chồng lấp nào sẽ không được hiển thị bên ngoài giới hạn của container.

Nếu bạn muốn có một hiệu ứng dựa vào thứ gì đó giống như một cái hộp có các cạnh cong, thì bạn sẽ dán bên trái của hộp vào bên trái của hộp chứa của bạn với đủ chồng lên nhau (trong lý do) cho dù thùng chứa lớn đến đâu, nó không bao giờ chạy ra khỏi nền và sau đó bạn layer một hình ảnh bên phải của hộp với các cạnh cong và đặt nó ở bên phải của container. Do đó, khi container co lại hoặc phát triển, hiệu ứng hộp cong dường như co lại hoặc phát triển cùng với nó - thực tế không phải vậy, nhưng nó mang lại ảo tưởng rằng đó là những gì đang xảy ra.

Để thực sự làm cho hình ảnh thu nhỏ và phát triển với vùng chứa, bạn sẽ cần sử dụng một số thủ thuật xếp lớp để làm cho hình ảnh có vẻ hoạt động như một nền và một số javascript để thay đổi kích thước với vùng chứa. Không có cách nào hiện tại để làm điều này với CSS ...

Nếu bạn đang sử dụng đồ họa vector, bạn sẽ vượt ra ngoài lĩnh vực chuyên môn của mình.


Kéo dài = Thay đổi kích thước x và y thay đổi độc lập tỷ lệ khung hình của hình ảnh, Tỷ lệ = thay đổi kích thước x và y tương ứng duy trì tỷ lệ khung hình của hình ảnh.
Lawrence Dol

@SoftwareMonkey: Làm nền thì không, bạn không thể thay đổi độ dài và tỷ lệ theo nghĩa thực sự của các thuật ngữ trong CSS thẳng. Bạn phải sử dụng các thủ thuật CSS khác nhau để tạo ảo giác rằng đây là những gì đang xảy ra như tôi đã mô tả.
BenAlabaster

4

Đây là những gì tôi đã làm về nó. Trong lớp kéo dài, tôi chỉ đơn giản là thay đổi chiều cao thành auto. Bằng cách này, ảnh nền của bạn luôn có cùng kích thước với chiều rộng của màn hình và chiều cao sẽ luôn có kích thước phù hợp.

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

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

2

Thêm một background-attachmentdòng:

#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

Tôi muốn chỉ ra rằng điều này tương đương với việc làm:

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

2

Một giải pháp tuyệt vời khác cho điều này là Backstretch của Srobbin có thể được áp dụng cho cơ thể hoặc bất kỳ yếu tố nào trên trang - http://srobbin.com/jquery-plugins/backstretch/


Nick, chúng tôi thường yêu cầu bạn cung cấp các phần nổi bật trong câu trả lời của bạn và chỉ cung cấp một liên kết bên ngoài để biết thêm chi tiết - điều này giúp câu trả lời vẫn hữu ích trong trường hợp quay vòng liên kết.
Lawrence Dol

1
Lỗi của tôi. Nói chung, bạn thêm backstretch vào <head> của tài liệu của bạn sau đó khởi tạo như vậy: $ (". Your-Element"). Backstretch ("path / to / image.jpg");
nickff


1

Một mẹo bổ sung cho cheat của SolidSmile là chia tỷ lệ (kích thước lại tỷ lệ) bằng cách đặt chiều rộng và sử dụng tự động cho chiều cao.

Ví dụ:

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

0

Sử dụng thuộc border-image : yourimagetính để đặt hình ảnh của bạn và phóng to nó lên toàn bộ viền của màn hình hoặc cửa sổ của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.