Растягивание и масштабирование фона CSS

Есть ли способ растянуть или масштабировать фон в CSS, чтобы заполнить его контейнер?

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
665
0
900 630
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

Одним словом: нет. Единственный способ растянуть изображение - использовать тег <img>. Вы должны проявить изобретательность.

Раньше так было в 2008 году, когда был написан ответ. Сегодня современные браузеры поддерживают background-size, что решает эту проблему. Помните, что IE8 его не поддерживает.

@Blowsie - Милый. Проверьте дату ответа. За последние 5 лет ландшафт браузеров немного изменился.

Vilx- 13.08.2013 17:00

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

Отличная статья доступна в A List Apart: Увеличьте размер фона, пожалуйста!

jensgram 02.11.2010 14:29

-1 Не думаю, что этот ответ очень актуален ... и не предлагает решения типа любой.

Potherca 15.06.2011 18:32

@Potherca, этот ответ был правильным в то время (почти 3 года назад).

Eran Galperin 16.06.2011 13:51

Дата указана не зря. Его следует сохранить для исторических справок. Вы просматриваете все старые ответы на сайте и голосуете против них? ответ по-прежнему верен, даже если с тех пор была добавлена ​​дополнительная информация. Также обратите внимание, что в других ответах здесь в основном указано то же самое (а некоторые действительно неверны - они заявляют, что это невозможно). У меня такое ощущение, что вы выбрали этот вариант, потому что он набрал несколько голосов.

Eran Galperin 17.06.2011 18:42

Нет, я выбрал этот, потому что все, что он говорит: «Компьютер говорит нет», хотя даже в 2008 году было несколько решений этой проблемы ;-)

Potherca 13.10.2011 23:47

Дайте определение «растянуть и масштабировать» ...

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

Обычно, чтобы создать иллюзию растягивания, заполняющего контейнер, когда он растет или сжимается, вы делаете изображение больше, чем контейнер. Любое перекрытие не будет отображаться за пределами контейнера.

Если вам нужен эффект, основанный на чем-то вроде коробки с изогнутыми краями, вы должны приклеить левую сторону коробки к левой стороне контейнера с достаточным перекрытием, чтобы (в пределах разумного) независимо от размера контейнера, он никогда не выходит за пределы фона, а затем вы накладываете изображение правой стороны коробки с изогнутыми краями и размещаете его справа от контейнера. Таким образом, по мере того, как контейнер сжимается или растет, эффект изогнутого прямоугольника, кажется, сжимается или растет вместе с ним - на самом деле это не так, но он создает иллюзию того, что происходит.

Что касается того, чтобы изображение действительно уменьшалось и увеличивалось вместе с контейнером, вам нужно будет использовать некоторые уловки наслоения, чтобы изображение выглядело как фон, и некоторый javascript, чтобы изменить его размер вместе с контейнером. В настоящее время нет способа сделать это с помощью CSS ...

Боюсь, что если вы используете векторную графику, вы выходите за рамки моей компетенции.

Растянуть = изменить размеры x и y независимо, изменяя соотношение сторон изображения, Scale = изменить размеры x и y пропорционально, сохраняя соотношение сторон изображения.

Lawrence Dol 18.12.2008 02:12

@SoftwareMonkey: В качестве фона, тогда нет, вы не можете изменить растяжение и масштаб в истинном смысле терминов в чистом CSS. Вы должны использовать различные приемы CSS, чтобы создать иллюзию того, что происходит именно так, как я описал.

BenAlabaster 18.12.2008 03:45

Масштабирование изображения с помощью 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.

Это работает хорошо ... но искал что-то более надежное (вероятно, с javascript), которое также центрировало бы его и настраивало в зависимости от того, было ли изображение альбомным или портретным. Если у кого-то есть решение в этом ключе, хотелось бы получить ссылку ... спасибо!

Brian Armstrong 02.03.2010 22:03

В случае, если кому-то еще интересно, это вроде работало хорошо: buildinternet.com/project/supersized

Brian Armstrong 02.03.2010 22:20

Горизонтальное центрирование может быть выполнено с помощью margin: 0 auto на .stretch. При установке только width или height соотношение сторон остается прежним. Попробуйте использовать max-width и max-height, чтобы ограничить коэффициент масштабирования ...

Ronald 21.03.2010 19:21

Это не работает для меня в ie8 / ie9, но работает в ie6 / ie7 (и, конечно, во всех других браузерах). В ie8 / ie9 изображение отображается только на 3/4 div. У кого-нибудь есть такая же проблема?

user375566 16.09.2011 06:14

Для ie7 установка .stretch { height: auto } работала в моем случае, а height:100% - нет. В противном случае отличное решение, спасибо!

Leimi 10.10.2011 19:01

Недостаток SO: нет возможности отмечать ответы, которые больше не являются правильными, что приводит к тому, что такие люди, как @Ullas, сбиваются с пути. Фон легко масштабировать во всех современных браузерах. developer.mozilla.org/en/CSS/background-size

Glenn Maynard 27.07.2012 00:41

На самом деле это не недостаток SO, если первоначальный автор ответа решает не отзывать / улучшать свой ответ, когда он больше не применяется. Вместо этого модератор или лицо с соответствующими привилегиями (и доверенное лицо) должны предпринять такие действия. Не стесняйтесь обсуждать этот вопрос на сайте meta.stackoverflow.com, поскольку я не буду здесь обсуждать этот вопрос.

Metalshark 01.08.2012 15:25

Жалко, если допустим, например, компиляция chms для старых и новых машин. Но чтобы получить этот а также, принятый ответ, работающий как для чего-то вроде @СМИ, так и для jqery, вообще не будет выглядеть очень красиво!

Laurie Stearn 03.07.2017 17:56

Дополнительным советом для читерства SolidSmile является масштабирование (пропорциональное изменение размера) путем установки ширины и использования авто для высоты.

Бывший:

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

Вот что я из этого сделал. В классе stretch я просто изменил высоту на auto. Таким образом, ваше фоновое изображение всегда имеет тот же размер, что и ширина экрана, а высота всегда будет иметь правильный размер.

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

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

Добавьте строку 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;
}

Используйте атрибут размера фона в CSS3:

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

Обновлено:Modernizr поддерживает обнаружение поддержки размера фона. Вы можете использовать обходной путь JavaScript, написанный для работы, но он вам нужен, и загружать его динамически, когда нет поддержки. Это позволит поддерживать код в сопровождении, не прибегая к навязчивым взломам CSS для определенных браузеров.

Лично я использую сценарий, чтобы справиться с этим с помощью jQuery, это адаптация imgsizer. Поскольку в большинстве дизайнов я сейчас использую width% для плавных макетов на разных устройствах, есть небольшая адаптация к одному из циклов (с учетом размеров, которые не всегда 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] e.

Чтобы подчеркнуть, Modernizr НЕ включает поддержку размера фона в браузерах, которые изначально не поддерживают его. Просто для этого есть удобный кроссбраузерный тест. Вы должны подделать его, когда тест вернет false.

Chris Moschini 26.06.2012 23:18

Попробуйте статью размер фона. Если вы используете все перечисленное ниже, оно будет работать в большинстве браузеров, кроме 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%;
} 

Спасибо! Это отличается от "размер фона: обложка"

Pavel Vlasov 28.07.2011 13:52

это растянулось для меня на ipad, но не масштабировалось. спасибо за публикацию.

Don Cote 29.11.2011 03:44

Это отлично подходит для уменьшения размера фона. Спасибо!

beingalex 15.05.2012 18:50

Если фоновое изображение является SVG, также необходимо указать preserveAspectRatio = "none" в SVG. Подробнее об этом здесь. Демо здесь.

Mentalist 11.06.2019 08:18

вы можете использовать background-size: cover; background-attachment: исправлено; вы можете масштабировать это

Siraj Ahmed 16.01.2020 16:53
Ответ принят как подходящий

В современных браузерах это можно сделать с помощью background-size:

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

cover означает растягивание изображения по вертикали или горизонтали, чтобы оно никогда не мозаично / не повторялось.

Это будет работать для Safari 3 (или новее), Chrome, Опера 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')";

Клементу: То, что вы предлагаете для фильтров в предыдущих версиях IE, работает только частично. Он масштабирует ширину изображения нормально, но масштабирование высоты идет не так, потому что не ограничивает его ничем. Чем выше страница, тем выше фоновое изображение .. = (Я пробовал это в IE8. А также, можно ли каким-либо образом использовать эти команды 'cover' и каким-то образом сделать это совместимым с мобильными телефонами, такими как iphone? Я знаю, что есть область просмотра проблема, но можно ли масштабировать область просмотра на весь экран таким образом, чтобы фон масштабировался здесь? Спасибо за ответы!

user611392 10.02.2011 21:55

Специфичные для IE фильтры не являются идеальным решением, поэтому не стесняйтесь использовать IE с альтернативами CSS. Я лично использую «обложку» CSS3 на моем собственном сайте, и она отлично работает на устройствах iOS, просто не забудьте указать ширину устройства.

Clement 20.04.2011 02:38

Чехол не растягивает бг. 100% 100% да.

neoswf 20.12.2012 19:01

Это решение лучше всего сработало для меня, когда я не хотел растягивать изображение по горизонтали или вертикали больше, чем его фактическое разрешение. Спасибо..!!

Mr. Noddy 04.12.2017 15:01

NB. Начиная с Chromium 78.0.3904.97, невозможно масштабировать изображения SVG независимо по каждой оси. Возможно, вам придется увеличить его и преобразовать в растровое изображение.

Mike 20.12.2019 00:24

Хочу отметить, что это равносильно выполнению:

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

Используйте свойство CSS 3background-size:

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

Это доступно для современных браузеров с 2012 года.

Чтобы сохранить соотношение сторон изображения, вы должны использовать "background-size: cover;" или "размер фона: содержать;". Я создал полифилл, который реализует эти значения в IE8: github.com/louisremi/background-size-polyfill

Louis-Rémi 05.12.2012 13:53

Я знаю, что этому год, но я должен (смеяться) согласиться с частью «приличных браузеров». Проверьте все свои браузеры, но с IE у меня было больше проблем, чем с любым из них.

ErocM 12.01.2013 00:36

Мне пришлось настроить background-size: 100% 100%;, чтобы добиться желаемого эффекта, если это кому-то поможет.

FarFigNewton 29.01.2013 02:18

@ Луи-Реми Как центрировать в обоих направлениях при использовании "укрытия"?

ceving 27.05.2013 16:11

@ceving добавить background-position:50% 50% - затем он используется в качестве источника.

Niels Keurentjes 03.06.2013 16:03

объяснение cover и containна MDN

mohas 14.03.2014 11:16

guanome спасибо, что решила мою проблему. cover и contain не работали в моем сценарии.

user1973285 08.04.2014 23:35

это на самом деле не работает. Вопрос в контейнере наполнять, что означает, что мы хотим, чтобы он растягивался, чтобы он не повторялся. С другой стороны, этот ответ будет повторяться в направлении высоты, если высота не покрывает область. «Растягивать до заполнения» означает растягивать, но вам нужно, чтобы это не повторялось. Правильный ответ - «прикрытие» снизу. На самом деле это решает тот случай, когда этого не происходит.

gman 23.02.2015 03:59

Еще одно отличное решение для этого - Backstretch Srobbin, который можно применить к телу или любому элементу на странице - http://srobbin.com/jquery-plugins/backstretch/

Ник, мы обычно просим вас указать основные части вашего ответа и предоставить внешнюю ссылку только для более подробной информации - это помогает ответам оставаться полезными в случае разрушения ссылок.

Lawrence Dol 02.11.2012 12:23

Моя вина. Вообще говоря, вы добавляете обратное растяжение к <head> вашего документа, а затем инициализируете его следующим образом: $ (". Your-element"). Backstretch ("path / to / image.jpg");

nickff 02.11.2012 18:00

Попробуй это

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;
}
.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 Whatever +
  • IE 9+
  • Opera 10+ (Opera 9.5 поддерживает размер фона, но не ключевые слова)
  • Firefox 3.6+ (Firefox 4 поддерживает версии без префиксов сторонних производителей)

Кроме того, вы можете попробовать это для решения IE

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

Кредит этой статье Криса Койера http://css-tricks.com/perfect-full-page-background-image/

Чем это лучше или отличается от "background-size: cover"?

PKHunter 07.02.2017 05:47

@PKHunter, я не совсем понимаю, о чем вы говорите. Используется background-size: cover, за исключением префиксов браузера и решения IE.

Blowsie 25.07.2017 16:31

Используйте свойство border-image : yourimage, чтобы установить изображение и масштабировать его до всей границы экрана или окна.

Другие вопросы по теме