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插件FusionCharts绘制2D环饼图效果示例【附demo源码】
Apr 10 jQuery
jQuery、layer实现弹出层的打开、关闭功能
Jun 28 jQuery
jQuery制作全屏宽度固定高度轮播图(实例讲解)
Jul 08 jQuery
基于jQuery的左滑出现删除按钮的示例
Aug 29 jQuery
jquery操作ul的一些操作笔记整理(干货)
Aug 31 jQuery
jQuery EasyUI结合zTree树形结构制作web页面
Sep 01 jQuery
jquery实现搜索框功能实例详解
Jul 23 jQuery
jQuery 操作 HTML 元素和属性的方法
Nov 12 jQuery
jQuery中each和js中forEach的区别分析
Feb 27 jQuery
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
Jun 18 jQuery
jquery-ui 进度条功能示例【测试可用】
Jul 25 jQuery
jQuery 实现DOM元素拖拽交换位置的实例代码
Jul 14 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
转生史莱姆:萌王第一次撸串开心到飞起,哥布塔撸串却神似界王神
2018/11/30 日漫
PHP面向对象程序设计之类常量用法实例
2014/08/20 PHP
php防止站外远程提交表单的方法
2014/10/20 PHP
php jsonp单引号转义
2014/11/23 PHP
php上传文件并存储到mysql数据库的方法
2015/03/16 PHP
PHP7+Nginx的配置与安装教程详解
2016/05/10 PHP
PHP的mysqli_ssl_set()函数讲解
2019/01/23 PHP
总结PHP中初始化空数组的最佳方法
2019/02/13 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
2020/02/07 PHP
添加到收藏夹代码(兼容几乎所有的浏览器)
2007/01/09 Javascript
event对象的方法 兼容多浏览器
2009/06/27 Javascript
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
2011/01/08 Javascript
js confirm()方法的使用方法实例
2013/07/13 Javascript
js中return false(阻止)的用法
2013/08/14 Javascript
JavaScript中Null与Undefined的区别解析
2015/06/30 Javascript
jQuery实现的tab标签切换效果示例
2016/09/05 Javascript
9个让JavaScript调试更简单的Console命令
2016/11/14 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
微信小程序组件传值图示过程详解
2019/07/31 Javascript
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
一个简单的python程序实例(通讯录)
2013/11/29 Python
Python深入学习之上下文管理器
2014/08/31 Python
Python随机生成数模块random使用实例
2015/04/13 Python
详解Python的单元测试
2015/04/28 Python
python复制文件的方法实例详解
2015/05/22 Python
python 安装virtualenv和virtualenvwrapper的方法
2017/01/13 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
2019/04/27 Python
Pytorch 使用不同版本的cuda的方法步骤
2020/04/02 Python
GAP欧盟网上商店:GAP EU
2016/09/13 全球购物
简述安装Slackware Linux系统的过程
2012/01/12 面试题
广告设计应届生求职信
2014/03/01 职场文书
2015年七一建党节演讲稿
2015/03/19 职场文书
行政处罚告知书
2015/07/01 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
OpenCV-Python实现油画效果的实例
2021/06/08 Python
SpringBoot读取Resource下文件的4种方法
2021/07/02 Java/Android