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 相关文章推荐
js对象数组按属性快速排序
Jan 31 Javascript
jQuery extend 的简单实例
Sep 18 Javascript
浅谈javascript事件取消和阻止冒泡
May 26 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
Oct 22 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
Oct 30 Javascript
Bootstrap Chart组件使用教程
Apr 28 Javascript
AngularJS 自定义指令详解及示例代码
Aug 17 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
Jun 13 Javascript
浅谈webpack下的AOP式无侵入注入
Nov 12 Javascript
Angular父组件调用子组件的方法
Apr 02 Javascript
vue+eslint+vscode配置教程
Aug 09 Javascript
javascript实现视频弹幕效果(两个版本)
Nov 28 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
文件上传的实现
2006/10/09 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
PHP7 新增功能
2021/03/09 PHP
jQuery中trigger()方法用法实例
2015/01/19 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
2015/01/28 Javascript
jquery在ie7下选择器的问题导致append失效的解决方法
2016/01/10 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
js学习笔记之事件处理模型
2016/10/31 Javascript
jQuery实现web页面樱花坠落的特效
2017/06/01 jQuery
Angularjs验证用户输入的字符串是否为日期时间
2017/06/01 Javascript
Vue-resource拦截器判断token失效跳转的实例
2017/10/27 Javascript
Vue项目添加动态浏览器头部title的方法
2018/07/11 Javascript
Vue中错误图片的处理的实现代码
2019/11/07 Javascript
浅析JavaScript中的事件委托机制跟深浅拷贝
2021/01/20 Javascript
[01:01:24]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第三局
2016/02/25 DOTA
Python random模块(获取随机数)常用方法和使用例子
2014/05/13 Python
轻松实现python搭建微信公众平台
2016/02/16 Python
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
2017/07/20 Python
关于Django外键赋值问题详解
2017/08/13 Python
Python 过滤错误log并导出的实例
2019/12/26 Python
Python多进程编程常用方法解析
2020/03/26 Python
Python map及filter函数使用方法解析
2020/08/06 Python
CSS3弹性伸缩布局之box布局
2016/07/12 HTML / CSS
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
Ticketmaster意大利:音乐会、节日、艺术和剧院的官方门票
2019/12/23 全球购物
公司财务总监岗位职责
2013/12/14 职场文书
《纸船和风筝》教学反思
2014/02/15 职场文书
项目建议书格式
2014/03/12 职场文书
精彩的演讲稿开头
2014/05/08 职场文书
给校长的建议书200字
2014/05/16 职场文书
个人自荐材料
2014/05/23 职场文书
教师暑期培训感言
2014/08/15 职场文书
放弃继承权公证书
2015/01/23 职场文书
离婚起诉书怎么写
2015/05/19 职场文书
MongoDB 常用的crud操作语句
2021/06/20 MongoDB