移动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 相关文章推荐
改进:论坛UBB代码自动插入方式
Dec 22 Javascript
Ext 今日学习总结
Sep 19 Javascript
jQuery表格行换色的三种实现方法
Jun 27 Javascript
Jquery颜色选择器ColorPicker实现代码
Nov 14 Javascript
javascript Event对象详解及使用示例
Nov 22 Javascript
javascript弹出页面回传值的方法
Jan 28 Javascript
原生js调用json方法总结
Feb 22 Javascript
javascript合并两个数组最简单的实现方法
Sep 14 Javascript
JavaScript中0、空字符串、'0'是true还是false的知识点分享
Sep 16 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
Jul 20 Javascript
three.js 如何制作魔方
Jul 31 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
Aug 12 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获取服务器信息的实现代码
2013/02/04 PHP
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
PHP中source #N问题的解决方法
2014/01/27 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
2014/05/06 PHP
WordPress中注册菜单与调用菜单的方法详解
2015/12/18 PHP
PHP微信开发用Cache 解决数据缓存
2016/07/11 PHP
php文件后缀不强制为.php的实操方法
2019/09/18 PHP
asp批量修改记录的代码
2008/06/25 Javascript
用js实现计算加载页面所用的时间
2010/04/02 Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
Jquery Mobile 自定义按钮图标
2015/11/18 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
2016/04/07 Javascript
Bootstrap零基础学习第一课之模板
2016/07/18 Javascript
Javascript从数组中随机取出不同元素的两种方法
2016/09/22 Javascript
基于vue2.0实现简单轮播图
2017/11/27 Javascript
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
Python实现的生成自我描述脚本分享(很有意思的程序)
2014/07/18 Python
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
python3.x实现发送邮件功能
2018/05/22 Python
Django 登陆验证码和中间件的实现
2018/08/17 Python
Python中判断子串存在的性能比较及分析总结
2019/06/23 Python
python selenium循环登陆网站的实现
2019/11/04 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
2020/04/20 Python
详解python命令提示符窗口下如何运行python脚本
2020/09/11 Python
html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
2020/07/20 HTML / CSS
Html5移动端网页端适配(js+rem)
2021/02/03 HTML / CSS
Cult Gaia官网:美国生活方式品牌
2019/08/16 全球购物
程序运行正确, 但退出时却"core dump"了,怎么回事
2014/02/19 面试题
华为python面试题
2016/05/03 面试题
工程概预算专业毕业生求职信
2013/10/04 职场文书
大学生饮食连锁店创业计划书
2014/01/17 职场文书
优秀小学生家长评语
2014/01/30 职场文书
企业宣传策划方案
2014/05/29 职场文书
建设工程授权委托书
2014/09/22 职场文书
CSS3 天气图标动画效果
2021/04/06 HTML / CSS