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设置FieldSet展开与收缩
May 15 Javascript
js 省地市级联选择
Feb 07 Javascript
如何使用Jquery获取Form表单中被选中的radio值
Aug 09 Javascript
瀑布流布局代码一例
Apr 11 Javascript
jquery.validate.js插件使用经验记录
Jul 02 Javascript
详解JavaScript设计模式开发中的桥接模式使用
May 18 Javascript
深入理解JavaScript单体内置对象
Jun 06 Javascript
AngularJS中的DOM操作用法分析
Nov 04 Javascript
微信小程序 详解页面跳转与返回并回传数据
Feb 13 Javascript
Vue生命周期示例详解
Apr 12 Javascript
微信小程序开发教程之增加mixin扩展
Aug 09 Javascript
Angular中使用MathJax遇到的一些问题
Dec 15 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性能的21种方法介绍
2013/06/25 PHP
php定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
2015/12/23 PHP
PHP并发多进程处理利器Gearman使用介绍
2016/05/16 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
javascript中的有名函数和无名函数
2007/10/17 Javascript
js同时按下两个方向键
2007/12/01 Javascript
JS写的贪吃蛇游戏(个人练习)
2013/07/08 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
2015/08/13 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
深入理解JS DOM事件机制
2016/08/06 Javascript
JavaScript 随机验证码的生成实例代码
2016/09/22 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
2016/11/04 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
2018/08/20 Javascript
快速解决vue在ios端下点击响应延时的问题
2018/08/27 Javascript
详解基于node.js的脚手架工具开发经历
2019/01/28 Javascript
用Electron写个带界面的nodejs爬虫的实现方法
2019/01/29 NodeJs
基于JS实现数字动态变化显示效果附源码
2019/07/18 Javascript
a标签调用js的方法总结
2019/09/05 Javascript
如何使用three.js 制作一个三维的推箱子游戏
2020/07/29 Javascript
python分治法求二维数组局部峰值方法
2018/04/03 Python
Python实现简单http服务器
2018/04/12 Python
Keras中的多分类损失函数用法categorical_crossentropy
2020/06/11 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
2020/06/17 Python
美国领先的户外服装与装备用品店:Moosejaw
2016/08/25 全球购物
Sofmap官网:日本著名的数码电器专卖店
2017/05/19 全球购物
进修护士自我鉴定
2013/10/14 职场文书
关于爱情的广播稿
2014/01/16 职场文书
个人授权委托书范本
2014/04/03 职场文书
优秀德育工作者事迹材料
2014/05/07 职场文书
借款担保书范文
2014/05/13 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书
Spring实现内置监听器
2021/07/09 Java/Android