基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解_javascript技巧
调用方式 :ImageView(index,imgData) --index参数 为图片默认显示的索引值,类型 为Number --imaData参数 为图片url数组 ,类型为Array
使用之前要先引入 zepto.js 文件
ImageView.js具体代码如下:
/*
* ImageView v1.0.0
* --基于zepto.js的大图查看
* --调用方法 ImageView(index,imgDada)
* --index 图片默认值显示索引,Number --imgData 图片url数组,Array
* */
var ImageView=(function(window,$){
var _this=$("#slideView"),_ImgData=[],_index=0,_length=0,
_start=[],_org=[],_orgTime=null,
_lastTapDate=null,
_zoom=1,_zoomXY=[0,0],_transX=null,
_advancedSupport = false,
_doubleDistOrg=1,_doubleZoomOrg=1,isDoubleZoom = false,
isSlide=true,isDrag=false,timer=null,
winW=window.innerWidth,winH=window.innerHeight;
/**
* 事件对象 event
*/
var Event={
touchstart:function(e){
e.preventDefault();
if (_advancedSupport && e.touches && e.touches.length >= 2) {
var img = getImg();
$(img).css({"-webkit-transitionDuration": "0ms","transitionDuration": "0ms"});
_doubleZoomOrg = _zoom;
_doubleDistOrg = getDist(e.touches[0].pageX, e.touches[0].pageY, e.touches[1].pageX, e.touches[1].pageY);
isDoubleZoom = true;
return
}
e = e.touches ? e.touches[0] : e;
isDoubleZoom = false;
_start = [e.pageX, e.pageY];
_org = [e.pageX, e.pageY];
_orgTime = Date.now();
_transX = -_index * winW;
if(_zoom!=1){
_zoomXY = _zoomXY || [0, 0];
_orgZoomXY = [_zoomXY[0], _zoomXY[1]];
var img = getImg();
img&&($(img).css({"-webkit-transitionDuration": "0ms","transitionDuration": "0ms"}));
isDrag = true
}else{
_this.find(".pv-inner").css({"-webkit-transitionDuration":"0ms","transitionDuration":"0ms"});
isSlide = true
}
},
touchmove:function(e){
e.preventDefault();
if (_advancedSupport && e.touches && e.touches.length >= 2) {
var newDist = getDist(e.touches[0].pageX, e.touches[0].pageY, e.touches[1].pageX, e.touches[1].pageY);
_zoom = (newDist/_doubleDistOrg) * _doubleZoomOrg
var img = getImg();
$(img).css({"-webkit-transitionDuration": "0ms","transitionDuration": "0ms"});
if (_zoom _zoom = 1;
_zoomXY = [0, 0];
$(img).css({"-webkit-transitionDuration": "200ms","transitionDuration": "200ms"})
} else if (_zoom >getScale(img) * 2){
_zoom = getScale(img) * 2;
}
$(img).css({"-webkit-transform": "scale(" + _zoom + ") translate(" + _zoomXY[0] + "px," + _zoomXY[1] + "px)","transform": "scale(" + _zoom + ") translate(" + _zoomXY[0] + "px," + _zoomXY[1] + "px)"});
return
}
if (isDoubleZoom){
return;
}
e = e.touches ? e.touches[0] : e;
if (_zoom != 1) {
var deltaX = (e.pageX - _start[0]) / _zoom;
var deltaY = (e.pageY - _start[1]) / _zoom;
_start = [e.pageX, e.pageY];
var img = getImg();
var newWidth = img.clientWidth *_zoom,
newHeight = img.clientHeight * _zoom;
var borderX = (newWidth - winW) / 2 / _zoom,
borderY = (newHeight - winH) / 2 / _zoom;
(borderX >= 0)&&(_zoomXY[0] borderX)&&(deltaX /= 3);
(borderY > 0)&&(_zoomXY[1] borderY)&&(deltaY /= 3);
_zoomXY[0] += deltaX;
_zoomXY[1] += deltaY;
(_length == 1 && newWidth (_length == 1 && newHeight $(img).css({"-webkit-transform": "scale(" + _zoom + ") translate(" + _zoomXY[0] +
"px," + _zoomXY[1] + "px)","transform": "scale(" + _zoom + ") translate(" + _zoomXY[0] +
"px," + _zoomXY[1] + "px)"})
}else{
if (!isSlide) return;
var deltaX = e.pageX - _start[0];
(_transX > 0 || _transX _transX = -_index * winW + deltaX;
_this.find(".pv-inner").css({"-webkit-transform":"translate(" + _transX + "px,0px) translateZ(0)"});
}
},
touchend:function(e){
if (isDoubleZoom) {
return;
}
if (_zoom != 1) {
if (!isDrag){return;}
var img = getImg();
var newWidth = img.clientWidth *_zoom,
newHeight = img.clientHeight * _zoom;
var borderX = (newWidth - winW) / 2 / _zoom,
borderY = (newHeight - winH) / 2 / _zoom;
if (_length > 1 && borderX >= 0) {
var updateDelta = 0;
var switchDelta = winW / 6;
if (_zoomXY[0] updateDelta = 1;
}else if (_zoomXY[0] > borderX + switchDelta / _zoom && _index > 0){
updateDelta = -1;
}
if (updateDelta != 0) {
scaleDown(img);
changeIndex(_index + updateDelta);
return
}
}
var delta = Date.now() - _orgTime;
if (delta (delta var deltaDis = Math.pow(180 / delta, 2);
_zoomXY[0] += (_zoomXY[0] - _orgZoomXY[0]) * deltaDis;
_zoomXY[1] += (_zoomXY[1] - _orgZoomXY[1]) * deltaDis;
$(img).css({"-webkit-transition": "400ms cubic-bezier(0.08,0.65,0.79,1)","transition": "400ms cubic-bezier(0.08,0.65,0.79,1)"})
} else{
$(img).css({"-webkit-transition": "200ms linear","transition": "200ms linear"});
}
if (borderX >= 0){
if (_zoomXY[0] _zoomXY[0] = -borderX;
}else if (_zoomXY[0] > borderX){
_zoomXY[0] = borderX;
}
}
if (borderY > 0){
if (_zoomXY[1] _zoomXY[1] = -borderY;
}else if (_zoomXY[1] >borderY){
_zoomXY[1] = borderY;
}
}
if (Math.abs(_zoomXY[0]) $(img).css({"-webkit-transform": "scale(" + _zoom + ") translate(0px," + _zoomXY[1] + "px)","transform": "scale(" + _zoom + ") translate(0px," + _zoomXY[1] + "px)"});
return
} else{
$(img).css({"-webkit-transform": "scale(" + _zoom + ") translate(" + _zoomXY[0] + "px," + _zoomXY[1] + "px)","transform": "scale(" + _zoom + ") translate(" + _zoomXY[0] + "px," + _zoomXY[1] + "px)"});
}
isDrag = false
}else{
if (!isSlide){ return;}
var deltaX = _transX - -_index * winW;
var updateDelta = 0;
if (deltaX > 50){
updateDelta = -1;
}else if(deltaX updateDelta = 1;
}
_index=_index+updateDelta;
changeIndex(_index);
isSlide =false
}
},
click:function(e){
_zoom=1;
_zoomXY=[0,0];
_this.css("opacity","0");
timer=setTimeout(function(){
_this.css({"display":""}).html("");
unbind();
},150)
},
dobelTap:function(e){
clearTimeout(timer);
var now = new Date;
if (now - _lastTapDate return;
}
_lastTapDate = now;
var img = getImg();
if (!img){
return;
}
if (_zoom != 1){
scaleDown(img);
}else{
scaleUp(img);
}
},
setView:function(e){
winW=window.innerWidth;
winH=window.innerHeight;
_this.width(window.innerWidth).height(window.innerHeight);
translate((-_index*window.innerWidth),0,0,$(".pv-inner")[0]);
scaleDown(getImg())
}
};
var handleEvent=function(e){
switch (e.type){
case "touchstart":
Event.touchstart(e);
break;
case "touchmove":
Event.touchmove(e);
break;
case "touchcancel":
case "touchend":
Event.touchend(e);
break;
case "orientationchange":
case "resize":
Event.setView(e);
break
}
};
/**
* 绑定事件
*/
var bind=function(){
_this.on("singleTap",function(e){
e.preventDefault();
var now = new Date;
if (now - _lastTapDate return;
}
_lastTapDate = now;
Event.click(e);
return false;
}).on("doubleTap", function(e) {
e.preventDefault();
Event.dobelTap(e);
return false;
});
_this.on("touchstart touchmove touchend touchcancel", function(e) {
handleEvent(e);
});
Event.setView();
"onorientationchange" in window ? window.addEventListener("orientationchange",Event.setView,false) : window.addEventListener("resize",Event.setView,false);
};
/**
* 解除事件
*/
var unbind= function() {
_this.off();
"onorientationchange" in window ? window.removeEventListener("orientationchange",Event.setView, false) : window.removeEventListener("resize",Event.setView, false)
};
var getDist= function(x1, y1, x2, y2) {
return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2), 2)
}
/**
* 图片缩放
*/
var getScale=function(img) {
var h = img.naturalHeight, w = img.naturalWidth,
Scale=w*h/(img.clientHeight*img.clientWidth);
return Scale;
};
var scaleUp=function(img) {
var scale = getScale(img);
if (scale > 1)
$(img).css({"-webkit-transform": "scale(" + scale + ")","transform": "scale(" + scale + ")","-webkit-transition": "200ms","transition": "200ms"});
_zoom = scale;
};
var scaleDown=function(img) {
_zoom = 1;
_zoomXY = [0, 0];
_doubleDistOrg = 1;
_doubleZoomOrg = 1;
$(img).css({"-webkit-transform": "scale(1)","transform": "scale(1)","-webkit-transition": "200ms","transition": "200ms"});
};
/**
* 滑动效果
* dist
*/
var translate = function( distX,distY,speed,ele) {
if( !!ele ){ ele=ele.style; }else{ return; }
ele.webkitTransitionDuration = ele.MozTransitionDuration = ele.msTransitionDuration = ele.OTransitionDuration = ele.transitionDuration = speed + 'ms';
ele.webkitTransform = 'translate(' + distX + 'px,'+distY+'px)' + 'translateZ(0)';
ele.msTransform = ele.MozTransform = ele.OTransform = 'translateX(' + distX + 'px) translateY(' + distY + 'px)';
};
/**
* 更改索引值 _index
*/
var changeIndex=function(index,force){
if (index index = 0;
}else if(index >= _length){
index =_length - 1;
}
_index = index;
translate((-_index*window.innerWidth),0,force? "0" : "200" ,$(".pv-inner")[0]);
$("#J_index").html(_index+1+"/"+_length);
imgLoad();
}
/**
* 图片获取
*/
var getImg=function(index) {
var img = _this.find("li").eq(index || _index).find("img");
if (img.size() == 1){
return img[0];
}else{
return null
}
}
/**
* 图片加载
*/
var imgLoad=function(){
if($(".pv-img").eq(_index).find("img")[0]){
$("#J_loading").css("display","");
return;
}else{
$("#J_loading").css("display","block");
var tempImg=new Image(),w,h,set;
tempImg.src=_ImgData[_index];
$(".pv-img").eq(_index)[0].appendChild(tempImg);
tempImg.onload=function(){
$("#J_loading").css("display","");
}
}
};
/**
* 创建大图查看Dome结构
*/
var Create=function(){
_this.append("
"+(_index+1)+"/"+_length+"
").append("")for(var i=0;i<_length> $(".pv-inner").append("
}
imgLoad();
};
/**
* 大图查看初始化
*/
var init=function(){
!!_this[0]||$("body").append("");
_this=$("#slideView");
($.os.iphone || $.os.android && parseFloat($.os.version) >= 4)&&(_advancedSupport = true);
}();
/**
* 大图查看返回接口函数
* ImageView(index,data)
* index 初始索引值 nubmer
* data 图片数组 array
*/
var ImageView=function(index,data){
_ImgData=data;
_index=index;
_length=data.length;
//创建dom结构
Create();
//dom结构显示
_this.css("display","block");
//绑定事件
bind();
}
return ImageView;
})(window,Zepto);
ImageView.js用到的css代码如下:
/*大图查看*/
.slide-view {background: #000;position: fixed;width: 100%;height: 100%;overflow: hidden;top: 0;left: 0;z-index: 100;opacity:0;display: none;-webkit-animation:fadeIn .2s linear forwards;animation:fadeIn .2s linear forwards;-webkit-touch-callout: none;-webkit-transform-style: preserve-3d; }
.slide-view .counts {position: absolute;top: 5%;left: 0;right: 0;text-align: center;font-size: 0;-webkit-transform-style: preserve-3d; }
.slide-view .counts .value {border-radius: 9px;line-height: 18px;padding: 0 6px;font-size: 11px;display: inline-block;background-color: rgba(102,102,102,.6);color: #f1f1f1;}
.pv-inner {position: relative;z-index: -1;display: -webkit-box;display: box;width: 100%;height: 100%;-webkit-transition: all 350ms linear;-webkit-backface-visibility: hidden;transition: all 350ms linear;backface-visibility: hidden;-webkit-touch-callout: none;-webkit-transform-style: preserve-3d; }
.pv-inner li {text-align: center;display: -webkit-box;display: box;-webkit-box-align: center;overflow: hidden;width: 100%;height: 100%;-webkit-touch-callout: none;backface-visibility: hidden;-webkit-transform-style: preserve-3d; }
.pv-inner img {max-width: 97%;max-height: 100%;-webkit-transform: scale(1) translate(0px,0px);transform: scale(1) translate(0px,0px);visibility: visible;-webkit-transition: 200ms;transition: 200ms;-webkit-user-select: none;user-select: none;display: block;margin: 0 auto;backface-visibility: hidden;-webkit-transform-style: preserve-3d; }
@-webkit-keyframes fadeIn{
0%{opacity:0;}
100%{opacity:1;}
}
@keyframes fadeIn{
0%{opacity:0;}
100%{opacity:100%;}
}
/*--------------------loading-----------------------*/
.ui-loading {position: absolute;left: 50%;top: 50%;display: none;vertical-align: middle;font: 0/0 arial;margin: -5px 0 0 -10px;}
.ui-loading i {display: inline-block;width: 5px;height: 12px;background: #fff;vertical-align: top;-webkit-animation: loading-spin 1s infinite linear;animation: loading-spin 1s infinite linear;}
.ui-loading i {-webkit-animation: loading-spin 1s infinite linear;animation: loading-spin 1s infinite linear}
.ui-loading i.t2 {margin: 0 3px;-webkit-animation-name: loading-spin-one;animation-name: loading-spin-one}
.ui-loading i.t3 {-webkit-animation-name: loading-spin-two;animation-name: loading-spin-two}
@-webkit-keyframes loading-spin {
0% {opacity: 0}
30% {opacity: 1;-webkit-transform: scale(1,1.2)}
60% {opacity: 0;-webkit-transform: scale(1)}
100% {opacity: 0}
}
@-webkit-keyframes loading-spin-one {
0% {opacity: 0}
20% {opacity: 0}
50% {opacity: 1;-webkit-transform: scale(1,1.2)}
80% {opacity: 0;-webkit-transform: scale(1)}
100% {opacity: 0}
}
@-webkit-keyframes loading-spin-two {
0% {opacity: 0}
40% {opacity: 0}
70% {opacity: 1;-webkit-transform: scale(1,1.2)}
100% {opacity: 0;-webkit-transform: scale(1)}
}
@keyframes loading-spin {
0% {opacity: 0}
30% {opacity: 1;transform: scale(1,1.2)}
60% {opacity: 0;transform: scale(1)}
100% {opacity: 0}
}
@keyframes loading-spin-one {
0% {opacity: 0}
20% {opacity: 0}
50% {opacity: 1;transform: scale(1,1.2)}
80% {opacity: 0;transform: scale(1)}
100% {opacity: 0}
}
@keyframes loading-spin-two {
0% {opacity: 0}
40% {opacity: 0}
70% {opacity: 1;transform: scale(1,1.2)}
100% {opacity: 0;transform: scale(1)}
}
/*--------------------loading-end----------------------*/
ps:代码功能比较简单,可能会存在诸多问题。但也能勉强使用了
下用是使用ImageView.js的一个例子:
<script><br /> ;(function(){<br /> //获取 html 中的图片元素<br /> var aImg=document.querySelectorAll("img"),<br /> aImgSrc=[];<br /> //为图片绑定单击事件<br /> for(var i=0,l=aImg.length;i<l;i++){<br /> aImg[i].index=i;<br /> aImg[i].className+=" conPic";<br /> aImgSrc.push(aImg[i].src);<br /> }<br /> for(var i=0;i<$(".conPic").length;i++){<br /> if($(".conPic")[i].complete){<br /> addTap($(".conPic")[i])<br /> }else{<br /> $(".conPic")[i].onload=function(){<br /> addTap(this);<br /> }<br /> }<br /> }<br /> function addTap(obj){<br /> $(obj).on("tap",function(){<br /> //调用ImageView<br /> ImageView($(obj)[0].index,aImgSrc);<br /> })<br /> }<br /> })();<br /> </script>
以上就是本文的全部内容了,希望大家能够喜欢

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

本文展示了与许可证确保的后端的前端集成,并使用Next.js构建功能性Edtech SaaS应用程序。 前端获取用户权限以控制UI的可见性并确保API要求遵守角色库

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

我使用您的日常技术工具构建了功能性的多租户SaaS应用程序(一个Edtech应用程序),您可以做同样的事情。 首先,什么是多租户SaaS应用程序? 多租户SaaS应用程序可让您从唱歌中为多个客户提供服务
