webp的使用

简介

WebP 在各大互联网公司已经使用得很多了,国外的有 Google(自家的东西肯定要用啦,Chrome Store 甚至已全站使用 WebP)、Facebook 和 ebay,国内的有淘宝、腾讯和美团等。WebP 的优势体现在它具有更优的图像数据压缩算法,能带来更小的图片体积,而且拥有肉眼识别无差异的图像质量;同时具备了无损和有损的压缩模式、Alpha 透明以及动画的特性,在 JPEG 和 PNG 上的转化效果都相当优秀、稳定和统一。主流浏览器支持webp格式的图片,在高保真的情况下,图片大小只有原来图片的50% - 70% ,所以可以通过转换图片为webp的方式来提示web加载体验

使用

下载智图电脑客户端或者访问智图网站 https://zhitu.isux.us 在线压缩

智图App按照默认方式生成webp文件

如果是背景图 style 添加webp样式 样式中替换 图片路径(注意用background-image 而不是background)

.wrap(v-webp="")
.wrap{
            width: 345px;
            height: 518px;
            background-image: url(/webapp/open-account-hk/apply/banner-bg.jpg);
            background-position: center;
            background-size: contain;
            background-repeat: no-repeat;
            &.webp {
                background-image: url(/webapp/open-account-hk/apply/webp/banner-bg.webp);
            }
        }

如果是image 标签,也可以直接传入 webp文件路径

img(v-webp="")

介绍下我司实现webp的方案

先检测浏览器是否支持,如支持则通过修改样式或者替换img的src路径

// webp.js 判断是否支持webp
let supportWebP = false


let elem = document.createElement('canvas')

if (elem.getContext && elem.getContext('2d')) {
    // was able or not to get WebP representation
    supportWebP = elem.toDataURL('image/webp').indexOf('data:image/webp') === 0
} else {
    // very old browser like IE 8, canvas not supported
    supportWebP = false
}

/**
 * 是否支持webP
 * @returns supportWebP: boolean
 */
function canUseWebP() {
    return supportWebP
}

export default { canUseWebP }
/**
 * 通过该指令,如果dom有 src 属性,会将 src 重新定位到原路径的  webp/imgName.webp
 * 例如 /newoffline/static/images/offline-icon.png => /newoffline/static/images/webp/offline-icon.webp
 * 如果没有 src 属性,会在 dom 上加一个 webp class。可以通过样式文件制定 webp 图片地址
 * 也可以 用 v-webp="webp-source-path" 来指定 webp 图片地址
 */
function isWebp(src) {
    return src.substr(src.length - 4) === 'webp'
}


Vue.directive('webp', (el, binding) => {
    if (Webp.canUseWebP()) {
        if (binding.value) {
            el.src = binding.value
        } else if (el.src && !isWebp(el.src)) {
            let imageSrc = el.src
            let lastPathIndex = imageSrc.lastIndexOf('/') + 1
            let fileName = imageSrc.substr(lastPathIndex)
            let webpPath =
                imageSrc.substr(0, lastPathIndex) +
                'webp/' +
                fileName.substr(0, fileName.lastIndexOf('.')) +
                '.webp'
            el.src = webpPath
        } else if (!el.src && el.classList) {
            el.classList.add('webp')
        }
    }
})
上一篇:linux 编译C++


下一篇:Pandas学习——Pandas基础