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 相关文章推荐
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
Mar 04 Javascript
在JavaScript中实现类的方式探讨
Aug 28 Javascript
jQuery实现的左右移动焦点图效果
Jan 14 Javascript
微信小程序 HTTPS报错整理常见问题及解决方案
Dec 14 Javascript
简单实现jQuery级联菜单
Jan 09 Javascript
浅谈函数调用的不同方式,以及this的指向
Sep 17 Javascript
webpack搭建vue 项目的步骤
Dec 27 Javascript
AngularJS创建一个上传照片的指令实例代码
Feb 24 Javascript
快速了解vue-cli 3.0 新特性
Feb 28 Javascript
从零开始搭建webpack+react开发环境的详细步骤
May 18 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
Dec 05 Javascript
vue使用echarts实现水平柱形图实例
Sep 09 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实现微信公众号支付功能图文详解
2019/04/10 PHP
使用Apache的rewrite
2021/03/09 Servers
QQ登录简单实现代码
2021/03/09 Javascript
javascript面向对象编程代码
2011/12/19 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
JQuery页面图片切换和新闻列表滚动效果的具体实现
2013/09/26 Javascript
ExtJS4中的requires使用方法示例介绍
2013/12/03 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
jquery对复选框(checkbox)的操作汇总
2016/01/13 Javascript
javascript绘制漂亮的心型线效果完整实例
2016/02/02 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
2017/09/25 Javascript
vue中设置height:100%无效的问题及解决方法
2018/07/27 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
详解easyui 切换主题皮肤
2019/04/04 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python MysqlDb模块安装及其使用详解
2018/02/23 Python
python 移除字符串尾部的数字方法
2018/07/17 Python
Python lambda表达式用法实例分析
2018/12/25 Python
Debenhams百货英国官方网站:Debenhams UK
2016/07/12 全球购物
英国潮流网站:END.(全球免邮)
2017/01/16 全球购物
英国助听器购物网站:Hearing Direct
2018/08/21 全球购物
GAZMAN官网:澳大利亚领先的男装品牌
2019/12/19 全球购物
关于安全演讲稿
2014/05/09 职场文书
廉洁自律演讲稿
2014/05/22 职场文书
趣味运动会广播稿
2014/09/13 职场文书
给老师的一封感谢信
2015/01/20 职场文书
2015年办公室文秘工作总结
2015/04/30 职场文书
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
2021/06/26 Python
详细聊聊MySQL中慢SQL优化的方向
2021/08/30 MySQL