先引入CSS

结构部分

data-option="{ "width": 200, "height": 180}" >

确认

取消

JS

var fileImg = "";

$(function () {

$(".imgCutConfirm").bind("click", function () {

$(".containerDiv").hide();

$(".imgEdit").hide();

$(".getCroppedCanvasModal").modal("hide");

})

})

//提交表达

function submitForm() {

$(".registerForm").attr("enctype", "multipart/form-data");

var formData = new FormData($(".registerForm")[0]);

formData.append("imgBase64", encodeURIComponent(fileImg));//

formData.append("fileFileName", "photo.jpg");

$.ajax({

url: "",

type: 'POST',

data: formData,

timeout: 10000, //超时时间设置,单位毫秒

async: true,

cache: false,

contentType: false,

processData: false,

success: function (result) {

},

error: function (returndata) {

Alert.closedLoading();

}

});

}

myCrop.css

/* Basic */

body {

margin: 0;

overflow-x: hidden;

}

.browserupgrade {

margin: 0;

padding: .5em 1em;

background-color: #fcfcfc;

text-align: center;

}

/* Header */

.docs-header {

margin-bottom: 0;

}

.navbar-toggle:hover,

.navbar-toggle:focus {

border-color: #0074d9;

}

.navbar-toggle .icon-bar {

background-color: #0074d9;

}

/* Jumbotron */

.docs-jumbotron {

background-color: #0074d9;

color: #fff;

}

.docs-jumbotron .version {

font-size: 14px;

color: #fff;

filter: alpha(opacity=50);

opacity: 0.5;

}

/* Content */

.img-container,

.img-preview {

background-color: #f7f7f7;

width: 100%;

text-align: center;

}

.img-container {

min-height: 200px;

max-height: 516px;

}

.img-container > img {

max-width: 100%;

}

.docs-preview {

margin-right: -15px;

}

.img-preview {

float: left;

margin-right: 10px;

margin-bottom: 10px;

overflow: hidden;

}

.img-preview > img {

max-width: 100%;

}

.preview-lg {

width: 263px;

height: 148px;

}

.preview-md {

width: 139px;

height: 78px;

}

.preview-sm {

width: 69px;

height: 39px;

}

.preview-xs {

width: 35px;

height: 20px;

margin-right: 0;

}

.docs-data > .input-group {

margin-bottom: 10px;

}

.docs-data > .input-group > label {

min-width: 80px;

}

.docs-data > .input-group > span {

min-width: 50px;

}

.docs-buttons{

text-align: center;

}

.docs-buttons > .btn,

.docs-buttons > .btn-group,

.docs-buttons > .form-control {

margin-right: 5px;

}

.docs-toggles > .btn,

.docs-toggles > .btn-group,

.docs-toggles > .dropdown {

margin-bottom: 10px;

}

.docs-tooltip {

display: block;

}

.docs-tooltip > .icon {

margin: 0 -3px;

vertical-align: top;

}

.tooltip-inner {

white-space: normal;

}

.btn-upload .tooltip-inner {

white-space: nowrap;

}

.docs-options .dropdown-menu {

width: 100%;

}

.docs-options .dropdown-menu > li {

padding: 3px 20px;

}

.docs-options .dropdown-menu > li:hover {

background-color: #f7f7f7;

}

.docs-options .dropdown-menu > li > label {

display: block;

}

myCrop.js

window.onload = function() {

('use strict');

var Cropper = window.Cropper;

var URL = window.URL || window.webkitURL;

var container = document.querySelector('.img-container');

var image = container.getElementsByTagName('img').item(0);

var actions = document.querySelector('.actions');

var screenWidth = $(window).width();

var screenHeight = $(window).height();

var inputImage = document.querySelector('.inputImage');

var dataArea;//dataArea里面width、height是裁剪框的尺寸

dataArea = {

area: inputImage.getAttribute('data-area') || undefined,

};

var cropArea = dataArea.area;

cropArea = cropArea.replace(/"/g, '').replace(/\s*/g, '');//去除""和空格

var areaObj = {};//将width、height转换成对象

var arr = cropArea.split(',');

for (var i = 0; i < arr.length; i++) {

var kv = arr[i].split(':');

if (areaObj[kv[0]]) {

areaObj[kv[0]] += ',' + kv[1];

} else {

areaObj[kv[0]] = kv[1];

}

}

var options = {

minContainerHeight: screenHeight,

minContainerWidth: screenWidth,

aspectRatio: areaObj.width / areaObj.height,//根据页面中dataArea里面width、height设置裁剪框比例

viewMode: 3, //显示

guides: false, //裁剪框虚线 默认true有

dragMode: 'move',

autoCropArea: 0.8, //自动裁剪面积大小(百分比)和图片进行对比

ready: function(e) {

$('.containerDiv').show();

$('.imgEdit').show();

},

background: true, // 容器是否显示网格背景

movable: true, //是否能移动图片

cropBoxMovable: true, //是否允许拖动裁剪框

cropBoxResizable: false, //是否允许拖动 改变裁剪框大小

toggleDragModeOnDblclick: false, //定义当点击两次时可以在“crop”和“move”之间切换拖拽模式

};

console.log(options.aspectRatio);

console.log(options.autoCropArea);

var cropper = new Cropper(image, options);

var originalImageURL = image.src;

var uploadedImageType = 'image/jpeg';

var uploadedImageName = 'cropped.jpg';

var uploadedImageURL;

// // Buttons

if (!document.createElement('canvas').getContext) {

$('button[data-method="getCroppedCanvas"]').prop('disabled', true);

}

if (typeof document.createElement('cropper').style.transition === 'undefined') {

$('button[data-method="scale"]').prop('disabled', true);

}

// Methods

actions.querySelector('.docs-buttons').onclick = function(event) {

var e = event || window.event;

var target = e.target || e.srcElement;

var cropped;

var result;

var input;

var data;

if (!cropper) {

return;

}

while (target !== this) {

if (target.getAttribute('data-method')) {

break;

}

target = target.parentNode;

}

if (target === this || target.disabled || target.className.indexOf('disabled') > -1) {

return;

}

data = {

method: target.getAttribute('data-method'),

option: target.getAttribute('data-option') || undefined,

secondOption: target.getAttribute('data-second-option') || undefined,

};

// cropped = cropper.cropped;

if (data.method) {

switch (data.method) {

// case 'rotate':

// if (cropped && options.viewMode > 0) {

// cropper.clear();

// }

// break;

case 'getCroppedCanvas':

try {

data.option = JSON.parse(data.option);

} catch (e) {

console.log(e.message);

}

if (uploadedImageType === 'image/jpeg') {

if (!data.option) {

data.option = {};

}

data.option.fillColor = '#fff';

}

break;

}

result = cropper[data.method](data.option, data.secondOption);

switch (data.method) {

case 'rotate':

if (cropped && options.viewMode > 0) {

cropper.crop();

}

break;

case 'scaleX':

case 'scaleY':

target.setAttribute('data-option', -data.option);

break;

case 'getCroppedCanvas':

if (result) {

fileImg = result.toDataURL('image/jpg');

$('.showImg')

.attr('src', fileImg)

.show();

}

break;

case 'destroy':

$('.inputImage').val('');

$('.containerDiv').hide();

$('.imgEdit').hide();

break;

}

if (typeof result === 'object' && result !== cropper && input) {

try {

input.value = JSON.stringify(result);

} catch (e) {

console.log(e.message);

}

}

}

};

document.body.onkeydown = function(event) {

var e = event || window.event;

if (e.target !== this || !cropper || this.scrollTop > 300) {

return;

}

};

// Import image

var inputImage = document.querySelector('.inputImage');

if (URL) {

inputImage.onchange = function() {

var files = this.files;

var file;

if (cropper && files && files.length) {

file = files[0];

if (/^image\/\w+/.test(file.type)) {

uploadedImageType = file.type;

uploadedImageName = file.name;

if (uploadedImageURL) {

URL.revokeObjectURL(uploadedImageURL);

}

image.src = uploadedImageURL = URL.createObjectURL(file);

cropper.destroy();

cropper = new Cropper(image, options);

inputImage.value = null;

} else {

window.alert('Please choose an image file.');

}

}

};

} else {

inputImage.disabled = true;

inputImage.parentNode.className += ' disabled';

}

};

我们项目用裁剪的地方比较多,所以做了一些更改,可以在HTML通过data-area中定义裁剪框比例

至于坑,感觉裁剪生成的图片比较模糊,没有官方文档清晰,应该是canvas绘图在高清屏显示问题,对canvas暂时还没有研究,等后面学习了再来填坑

cropper左右移动_移动端cropper.js上传图片、裁剪相关推荐

  1. java获取移动端定位_移动端报表JS开发示例--获取定位

    上次分享了移动端报表JS开发的系统概念,后来我又回去摸索了一些案例.之前接触到的FineReport的APP客户端可以用来打卡签到,就好奇研究了以下,这次就来聊一聊报表移动端开发如何实现定位功能. 1 ...

  2. cropper.js 实现裁剪图片并上传(PC端)

    博客地址:http://blog.mambaxin.com 由于之前做项目的时候有需求是需要实现裁剪图片来做头像并上传到服务器,所以上网查询了很多资料,也试用了许多案例,发现cropper插件裁剪是比 ...

  3. sortable 拖拽时互换目标的位置_双端通用型JS拖拽插件的封装与应用

    最近工作中遇到一个需求,需要将一个元素从某位置拖动到另一固定位置后执行某一交互行为,具体效果如下: 这个看似简单的需求,然而实现起来却并不那么顺利.我首先想到的是如何通过哪个现有的插件来快速解决这个问 ...

  4. jquery实现截取pc图片_Cropper.js 实现裁剪图片并上传(PC端)

    由于之前做项目的时候有需求是需要实现裁剪图片来做头像并上传到服务器,所以上网查询了很多资料,也试用了许多案例,发现cropper插件裁剪是比较完善的,所以结合之前的使用情况,编写了此案例.本案例是参考 ...

  5. 移动端报表JS开发示例--获取定位

    上次分享了移动端报表JS开发的系统概念,后来我又回去摸索了一些案例.之前接触到的FineReport的APP客户端可以用来打卡签到,就好奇研究了以下,这次就来聊一聊报表移动端开发如何实现定位功能. 1 ...

  6. 在线考试系统_管理员端

    专题习作_在线考试系统_管理员端 作者:力争上游_韩元欣 登录页面 登录页面包括校验管理号与密码以及页面记住密码功能. 校验账号与密码 用户输入正确的账号和密码即可以登录. 用户输入账号和密码并点击登 ...

  7. python机票_某哪儿机票JS解密(3)--python调用node产生正确的航线和pre

    终于,历经了2-3个星期,破解了所有去哪儿下单所要的数据.从一开始的pre,_m_,不确定的header 和 key ,value.还有个后面因为我用了模拟浏览器过滑动验证码而没用到的faver请求! ...

  8. oracle11g服务器端下载,安装_oracle11G_客户端_服务端_链接_oracle

    在开始之前呢,有一些注细节需要注意,oracle11G_客户端_和_服务端, 分为两种   一种是  开发者使用    一种是  BDA  自己使用(同时也需要根据自己 PC 的系统来做_win7_与 ...

  9. php7 mysql json 小程序_微信小程序 JS+PHP+MYSQL 怎么获取JSON数据并显示

    很简单的想实现这个功能 描述一下微信小程序端用JS发出请求,用的微信自带的wx.request checkBoilerCode:function(e){ if (e.detail.value.boil ...

最新文章

  1. (连续)周期信号的傅里叶级数(FS)
  2. 蓄力十年,做一个成就
  3. Android Studio vs Eclipse:你需要知道的那些事
  4. 设置网络映射后,电脑重启后自动重连
  5. Day14:使用斯坦福 NER 软件包实现你自己的命名实体识别器
  6. mybatis的$和#详解分析
  7. C++ 递归函数返回值理解
  8. 企业库实现AOP的几种方法
  9. 计算机基础知识精品课程,计算机应用基础精品课程课件第1课计算机基础知识第课计算机基础.PDF...
  10. windows桌面美化
  11. Allure清除历史记录
  12. UWP 写入图片 Exif 信息
  13. 学生上课睡觉班主任怎么处理_学生上课睡觉,老师该怎么处理? | 实操课103
  14. 计算机xp的解释,xp蓝屏代码解释以及解决办法
  15. Outlook中老是出来“信息检索” -- 解决方法
  16. cad无法安装_CAD软件下载好了,为什么安装不上?有两个原因,解决方法在这
  17. 禅道删除我的地盘中的任务,提示:您无权访问该迭代
  18. 转载 gro转lammps
  19. 【RED-V】开发环境搭建及快速入门
  20. 墨西哥付款方式有哪些

热门文章

  1. 16 张图解带你掌握一致性哈希算法
  2. 天呐,这群“员工”的业务能力太强了
  3. 华为云3大体系化防护实践,保障金融业云上数据安全
  4. mysql 5.7 导入出错_mysql5.x数据库文件导入mysql5.7数据库出错解决方法
  5. 红橙Darren视频笔记 代理模式 动态代理和静态代理
  6. 使用CLion构建Qt项目
  7. CenterNet+ deepsort实现多目标跟踪
  8. Stateflow_duration计时
  9. http和https的区别与联系
  10. python多变量拟合_Python曲线将多个参数拟合到多个数据集