一、问题分析

既然要实现图片自适应,那就要对不同的图片尺寸进行分类处理,我最开始是分了5类

对于长宽都不超过的情况 -- 应该不改变图片本身比例

对于长宽都超过的情况 -- 应该是根据图片比例进行缩小,这样才不会扭曲图片,因此同样存在两种情况

二、算法

// img.height -- 图片高度 img.weight -- 图片宽度
// changeHeight -- 压缩后高度 changeWidth -- 压缩后宽度
// 180 -- 显示器高度 360 -- 显示器宽度 if (img.height > 180 && img.width > 360) {
if (img.height / img.width > 0.5) {
// 第四种情况
} else {
// 第五种情况
} } else if (img.height > 180 && img.width <= 360) {
// 第二种情况
} else if (img.height <= 180 && img.width > 360) {
// 第三种情况
} else {
// 第一种情况
}

将5种情况的判断条件进行分类讨论后,再讨论其具体实现方法

第一种:高度 = 图片高 宽 = 图片宽

第二种:高 = 显示器高 宽 = 图片宽(压缩后)

(或许有人会有疑问:既然图片宽度没超过,那为什么不直接使用图片宽呢? 因为图片高已经压缩为显示器高了,如果图片宽保持不变,图像绝对会变形,这就涉及到比例了,在进行图片处理的时候,一定不要改变其比例!)

第三种: 高 = 图片高(压缩后) 宽 = 显示器宽

对于四、五种情况,因为长宽都超了,因为再判断图片与显示器关系的同时,也要判断图片自身的关系,就是其比例

这也就是前面写的这块代码了,后面其实就是显示器的比例,通过比例对比,就能知道这个图片相比显示器是偏宽还是偏长

然后我就发现,第四种 和 第三种处理方法是一致的 ,第五种 和 第二种一致,也就是无论另一条边超没超过显示器,都需要按比例缩放,因此代码可以整理如下

三、具体实现

if(img.height > 180 || img.width >360){
if(img.height *2 >img.width){
changeHeight.value = '180px'
changeWidth.value = (img.width * 180) / img.height
changeWidth.value = parseInt(changeWidth.value) + 'px'
} else{
changeHeight.value = (img.height * 360) / img.width
changeHeight.value = parseInt(changeHeight.value) + 'px'
changeWidth.value = '360px'
} } else {
changeHeight.value = img.height + 'px'
changeWidth.value = img.width + 'px'
}

实现中多了两个内容,单位和除数取整

根据css文档可知,需要有单位样式才会起作用

等比例缩放的时候必然会出现一条边的数值为小数,虽然height 和 weight 可以取小数,但是不同浏览器可能会对其有不同解析,为了避免可能出现的问题,提前将其取整。

四、其他问题

(1)如何获取图片长宽?

var img = new Image()
img.src = res.resourceUrl
img.onload = function () {
}

详情如下:

JS快速获取图片宽高的方法_Jensen Wu UED-CSDN博客_js获取图片的宽高

(2)vue如何利用js改变样式

<el-image :style="{ height: changeHeight, width: changeWidth }" ></el-image>

【前端】js实现图片自适应的更多相关文章

  1. 使用HTML5的两个api,前端js完成图片压缩

    主要用了两个html5的 API,一个file,一个canvas,压缩主要使用cnavas做的,file是读取文件,之后把压缩好的照片放入内存,最后内存转入表单下img.src,随着表单提交. 照片是 ...

  2. [css或js控制图片自适应]

    [css或js控制图片自适应]图片自动适应大小是一个非常常用的功能,在进行制作的时候为了防止图片撑开容器而对图片的尺寸进行必要的控制,我们可不可以用CSS控制图片使它自适应大小呢?此个人博客想到了一个 ...

  3. 利用HTML5,前端js实现图片压缩

    http://blog.csdn.NET/qazwsx2345/article/details/21827553 主要用了两个HTML5的 API,一个file,一个canvas,压缩主要使用cnav ...

  4. 前端JS转图片为base64并压缩、调整尺寸脚本

    image to base64 to blob //////////////////////////////////////////////////////////////////////////// ...

  5. 前端CSS实现图片自适应背景大小

    <body> <div> <!--背景图片--> <div id="web_bg" style="background-imag ...

  6. JS获取图片实际宽高及根据图片大小进行自适应

    JS获取图片实际宽高,以及根据图片大小进行自适应  <img src="http://xxx.jpg" id="imgs" onload="ad ...

  7. 图片纯前端JS压缩的实现

    一.图片上传前端压缩的现实意义 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅 ...

  8. 前端js实现字符串/图片/excel文件下载

    在web开发中,如果你想让用户下载或者导出一个文件,应该怎么做呢?传统的做法是在后端存储或者即时生成一个文件来提供下载功能,这样的优势是可以做权限控制.数据二次处理,但缺点是需要额外发起请求.增大服务 ...

  9. 前端js保存页面为图片下载到本地

    前端js保存页面为图片下载到本地 手机端点击下载按钮将页面保存成图片到本地 前端js保存页面为图片下载到本地的坑 html2canvas 识别 svg 解决方案 方案 html2canvas.js:可 ...

  10. 前端js图片上传

    前端js图片上传,原理用input type="file"获取图片然后把图片转换成base64编码传到后台. 图片上传 <!DOCTYPE html><html& ...

随机推荐

  1. python中文词云生成

    一.词云 "词云"就是对网络文本中出现频率较高的"关键词"予以视觉上的突出,形成"关键词云层"或"关键词渲染",从而过滤 ...

  2. 发送http2请求

    有时服务器会检测http协议版本,有http/1.1和h2,requests发送的是http1.1的请求 # pip install httpx client = httpx.Client(http2 ...

  3. MyBatis是如何初始化的?

    摘要:我们知道MyBatis和数据库的交互有两种方式有Java API和Mapper接口两种,所以MyBatis的初始化必然也有两种:那么MyBatis是如何初始化的呢? 本文分享自华为云社区< ...

  4. 后疫情办公时代——你需要的多人同步协同编辑Demo(可粘贴可撤销)

    新冠病毒的疫情使得在线办公成为了一个常态,这使得在线文档成为了时下的热点.其中在线协同表格是在线文档的重要一个组成部分,纯前端表格在在线协同表格上有着得天独厚的优势:本身已经实现了单人操作在线文档的基 ...

  5. 【Azure 云服务】为Azure云服务配置上自签名的SSL证书步骤

    问题描述 在使用Azure Cloud Service(云服务),默认的情况下都是使用的 HTTP 服务,通过 Visual Studio 2022 创建的默认 Cloud Service项目中,在S ...

  6. [机器学习] t-SNE聚类算法实践指南

    ​  转载于比PCA降维更高级--(R/Python)t-SNE聚类算法实践指南-阿里云开发者社区 作者介绍:Saurabh.jaju2 Saurabh是一名数据科学家和软件工程师,熟练分析各种数据集 ...

  7. [OpenCV实战]48 基于OpenCV实现图像质量评价

    本文主要介绍基于OpenCV contrib中的quality模块实现图像质量评价.图像质量评估Image Quality Analysis简称IQA,主要通过数学度量方法来评价图像质量的好坏. 本文 ...

  8. python进阶之路6之 for循环方法

    while循环补充说明 1.死循环 真正的死循环是一旦执行 CPU功耗会极速上升 直到系统采取紧急措施 尽量不要让CPU长时间不间断运算 2.嵌套及全局标志位 强调:一个break只能结束它所在的那一 ...

  9. 递归实现指数型枚举 (n个可选可不选)

    递归实现指数型枚举 从 1∼n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案. 输入格式 输入一个整数 n. 输出格式 每行输出一种方案. 同一行内的数必须升序排列,相邻两个数用恰好 1 ...

  10. ABP Framework 手动升级指南:从6.0.1升级到7.0.0

    ABP 7.0.0 正式版已经发布,ABP-Framework-All-In-One 项目同步升级. LeptonX Lite Theme 目前还没有包含在源码解决方案中,还是以 Nuget 包提供, ...