移动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 相关文章推荐
ext jquery 简单比较
Apr 07 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
Oct 13 Javascript
页面载入结束自动调用js函数示例
Sep 23 Javascript
JS小功能(checkbox实现全选和全取消)实例代码
Nov 28 Javascript
如何用jQuery实现ASP.NET GridView折叠伸展效果
Sep 26 Javascript
基于vue.js实现图片轮播效果
Dec 01 Javascript
javascript简单写的判断电话号码实例
May 24 Javascript
JavaScript正则表达式和级联效果
Sep 14 Javascript
Django+vue跨域问题解决的详细步骤
Jan 20 Javascript
javascript关于“时间”的一次探索
Jul 24 Javascript
详解Vue Cli浏览器兼容性实践
Jun 08 Javascript
Vue自定义多选组件使用详解
Sep 08 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
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
php实现encode64编码类实例
2015/03/24 PHP
php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法
2015/05/25 PHP
PHP之图片上传类实例代码(加了缩略图)
2016/06/30 PHP
thinkphp中的url跳转用法分析
2016/07/12 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
thinkphp项目如何自定义微信分享描述内容
2017/02/20 PHP
PHP实现正则匹配所有括号中的内容
2018/06/22 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
2019/09/16 PHP
Javascript实现的鼠标经过时播放声音
2010/05/18 Javascript
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
23个Javascript弹出窗口特效整理
2011/02/25 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
jQuery和JavaScript节点插入元素的方法对比
2016/11/18 Javascript
详解vue表单验证组件 v-verify-plugin
2017/04/19 Javascript
js实现扫雷小程序的示例代码
2017/09/27 Javascript
详解Vue底部导航栏组件
2019/05/02 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
详解Python中的多线程编程
2015/04/09 Python
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
Python简单实现Base64编码和解码的方法
2017/04/29 Python
基于python3 类的属性、方法、封装、继承实例讲解
2017/09/19 Python
Python 实现「食行生鲜」签到领积分功能
2018/09/26 Python
python实现彩色图转换成灰度图
2019/01/15 Python
基于python全局设置id 自动化测试元素定位过程解析
2019/09/04 Python
pytorch 实现tensor与numpy数组转换
2019/12/27 Python
Tensorflow实现将标签变为one-hot形式
2020/05/22 Python
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
阿迪达斯奥地利官方商城:adidas.at
2016/10/16 全球购物
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
财务出纳岗位职责
2014/02/03 职场文书
中学生打架检讨书
2014/02/10 职场文书
六五普法先进个人主要事迹材料
2015/11/03 职场文书
班委竞选稿范文
2015/11/21 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python