Розтягування та масштабування фону 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 (або новішої версії).

Щоб він працював з нижчими версіями 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: s, працюйте лише частково. Він масштабує ширину зображення добре, але масштабування по висоті йде не так, не обмежуючи її нічим. Чим вище сторінка, тим фонове зображення .. = (я спробував це на IE8. А також, чи можна в будь-якому випадку використовувати ці команди 'cover' і якось зробити це сумісним з мобільними телефонами, як iphone? Я знаю, що є вікно перегляду Проблема, але чи можливо, можливо, масштабувати вікно перегляду на весь екран так, щоб фон масштабувався тут ?? Спасибі за відповіді!

3
Специфічні для IE фільтри не є ідеальним рішенням, тому не соромтеся умовляти IE з CSS-альтернативами. Я особисто використовую CSS3 "обкладинку" на своєму власному сайті, і він чудово працює на пристроях iOS, просто не забудьте визначити ширину пристрою.
Климент

9
Обкладинка не розтягує біг. 100% 100% так.
neoswf

Це рішення найкраще працювало для мене там, де я не хотів розтягувати зображення ні по горизонталі, ні по вертикалі, ніж по справжній роздільній здатності. Дякую..!!
Містер Ноді

1
Примітка: Станом на Chromium 78.0.3904.97, неможливо масштабувати SVG-зображення незалежно вздовж кожної осі. Можливо, вам доведеться масштабувати його та перетворювати на растрове зображення.
Майк

567

Використовуйте властивість CSS 3background-size :

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

Це доступно для сучасних браузерів з 2012 року.


93
Для збереження співвідношення сторін зображення слід використовувати "background-size: cover;" або "фоновий розмір: містити;". Я створив 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
це насправді не працює. Питання полягає в тому, щоб заповнити контейнер, а це означає, що ми хочемо, щоб він розтягнувся, щоб він не повторився. Ця відповідь з іншого боку повториться у напрямку висоти, якщо висота не охоплює область. "Розтягнути, щоб заповнити" означає розтягнення, проте вам доведеться, щоб воно не повторилося. Правильна відповідь - «кришка» знизу. Це фактично вирішує той випадок, коли цього немає.
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
Це добре працює ... але шукав щось трохи більш надійне (ймовірно, з javascript), яке також зосереджувало його та коригувало, виходячи з того, якщо зображення було пейзажним чи портретним. Якщо хтось має рішення в цій жилці, дуже сподобається посилання ... дякую!
Брайан Армстронг

4
Якщо хтось цікавиться, це, здається, працює добре: buildinternet.com/project/supersized
Брайан Армстронг,

1
Горизонтальне центрування може бути зроблено з margin: 0 autoна .stretch. Встановлюючи лише, widthабо heightспіввідношення сторін залишається таким же. Спробуйте використовувати max-widthта max-heightобмежити коефіцієнт збільшення ...
Рональд,

1
Це не працює для мене у ie8 / ie9, але працює у ie6 / ie7 (і, звичайно, у всіх інших браузерах). У ie8 / ie9 зображення відображається лише для приблизно 3/4 розділу. У когось те саме питання?

3
Недолік з SO: немає способу відзначити відповіді, які вже не є правильними, що призводить до того, що люди, як @Ullas, збивають зблуд. Шпалери можна легко масштабувати у всіх сучасних браузерах. developer.mozilla.org/uk/CSS/background-size
Glenn Maynard

161

Використовуйте атрибут розміру фону в CSS3:

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

EDIT: Modernizr підтримує виявлення підтримки фонового розміру . Ви можете використовувати вирішення JavaScript, написане для роботи, однак він вам потрібен і динамічно завантажувати його, коли немає підтримки. Це дозволить зберегти код бездоганним, не вдаючись до настирливих CSS-хаків для певних браузерів.

Особисто я використовую скрипт для роботи з ним за допомогою jQuery, його адаптації imgsizer . Оскільки в більшості конструкцій я зараз використовую ширину% s для розкладки рідини на різних пристроях, є незначна адаптація до однієї з петель (враховуючи розміри, які не завжди є 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: Можливо, вас також зацікавить jQuery CSS3 Finaliz [s] e .


3
Наголосимо лише, що Modernizr НЕ вмикає підтримку розміру фону в браузерах, які не підтримують його. У ньому просто є зручний тест для веб-переглядачів. Підробляти це потрібно, коли тест повернеться помилковим.
Кріс Москіні

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
Дякую! Це відрізняється від "background-size: cover"
Павло Власов

1
це розтягнулося для мене на ipad, але не масштабувало. THX для розміщення.
Дон Кот

1
Це відмінно підходить для того, щоб фон також скорочувався. Дякую!
beingalex

1
Якщо фонове зображення є SVG, також необхідно вказати preserveAspectRatio="none"в SVG. Більше інформації про це тут . Демо тут .
менталіст

ви можете використовувати фоновий розмір: обкладинка; фон-вкладення: фіксований; ви можете його масштабувати
Сірай Ахмед

15

Наразі не. Він буде доступний у CSS 3 , але пройде певний час, поки він не буде реалізований у більшості браузерів.


2
Відмінна стаття, доступна на A List Apart: Перебільшуйте цей фон!
jensgram

3
-1 Я не думаю, що ця відповідь є дуже актуальною ... і вона не пропонує рішення будь-якого типу.
Potherca

1
@Potherca ця відповідь була правильною у той час (майже 3 роки тому).
Еран Гальперін

4
Є причина, що відображається дата. Його слід зберігати для історичних довідок. Чи переглядаєте ви всі старі відповіді на сайті та зволікаєте їх? відповідь все ще правильна, навіть якщо з тих пір було додано більше інформації. Також зауважте, що інші відповіді, в основному, заявляють те саме (а деякі справді є невірними - вони заявляють, що це неможливо). Я відчуваю, що ти вибрав цей, оскільки в ньому є голоси.
Еран Гальперін

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

Працює в:

  • Сафарі 3+
  • Chrome "Що б ні +"
  • IE 9+
  • Opera 10+ (розмір фонового режиму, підтримуваний Opera 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

Визначте "розтягнення і масштаб" ...

Якщо у вас є формат растрових зображень, як правило, не чудово (графічно кажучи) розтягувати його та витягувати. Можна використовувати повторювані шаблони, щоб дати ілюзію того ж ефекту. Наприклад, якщо у вас є градієнт, який стає світлішим у нижній частині сторінки, ви використовуєте графіку, яка має ширину одного пікселя та таку ж висоту, як ваш контейнер (або бажано більший для обліку масштабування), а потім плиткою поперек сторінки. Так само, якби градієнт проходив по всій сторінці, він був би на один піксель вище і ширше, ніж ваш контейнер, і повторювався вниз.

Зазвичай, щоб ілюзія про те, що вона розтягується, щоб наповнити контейнер, коли контейнер росте або скорочується, ви робите зображення більше, ніж контейнер. Будь-яке перекриття не відображатиметься за межами контейнера.

Якщо ви хочете, щоб ефект, який спирається на щось на кшталт коробки з вигнутими краями, тоді ви будете приклеювати ліву частину коробки до лівої частини контейнера з достатньою накладкою, яка (в межах розуму), незалежно від того, наскільки великий контейнер, він ніколи закінчується фон, а потім ви шаруєте зображення правої сторони коробки з вигнутими краями і розміщуєте її праворуч від контейнера. Таким чином, коли контейнер скорочується або зростає, ефект зігнутої коробки, здається, зменшується або наростає разом з ним - насправді це не відбувається, але це дає ілюзію того, що відбувається.

Що стосується того, щоб зображення зменшувалося та зростало разом з контейнером, вам потрібно буде використовувати кілька шарів накладання шарів, щоб зображення виглядало як фон, а трохи javascript, щоб змінити його розмір у контейнері. Немає поточного способу зробити це з CSS ...

Якщо ви використовуєте векторну графіку, ви боюсь поза моєю сферою досвіду, боюся.


Stretch = Змінення розмірів x і y незалежно змінюючи пропорцію зображення, масштаб = змінює розміри x і y пропорційно, підтримуючи співвідношення сторін зображення.
Лоуренс Дол

@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/


Нік, ми, як правило, просимо вказати важливі частини у своїй відповіді та надавати зовнішнє посилання лише для подальшої деталізації - це допомагає відповідям залишатися корисними у випадку згнивання посилань.
Лоуренс Дол

1
Моє ліжко. Взагалі кажучи, ви додаєте backstretch до <head> документа, потім ініціалізуєтесь так: $ (". Ваш-елемент"). Backstretch ("шлях / до / image.jpg");
нікфф

2

Спробуйте це

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 є масштабування (пропорційне зміна розмірів) шляхом встановлення ширини та використання автоматичного для висоти.

Наприклад:

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

0

Використовуйте border-image : yourimageвластивість, щоб встановити зображення та масштабувати його до усієї межі екрана чи вікна.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.