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 相关文章推荐
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
Feb 09 Javascript
jQuery live
May 15 Javascript
javascript中String类的subString()方法和slice()方法
May 24 Javascript
JS中showModalDialog 的使用解析
Apr 17 Javascript
浅析return false的正确使用
Nov 04 Javascript
基于JavaScript实现定时跳转到指定页面
Jan 01 Javascript
动态加载js文件简单示例
Apr 21 Javascript
Bootstrap3 input输入框插入glyphicon图标的方法
May 16 Javascript
jQuery获取单击节点对象的方法
Jun 02 Javascript
jquery动态创建div与input的实例代码
Oct 12 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
Jan 11 Javascript
vue中组件的过渡动画及实现代码
Nov 21 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文件
2007/01/04 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
2017/06/07 PHP
JavaScript 上万关键字瞬间匹配实现代码
2013/07/07 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
jQuery插件zepto.js简单实现tab切换
2015/06/16 Javascript
理解Javascript的动态语言特性
2015/06/17 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
Angular.js实现注册系统的实例详解
2016/12/18 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
jQuery自定义图片上传插件实例代码
2017/04/04 jQuery
js遍历获取表格内数据的方法(必看)
2017/04/06 Javascript
详解Vue中一种简易路由传参办法
2017/09/15 Javascript
react以create-react-app为基础创建项目
2018/03/14 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
JavaScript和TypeScript中的void的具体使用
2019/09/12 Javascript
基于JS判断对象是否是数组
2020/01/10 Javascript
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
让python同时兼容python2和python3的8个技巧分享
2014/07/11 Python
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
Python字符串中查找子串小技巧
2015/04/10 Python
Python操作列表之List.insert()方法的使用
2015/05/20 Python
python实现根据文件关键字进行切分为多个文件的示例
2018/12/10 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
深入理解Python 多线程
2020/06/16 Python
美国男士西装打折店:Jos. A. Bank
2017/11/13 全球购物
会话Bean的种类
2013/11/07 面试题
学生安全承诺书
2014/05/22 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
市委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
项目建议书
2015/02/04 职场文书
承诺书模板大全
2015/05/04 职场文书
投诉信范文
2015/07/02 职场文书
如何用threejs实现实时多边形折射
2021/05/07 Javascript
分析SQL窗口函数之聚合窗口函数
2022/04/21 Oracle