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 相关文章推荐
JXTree对象,读取外部xml文件数据,生成树的函数
Apr 02 Javascript
jquery 表格分页等操作实现代码(pagedown,pageup)
Apr 11 Javascript
Javascript级联下拉菜单以及AJAX数据验证核心代码
May 10 Javascript
jquery分页插件jpaginate在IE中不兼容问题
Apr 22 Javascript
基于JS实现PHP的sprintf函数实例
Nov 14 Javascript
jQuery unbind()方法实例详解
Jan 19 Javascript
[原创]JavaScript语法高亮插件highlight.js用法详解【附highlight.js本站下载】
Nov 01 Javascript
Vue.JS入门教程之自定义指令
Dec 08 Javascript
Vue响应式添加、修改数组和对象的值
Mar 20 Javascript
bootstrap是什么_动力节点Java学院整理
Jul 14 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
Jul 20 Javascript
javascript设计模式 ? 享元模式原理与用法实例分析
Apr 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 中的类
2006/10/09 PHP
php代码把全角数字转为半角数字
2007/12/10 PHP
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
2013/11/07 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
2015/06/23 PHP
PHP类的声明与实例化及构造方法与析构方法详解
2016/01/26 PHP
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
JS下高效拼装字符串的几种方法比较与测试代码
2010/04/15 Javascript
下载网站打开页面后间隔多少时间才显示下载链接地址的代码
2010/04/25 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
JavaScript实现节点的删除与序号重建实例
2015/08/05 Javascript
js基于cookie记录来宾姓名的方法
2016/07/19 Javascript
Angular通过angular-cli来搭建web前端项目的方法
2017/07/27 Javascript
JavaScript Tab菜单实现过程解析
2020/05/13 Javascript
[33:17]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
python读写json文件的简单实现
2017/04/11 Python
python enumerate函数的使用方法总结
2017/11/15 Python
NLTK 3.2.4 环境搭建教程
2018/09/19 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
2018/12/19 Python
Python数据可视化教程之Matplotlib实现各种图表实例
2019/01/13 Python
python实现程序重启和系统重启方式
2020/04/16 Python
基于python实现获取网页图片过程解析
2020/05/11 Python
Pycharm安装python库的方法
2020/11/24 Python
CSS3教程(10):CSS3 HSL声明设置颜色
2009/04/02 HTML / CSS
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
俄罗斯金苹果网上化妆品和香水商店:Goldapple
2019/12/01 全球购物
周年庆典邀请函范文
2014/01/23 职场文书
十佳青年个人事迹材料
2014/01/28 职场文书
党员公开承诺书
2014/03/25 职场文书
小学生一分钟演讲稿
2014/08/26 职场文书
先进集体申报材料
2014/12/25 职场文书
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书
Java比较两个对象中全部属性值是否相等的方法
2021/08/07 Java/Android
全新239军机修复记
2022/04/05 无线电