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源码解读之extend()与工具方法、实例方法详解
Mar 30 jQuery
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
Apr 14 jQuery
jquery将标签元素的高设为屏幕的百分比
Apr 19 jQuery
jQuery实现倒计时功能 jQuery实现计时器功能
Sep 19 jQuery
JS和JQuery实现雪花飘落效果
Nov 30 jQuery
jquery实现楼层滚动效果
Jan 01 jQuery
基于jquery.page.js实现分页效果
Jan 01 jQuery
解决jquery有正确返回值但不执行success函数的问题
Aug 20 jQuery
jQuery插件实现的日历功能示例【附源码下载】
Sep 07 jQuery
jQuery无冲突模式详解
Jan 17 jQuery
jquery实现手风琴案例
May 04 jQuery
jQuery实现简单评论区功能
Oct 26 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正则判断是否为合法身份证号的方法
2017/03/16 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
Prototype Selector对象学习
2009/07/23 Javascript
javascript实现跳转菜单的具体方法
2013/07/05 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
ie8模式下click无反应点击option无反应的解决方法
2014/10/11 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
详解Vue使用命令行搭建单页面应用
2017/05/24 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
2018/11/30 Javascript
详解vue在项目中使用百度地图
2019/03/26 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
如何在Express4.x中愉快地使用async的方法
2020/11/18 Javascript
[02:47]3.19DOTA2发布会 国服成长历程回顾
2014/03/25 DOTA
Python中文编码那些事
2014/06/25 Python
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
python爬取51job中hr的邮箱
2016/05/14 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
Python实现判断并移除列表指定位置元素的方法
2018/04/13 Python
Python利用Django如何写restful api接口详解
2018/06/08 Python
pyqt5的QWebEngineView 使用模板的方法
2018/08/18 Python
Python Series从0开始索引的方法
2018/11/06 Python
使用python 对验证码图片进行降噪处理
2019/12/18 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
2020/02/20 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
css3实例教程 一款纯css3实现的发光屏幕旋转特效
2014/12/07 HTML / CSS
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
经典的毕业生自荐信范文
2014/04/14 职场文书
优秀学生干部个人事迹材料
2014/06/02 职场文书
小学校园文化建设汇报材料
2014/08/19 职场文书
2015年导购员工作总结
2015/04/25 职场文书
工伤调解协议书
2016/03/21 职场文书
JAVA API 实用类 String详解
2021/10/05 Java/Android
pycharm无法安装cv2模块问题
2022/05/20 Python