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 相关文章推荐
一段实时更新的时间代码
Jul 07 Javascript
js获取控件位置以及不同浏览器中的差别介绍
Aug 08 Javascript
Javascript中的call()方法介绍
Mar 15 Javascript
JS采用绝对定位实现回到顶部效果完整实例
Jun 20 Javascript
JS类的定义与使用方法深入探索
Nov 26 Javascript
JavaScript基础之AJAX简单的小demo
Jan 29 Javascript
js清除浏览器缓存的几种方法
Mar 15 Javascript
JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查
Apr 28 Javascript
原生js实现拖拽功能基本思路详解
Apr 18 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
Jun 29 Javascript
JS异步处理的进化史深入讲解
Aug 25 Javascript
通过实例解析jQ Ajax操作相关原理
Sep 23 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 中检查或过滤IP地址的实现代码
2011/11/27 PHP
php链表用法实例分析
2015/07/09 PHP
javascript 按回车键相应按钮提交事件
2009/11/02 Javascript
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
JS判断移动端访问设备并加载对应CSS样式
2014/06/13 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
2015/10/13 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
2016/05/26 Javascript
javascript 判断页面访问方式电脑或者移动端
2016/09/19 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(2)
2017/02/20 Javascript
javascript编程实现栈的方法详解【经典数据结构】
2017/04/11 Javascript
node.js实现的装饰者模式示例
2017/09/06 Javascript
判断滚动条滑到底部触发事件(实例讲解)
2017/11/15 Javascript
vue、react等单页面项目应该这样子部署到服务器
2018/01/03 Javascript
详解node child_process模块学习笔记
2018/01/24 Javascript
使用proxy实现一个更优雅的vue【推荐】
2018/06/19 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
[02:44]DOTA2英雄基础教程 魅惑魔女
2014/01/07 DOTA
[07:54]DOTA2-DPC中国联赛 正赛 iG vs VG 选手采访
2021/03/11 DOTA
利用Python如何生成hash值示例详解
2017/12/20 Python
python简单贪吃蛇开发
2019/01/28 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
使用Python做定时任务及时了解互联网动态
2019/05/15 Python
python 数据提取及拆分的实现代码
2019/08/26 Python
python实现把两个二维array叠加成三维array示例
2019/11/29 Python
python多线程使用方法实例详解
2019/12/30 Python
物流仓管员工作职责
2014/01/06 职场文书
小加工厂管理制度
2014/01/21 职场文书
个人近期表现材料
2014/02/11 职场文书
诚信的演讲稿范文
2014/05/12 职场文书
羽毛球比赛策划方案
2014/06/13 职场文书
银行转正自我鉴定
2014/09/29 职场文书
消防隐患整改通知书
2015/04/22 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
萤火虫之墓观后感
2015/06/05 职场文书