移动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实现继承机制之构造函数+原型链混合方式的使用详解
May 07 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
Oct 16 Javascript
浅谈Javascript线程及定时机制
Jul 02 Javascript
javascript学习总结之js使用技巧
Sep 02 Javascript
Javascript数组Array基础介绍
Mar 13 Javascript
js实现上传图片及时预览
May 07 Javascript
React Native中的RefreshContorl下拉刷新使用
Oct 09 Javascript
mpvue跳转页面及注意事项
Aug 03 Javascript
理理Vue细节(推荐)
Apr 16 Javascript
jQuery属性选择器用法实例分析
Jun 28 jQuery
JS控制只能输入数字并且最多允许小数点两位
Nov 24 Javascript
Nest.js环境变量配置与序列化详解
Feb 21 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
新安装的MySQL数据库需要注意的安全知识
2008/07/30 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
详解Yii2 之 生成 URL 的方法
2017/06/16 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(上:事件篇)
2010/03/24 Javascript
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
2011/01/06 Javascript
JS给Textarea文本框添加行号的方法
2015/08/20 Javascript
Bootstrap实现水平排列的表单
2016/07/04 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
jquery 一键复制到剪切板的实例
2017/09/20 jQuery
解决vue router组件状态刷新消失的问题
2018/08/01 Javascript
vue里input根据value改变背景色的实例
2018/09/29 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
使用js和canvas实现时钟效果
2020/09/08 Javascript
[55:16]Mski vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
python使用in操作符时元组和数组的区别分析
2015/05/19 Python
Python中属性和描述符的正确使用
2016/08/23 Python
CentOS中升级Python版本的方法详解
2017/07/10 Python
基于Python组装jmx并调用JMeter实现压力测试
2020/11/03 Python
用HTML5制作烟火效果的教程
2015/05/12 HTML / CSS
Hanky Panky官方网站:内衣和睡衣
2019/07/25 全球购物
美国家庭鞋店:Shoe Sensation
2019/09/27 全球购物
分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题)
2014/07/16 面试题
心碎乌托邦的创业计划书范文
2013/12/26 职场文书
财务会计大学生自我评价
2014/04/09 职场文书
探亲假请假条
2014/04/11 职场文书
股东合作协议书范本
2014/04/14 职场文书
商场开业庆典策划方案
2014/06/02 职场文书
医药销售自我评价200字
2014/09/11 职场文书
2014年幼儿园保育工作总结
2014/12/02 职场文书
企业介绍信范文
2015/01/30 职场文书
2019企业给员工的慰问信
2019/06/24 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书
标准版个人借条怎么写?以及什么是借条?
2019/08/28 职场文书
nginx+lua单机上万并发的实现
2021/05/31 Servers