1. 程式人生 > >移動端圖片的觸屏放大縮小和拖拽事件,touch,js實現的

移動端圖片的觸屏放大縮小和拖拽事件,touch,js實現的

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta content="initial-scale=1.0,maximum-scale=1.0,width=device-width" name="viewport">
        <title>移動端圖片縮放</title>
        <style type="text/css">
            *{
                padding: 0px;
                margin: 0px;
            }
            #play {
                position: fixed;
                left: 0;
                top: 0;
                background: black;
                width: 100%;
                height: 100%;
                overflow: hidden;
                color: #fff;
            }
            #target {
                position: absolute;
                left: 0;
                top: 0;
                right: 0;
                bottom: 0;
                margin: auto;
                width: 100%;
                height: auto;
                /*display: block;*/
            }
        </style>
        <script type="text/javascript" src="js/require.js"></script>
    </head>
    <body>
        <div id="main">
            <div id="play">
                <img id="target" draggable="false" src="http://pic50.nipic.com/file/20141009/18691690_111045114040_2.jpg" />
            </div>
        </div>
        <script src="js/jquery-1.7.2.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="js/touch.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="js/requirejs.min.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            require.config({
                baseUrl:"js",
                paths:{
                    "touch":"touch.min"
                }
            });
          require(["touch"],function(touch){
    
                function zoomImg(opt){
                    if(!opt && typeof opt !="object") throw error("opt is not object");
                    this.box=document.querySelector(opt.box);       //事件監聽框
                    this.tag=this.box.querySelector("img");      //縮放物件
                    this.def={          //預設資料
                        zoom_str:"",
                        move_str:"",
                        min_val:opt.boundary || 20,         //限制
                        x:0,            //prev位置x
                        y:0,                //prev位置y
                        n_x:0,              //now位置x
                        n_y:0,              //now位置y
                        n_scale:0,              //now縮放倍數
                        scale:1,            //prev縮放倍數
                        min_scale:opt.min_scale || 0.5,     //最小縮放倍數
                        max_scale:opt.max_scale || 5        //最大縮放倍數
                    };
                    this.init();
                };
                zoomImg.prototype={         //原型
                    init:function(){            //初始化
                        var a=this;
                        a.setStyle(a.tag,{
                            "transition":"all ease 0.1s"
                        });
                        a.getSize();
                        a.bindFunc();
                    },
                    bindFunc:function(){        //繫結事件
                        var a=this;
                        //阻止預設事件
                        touch.on(a.box, 'touchstart', function(ev) {
                            ev.preventDefault();
                        });
                        //縮放
                        touch.on(a.box, 'pinch', function(ev) {
                            document.querySelector(".js-txt1").innerHTML=ev.scale;
                            var current_scale=ev.scale+(a.def.scale-1);
                            current_scale = current_scale >a.def.max_scale?a.def.max_scale:current_scale;
                            current_scale = current_scale <a.def.min_scale?a.def.min_scale:current_scale;
                            a.setStyle(a.tag,{
                                "transform":a.def.move_str+" scale("+current_scale+")"
                            });
                            a.def.n_scale=current_scale;
                        });
                        touch.on(a.box, 'pinchend',function(ev) {
                            a.def.scale=a.def.n_scale;
                            a.def.zoom_str="scale("+a.def.scale+")";
                        });
                        //拖拽
                        touch.on(a.tag, 'drag', function(ev) {
                            //移動的距離
                            console.log(ev.x+":"+ev.y)
                            //移動之前的位置;
                            console.log('a.def.x'+a.def.x+":a.def.y"+a.def.y)
                            
                            var _x=a.def.x+ev.x;
                            
                            var _y=a.def.y+ev.y;
                            var k=a.def.scale;
                            if(Math.abs(_x/k)>=Math.abs(a.def.limit_x)){
                                _x=_x<0?a.def.limit_x:-a.def.limit_x;
                            }
                            if(Math.abs(_y/k)>=Math.abs(a.def.limit_y)){
                                _y=_y<0?a.def.limit_y:-a.def.limit_y;
                            }
                          // console.log($('#target').offset().left)
                           
                               a.setStyle(a.tag,{
                                "transform":"translate3d("+_x+"px,"+_y+"px,0) "+a.def.zoom_str
                            });
 
                            a.def.n_x=_x;
                            a.def.n_y=_y;
                        });
                        touch.on(a.tag, 'dragend', function(ev) {
                            a.def.x=a.def.n_x;
                            a.def.y=a.def.n_y;
                            a.def.move_str="translate3d("+a.def.x+"px,"+a.def.y+"px,0)";
                        });
                    },
                    getSize:function(){             //獲取資料
                        var a=this;
                        var _src=a.tag.src;
                        var o_img=new Image();
                        a.def.ow=parseInt(a.getStyle(a.tag,"width"));
                        a.def.oh=0;
                        a.def.offset_left=a.tag.offsetLeft;
                        a.def.limit_x=-(a.tag.offsetLeft+a.def.ow)+a.def.min_val;
                        o_img.onload=function(){
                            a.def.oh=parseInt(a.def.ow*this.height/this.width);
                            a.def.limit_y=-(a.tag.offsetTop+a.def.oh)+a.def.min_val;
                        }
                        o_img.src=_src;
                    },
                    getStyle:function(obj,name){                    // 獲取樣式
                        if(obj.currentStyle){
                            return obj.currentStyle[name];
                        }else{
                            return getComputedStyle(obj,false)[name];
                        }
                    },
                    //設定樣式
                    setStyle:function (obj,opt){
                        if(typeof opt !="object") throw error("opt is not object!");
                        for(var key in opt){
                            switch(key){
                                case "transform":
                                    obj.style.webkitTransform=obj.style.mozTransform=obj.style.oTransform=obj.style.msTransform=opt[key];
                                    break;
                                case "transition":
                                    obj.style.webkitTransition=obj.style.mozTransition=obj.style.oTransition=obj.style.msTransition=opt[key];
                                    break;
                                default:
                                    obj.style[key]=opt[key];
                            }
                        }
                    }
                };
                //例項化
                var show_pic=new zoomImg({
                    box:"#play"
                });
            });
        </script>
    </body>
</html>

相關推薦

移動圖片放大縮小事件,touch,js實現

<!DOCTYPE html> <html>     <head>         <meta charset="utf-8">         <meta http-equiv="X-UA-Compatible" co

百度地圖手機點單擊長按事件,解決部分手機(小米手機)地圖單擊事件失效,多點、動依然觸發長按的bug

|| ble apply timeout console dto eat 問題 int /** * Author 嶽曉 * * 對百度地圖的事件擴展,目前擴展了fastclick和longclick, * 解決某些設備click不執行的問題

js實現移動圖片預覽:手勢縮放, 手勢動,雙擊放大...

在屏幕上 turn cit format 基礎上 set 邊距 點擊 點擊事件 前言本文將介紹如何通過js實現移動端圖片預覽,包括圖片的 預覽模式,手勢縮放,手勢拖動,雙擊放大等基本功能;

[jQuery]地圖瀏覽:如何實現圖片放大縮小點選之後的位置居中

HTML程式碼: <!DOCTYPE html> <html> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min

html5移動input file可進行拍照選擇圖片

<input id="fileImage" class="fileImage" type="file"  accept="image/*" capture="camera" size="30"> accept="image/*;capture=camera" 直

Android 在程式碼中設定imageview的大小位置(滿足單方向的放大縮小任意位置的移動

       許久以前,在我還是初中的時候,有過一個當網路小說家的夢想,誰知到如今,卻成一個程式設計師。享受生活,享受現在,做一個寫部落格的程式設計師,也算是了卻當初的半個夢想。                                                

bootstrap響應式相容PC移動圖片無縫滾動效果demo

效果如圖所示: js程式碼部分: /** * Created by Administrator on 2017/9/15. */ (function(){ var firstD

移動圖片壓縮上傳解決方案

長度 繪制圖片 slice ase 但是 choose 100萬 lis 計算 最近做移動端圖片上傳,發現圖片尤其是iPhone拍照的圖片都有2M左右,但是實際上項目中用不到這麽大,於是想到要用js在前臺進行壓縮。 解決方案如下:  【一】獲取圖片數據   先是獲取圖片數據

移動判斷摸的方向

art math starty title pos round document ava 通過 最近做微信端頁面,於是趁周末梳理了下移動端的事件這一塊。 通過判斷手指在屏幕上移動的位置減去手指放在屏幕上時的位置,就可以得出是往什麽方向滑動: <!DOCTYPE ht

box-shadow實現移動(Retina)超細邊框

屬性 png color ice com 移動 .com alt 方法 // box-shadow投影方向 // 上 box-shadow: inset 0px 1px 0px 0px #000; // 右 box-shadow: inset -1px 0px 0p

移動圖片上下居中且按鈕始終保持在圖片底部一定距離

分享 none game 位置 居中 back align rip 適應 最近開發中經常碰到這樣的問題:活動中需要一個彈層,彈層是一張圖片,圖片上有一個按鈕,一般是指向一個鏈接地址的。在手機裏,要求圖片大小尺寸不限,但是要上下左右居中,並且圖片上的按鈕保存在圖片底部一定位置

圖片移動圖片上傳旋轉、壓縮的解決方案

dex adding .com pad 移動 side www shu add 移動端圖片上傳旋轉、壓縮的解決方案 來源 知乎 作者 林鑫 工作上有手機上傳準考證等圖片的功能,這個是非常必要的,作者寫的很全面,就直接記錄這個地址了 還有一篇 文件的上傳、下載

移動--判斷橫豎

on() list change cas spa orien type tno nta (function(){ var supportOrientation = (typeof window.orientation === ‘number‘ && typ

移動適配方案以及rempx之間的轉換

場景 adding 區間 tin 每一個 left ios7 分辨率 user 背景 開發移動端H5頁面 面對不同分辨率的手機 面對不同屏幕尺寸的手機 視覺稿 在前端開發之前,視覺MM會給我們一個psd文件,稱之為視覺稿。 對於移動端開發而言,為了做到頁面高

移動調用手機的攝像頭相冊

系統 一個 video 什麽 移動端 屬性 type=file 記錄 ima input type=file 怎麽樣調取用戶手機照相機 input 有個屬性accept="image/*" 這樣就可以了,同時在網上看到了其他答案,試了下沒啥效果。寫記錄下來 如下: 使用in

移動頁面摸滑動

col tde chang tar post eve start blog default $("body").on("touchstart", function(e) { // 判斷默認行為是否可以被禁用 if (e.cancelable) {

移動彈出層平滑滾動fix定位的沖突

-s 解決 branch sla 3D andro fixed lin 滾動 #branch-list{ overflow: scroll; -webkit-overflow-scrolling: touch;/* ios 平滑滾動*/ overflow-sc

WPF多點放大縮小旋轉

top rotation https csharp 添加 template wpf 轉載 nds 原文:WPF多點觸摸放大縮小旋轉 版權聲明:本文為博主原創文章,需要轉載盡管轉載。 https://blog.csdn.net/z597

移動圖片預覽且可以手勢縮放

首先進入http://photoswipe.com/官網下載photoswipe.js,然後引入default-skin.css,photoswipe.css,photoswipe.min.js,photoswipe-ui-default.min.js四個檔案,但是不知道那個

手機移動視訊全播放(相容Android與iOS)

在做移動端專案時,做個視訊播放是不可避免的,大部分情況下都是點選一個按鈕,視訊全屏播放,下面將對這個情況進行分析與記錄。 html: <video height="100%" id="videoPlay1" playsinline preload="auto" sr