做了一个图片等比缩放的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

时间: 2024-11-07 17:47:05

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

做了一个手表网站,怎么用js改模板

做了一个手表网站,怎么用js改模板,卡地亚手镯love见证爱情对于很多情侣来讲,这对手镯对他意义是特殊的,相信每个情侣都会喜欢带情侣戒指项链,当然这款手镯是完全符合情侣之间的定情物,美好的爱情也需要这款卡地亚手镯love见证,情侣们可以考虑一下它啦!卡地亚手镯love款价格是多少呢?这款象征着美好爱情的手镯情侣们怎么可能不心动呢?当你购买这款手镯给对方的时候,相信他一定会很感动很喜欢哦.手镯一般情况下更多的女性朋友们更加追求的物品,但是男士也有男士手镯,为什么男士也要带手镯呢?这当然是有一定原因

GridView编写的一个图片浏览器

学完GridView,做了一个图片浏览的功能的小组件.什么是GridView呢? GridView(网格视图)是按照行列的方式来显示内容的,一般用于显示图片,图片等内容,比如实现九宫格图,用GridView是首选,也是最简单的. 分析步骤 1.准备好数据源 2.创建一个List集合,用于将图片ID转换为List集合 3.创建适配器 4.绑定GridView和Adapter之间的关联 5.注册事件监听 程序结果图: 代码下载地址:https://github.com/GXS1225/GridVie

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

之前发了一篇关于自己看待前端组件化的文章,但是由于学习和实践的业务逻辑差异,所以自己练习的一些demo逻辑比较简单,打算用vue重构现在公司做的项目,所以在一些小的功能页面上使用vue来做的,现在写的这个是项目中用户反馈功能而来的,收获还是挺多的. 收获:dom操作=>数据操作       router的使用       组件的使用,具体总结放在尾部. 功能:1.上传图片 2.显示缩略图 3.可以删除 4.可以重新选择文件 先上成品图(主要抽取图片这块),自己在家主要做的功能,样式就不计较了.

PHP实例————图片等比例缩放功能

在网站开发的过程中,经常要对一些图片进行一些处理,比如说缩放,裁剪,加水印等等.当然这些功能不仅仅可以用在开发网站的过程中,平时需要对图片做一些处理的时候,把这个功能封装到函数中去,要处理图片的时候,根据自己的要求在函数中添加需要的参数不就搞定了么.虽说这个对于小白来说可能一下子上来就点困难,但是一回生二回熟嘛.好了,进入正题.今天分享一个图像等比例缩放的函数.需要中的同学可以稍作修改,然后自己拿去用,就省的自己写了(大神请无视). 1.首先,了解一下图片缩放中多需要的函数 有不太明白的可以用p

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

在图片上直接画出带超级链接热区元素map和area相信大家并不陌生,Dreamweaver等网页制作软件都有直接在图片上绘制带超级链接的热区工具,但是直接绘制的热区是不能随着图片自适应放大和缩小的,现在很多网页对浏览器分辨率兼容性要求很高,多数都是用的百分比来定义图片的尺寸,希望图片能随着分辨率的不同,显示设备的不同,自适应的显示最佳效果,这种情况下如何定义图片热区的尺寸可以随着图片一起变化呢? 这是我今天遇到的问题,问了百度个把小时也没有找到答案,忽悠人的错误答案也不少.热区的范围和坐标主要是

利用canvas制作图片(可缩放和平移)+相框+文字

前言: 公司一个售前问我能不能用H5做一个手机拍照,给相片添加相框和添加文字上传到服务器的功能,我当时一琢磨觉得可行,就利用空余时间做了一个demo,去掉了拍照和上传,如果以后有机会,会给补上,当然对于开发过webApp的朋友来做到这个很简单.下面来看代码 1,思路 首先我们需要准备素材,一个相框和一个相片,然后我们要思考,只是把他们和并且就可以了吗?答案是否定的,我还需要对照片进行编辑,比如平移和缩放等.还要可以切换相框. 2,如何合并相框和图片? 上面是我的界面,从界面可以看出,我有三张图片

前端学习代码实例-JavaScript 图片等比例缩放裁切详解

本文将通过代码实例详细介绍一下如何实现图片等比例缩放裁切效果. 图片有两种应用方式,一种作为子元素存在,一种是作为背景图片. 在每一种应用方式中,图片的等比例缩放又可以大致分为如下几种情况: (1).确保图片能够填充满元素,超出的部分被裁切或者隐藏. (2).确保图片的长或者宽填充满元素,超出的部分被裁切或者隐藏. 下面通过代码实例分别介绍一下上述列举的中可能,需要的朋友可以做一下参考. 一.作为背景图片: 通过CSS的background-image属性可以设置元素的背景图片效果. 下面就以如

jQuery实现的图片等比例缩放效果

jQuery实现的图片等比例缩放效果:如果一个容器中放一个比容器还要大的图,那就可能就造成布局出现问题,就算是不容器大,有时候也看起来不够美观,这时候就要限制图片的尺寸,当然不能变形,否则就难看了,下面就介绍一下如何使用jQuery实现等比例缩放效果.代码如下: <div id="demo"> <img src="a.jpg" width="800" height="300" alt="图片&quo

IOS基础UI之(三)手写UI和storyboard方式实现图片移动和缩放

手写UI是最早进行UI界面布局的方法,优点是灵活自由,缺点是使代码看起来比较长.平时学习的时候可以多尝试手写ui,这样会更深入熟悉控件.storyboard开发效率相对比较高.实际开发中看情况而定!! 下面用这两种方式分别实现图片移动和缩放. 功能描述: 1. 界面布局 2.点击相应的按钮,对显示的图片移动.缩放. 效果如下:    掌握点: 一:熟悉代码的描述UIButton属性 1.UIButton状态 UIControlStateNormal          // 正常状态 UICont