移动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 相关文章推荐
跟着JQuery API学Jquery 之三 筛选
Apr 09 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
May 07 Javascript
javascript创建数组之联合数组的使用方法示例
Dec 26 Javascript
将数字转换成大写的人民币表达式的js函数
Sep 21 Javascript
jQuery的position()方法详解
Jul 19 Javascript
Javascript动画效果(4)
Oct 11 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
Oct 27 Javascript
Ionic 2 实现列表滑动删除按钮的方法
Jan 22 Javascript
JavaScript Drum Kit 指南(纯 JS 模拟敲鼓效果)
Jul 23 Javascript
微信小程序实现手势滑动卡片效果
Aug 26 Javascript
vue中axios的二次封装实例讲解
Oct 14 Javascript
react+antd 递归实现树状目录操作
Nov 02 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
Netflix将与CLAMP、乙一以及冲方丁等6名知名制作人合伙展开原创动画计划!
2020/03/06 日漫
PHP COOKIE设置为浏览器进程
2009/06/21 PHP
PHP中的Memcache详解
2014/04/05 PHP
PHP实现采集抓取淘宝网单个商品信息
2015/01/08 PHP
php替换字符串中间字符为省略号的方法
2015/05/04 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
2009/11/27 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
Jquery动态添加及删除页面节点元素示例代码
2014/06/16 Javascript
JavaScript forEach()遍历函数使用及介绍
2015/07/08 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
javascript实现滑动解锁功能
2017/03/22 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
vue获取验证码倒计时组件
2019/08/26 Javascript
跟老齐学Python之变量和参数
2014/10/10 Python
在Python的Flask框架中验证注册用户的Email的方法
2015/09/02 Python
剖析Python的Twisted框架的核心特性
2016/05/25 Python
用Python进行简单图像识别(验证码)
2018/01/19 Python
PyCharm鼠标右键不显示Run unittest的解决方法
2018/11/30 Python
Python 3.8新特征之asyncio REPL
2019/05/28 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
pandas中遍历dataframe的每一个元素的实现
2019/10/23 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
几款好用的python工具库(小结)
2020/10/20 Python
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
亿企通软件测试面试题
2012/04/10 面试题
留学自荐信
2013/10/10 职场文书
修理厂厂长岗位职责
2014/01/30 职场文书
酒店端午节促销方案
2014/02/18 职场文书
学习雷锋标语
2014/06/25 职场文书
工作疏忽、懈怠的检讨书
2014/09/11 职场文书
2014年工作总结及2015工作计划
2014/12/12 职场文书
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP
Redis 持久化 RDB 与 AOF的执行过程
2021/11/07 Redis