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树插件zTree使用方法详解
May 02 jQuery
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
May 05 jQuery
jQuery实现拖动效果的实例代码
Jun 25 jQuery
利用jQuery异步上传文件的插件用法详解
Jul 19 jQuery
jQuery Ajax向服务端传递数组参数值的实例代码
Sep 03 jQuery
jquery实现侧边栏左右伸缩效果的示例
Dec 19 jQuery
JQuery选中select组件被选中的值方法
Mar 08 jQuery
jQuery使用bind动态绑定事件无效的处理方法
Dec 11 jQuery
jQuery访问json文件中数据的方法示例
Jan 28 jQuery
jquery实现动态改变css样式的方法分析
May 27 jQuery
jQuery实现动态向上滚动
Dec 21 jQuery
jquery实现图片放大镜效果
Dec 23 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 截取字符串 分别适合GB2312和UTF8编码情况
2009/02/12 PHP
回帖脱衣服的图片实现代码
2014/02/15 PHP
wamp安装后自定义配置的方法
2014/08/23 PHP
php中使用base HTTP验证的方法
2015/04/20 PHP
php实现快速对二维数组某一列进行组装的方法小结
2019/12/04 PHP
文字幻灯片
2006/06/26 Javascript
JavaScript中for..in循环陷阱介绍
2013/11/12 Javascript
在JavaScript中处理字符串之fontcolor()方法的使用
2015/06/08 Javascript
微信小程序 教程之注册页面
2016/10/17 Javascript
angularJS深拷贝详解
2017/03/23 Javascript
使用angular帮你实现拖拽的示例
2017/07/05 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
Vue.js实现tab切换效果
2019/07/24 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
vue实现路由不变的情况下,刷新页面操作示例
2020/02/02 Javascript
js节流防抖应用场景,以及在vue中节流防抖的具体实现操作
2020/09/21 Javascript
基于vuex实现购物车功能
2021/01/10 Vue.js
python中的reduce内建函数使用方法指南
2014/08/31 Python
Python中列表的一些基本操作知识汇总
2015/05/20 Python
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
Python 多线程不加锁分块读取文件的方法
2018/12/11 Python
对Python实现累加函数的方法详解
2019/01/23 Python
python构建指数平滑预测模型示例
2019/11/21 Python
解决django FileFIELD的编码问题
2020/03/30 Python
opencv之颜色过滤只留下图片中的红色区域操作
2020/06/05 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
Python通过yagmail实现发送邮件代码解析
2020/10/27 Python
请说出你所知道的线程同步的方法
2013/04/19 面试题
软件工程师岗位职责
2013/11/16 职场文书
协议书与合同的区别
2014/04/18 职场文书
党的群众路线教育实践活动党员个人剖析材料
2014/10/08 职场文书
超市收银员岗位职责
2015/04/07 职场文书
使用tensorflow 实现反向传播求导
2021/05/26 Python
Python连续赋值需要注意的一些问题
2021/06/03 Python
Java 实现限流器处理Rest接口请求详解流程
2021/11/02 Java/Android