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 相关文章推荐
Jquery替换已存在于element上的event的方法
Mar 09 Javascript
js中的setInterval和setTimeout使用实例
May 09 Javascript
js实现简单的购物车有图有代码
May 26 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
Jun 23 Javascript
JS中dom0级事件和dom2级事件的区别介绍
May 05 Javascript
jQuery实现的简单拖拽功能示例
Sep 13 Javascript
关于JavaScript中事件绑定的方法总结
Oct 26 Javascript
jQuery实现两个select控件的互移操作
Dec 22 Javascript
jquery表单验证实例仿Toast提示效果
Mar 03 Javascript
js实现手机发送验证码功能
Mar 13 Javascript
详解微信小程序开发聊天室—实时聊天,支持图片预览
May 20 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
Oct 08 jQuery
浅谈如何优雅处理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权限分配的实现代码
2013/04/28 PHP
PHP中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
[原创]php实现 data url的图片生成与保存
2016/12/04 PHP
thinkPHP实现的省市区三级联动功能示例
2017/05/05 PHP
php-msf源码详解
2017/12/25 PHP
CI框架实现创建自定义类库的方法
2018/12/25 PHP
jQuery 一个图片切换的插件
2011/10/09 Javascript
javascript的数据类型、字面量、变量介绍
2012/05/23 Javascript
浅谈js 闭包引起的内存泄露问题
2015/06/22 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
vue实现手机号码抽奖上下滚动动画示例
2017/10/18 Javascript
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
JS内部事件机制之单线程原理
2018/07/02 Javascript
layer.prompt输入层的例子
2019/09/24 Javascript
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2014/08/22 Python
python 生成器协程运算实例
2017/09/04 Python
python实现发送邮件功能代码
2017/12/14 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
分享8点超级有用的Python编程建议(推荐)
2019/10/13 Python
Python读取实时数据流示例
2019/12/02 Python
Python属性和内建属性实例解析
2020/01/14 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
python读取图像矩阵文件并转换为向量实例
2020/06/18 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
纯CSS3实现滚动的齿轮动画效果
2014/06/05 HTML / CSS
html5 localStorage本地存储_动力节点Java学院整理
2017/07/06 HTML / CSS
LTD Commodities:礼品,独特发现,家居装饰,家用器皿
2017/08/11 全球购物
大学生物业管理求职信
2013/10/24 职场文书
机电一体化大学生求职信
2013/11/08 职场文书
班主任班级寄语大全
2014/04/04 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
党的群众路线教育实践活动整改落实情况自查报告
2014/10/28 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书
业余无线电通联Q语
2022/02/18 无线电
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL