JavaScript 实现图片等比缩放
web前端开发
共 2058字,需浏览 5分钟
· 2021-02-01
在开发网页的时候少不了图片,展示图片时自然会遇到缩放问题。一般情况下只要我们的图片宽高比例差不多时,缩放是没有问题的,展示不太影响美观。
但是有一些网页对这个要求比较高,要求图片不能变形,缩放一定按比较展示,还不能影响网页整个布局。
网上给到一些 css方法都试过,均不能实现目的,所以特地使用js来实现一了一下。以下案例摘自我的企业微信项目。
实现原理:
(1)获取图片的原始高度和宽度。可以通过以下代码实现:
function getImgNaturalDimensions(oImg, callback) {
var nWidth, nHeight;
if (!oImg.naturalWidth) {
nWidth = oImg.naturalWidth;
nHeight = oImg.naturalHeight;
callback(oImg,{ w: nWidth, h: nHeight });
} else {
var nImg = new Image();
nImg.onload = function () {
var nWidth = nImg.width,
nHeight = nImg.height;
callback(oImg,{ w: nWidth, h: nHeight });
}
nImg.src = oImg.src;
}
}
(2)计算缩放后的宽度和高度,分为以下几种情况:
图片的高和宽都超限了,这时要算一下哪个超的多,按超多的缩放比例等比计算宽和高。
高超限,宽未超限,按高的缩放等比计算。
宽超限,高未超退,按宽的缩放等比计算。
高宽均未超限,返回原始宽和高。
function scale(maxW, maxH, orgW, orgH) {
if (orgW < maxW && orgH < maxH) {
return { w: orgW, h: orgH }
} else if (orgW > maxW && orgH > maxH) {
var sw = orgW / maxW, sh = orgH / maxH;
if (sw > sh) {
return { w: maxW, h: maxH / sw };
} else {
return { w: maxW / sh, h: maxH };
}
} else if (orgW > maxW) {
var sw = orgW / maxW;
return { w: maxW, h: orgH / sw };
} else {
var sh = orgH / maxH;
return { w: orgW/sh, h: maxH };
}
}
(3)给图片赋值宽和高。
var resimg = scale(300, 999999, dimensions.w, dimensions.h);
image.style.width = resimg.w + 'px';
image.style.height = resimg.h + 'px';
这种方法经过测试可行,还未发现不兼容情况,可根据自己的情况调整代码。
以上是主要代码,需要说明的是图片外的容器一定有要个宽度或高度不然都不限了就没有必要使用了,可同时有宽度和高度,也可以有其中一个,另一个不限时可设置成一个大值即可。
评论
15种时间序列预测方法总结(包含多种方法代码实现)
向AI转型的程序员都关注了这个号👇👇👇在这篇文章中,我们将深入探讨时间序列预测的基本概念和方法。我们将首先介绍单元预测和多元预测的概念,然后详细介绍各种深度学习和传统机器学习方法如何应用于时间序列预测,包括循环神经网络(RNN)、一维卷积神经网络(1D-CNN)、Transformer、自回归模型(
机器学习AI算法工程
0
JavaScript 可视化:Promise执行彻底搞懂
深入探讨了 JavaScript 中 Promise 的内部机制,解释了它们如何使异步任务以非阻塞方式执行,并展示了 Promise 的创建、状态变化以及与事件循环的关系。正文从这开始~~JavaScript 中的 Promise 一开始可能会让人感到有些难以理解,但是如果我们能够理解其内部的工作原
高级前端进阶
0
SpringBoot 实现图片防盗链功能
程序员的成长之路互联网/程序员/技术/资料共享 关注阅读本文大概需要 4 分钟。来自:blog.csdn.net/weixin_46157208/article/details/138051737前言出于安全考虑,我们需要后端返回的图片只允许在某个网站内展示,不想被爬虫拿到图片地
程序员的成长之路
0
一站式解决方案:基于 Arthas 实现服务发现和权限控制
来源:juejin.cn/post/7281849496983994383👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接
小哈学Java
0
用 Shader 实现旗帜飘扬动画效果
我觉得对于刚入门 3D 编程的朋友来说,如果能够完成代码创建模型数据->创建材质->编写Shader动画这一系列,想必会有满满的成就感。今天就用 Cocos Creator 的 utils.MeshUtils.createMesh 接口,带大家感受一下这个流程。这个流程不仅可以用于新手学
COCOS
2
JavaScript 可视化:Promise执行彻底搞懂
大厂技术 高级前端 Node进阶点击上方 程序员成长指北,关注公众号回复1,加入高级Node交流群深入探讨了 JavaScript 中 Promise 的内部机制,解释了它们如何使异步任务以非阻塞方式执行,并展示了 Promise 的创建、状态变
程序员成长指北
2
一篇文章带你了解JavaScript作用域
点击上方“前端进阶学习交流”,进行关注回复“前端”即可获赠前端相关学习资料今日鸡汤杨家有女初长成,养在深闺人未识。在JavaScript中,对象和函数也是变量。在JavaScript中,作用域是你可以访问的变量、对象和函数的集合。JavaScript 有函数作用域: 这个作用域在函数内变化。一、本地
前端进阶学习交流
0
SpringBoot+Minio实现上传凭证、分片上传、秒传和断点续传
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。Spring Boot整合Minio后,前端的文件上传有两种方式:1、文件上传到后端,由后端保存到Minio这种方式好处是完全由后端集中管理,可以很好的做到、身份验证、
Java架构师社区
0