Javascript获取图片原始宽度和高度的方法详解


Posted in Javascript onSeptember 20, 2016

前言

网上关于利用Javascript获取图片原始宽度和高度的方法有很多,本文将再次给大家谈谈这个问题,或许会对一些人能有所帮助。

方法详解

页面中的img元素,想要获取它的原始尺寸,以宽度为例,可能首先想到的是元素的innerWidth属性,或者jQuery中的width()方法。

如下:

<img id="img" src="1.jpg">

<script type="text/javascript">
 var img = document.getElementById("img");
 console.log(img.innerWidth); // 600
</script>

这样貌似可以拿到图片的尺寸。

但是如果给img元素增加了width属性,比如图片实际宽度是600,设置了width为400。这时候innerWidth为400,而不是600。显然,用innerWidth获取图片原始尺寸是不靠谱的。

这是因为 innerWidth属性获取的是元素盒模型的实际渲染的宽度,而不是图片的原始宽度。

<img id="img" src="1.jpg" width="400">

<script type="text/javascript">
 var img = document.getElementById("img");
 console.log(img.innerWidth); // 400
</script>

jQuery的width()方法在底层调用的是innerWidth属性,所以width()方法获取的宽度也不是图片的原始宽度。

那么该怎么获取img元素的原始宽度呢?

naturalWidth / naturalHeight

HTML5提供了一个新属性naturalWidth/naturalHeight可以直接获取图片的原始宽高。这两个属性在Firefox/Chrome/Safari/Opera及IE9里已经实现。

如下:

var naturalWidth = document.getElementById('img').naturalWidth,
 naturalHeight = document.getElementById('img').naturalHeight;

naturalWidth / naturalHeight在各大浏览器中的兼容性如下:

Javascript获取图片原始宽度和高度的方法详解

图片截取自http://caniuse.com/#search=naturalWidth

所以,如果不考虑兼容至IE8的,可以放心使用naturalWidth / naturalHeight属性了。

IE7/8中的兼容性实现:

在IE8及以前版本的浏览器并不支持naturalWidth和naturalHeight属性。

在IE7/8中,我们可以采用new Image()的方式来获取图片的原始尺寸,如下:

function getNaturalSize (Domlement) {
 var img = new Image();
 img.src = DomElement.src;
 return {
  width: img.width,
  height: img.height
 };
}

// 使用
var natural = getNaturalSize (document.getElementById('img')),
 natureWidth = natural.width,
 natureHeight = natural.height;

IE7+浏览器都能兼容的函数封装:

function getNaturalSize (Domlement) {
 var natureSize = {};
 if(window.naturalWidth && window.naturalHeight) {
  natureSize.width = Domlement.naturalWidth;
  natureSizeheight = Domlement.naturalHeight;
 } else {
  var img = new Image();
  img.src = DomElement.src;
  natureSize.width = img.width;
  natureSizeheight = img.height;
 }
 return natureSize;
}

// 使用
var natural = getNaturalSize (document.getElementById('img')),
 natureWidth = natural.width,
 natureHeight = natural.height;

总结

以上就是这篇文章的全部内容,希望能对大家的学习或者工作带来一定的帮助。如果有疑问大家可以留言交流。

Javascript 相关文章推荐
javascript new fun的执行过程
Aug 05 Javascript
iframe 异步加载技术及性能分析
Jul 19 Javascript
Notify - 基于jquery的消息通知插件
Oct 18 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
Feb 28 Javascript
从零学jquery之如何使用回调函数
May 16 Javascript
js设置控件的隐藏与显示的两种方法
Aug 21 Javascript
分享有关jQuery中animate、slide、fade等动画的连续触发、滞后反复执行的bug
Jan 10 Javascript
JS hashMap实例详解
May 26 Javascript
Vue组件之Tooltip的示例代码
Oct 18 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
Jul 08 Javascript
微信小程序左右滚动公告栏效果代码实例
Sep 16 Javascript
用javascript实现倒计时效果
Feb 09 Javascript
AngularJS 过滤器(自带和自建)详解
Sep 19 #Javascript
js Canvas实现圆形时钟教程
Sep 19 #Javascript
Bootstrap模态框调用功能实现方法
Sep 19 #Javascript
javascript实现的上下无缝滚动效果
Sep 19 #Javascript
Angular ng-class详解及实例代码
Sep 19 #Javascript
javascript实现的左右无缝滚动效果
Sep 19 #Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
Sep 19 #Javascript
You might like
php 调用远程url的六种方法小结
2009/11/02 PHP
ThinkPHP之M方法实例详解
2014/06/20 PHP
Javascript与PHP验证用户输入URL地址是否正确
2014/10/09 PHP
jquery下checked取值问题的解决方法
2012/08/09 Javascript
ie8本地图片上传预览示例代码
2014/01/12 Javascript
jQuery基础知识点总结(DOM操作)
2016/06/01 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
2016/08/03 Javascript
JS判断浏览器是否安装flash插件的简单方法
2016/09/13 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
原生js实现form表单序列化的方法
2018/08/02 Javascript
vue-cli webpack 引入swiper的操作方法
2018/09/15 Javascript
Vue拖拽组件列表实现动态页面配置功能
2019/06/17 Javascript
Layui tree 下拉菜单树的实例代码
2019/09/21 Javascript
[02:57]2014DOTA2国际邀请赛-观众采访
2014/07/19 DOTA
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
Python抓取淘宝下拉框关键词的方法
2015/07/08 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
Python数据结构之栈、队列的实现代码分享
2017/12/04 Python
matplotlib绘图实例演示标记路径
2018/01/23 Python
python实现扫描局域网指定网段ip的方法
2019/04/16 Python
Python分布式进程中你会遇到的问题解析
2019/05/28 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
2019/08/24 Python
在django中自定义字段Field详解
2019/12/03 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
Python使用requests模块爬取百度翻译
2020/08/25 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
加拿大领先的时尚和体育零售商:Sporting Life
2019/12/15 全球购物
存储过程和函数的区别
2013/05/28 面试题
毕业生欢送会主持词
2014/03/31 职场文书
关于颐和园的导游词
2015/01/30 职场文书
员工加薪申请报告
2015/05/15 职场文书
运动会通讯稿50字
2015/07/20 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python