做了一个图片等比缩放的js
芋头 发布在view:8447
 
今天改了一下博客的主题,发现博客主题在ie6下变样了,后来发现是因为某篇文章里的某个图片太大了撑开了容器,导致样式错位,前几天公司需求里也曾遇到过要编写一个等比缩放的东西,后来不了了之,今天就一起解决了它吧. 1.等比缩放? 等比缩放就是一张图片按照比例缩放,而不是按照容器大小去缩放,那样会变形而且变得很丑,例如下面的示例: 这是原图片,大小是200*100: , 如果不按比例缩放成100*100: ,很明显变形了. 我现在要的效果是这样的: 在两边多出两块空白,图片是100*100的,但是里面的内容是没有变形的. 2.OK,还有那些需求? 男人对自己要狠一点,再想想还会有哪些地方用到这个功能吧! 第一个需求就是上面演示的那样,给任意一个图片,给一个缩放后的尺寸,然后完成缩放,外层是一个a标签,以便表现出空白和空间的感觉. 第二个需求是,页面上有很多图片,有大有小,很大的图片会影响美观,这时候规定一个最大的边长值,如果某个图片的最长边大于这个值,那么就缩放这个图片,从而使其不至于影响页面样式的美观. 好了,先这些吧,现在就动手分析原理 3.原理? 图片的等比缩放通常都是后台来完成的,后台完成这项工作可以保持图片的完全不失真和容量的控制,但是难保有不能控制后台的情况,这时候就需要在前台做点手脚了,但是这种处理后的图片虽然形状规则,但是可能会看起来比较不清楚,特别是带字的图片. 这个处理里的所有处理都是在文档加载完后处理的,不必等到图片也下载完.dom加载完的处理方式可以参见某些框架的源码,我的框架里也提供了一个实现. 文档加载完后,我们取页面上要处理的img元素,可以过滤一下这些元素,例如gif图片可以不处理,因为gif一般不会太大,而且gif的处理在ie6下比较麻烦,会引起一系列问题. 然后拿到图片和要缩放到的尺寸之后,我们之后要做的就是获取到图片的大小,可是通过img元素我们获取不到这些值,我们要根据img.src来创建一个new Image().在它的onload事件中才能得到图片的大小,取得图片的大小后,重要的一步来了,我们需要根据这个大小和要缩放到的尺寸来判断怎么缩放,是根据宽来缩放呢,还是根据高来缩放.

//下面判断应该按宽还是高来缩放图片
var scale; if(sizeV.x/sizeV.y>(scale=this.width/this.height)) useW=false;
else useW=true;
//这里是我框架里的方法,用来混合样式到某个元素
M.dom.mixinStyle(img,{width:(useW?sizeV.x:sizeV.y*scale)+"px",
height:(useW?sizeV.x/scale:sizeV.y)+"px"
})

原理就是判断图片的高宽比和要缩放到的尺寸的高宽比的大小,这里说起来比较绕口,大家自己去想,上面的变量useW是表示按照宽度缩放,如果是true 则在定义样式的时候宽度就直接是要缩放的宽度,高度则根据图片的高宽比计算得出,否则相反. 关于在外面套一个a标签来生成空白的问题也很简单,

M.dom.mixinStyle((wrap=document.createElement("a")),{
width:sizeV.x+"px",
height:sizeV.y+"px",
display:"inline-block",
textAlign:"center",
background:"#ddd"
});
if(useW==true) M.dom.mixinStyle((wrap),{
height:sizeV.x/scale+"px",
padding:(sizeV.y-sizeV.x/scale)/2+"px 0px"
});

原理都差不多,根据情况不同生成不同的a标签 之后我们做了一些处理把图片又放回了它原来的位置: 全部代码如下:(里面用了几个我库里的函数,你应该知道的,M框架)

        /**
*这是一个基础方法,可以修改其行为
*通常的使用情形是在页面里 需要限制最大图像的大小,防止页面被撑开,小的图片不处理,大的图片按缩放比缩放,
*这个方法,传入一个缩放的大小,然后判断图片大小,然后根据图片的比例和要缩放到的比例比较 最后做到等比缩放来适应外容器
*使用情形有:1.页面里大图片的缩小处理 2.在一个固定区域里放进各种比例的图片,用js控制他们的大小,然后等比缩放,使宽或者高中的一个适应父容器
*/
imgResize:function(img,sizeV){
//首先判断有没有下一个兄弟元素,如果没有就好办了,如果有则返回的时候insertbefore一下
var next=img.nextSibling;
var imgSrc=img.src;
// if(/.*.gif.*/i.test(imgSrc)) return; //过滤gif图片,gif的处理会引起一些问题,
var img_r=new Image();
var imgSize,useW;
img_r.onload=function(){
this.onload=null;//如果过滤了gif图片,可以去掉这句
imgSize=new M.Vector(this.width,this.height);
//下面判断应该按宽还是高来缩放图片
var scale,wrap;
if(sizeV.x/sizeV.y>(scale=this.width/this.height)) useW=false;
else useW=true;
M.dom.mixinStyle((wrap=document.createElement("a")),{
width:sizeV.x+"px",
height:sizeV.y+"px",
display:"inline-block",
textAlign:"center",
background:"#ddd"
});
if(useW==true) M.dom.mixinStyle((wrap),{
height:sizeV.x/scale+"px",
padding:(sizeV.y-sizeV.x/scale)/2+"px 0px"
});
var p=img.parentNode;
wrap.appendChild(p.removeChild(img));
M.dom.mixinStyle(img,{
width:(useW?sizeV.x:sizeV.y*scale)+"px",
height:(useW?sizeV.x/scale:sizeV.y)+"px"
})
try{
if(next){
// alert("dd");
p.insertBefore(wrap,next);
}else{
p.appendChild(wrap);
}
}catch(e){} }
img_r.src=imgSrc;
}

4.等等? 好像少了一个需求,是的,将超限的图片缩小的需求比上述的需求简单,所以不再重复,无非是从dom里取出来,根据src创建Image,然后onload里调整img大小,然后再塞回去(注意怎么塞才能正好塞回去,我这里分了两种情况,一种是有下一个兄弟节点的,记住这个节点,之后insertBefore即可,没有下一个兄弟节点的,之后appendChild即可) 下面还有个效果demo: demo

 
 
其他有用的链接http://www.divcss5.com/wenji/w632.shtml
http://www.linuxfly.org/post/518/
http://www.111cn.net/cssdiv/css/53349.htm

css实现非等宽图片列表的布局详解

做了一个图片等比缩放的js的更多相关文章

  1. VUE2.0+VUE-Router做一个图片上传预览的组件

    之前发了一篇关于自己看待前端组件化的文章,但是由于学习和实践的业务逻辑差异,所以自己练习的一些demo逻辑比较简单,打算用vue重构现在公司做的项目,所以在一些小的功能页面上使用vue来做的,现在写的 ...

  2. 媳妇儿喜欢玩某音中的动漫特效,那我就用python做一个图片转化软件。

    ​    最近某音上的动漫特效特别火,很多人都玩着动漫肖像,我媳妇儿也不例外.看着她这么喜欢这个特效,我决定做一个图片处理工具,这样媳妇儿的动漫头像就有着落了.编码    为了快速实现我们的目标,我们 ...

  3. css技术之用最高和最宽的限制“max-height和max-width”做图片同比例缩放,达到图片不变形目的,做出批量打印图片功能,页面打印“window.print()”

    一.简介 他们是为流而生的,像width/height这种定死的砖头式布局,min-width/max-width就没有存在的意义 ,min-width/max-width一定是自适应布局或流体布局中 ...

  4. 理解CSS3中的background-size(对响应性图片等比例缩放)

    理解CSS3中的background-size(对响应性图片等比例缩放) 阅读目录 background-size的基本属性 给图片设置固定的宽度和高度的 固定宽度400px和高度200px-使用ba ...

  5. 使用C#进行图片转换格式,缩放,自动旋转,保留exif(转载)

    这几天心血来潮做了一个批量图片缩放,转换格式,并且可以根据exif的信息旋转图片,校正exif信息后保存的小程序.根据配置文件 指定需要的功能. 1 2 3 4 5 6 7 8 9 10 11 12 ...

  6. android 拍照,裁切,上传圆形头像, 图片等比缩放

    最近太忙了,没有空更新博客,其它部分以后再更新: 今天给大家分享的是解决解析图片的出现oom的问题,我们可以用BitmapFactory这里的各种Decode方法,如果图片很小的话,不会出现oom,但 ...

  7. [jquery] 图片热区随图片大小自由缩放

    在图片上直接画出带超级链接热区元素map和area相信大家并不陌生,Dreamweaver等网页制作软件都有直接在图片上绘制带超级链接的热区工具,但是直接绘制的热区是不能随着图片自适应放大和缩小的,现 ...

  8. 记一次产品需求:图片等比缩放和CSS自适应布局16:9

    前言 前阵子,产品跑过来问我现有的模板中没有图片模板,需要添加一个图片模板:然而,他要求图片在展示区最好能够实现随着窗口的变化而自动按图片比例等比缩放,并且居中展示图片.我当时想着,抛开技术实现层面, ...

  9. vue项目中编写一个图片预览的公用组件

    今天产品提出了一个查看影像的功能需求. 在查看单据的列表中,有一列是影像字段,一开始根据单据号调用接口查看是否有图片附件,如果有则弹出一个全屏的弹出层,如果没有给出提示.而且,从列表进入详情之后,附件 ...

随机推荐

  1. Eclipse下运行拷贝的项目,更改项目名后报404

    右键项目->Properties->Web Project Settings 将“Context root”改为你的项目名称

  2. Mac浏览器全屏设置

    在 mac 升级之后,以往点击放大的按钮,现在显示的效果是全屏:

  3. BZOJ 2878: [Noi2012]迷失游乐园( 树形dp )

    一棵树的话直接树形dp(求出往下走和往上走的期望长度). 假如是环套树, 环上的每棵树自己做一遍树形dp, 然后暴力枚举(环上的点<=20)环上每个点跑经过环上的路径就OK了. -------- ...

  4. leetcode Binary Tree Right Side View python

    # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = ...

  5. LeakCanary,检测安卓,java内存泄漏

    官方中文API地址:http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/

  6. head first 设计模式读书笔记 之 策略模式

    作为一个php开发者,深知曾经很多程序员都鄙视php,为什么呢?因为他们认为php的语法是dirty的,并且由于开发者水平参差不齐导致php的代码更加乱上加乱,维护起来简直一坨shit一样.随着php ...

  7. c/c++:内存泄露和野指针的概念

    内存泄漏 用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元.直到程序结束.即所谓内存泄漏.    注意:内存泄漏是指堆内存的泄漏. 简单的说就是申请了一块内存空间,使用 ...

  8. 关于C语言中结构体中的结构体成员导致的字节对齐问题

    关于结构体的字节对齐是什么,就不赘述,再此附上一篇文章,介绍字节对齐:http://www.linuxsong.org/2010/09/c-byte-alignment/ 这里的结构体字节对齐的数据类 ...

  9. c++多线程编程之互斥对象(锁)的使用之----死锁

    一.死锁会在什么情况发生 1.假设有如下代码 mutex;   //代表一个全局互斥对象 void  A() { mutex.lock(); //这里操作共享数据 B();  //这里调用B方法 mu ...

  10. Python的迭代器(iterator)和生成器(constructor)

    一.迭代器(iterator) 1.迭代器的概述 在Python中,for循环可以用于Python中的任何类型,包括列表.元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器 迭代器 ...