Как загрузить форматы изображений на основе поддержки браузера с помощью CSS?

#html #css #cross-browser #background-image #webp

#HTML #css #кросс-браузерный #фоновое изображение #webp

Вопрос:

Я хотел бы использовать формат изображения WebP в моем background-image свойстве CSS. Но, поскольку WebP является довольно новым и до сих пор не поддерживается всеми новыми и старыми браузерами, я также хотел бы добавить поддержку версии этого изображения в формате JPEG в качестве запасного варианта.

Я знаю, что могу использовать <picture> тег для этого, например:

 <picture>
    <source type="image/webp" srcset="image.webp">
    <source type="image/jpeg" srcset="image.jpg">
    <img src="image.jpg">
</picture>
  

И это заставило бы браузер загружать первый поддерживаемый формат. Но могу ли я каким-то образом добиться того же эффекта, используя только CSS, поскольку я устанавливаю фоновое изображение с помощью background-image свойства? Я знаю, что могу выбирать изображения на основе размера экрана с помощью @media запросов, но как мне загружать изображения на основе поддержки браузера?

Я пытался найти решение, но не смог его найти. Дайте мне знать, если это дубликат и решение уже существует.

Спасибо.

Комментарии:

1. Я ценю, что вы написали, как вы можете это сделать, <picture> поскольку это именно то, что мне было нужно.

Ответ №1:

@supports Вместо этого используйте CSS.

 .yourclass {
    background: url("image.jpg") no-repeat center / contain;
}

@supports (background-image: url("image.webp")) {
    .yourclass {
        background: url("image.webp") no-repeat center / contain;
    }
}
  

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

Что следует учитывать:

  • Обратите внимание, что вы должны объявить webp версию после jpg , или каскадный поток должен выиграть.
  • Параметры background-repeat , background-position и background-size приведены только для примера.

Комментарии:

1. Выглядело многообещающе, но, тестируя Safari, я обнаружил, что, несмотря на невозможность использовать webp, он будет использовать правила внутри части @supports.

2. Я также тестировал Safari, этот ответ неверен. Я думаю @supports , что только тесты этого правила CSS доступны и действительны для текущего браузера, но не скажут вам, может ли ресурс быть успешно загружен.

3. @bambooom с какой версией Safari вы тестировали? caniuse.com/#feat=css-featurequeries

4. @ed1nh0 Safari версии 13.0.5 (15608.5.11). Я не имею @supports в виду, что он не поддерживается в Safari. Но я согласен с первым комментарием. Запросы функций @supports возвращают true для Safari 13, так что правило url("image.webp") применяется, но webp не может быть показан в Safari.

Ответ №2:

Используйте 2 фоновых изображения: одно с JPG или PNG, другое с WEBP, браузер автоматически выберет лучшее.

Нашел этот код в codepen:Robin Rendle

CSS:

 element {
  width: 50vw;
  height: 100vh;
  background-image: url('https://s3-us-west-2.amazonaws.com/s.cdpn.io/14179/cust-housegreening-pup@2x-4cf7ada520811031a97bee12c06d9e9367f811bd86255ea60d40aa809cf58801.jpg');
  background-image: url('https://s3-us-west-2.amazonaws.com/s.cdpn.io/14179/cust-housegreening-pup@2x-4cf7ada520811031a97bee12c06d9e9367f811bd86255ea60d40aa809cf58801.webp');
}
  

https://codepen.io/robinrendle/pen/ORmzJY

Комментарии:

1. Я могу подтвердить, что этот подход НЕ работает. При использовании этого подхода как FireFox, так и Google Chrome загружают .webp версию изображения и работают нормально. Но в Safari (v12.1.1), который не поддерживает WebP, это не работает. Safari по-прежнему пытается загрузить .webp формат и не показывает изображение. Это предполагаемое поведение CSS, поскольку при использовании нескольких background-image атрибутов браузер всегда загружает последнее упомянутое изображение. Даже предоставленный вами codepen не работает в Safari.

2. Извините за это, проверил это в текущем браузере. единственный способ — использовать JS для определения поддержки webp и добавления класса body, чтобы все элементы с фоновыми изображениями можно было переключить на webp

3. вы можете обратиться к этому link:css-tricks.com/using-webp-images и вот что: freecodecamp.org/news /…