移动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 相关文章推荐
javascript 写类方式之一
Jul 05 Javascript
一个cssQuery对象 javascript脚本实现代码
Jul 21 Javascript
jQuery选择头像并实时显示的代码
Jun 27 Javascript
jquery 与NVelocity 产生冲突的解决方法
Jun 13 Javascript
《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型
Feb 27 Javascript
javascript生成随机颜色示例代码
May 05 Javascript
JavaScript学习笔记之数组的增、删、改、查
Mar 23 Javascript
javascirpt实现2个iframe之间传值的方法
Jun 30 Javascript
很棒的js Tab选项卡切换效果
Aug 30 Javascript
JS前向后瞻正则表达式定义与用法示例
Dec 27 Javascript
Vue项目实现简单的权限控制管理功能
Jul 17 Javascript
JS highcharts动态柱状图原理及实现
Oct 16 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编程快速实现数组去重的方法详解
2017/07/22 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
基于jquery的自定义鼠标提示效果 jquery.toolTip
2010/11/14 Javascript
jquery自动将form表单封装成json的具体实现
2014/03/17 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
jQuery选择器全集详解
2014/11/24 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
js导出excel文件的简洁方法(推荐)
2016/11/02 Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
浅谈vue首屏加载优化
2018/06/28 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
ES6 proxy和reflect的使用方法与应用实例分析
2020/02/15 Javascript
Python金融数据可视化汇总
2017/11/17 Python
Python Cookie 读取和保存方法
2018/12/28 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
python等差数列求和公式前 100 项的和实例
2020/02/25 Python
python中return不返回值的问题解析
2020/07/22 Python
Django CBV模型源码运行流程详解
2020/08/17 Python
Python制作数据预测集成工具(值得收藏)
2020/08/21 Python
使用CSS3制作版头动画效果
2020/12/24 HTML / CSS
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
学生发电厂实习自我鉴定
2013/09/22 职场文书
年终考核评语
2014/01/19 职场文书
教师党员公开承诺事项
2014/05/28 职场文书
亲子运动会的活动方案
2014/08/17 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
病人慰问信范文
2015/02/15 职场文书
暂停营业通知
2015/04/25 职场文书
拾金不昧通报表扬范文
2015/05/05 职场文书
少儿励志名言(80句)
2019/08/14 职场文书
关于企业的执行力标语大全
2020/01/06 职场文书
z-index不起作用
2021/03/31 HTML / CSS
php微信小程序解包过程实例详解
2021/03/31 PHP
详解 TypeScript 枚举类型
2021/11/02 Javascript
解决redis批量删除key值的问题
2022/03/23 Redis