Vue自定义指令结合阿里云OSS优化图片的实现方法


Posted in Javascript onNovember 12, 2019

图片往往在加载前端项目中占大头,如何既不损失图片质量,又提升加载速度呢?

  • 根据显示设备pixelRatio和元素宽高来显示合适图片
  • 略微压缩图片质量
  • 使用webp

注册全局自定义指令

Vue.directive('img-condense', {
 bind: (el, binding, vnode) => {
  let src = el.getAttribute('src')
  let newSrc = compressImg(src, el)
  el.setAttribute('src', newSrc)
 }
})

获取元素宽高和显示设备pixelRatio

let compressImg = (imgUrl, el) => {
 // 获取显示设备 pixelRatio
 let pixelRatio = window.devicePixelRatio
 let elWidth = elStyle.width * pixelRatio
 let elHeight = elStyle.height * pixelRatio
 let resize = '/resize'
 if (elWidth) {
  resize += `,w_${elWidth}`
 }
 if (elHeight) {
  resize += `,h_${elHeight}`
 }
})

判断webp

let canUseWebp = document.createElement('canvas').toDataURL('image/webp').indexOf('data:image/webp') == 0
let webp = ''
if (canUseWebp) {
 webp = '/format,webp'
}

质量降低至80%

let ossParam?x-oss-process=image${resize}/auto-orient,1/quality,Q_80/bright,-1${webp}

完整版

<img v-img-condense alt="Vue logo" src="../assets/logo.png">
Vue.directive('img-condense', {
 bind: (el, binding, vnode) => {
  let src = el.getAttribute('src')
  let newSrc = compressImg(src, el)
  el.setAttribute('src', newSrc)
 }
})
let compressImg = (imgUrl, el) => {
 // 如果不是oss 或者已经压缩过的图片直接返回
 if (imgUrl.includes('aliyuncs.com') || imgUrl.indexOf('blob') === 0 || imgUrl.includes('x-oss-process=')){
  return imgUrl 
 }
 // 获取显示设备 pixelRatio
 let pixelRatio = window.devicePixelRatio
 let elWidth = el.width * pixelRatio
 let elHeight = el.height * pixelRatio
 let resize = '/resize'
 if (elWidth) {
  resize += `,w_${elWidth}`
 }
 if (elHeight) {
  resize += `,h_${elHeight}`
 }
 if (!elWidth && !elHeight) {
  resize = ''
 }
 // 判断webp
 let canUseWebp = document.createElement('canvas').toDataURL('image/webp').indexOf('data:image/webp') == 0
 let webp = ''
 if (canUseWebp) {
  webp = '/format,webp'
 }
 return `${imgUrl}?x-oss-process=image${resize}/auto-orient,1/quality,Q_80/bright,-1${webp}`
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS应用之禁止抓屏、复制、打印
Feb 21 Javascript
得到jQuery detach()后节点中的某个值实现代码
Feb 05 Javascript
利用毫秒减值计算时长的js代码
Sep 22 Javascript
PHP abstract与interface之间的区别
Nov 11 Javascript
jquery左右全屏大尺寸多图滑动效果代码分享
Aug 28 Javascript
Javascript刷新窗口方法小结
Oct 21 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
Jun 26 Javascript
node.js express安装及示例网站搭建方法(分享)
Aug 22 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
Aug 15 jQuery
javaScript canvas实现(画笔大小 颜色 橡皮的实例)
Nov 28 Javascript
记一次vue去除#问题处理经过小结
Jan 24 Javascript
解决antd datepicker 获取时间默认少8个小时的问题
Oct 29 Javascript
浅谈如何优雅处理JavaScript异步错误
Nov 12 #Javascript
vue页面切换项目实现转场动画的方法
Nov 12 #Javascript
解决vue-cli 打包后自定义动画未执行的问题
Nov 12 #Javascript
vue transition 在子组件中失效的解决
Nov 12 #Javascript
vue+element导航栏高亮显示的解决方式
Nov 12 #Javascript
vue-element-admin 菜单标签失效的解决方式
Nov 12 #Javascript
Vue退出登录时清空缓存的实现
Nov 12 #Javascript
You might like
php写的带缓存数据功能的mysqli类
2012/09/06 PHP
php内存缓存实现方法
2015/01/24 PHP
php编译安装php-amq扩展简明教程
2016/06/25 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
不使用中间变量,交换int型的 a, b两个变量的值。
2010/10/29 Javascript
JavaScript 函数replace深入了解
2013/03/14 Javascript
原生js实现给指定元素的后面追加内容
2013/04/10 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
jQuery数据缓存用法分析
2015/02/20 Javascript
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
浅谈在Vue-cli里基于axios封装复用请求
2017/11/06 Javascript
vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
2017/11/28 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
swiper实现异形轮播效果
2019/11/28 Javascript
Vue开发中常见的套路和技巧总结
2020/11/24 Vue.js
[02:22]2018DOTA2亚洲邀请赛VG赛前采访
2018/04/03 DOTA
python取数作为临时极大值(极小值)的方法
2018/10/15 Python
Python3非对称加密算法RSA实例详解
2018/12/06 Python
python获取url的返回信息方法
2018/12/17 Python
用Python逐行分析文件方法
2019/01/28 Python
浅谈Python 递归算法指归
2019/08/22 Python
Python 实现自动导入缺失的库
2019/10/29 Python
python Shapely使用指南详解
2020/02/18 Python
Python3实现飞机大战游戏
2020/04/24 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
网络教育自我鉴定
2013/11/01 职场文书
销售人员获奖感言
2014/02/05 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
2014年业务工作总结
2014/11/17 职场文书
辞职信的写法
2015/02/27 职场文书
会计试用期自我评价
2015/03/10 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
详解Python魔法方法之描述符类
2021/05/26 Python
mysql 联合索引生效的条件及索引失效的条件
2021/11/20 MySQL