Эта статья была впервые написана 3 марта 2017 года, когда я работал в Superrb.
Возможно, вы не слышали о формате изображений WebP, и, вероятно, для этого есть причина; он не смог по-настоящему взлететь в (большинстве) основных браузеров. Так почему мы вообще об этом говорим? Что ж, формат был разработан Google, и это означает, что все браузеры Chrome поддерживают этот формат.
Так зачем же нам нужен другой формат изображения? WebP может похвастаться действительно впечатляющим сжатием изображений (около 26%) для изображений без потерь. Важно отметить, что он может содержать альфа-канал для прозрачности. Это позволяет нам иметь легитимную альтернативу изображениям в формате PNG с возможностью существенной экономии размера файла. Конечно, поддержка на данный момент невелика, но большой плюс в том, что Chrome поддерживает формат и выглядит как Safari и поддержка Firefox может не за горами. Modernizr позволяет нам обнаружить поддержку браузером WebP, так что нет никаких оправданий, чтобы не попробовать.
Я решил написать небольшой миксин SASS для использования WebP для структурных и фоновых изображений для недавней сборки. Давайте взглянем.
@mixin webp-background($img, $color: transparent, $repeat: repeat, $attachment: scroll, $position: center, $size: auto, $type: ‘.png’) { background: $color url(‘/frontend/img/#{$img}.webp’) $repeat $attachment $position / $size; .no-webp & { background-image: url(‘/frontend/img/#{$img}#{$type}’); } }
Все, что делает миксин, — это ищет изображение по имени файла и создает его как фоновое изображение с типом файла WebP. Если WebP не поддерживается (обнаружено Modernizr), мы можем вернуться к исходному типу файла. Другие настройки позволяют нам построить весь фон со всеми его настройками (размер, исходный тип файла, повтор и т. д.).
Давайте посмотрим, как использовать миксин.
@include webp-background($img: 'background-img');
Это основное использование. Единственным обязательным параметром является имя изображения. Обратите внимание, что у файла нет расширения, так как оно применяется нашим миксином. Основываясь на настройках нашего миксина, он будет искать /frontend/img/background-img.webp
для тех браузеров, которые могут, и /frontend/img/background-img.png
для тех, которые не могут.
Существует множество других настроек, которые вы можете настроить для каждого использования или глобально со значениями по умолчанию в миксине. Например, если вы хотите вместо этого использовать JPG, вы можете передать это расширение файла миксину;
@include webp-background($img: 'background-img', $type: '.jpg');
Этот миксин предполагает, что вы преобразовали файлы WebP, что вы можете сделать вручную, онлайн или встроить их в процесс компиляции ресурсов Gulp/Grunt. Давайте посмотрим, как может выглядеть ваша задача gulp.
gulp.task(‘images’, function() { var sink = clone.sink(); return gulp.src(config.img) // Only optimize changed images .pipe(plugins.changed(config.dist.img)) // Imagemin .pipe(plugins.imagemin({ optimizationLevel: 3, progressive: true, svgoPlugins: [{ removeViewBox: false }] })) .pipe(sink) // clone image .pipe(webp()) // convert cloned image to WebP .pipe(sink.tap()) // restore original image // Set destination .pipe(gulp.dest(config.dist.img)) // Show total size of images .pipe(plugins.size({ title: ‘images’ })); });
Это требует использования gulp-webp и gulp-clone. Я могу запустить эту функцию как часть моих часов/сборки, и она сделает за меня все преобразование изображений.
В конечном счете, это означает, что я могу беспрепятственно встраивать прогрессивные улучшения в свой рабочий процесс; это всесторонняя победа. Надеемся, приведенные выше фрагменты помогут вам сделать то же самое.