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中Eval函数的使用说明
Oct 11 Javascript
javascript document.referrer 用法
Apr 30 Javascript
jQuery.validate 常用方法及需要注意的问题
Mar 20 Javascript
Jquery获得控件值的三种方法总结
Feb 13 Javascript
javascript中使用正则表达式清理table样式的代码
Apr 01 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
Feb 21 Javascript
JS实现复选框的全选和批量删除功能
Apr 05 Javascript
详解如何实现一个简单的 vuex
Feb 10 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
Mar 05 Javascript
ES6与CommonJS中的模块处理的区别
Jun 13 Javascript
小程序Scroll-view上拉滚动刷新数据
Jun 21 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
Jul 20 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
APMServ使用说明
2006/10/23 PHP
使用openssl实现rsa非对称加密算法示例
2014/01/24 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
PHP数组编码gbk与utf8互相转换的两种方法
2016/09/01 PHP
php简单实现多维数组排序的方法
2016/09/30 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
2018/04/21 PHP
PHP中PDO事务处理操作示例
2018/05/02 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
JQUERY设置IFRAME的SRC值的代码
2010/11/30 Javascript
将查询条件的input、select清空
2014/01/14 Javascript
在jquery boxy中添加百度地图坐标拾取注意流程
2014/04/03 Javascript
js简单实现点击左右运动的方法
2015/04/10 Javascript
javascript中checkbox使用方法实例演示
2015/11/19 Javascript
js简单判断flash是否加载完成的方法
2016/06/21 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
Nginx 配置多站点vhost 的方法
2018/01/07 Javascript
vue 使用Jade模板写html,stylus写css的方法
2018/02/23 Javascript
微信小程序实现登录注册tab切换效果
2020/12/29 Javascript
vue-cli中使用高德地图的方法示例
2019/03/28 Javascript
Layui Form 自定义验证的实例代码
2019/09/14 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
[01:01:42]Secret vs Optic Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
Python控制多进程与多线程并发数总结
2016/10/26 Python
Python 3.x读写csv文件中数字的方法示例
2017/08/29 Python
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
python 中的列表生成式、生成器表达式、模块导入
2019/06/19 Python
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
2013/01/09 HTML / CSS
微信端html5页面调用分享接口示例
2018/03/14 HTML / CSS
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
大专毕业生自我鉴定
2013/11/21 职场文书
高中军训感想300字
2014/03/04 职场文书
党员专题组织生活会发言材料
2014/10/17 职场文书
Windows 11上手初体验:任务栏和开始菜单等迎来大改
2021/11/21 数码科技
Vue router配置与使用分析讲解
2022/12/24 Vue.js