jQuery实现的移动端图片缩放功能组件示例


Posted in jQuery onMay 01, 2020

本文实例讲述了jQuery实现的移动端图片缩放功能组件。分享给大家供大家参考,具体如下:

源码见这里:https://github.com/CaptainLiao/zujian/tree/master/matrix

HTML结构:

<div class="box">
 <img src="d1981a8ba21975314fd2edf9c09447bb.jpg">
 <img src="8e7075a2c6b7fb1e083914db000a70c5.jpg">
 <img src="d1981a8ba21975314fd2edf9c09447bb.jpg">
</div>

JS:

function Matrix($el, options) {
  this.$el = $el;
  this.clientW = $(window).width();
  this.imgLen = 0;
  this.cur_x = 0;
  this.start_x = 0;
  // 差值
  this.m = 0;

  this.params = $.extend({},{plus: 1.1, reduce: .9}, options);
  this.plus = this.params.plus;
  this.reduce = this.params.reduce;
  // 缩放初始值
  this.s = 1;
  this.flag = false;
}

Matrix.prototype.chooseImg = function () {
  var _this = this,
    $wrap = this.$el;
  $wrap.on('click','img' ,function () {
    var mask = $('<div class="fui-mask"></div>'),
      fui_pop = $('<div class="fui-pop"></div>'),
      fui_slider = $('<ul class="fui-slider"></ul>'),
      index,
      $imgs = $wrap.find('img'),
      url = '',
      li = '',
      clientWidth = _this.clientW;

    index = $(this).index();

    $('body').append(mask).append(fui_pop);
    $('.fui-pop').append(fui_slider);

    if($imgs) {
      $imgs.each(function () {
        url = $(this).attr('src');
        li += ' <li class="fui-slider-item" style="width: '+clientWidth+'px"><img src='+url+' alt=""></li>';
        _this.imgLen++;
      });
      $('.fui-slider').append(li)
        .width(_this.imgLen * 100 +'%')
        .css('left', -index * clientWidth +'px');
    }else {
      alert('请选择图片@@');
      return
    }

    _this.touchSlide();
    _this.closeImg();
    _this.scale();
  })
};
Matrix.prototype.closeImg = function () {
  var _this = this;
  $('.fui-slider-item').on('click', function (e) {
    $('.fui-pop, .fui-mask').remove();
    _this.imgLen = 0;
  })
};
Matrix.prototype.touchSlide = function () {
  var _this = this,
    $slider = $('.fui-slider'),
    clientW = this.clientW,
    imgLen = this.imgLen;

  $slider.on('touchstart', '.fui-slider-item', function (e) {
    var index = $(this).index(),
      m = _this.m,
      left = parseInt($slider.css('left'));
    _this.start_x = e.originalEvent.touches[0].clientX;

    if(_this.flag) return;
    _this.flag = true;

    $(this).on('touchmove', function (e) {
      _this.cur_x = e.originalEvent.touches[0].clientX;
      m = _this.cur_x - _this.start_x;
      if(Math.abs(m) > 50) {
        console.log(m);
        console.log(m);
        $slider
          .css('left', left+m+'px')
          .find('.fui-slider-item').css({
          'transform': 'scale(1)',
          'transform-origin': '0% 0%'
        });
      }
    });

    $(this).on('touchend', function (e) {
      _this.flag = false;
      // 每次touchend的时候,将缩放值初始化
      _this.s = 1;

      if(Math.abs(m) < clientW / 3){
        $slider.css('left', left+'px');
        return;
      }

      index = index % imgLen;

      if(index ==0){
        if(m > 0) {
          $slider.css('left', left+'px');
        }else {
          $slider.css('left', left-clientW+'px');
        }
      }else if(index < imgLen-1){
        if(m > 0) {
          $slider.css('left', left+clientW+'px');
        }else {
          $slider.css('left', left-clientW+'px');
        }

      }else{
        if(m < 0) {
          $slider.css('left', left+'px');
        }else {
          $slider.css('left', left+clientW+'px');
        }
      }

    });
  })
};

Matrix.prototype.scale = function() {
  var _this = this;

  $('.fui-slider').on('mousewheel','.fui-slider-item', function(e) {

    var
      oEvent = e.originalEvent,
      p_x = 0,
      p_y = 0,
      delta = oEvent.wheelDelta || -oEvent.delta;

    if(delta > 0) {
      _this.s *= _this.plus;
    }else {
      _this.s *= _this.reduce;
    }
   

    p_x = (oEvent.clientX / $(window).width()) * 100;
    p_y = (oEvent.clientY / $(window).height()) *100 ;

    $(this).css({
      'transform': 'scale('+_this.s+')',
      'transform-origin':p_x+'% '+p_y+'%',
      '-webkit-transform-origin': p_x+'% '+p_y+'%'
    });
  })
};

$.fn.zoom = function (options, cb) {
  var zoom = new Matrix(this, options, cb);
  return zoom.chooseImg();
};

希望本文所述对大家jQuery程序设计有所帮助。

jQuery 相关文章推荐
jquery实现提示语淡入效果
May 05 jQuery
JQuery 获取Dom元素的实例讲解
Jul 08 jQuery
基于jQuery实现的单行公告活动轮播效果
Aug 23 jQuery
jQuery实现的form转json经典示例
Oct 10 jQuery
jQuery简单实现向列表动态添加新元素的方法示例
Dec 25 jQuery
基于jquery的on和click的区别详解
Jan 15 jQuery
详解使用jQuery.i18n.properties实现js国际化
May 04 jQuery
jquery+php后台实现省市区联动功能示例
May 23 jQuery
jQuery提示框插件SweetAlert用法分析
Aug 05 jQuery
jquery分页优化操作实例分析
Aug 23 jQuery
jQuery实现消息弹出框效果
Dec 10 jQuery
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
May 29 jQuery
jQuery实现移动端图片上传预览组件的方法分析
May 01 #jQuery
jQuery实现的上拉刷新功能组件示例
May 01 #jQuery
jQuery实现的解析本地 XML 文档操作示例
Apr 30 #jQuery
jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较实例分析
Apr 30 #jQuery
jQuery实现高度灵活的表单验证功能示例【无UI】
Apr 30 #jQuery
jQuery插件simplePagination的使用方法示例
Apr 28 #jQuery
jquery检测上传文件大小示例
Apr 26 #jQuery
You might like
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
js调用webservice中的方法实现思路及代码
2013/02/25 Javascript
代码获取历史上的今天发生的事
2014/04/11 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
JS实现OCX控件的事件响应示例
2014/09/17 Javascript
jQuery+CSS3实现3D立方体旋转效果
2015/11/10 Javascript
详解Document.Cookie
2015/12/25 Javascript
浅析Javascript ES6新增值比较函数Object.is
2016/08/24 Javascript
Angular2 环境配置详细介绍
2016/09/21 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
javascript作用域链与执行环境详解
2017/03/25 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
2017/08/04 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
2018/11/01 NodeJs
jquery插件实现轮播图效果
2020/10/19 jQuery
python中WSGI是什么,Python应用WSGI详解
2017/11/24 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
python实现简易数码时钟
2021/02/19 Python
Python 分享10个PyCharm技巧
2019/07/13 Python
python join方法使用详解
2019/07/30 Python
Pyside2中嵌入Matplotlib的绘图的实现
2021/02/22 Python
pytorch 实现L2和L1正则化regularization的操作
2021/03/03 Python
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
2014/04/16 HTML / CSS
综合办公室主任职责
2013/12/16 职场文书
咖啡厅创业计划书范本
2014/01/22 职场文书
公司门卫管理制度
2014/02/01 职场文书
幼儿园父亲节活动方案
2014/03/11 职场文书
公务员党员评议表自我鉴定
2014/09/14 职场文书
交通事故代理词范文
2015/05/23 职场文书
php7中停止php-fpm服务的方法详解
2021/05/09 PHP
HTML中的表格元素介绍
2022/02/28 HTML / CSS
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫
Kubernetes关键组件与结构组成介绍
2022/03/31 Servers