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 相关文章推荐
javascript之dhDataGrid Ver2.0.0代码
Jul 01 Javascript
javascript html 静态页面传参数
Apr 10 Javascript
JS和函数式语言的三特性
Mar 05 Javascript
js生成缩略图后上传并利用canvas重绘
May 15 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
Jan 05 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
Mar 21 Javascript
js实现跨域的方法实例详解
Jun 24 Javascript
JS与Ajax Get和Post在使用上的区别实例详解
Jun 08 Javascript
webpack构建react多页面应用详解
Sep 15 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
Nov 22 Javascript
使用webpack打包koa2 框架app
Feb 02 Javascript
详解Node 定时器
Feb 26 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自定义函数call_user_func和call_user_func_array详解
2011/07/14 PHP
PHP之图片上传类实例代码(加了缩略图)
2016/06/30 PHP
注释PHP和html混合代码的小技巧(分享)
2016/11/03 PHP
PHP读取word文档的方法分析【基于COM组件】
2017/08/01 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
JavaScript setTimeout和setInterval的使用方法 说明
2010/03/25 Javascript
jQuery UI的Dialog无法提交问题的解决方法
2011/01/11 Javascript
jQuery实战之品牌展示列表效果
2011/04/10 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
jQuery中hide()方法用法实例
2014/12/24 Javascript
JavaScript数据结构与算法之栈详解
2015/03/12 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
2016/04/14 Javascript
jQuery编写网页版2048小游戏
2017/01/06 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
2017/08/28 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
2018/01/06 jQuery
深入理解移动前端开发之viewport
2018/10/19 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
vue ajax 拦截原理与实现方法示例
2019/11/29 Javascript
详解JavaScript修改注册表的方法
2020/01/05 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
python中nan与inf转为特定数字方法示例
2017/05/11 Python
Django验证码的生成与使用示例
2017/05/20 Python
django Serializer序列化使用方法详解
2018/10/16 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
2018/12/28 Python
Python实现把多维数组展开成DataFrame
2019/11/30 Python
Python 实现敏感目录扫描的示例代码
2020/05/21 Python
详解Python 中的 defaultdict 数据类型
2021/02/22 Python
新西兰珠宝品牌:Michael Hill
2017/09/16 全球购物
英国发展最快的在线超市之一:Click Marketplace
2021/02/15 全球购物
优秀社区干部事迹材料
2014/02/03 职场文书
2014年节能工作总结
2014/12/18 职场文书
2016十一国庆节慰问信
2015/12/01 职场文书
Python使用scapy模块发包收包
2021/05/07 Python
详解Python中__new__方法的作用
2022/03/31 Python