首页 > 其他分享 >【前端】js实现图片自适应

【前端】js实现图片自适应

时间:2023-01-09 11:25:53浏览次数:59  
标签:img -- 前端 value height width js 图片

一、问题分析

既然要实现图片自适应,那就要对不同的图片尺寸进行分类处理,我最开始是分了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)如何利用js改变样式

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

 

标签:img,--,前端,value,height,width,js,图片
From: https://www.cnblogs.com/bisiyuan/p/17036439.html

相关文章

  • 前端打印相关
    1、方式一:后端提供打印文件,返回Blob格式数据,前端承接后直接转成对应文件即可1)前端直接调用后端接口,把blob文件转为url对象,拿到此对象后可以进行下载,打印和预览等操作2)......
  • 前端 vue 静态页面
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Compatible"content="IE=edge"/><metaname="viewport"content="width=......
  • 表格集算表高性能原理——怎样实现纯前端百万行数据秒级响应
    集算表(TableSheet)是一个具备高性能渲染、数据绑定功能、公式计算能力的数据表格,通过全新构建的关系型数据管理器结合结构化公式,在高性能表格的基础上提供排序、筛选、样......
  • 前端二面经典vue面试题指南
    v-model的原理?我们在vue项目中主要使用v-model指令在表单input、textarea、select等元素上创建双向数据绑定,我们知道v-model本质上不过是语法糖,v-model在内部为......
  • 百度前端经典vue面试题整理
    子组件可以直接改变父组件的数据吗?子组件不可以直接改变父组件的数据。这样做主要是为了维护父子组件的单向数据流。每次父级组件发生更新时,子组件中所有的prop都将会刷......
  • js获取天数, 如昨天,今天
    vardt=newDate();        m=dt.getMonth()+1;//获得月份        d=dt.getDate();//获取日        y=dt......
  • 前端高频react面试题整理
    createElement和cloneElement有什么区别?createElement是JSX被转载得到的,在React中用来创建React元素(即虚拟DOM)的内容。cloneElement用于复制元素并传递新的props。区......
  • react的jsx和React.createElement是什么关系?面试常问
    1、JSX在React17之前,我们写React代码的时候都会去引入React,并且自己的代码中没有用到,这是为什么呢?这是因为我们的JSX代码会被Babel编译为React.createElement,我们来......
  • Qt应用程序初始化图片文件对话框静态函数(设置图片文件对话框的打开目录为系统图片标准
    //初始化图片文件对话框staticvoidinitializeImageFileDialog(QFileDialog&dialog,QFileDialog::AcceptModeacceptMode){staticboolfirstDialog=true;/......
  • 社招前端react面试题整理
    什么是上下文ContextContext通过组件树提供了一个传递数据的方法,从而避免了在每一个层级手动的传递props属性。用法:在父组件上定义getChildContext方法,返回一个对象,......