移动Web中图片自适应的两种JavaScript解决方法


Posted in Javascript onJune 18, 2015

本文主要说的是Web中图片根据手机屏幕大小自适应居中显示,图片自适应两种常见情况解决方案。开始吧
在做配合手机客户端的Web wap页面时,发现文章对图片显示的需求有两种特别重要的情况,一是对于图集,这种文章只需要左右滑动浏览,最好的体验是让图片缩放显示在屏幕有效范围内,防止图片太大导致用户需要滑动手指移动图片来查看这种费力气的事情,用户体验大大降低。二是图文混排的文章,图片最大宽度不超过屏幕宽度,高度可以auto。这两种情况在项目中很常见。另外,有人说做个图片切割工具,把图片尺寸比例都设定为统一的大小,但即使这样,面对各种大小的移动设备屏幕,也是无法适用一个统一方案就能解决得了的。而且如果需求太多,那服务器上得存多少份不同尺寸的图片呢?显示不太符合实际。

下面是图集类型,需求方要求图片高宽都保持在手机可视视野范围,js代码列在下面:

<script type="text/javascript"> 
$(function(){ 
 
var imglist =document.getElementsByTagName("img"); 
//安卓4.0+等高版本不支持window.screen.width,安卓2.3.3系统支持 
/* 
var _width = window.screen.width; 
var _height = window.screen.height - 20; 
 
var _width = document.body.clientWidth; 
var _height = document.body.clientHeight - 20; 
*/ 
var _width,  
  _height; 
doDraw(); 
 
window.onresize = function(){ 
  doDraw(); 
} 
 
function doDraw(){ 
  _width = window.innerWidth; 
  _height = window.innerHeight - 20; 
  for( var i = 0, len = imglist.length; i < len; i++){ 
    DrawImage(imglist[i],_width,_height); 
  } 
} 
 
function DrawImage(ImgD,_width,_height){  
  var image=new Image();  
  image.src=ImgD.src;  
  image.onload = function(){ 
    if(image.width>30 && image.height>30){  
    
      if(image.width/image.height>= _width/_height){  
        if(image.width>_width){ 
          ImgD.width=_width;  
          ImgD.height=(image.height*_width)/image.width;  
        }else{  
          ImgD.width=image.width;  
          ImgD.height=image.height;  
        }  
      }else{  
        if(image.height>_height){ 
          ImgD.height=_height;  
          ImgD.width=(image.width*_height)/image.height;  
        }else{  
          ImgD.width=image.width;  
          ImgD.height=image.height;  
        }  
      } 
    }   
  } 
 
} 
   
}) 
</script>

注意:测试中发现安卓4.0+的系统对window.screen.width属性支持的不好,很多情况在首次加载时返回的屏幕像素不正确。本人的安卓2.3.3系统测试通过,支持该属性。据说,这是安卓系统的bug,可以通过setTimeout设置延时时间来解决这个问题。不过,这个方法,本人怎么测试都行不通。所以干脆还是另寻高明吧。发现window.innerWidth可以担此重任,没有发现兼容问题,ok。

下面是,第二种情况,图文并茂的文章类型。这时候只对图片宽度和手机宽度适应有要求,对高度不做限制,相对容易些。
改造上面的javascript代码,如下:

<script type="text/javascript"> 
$(function(){ 
var imglist =document.getElementsByTagName("img"); 
//安卓4.0+等高版本不支持window.screen.width,安卓2.3.3系统支持 
var _width; 
doDraw(); 
 
window.onresize = function(){ 
  //捕捉屏幕窗口变化,始终保证图片根据屏幕宽度合理显示 
  doDraw(); 
} 
 
function doDraw(){ 
  _width = window.innerWidth; 
  for( var i = 0, len = imglist.length; i < len; i++){ 
    DrawImage(imglist[i],_width); 
  } 
} 
 
function DrawImage(ImgD,_width){  
  var image=new Image();  
  image.src=ImgD.src;  
  image.onload = function(){ 
    //限制,只对宽高都大于30的图片做显示处理 
    if(image.width>30 && image.height>30){  
      if(image.width>_width){ 
        ImgD.width=_width;  
        ImgD.height=(image.height*_width)/image.width;  
      }else{  
        ImgD.width=image.width;  
        ImgD.height=image.height;  
      }  
 
    }   
  } 
 
} 
   
}) 
</script>

说明:代码中的resize函数,是捕捉屏幕窗口变化,始终保证图片根据屏幕宽度合理显示。当然了,前提是像我的项目一样,文章直接为富文本格式,图片的父级标签已经设定了text-align:center的居中属性。如果你的文章内容是直接调用第三方的,那么你可以在上面的javascript代码中添加相应的处理语句即可。

Javascript 相关文章推荐
fancybox1.3.1 基于Jquery的插件在IE中图片显示问题
Oct 01 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
Aug 29 Javascript
关于js数组去重的问题小结
Jan 24 Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
Mar 05 Javascript
jQuery的观察者模式详解
Dec 22 Javascript
JavaScript 学习笔记之操作符
Jan 14 Javascript
JavaScript 经典实例日常收集整理(常用经典)
Mar 30 Javascript
JQuery异步提交表单与文件上传功能示例
Jan 12 Javascript
js的各种数据类型判断的介绍
Jan 19 Javascript
详解element-ui中form验证杂记
Mar 04 Javascript
微信小程序下拉菜单效果的实例代码
May 14 Javascript
Webpack3+React16代码分割的实现
Mar 03 Javascript
javascript随机显示背景图片的方法
Jun 18 #Javascript
利用JavaScript的AngularJS库制作电子名片的方法
Jun 18 #Javascript
javascript实现根据时间段显示问候语的方法
Jun 18 #Javascript
javascript显示中文日期的方法
Jun 18 #Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
Jun 18 #Javascript
使用AngularJS中的SCE来防止XSS攻击的方法
Jun 18 #Javascript
初步认识JavaScript函数库jQuery
Jun 18 #Javascript
You might like
使用PHP模拟HTTP认证
2006/10/09 PHP
解决php中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
2016/05/19 PHP
在JavaScript中,为什么要尽可能使用局部变量?
2009/04/06 Javascript
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
遨游,飞飞,IE,空中网 浏览器无提示关闭方法
2011/07/11 Javascript
javascript仿php的print_r函数输出json数据
2013/09/13 Javascript
jquery实现多级下拉菜单的实例代码
2013/10/02 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
angularjs实现与服务器交互分享
2014/06/24 Javascript
浅谈JavaScript函数节流
2014/12/09 Javascript
基于JavaScript实现评论框展开和隐藏功能
2017/08/25 Javascript
ES6中Array.includes()函数的用法
2017/09/20 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
vue中使用localstorage来存储页面信息
2017/11/04 Javascript
angular2 组件之间通过service互相传递的实例
2018/09/30 Javascript
JavaScript模板引擎应用场景及实现原理详解
2018/12/14 Javascript
浅谈vue获得后台数据无法显示到table上面的坑
2020/08/13 Javascript
javascript实现时钟动画
2020/12/03 Javascript
Python中使用glob和rmtree删除目录子目录及所有文件的例子
2014/11/21 Python
利用Python如何生成便签图片详解
2018/07/09 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
2019/08/12 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
基于Python爬取爱奇艺资源过程解析
2020/03/02 Python
Python 防止死锁的方法
2020/07/29 Python
Python接口自动化测试框架运行原理及流程
2020/11/30 Python
CSS实现聊天气泡效果
2020/04/26 HTML / CSS
Canvas多边形绘制的实现方法
2019/08/05 HTML / CSS
美国知名的在线旅游服务网站:Priceline
2016/07/23 全球购物
英国天然保健品网站:Simply Supplements
2017/03/22 全球购物
珠宝店促销方案
2014/03/21 职场文书
国家机关领导干部民主生活会对照检查材料思想汇报
2014/09/17 职场文书
借条如何写
2015/05/26 职场文书
煤矿安全生产工作总结
2015/08/13 职场文书
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL