腾讯新闻上用的插件(xw.qq.com)

缩放插件scale.js

(function(window, undefined) {
var document = window.document,
support = {
transform3d: ("WebKitCSSMatrix" in window && "m11" in new WebKitCSSMatrix()),
touch: ("ontouchstart" in window)
}; function getTranslate(x, y) {
var distX = x,
distY = y;
return support.transform3d ? "translate3d(" + distX + "px, " + distY + "px, 0)" : "translate(" + distX + "px, " + distY + "px)";
} function getPage(event, page) {
return support.touch ? event.changedTouches[0][page] : event[page];
} var ImagesZoom = function() {}; ImagesZoom.prototype = {
// 给初始化数据
init: function(param) {
var self = this,
params = param || {}; var imgList = document.querySelectorAll(params.elem + " img"),
zoomMask = document.querySelector(".imgzoom_pack"),
zoomImg = document.querySelector(".imgzoom_pack .imgzoom_img img"),
zoomClose = document.querySelector(".imgzoom_pack .imgzoom_x"),
imgSrc = ""; self.buffMove = 3; //缓冲系数
self.buffScale = 2; //放大系数
self.finger = false; //触摸手指的状态 false:单手指 true:多手指 self._destroy(); zoomClose.addEventListener("click", function() {
zoomMask.style.cssText = "display:none";
zoomImg.src = "";
zoomImg.style.cssText = ""; self._destroy(); document.removeEventListener("touchmove", self.eventStop, false);
}, false); for (var len = imgList.length, i = 0; i < len; i++) {
imgList[i].addEventListener("click", function() {
imgSrc = this.getAttribute("src");
zoomMask.style.cssText = "display:block";
zoomImg.src = imgSrc; zoomImg.onload = function() {
zoomImg.style.cssText = "margin-top:-" + (zoomImg.offsetHeight / 2) + "px"; // 禁止页面滚动
document.addEventListener("touchmove", self.eventStop, false); self.imgBaseWidth = zoomImg.offsetWidth;
self.imgBaseHeight = zoomImg.offsetHeight; self.addEventStart({
wrapX: zoomMask.offsetWidth,
wrapY: zoomMask.offsetHeight,
mapX: zoomImg.width,
mapY: zoomImg.height
});
}
}, false);
}
},
addEventStart: function(param) {
var self = this,
params = param || {}; self.element = document.querySelector(".imgzoom_pack img"); //config set
self.wrapX = params.wrapX || 0; //可视区域宽度
self.wrapY = params.wrapY || 0; //可视区域高度
self.mapX = params.mapX || 0; //地图宽度
self.mapY = params.mapY || 0; //地图高度 self.outDistY = (self.mapY - self.wrapY) / 2; //图片超过一屏的时候有用 self.width = self.mapX - self.wrapX; //地图的宽度减去可视区域的宽度
self.height = self.mapY - self.wrapY; //地图的高度减去可视区域的高度 self.element.addEventListener("touchstart", function(e) {
self._touchstart(e);
}, false);
self.element.addEventListener("touchmove", function(e) {
self._touchmove(e);
}, false);
self.element.addEventListener("touchend", function(e) {
self._touchend(e);
}, false);
},
// 重置坐标数据
_destroy: function() {
this.distX = 0;
this.distY = 0;
this.newX = 0;
this.newY = 0; },
// 更新地图信息
_changeData: function() {
this.mapX = this.element.offsetWidth; //地图宽度
this.mapY = this.element.offsetHeight; //地图高度
// this.outDistY = (this.mapY - this.wrapY)/2; //当图片高度超过屏幕的高度时候。图片是垂直居中的,这时移动有个高度做为缓冲带
this.width = this.mapX - this.wrapX; //地图的宽度减去可视区域的宽度
this.height = this.mapY - this.wrapY; //地图的高度减去可视区域的高度
},
_touchstart: function(e) {
var self = this; self.tapDefault = false;
// self.tapDefaultY = false; e.preventDefault(); var touchTarget = e.targetTouches.length; //获得触控点数 self._changeData(); //重新初始化图片、可视区域数据,由于放大会产生新的计算 if (touchTarget == 1) {
// 获取开始坐标
self.basePageX = getPage(e, "pageX");
self.basePageY = getPage(e, "pageY"); self.finger = false;
} else {
self.finger = true; self.startFingerDist = self.getTouchDist(e).dist;
self.startFingerX = self.getTouchDist(e).x;
self.startFingerY = self.getTouchDist(e).y;
}
/*console.log("pageX: " + getPage(e, "pageX"));
console.log("pageY: " + getPage(e, "pageY"));*/
},
_touchmove: function(e) {
var self = this;
self.tapDefault = true;
e.preventDefault();
e.stopPropagation(); // console.log("event.changedTouches[0].pageY: " + event.changedTouches[0].pageY); var touchTarget = e.targetTouches.length; //获得触控点数 if (touchTarget == 1 && !self.finger) { self._move(e);
} if (touchTarget >= 2) {
self._zoom(e);
}
},
_touchend: function(e) {
var self = this;
console.log(self.tapDefault) if (!self.finger && !self.tapDefault) {
var zoomMask = document.querySelector(".imgzoom_pack"),
zoomImg = document.querySelector(".imgzoom_pack .imgzoom_img img");
zoomMask.style.cssText = "display:none";
zoomImg.src = "";
zoomImg.style.cssText = ""; self._destroy(); document.removeEventListener("touchmove", self.eventStop, false);
return
};
self._changeData(); //重新计算数据
if (self.finger) {
self.distX = -self.imgNewX;
self.distY = -self.imgNewY;
} if (self.distX > 0) {
self.newX = 0;
} else if (self.distX <= 0 && self.distX >= -self.width) {
self.newX = self.distX;
self.newY = self.distY;
} else if (self.distX < -self.width) {
self.newX = -self.width;
} self.reset();
},
_move: function(e) { var self = this,
pageX = getPage(e, "pageX"), //获取移动坐标
pageY = getPage(e, "pageY"); // 禁止默认事件
// e.preventDefault();
// e.stopPropagation(); /*self.tapDefaultX = pageX - self.basePageX;
self.tapDefaultY = pageY - self.basePageY;*/
// 获得移动距离
self.distX = (pageX - self.basePageX) + self.newX;
self.distY = (pageY - self.basePageY) + self.newY; if (self.distX > 0) {
self.moveX = Math.round(self.distX / self.buffMove);
} else if (self.distX <= 0 && self.distX >= -self.width) {
self.moveX = self.distX;
} else if (self.distX < -self.width) {
self.moveX = -self.width + Math.round((self.distX + self.width) / self.buffMove);
}
self.movePos();
self.finger = false;
},
// 图片缩放
_zoom: function(e) {
var self = this;
// e.preventDefault();
// e.stopPropagation(); var nowFingerDist = self.getTouchDist(e).dist, //获得当前长度
ratio = nowFingerDist / self.startFingerDist, //计算缩放比
imgWidth = Math.round(self.mapX * ratio), //计算图片宽度
imgHeight = Math.round(self.mapY * ratio); //计算图片高度 // 计算图片新的坐标
self.imgNewX = Math.round(self.startFingerX * ratio - self.startFingerX - self.newX * ratio);
self.imgNewY = Math.round((self.startFingerY * ratio - self.startFingerY) / 2 - self.newY * ratio); if (imgWidth >= self.imgBaseWidth) {
self.element.style.width = imgWidth + "px";
self.refresh(-self.imgNewX, -self.imgNewY, "0s", "ease");
self.finger = true;
} else {
if (imgWidth < self.imgBaseWidth) {
self.element.style.width = self.imgBaseWidth + "px";
}
} self.finger = true;
},
// 移动坐标
movePos: function() {
var self = this; if (self.height < 0) {
if (self.element.offsetWidth == self.imgBaseWidth) {
self.moveY = Math.round(self.distY / self.buffMove);
// console.log(self.moveY +"111")
} else {
var moveTop = Math.round((self.element.offsetHeight - self.imgBaseHeight) / 2);
self.moveY = -moveTop + Math.round((self.distY + moveTop) / self.buffMove);
// console.log(self.moveY +"222")
}
} else {
var a = Math.round((self.wrapY - self.imgBaseHeight) / 2),
b = self.element.offsetHeight - self.wrapY + Math.round(self.wrapY - self.imgBaseHeight) / 2; if (self.distY >= -a) {
self.moveY = Math.round((self.distY + a) / self.buffMove) - a;
// console.log(self.moveY +"333")
} else if (self.distY <= -b) {
self.moveY = Math.round((self.distY + b) / self.buffMove) - b;
// console.log(self.moveY +"444")
} else {
self.moveY = self.distY;
// console.log(self.moveY +"555")
}
}
self.refresh(self.moveX, self.moveY, "0s", "ease");
},
// 重置数据
reset: function() {
var self = this,
hideTime = ".2s";
if (self.height < 0) {
self.newY = -Math.round(self.element.offsetHeight - self.imgBaseHeight) / 2;
} else {
var a = Math.round((self.wrapY - self.imgBaseHeight) / 2),
b = self.element.offsetHeight - self.wrapY + Math.round(self.wrapY - self.imgBaseHeight) / 2; if (self.distY >= -a) {
self.newY = -a;
} else if (self.distY <= -b) {
self.newY = -b;
} else {
self.newY = self.distY;
}
}
self.refresh(self.newX, self.newY, hideTime, "ease-in-out");
},
// 执行图片移动
refresh: function(x, y, timer, type) {
this.element.style.webkitTransitionProperty = "-webkit-transform";
this.element.style.webkitTransitionDuration = timer;
this.element.style.webkitTransitionTimingFunction = type;
this.element.style.webkitTransform = getTranslate(x, y);
},
// 获取多点触控
getTouchDist: function(e) {
var x1 = 0,
y1 = 0,
x2 = 0,
y2 = 0,
x3 = 0,
y3 = 0,
result = {}; x1 = e.touches[0].pageX;
x2 = e.touches[1].pageX;
y1 = e.touches[0].pageY - document.body.scrollTop;
y2 = e.touches[1].pageY - document.body.scrollTop; if (!x1 || !x2) return; if (x1 <= x2) {
x3 = (x2 - x1) / 2 + x1;
} else {
x3 = (x1 - x2) / 2 + x2;
}
if (y1 <= y2) {
y3 = (y2 - y1) / 2 + y1;
} else {
y3 = (y1 - y2) / 2 + y2;
} result = {
dist: Math.round(Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2))),
x: Math.round(x3),
y: Math.round(y3)
};
return result;
},
eventStop: function(e) {
e.preventDefault();
e.stopPropagation();
}
}; window.ImagesZoom = new ImagesZoom();
})(this);
/* |xGv00|e265149d8101b256799ca6fa116fac35 */

Html代码

<div class="content">
  <img src='图片URL'/>
</div>
<div class="imgzoom_pack" style="display: none;">
<div class="imgzoom_x">X</div>
<div class="imgzoom_img"><img class="pp" src=""></div>
</div>

Css代码

.imgzoom_pack {
width: 100%;
height: 100%;
position: fixed;
top: 0px;
bottom: 0px;
left: 0px;
right: 0px;
background: rgba(0, 0, 0, .7);
} .imgzoom_pack .imgzoom_x {
color: #fff;
height: 30px;
width: 30px;
line-height: 30px;
background: #000;
text-align: center;
position: absolute;
right: 5px;
top: 5px;
z-index:;
cursor: pointer;
} .imgzoom_pack .imgzoom_img {
width: 100%;
height: 100%;
position: absolute;
left:;
top:;
overflow: hidden;
} .imgzoom_pack .imgzoom_img img {
width: 100%;
position: absolute;
top: 50%;
}

用法

$(function () {
$(".content img").on("click", function () {
$(".imgzoom_img>img").attr("src", $(this).attr("src"));
$(".imgzoom_img>img").css("marginTop", "-" + ($(this).height() / 2) + "px");
$(".imgzoom_pack").show(); });
$(".imgzoom_x").on("click", function () {
$(".imgzoom_pack").hide();
$(".imgzoom_img>img").attr("src", "");
}); window.ImagesZoom.init({
"elem": ".content"
})
})

HTML5 图片缩放功能的更多相关文章

  1. iOS开发UI篇—UIScrollView控件实现图片缩放功能

    iOS开发UI篇—UIScrollView控件实现图片缩放功能 一.缩放 1.简单说明: 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScrollView不仅能滚动显示大量内容,还能对 ...

  2. UIScrollView控件实现图片缩放功能

    转发自:http://www.cnblogs.com/wendingding/p/3754268.html 一.缩放 1.简单说明: 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScr ...

  3. iOS UI-UIScrollView控件实现图片缩放功能

    一.缩放 1.简单说明: 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScrollView不仅能滚动显示大量内容,还能对其内容进行缩放处理.也就是说,要完成缩放功能的话,只需要将需要缩 ...

  4. WP8图片缩放功能实现

    最近在学习WP8,想实现WP微信中查看图片时的放大缩小功能. 网上找了两个解决方案: 1 利用GestureListener 这个类在Microsoft.Phone.Controls.Toolkit中 ...

  5. php实现图片缩放功能类

    http://www.poluoluo.com/jzxy/201312/255447.html <?php /** * Images类是一个图片处理类 * @package applicatio ...

  6. Python之图片缩放功能实现

    这几天由于有项目在做,自己的学习部分然后没有很充足的时间,但是这些零碎的时间也是很宝贵的,所以还是继续学我的python,我很喜欢这个语言,因为简洁,开发环境简单,更多的事,功能灰常的强大,所以好多有 ...

  7. iOS开发基础-UIScrollView实现图片缩放

    当用户在 UIScrollView 上使用捏合手势时, UIScrollView 会给 UIScrollViewDelegate 协议发送一条消息,并调用代理的 viewForZoomingInScr ...

  8. 分享10款效果惊艳的HTML5图片特效

    在HTML5的世界里,图片特效都十分绚丽,我们在网站上也分享过很多不错的HTML5图片特效,现在我们精选10款效果惊艳的HTML5图片特效分享给大家. 1.HTML5 3D正方体旋转动画 很酷的3D特 ...

  9. 使用Martix来实现缩放图片的功能

    使用Martix(android.graphics.Matrix)类中的postScale()方法结合Bitmap来实现缩放图片的功能 Bitmap bmp = BitmapFactory.decod ...

随机推荐

  1. 用EF访问Centos下的MySQL

    环境 : MySQL 5.6.21 64位 CentOS 6.5 64位 VMware 10 Navicat for MySQL 11 VS2013 1.首先搭建centos 的MySQL开发环境 : ...

  2. JAVA之直接内存(DirectMemory)

    Baisics: JAVA NIO使用,基于通道和缓冲区的IO方式,使用Native函数库直接分配堆外内存(allocateDirect),然后通过一个Java堆中的DirectByteBuffer对 ...

  3. Xstream学习资料

    java中有关xml操作的,我们项目中首推Xstream.至于原因不说了.跟着大众的脚步走应该没错的.有关Xstream的文档如下. 官方文档 XStream完美转换XML.JSON XStream实 ...

  4. Linux 负载监控脚本

    #!/bin/bash Date=`echo $(date +%Y\-%m\-%d\ %H:%M:%S)`HostName=`hostname`IP=`ifconfig eth0 | grep &qu ...

  5. 第一次在Django上编写静态网页

    新建一个Python Django工程: Win+R进入cmd命令界面,并cd到指定工程目录下,比如我的工程目录是E:\wamp\Apache24\www\ 输入E: 跳转E盘 输入cd wamp\A ...

  6. BI商务智能对于企业的意义

    BI商务智能之所以越来越重要,是因为无知是现代企业的最大威胁.不知不觉的风险是巨大的,而一知半解可能比一无所知危害更大,因为我们会带着错误的念头做出决定和采取行动,同时还自鸣得意地认为自己是真理的化身 ...

  7. Neutron 理解 (3): Open vSwitch + GRE/VxLAN 组网 [Netruon Open vSwitch + GRE/VxLAN Virutal Network]

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  8. 微信公共号的PHP开发(基础篇)——玩一下

    最近没事儿开了个微信号,写点东西给家人啊什么的看,你们想看的话就这个嘛: 然后就意外的看到imooc上的微信公众号开发相关了.每天科研的累累的,做点这个不是很累的东西吧. 微信公共号开发 一.基础 1 ...

  9. 【2016-11-13】【坚持学习】【Day25】【Oracle 查询某一字段最大值】

    partition 分组order by 以哪一个字段排序 select n.* ,row_number()over(partition by n.type order by n.createtime ...

  10. 【2016-11-6】【坚持学习】【Day21】【子窗口关闭时,同步关闭它的主窗口(方法二)】

    根据上文,在子窗口设置一个委托.然后在子窗口关闭事件,执行委托实例,然后在主窗口增加监听委托的方法.... 想想,本事关闭事件就是一个特殊的委托.那么干嘛还要特意去声明一个新的呢?多此一举. 于是有下 ...