当前位置: 首页 > news >正文

天津商城网站建设/南昌seo搜索优化

天津商城网站建设,南昌seo搜索优化,丰县网站建设,wordpress域名绑定费用苏格团队作者:Bigben在当下的的前端项目中,图片功能可以说是非常常见的,图片的展示、图片的裁剪编辑、图片的上传等,那么我们的项目便来了个需求。当下我们项目中需要一个可自由编辑图片的功能,当图片可能出现需要频繁…

苏格团队

作者:Bigben

在当下的的前端项目中,图片功能可以说是非常常见的,图片的展示、图片的裁剪编辑、图片的上传等,那么我们的项目便来了个需求。

当下我们项目中需要一个可自由编辑图片的功能,当图片可能出现需要频繁编辑,同时能满足发现裁剪不满意想要微调的时候,会发现如果我们处理图片按照平常的习惯,如裁剪后上传服务器或者转base64,都是不符合需求的。那么该怎么处理比较好呢?如何以尽量少的网络请求、少占用存储来解决应用场景呢?那么,便想到了只用纯数据来跟我们的功能打交道。

先安利个裁图神器cropperjs,个人认为是个易上手,配置和api方法蛮齐全的一个组件库。

项目内引入,一定不要漏了引用样式

import Cropper from 'cropperjs';

import 'cropperjs/dist/cropper.css';

复制代码

这里我们以react为例

this.state = {

width: 640, //图片展示宽

height: 360, //图片展示高

imgWidth: 640, //图片实际宽

imgHeight: 360, //图片实际高

imgLeft: 0, //图片左偏移

imgTop: 0, //图片上偏移

editing: false //是否编辑中

}

//展示图片的基本dom结构,我们使用外div内img的形式,来跟数据结合控制裁剪图片的展示

const { width, height, imgWidth, imgHeight, imgLeft, imgTop, editing } = this.state;

const containerStyle = {

width: `${width}px`,

height: `${height}px`

}

const imgStyle = {

width: `${imgWidth}px`,

height: `${imgHeight}px`,

left: `${imgLeft}px`,

top: `${imgTop}px`

}

.img-container {

overflow: hidden;

position: relative;

}

.crop-img {

position: absolute;

left: 0;

top: 0;

}

className="img-container"

style={containerStyle}

>

className="crop-img"

src={picture}

style={imgStyle}

alt="pic"

>

复制代码

简单来说就是外层元素控制裁剪展示的宽高,同时根据项目需求的元素定位也挂在这,内部img挂载图片实际大小和偏移。

cropperjs初始化后的元素,是会与初始化对象img处在同一dom层级,也就是说如果我们直接对展示img进行初始化的话,编辑区域展示将会受父元素,如图,放大图片时候会不方查看超出部分a5957ac6255390b975e9022fe9f14f60.png

所以在这里,为了图片编辑的自由度,建议分开展示dom与用以初始化cropper对象的dom,在这里编辑区域为全屏幕为例,根据项目实际功能区域进行调整

.edit-container {

position: absolute;

left: 0;

right: 0;

top: 0;

bottom: 0;

}

className="img-container"

style={containerStyle}

>

className="crop-img"

src={picture}

style={imgStyle}

alt="pic"

>

//cropper初始化

this.myRef = React.createRef();

this.myCropper = new Cropper(this.myRef.current, options);

//options配置

const options = {

dragMode: 'move', //使裁剪时图片可拖动

background: false, //因为我们现在是全屏可编辑,需要隐藏掉默认的背景

}

//当然还有许多常见的配置项,如编辑框尺寸比例等,大家可自行查看api

//裁剪保存

save() {

const cropBoxData = this.myCropper.getCropBoxData(); //获取裁剪框数据

const canvasData = this.myCropper.getCanvasData(); //获取图片数据

this.setState({

width: cropBoxData.width,

height: cropBoxData.height,

imgLeft: canvasData.left - cropBoxData.left,

imgTop: canvasData.top - cropBoxData.top,

imgWidth: canvasData.width,

imgHeight: canvasData.height

})

}

复制代码

这样的话 我们就可以完全在自定义的全屏内编辑,保存效果如下,到这里我们就完成了第一部分功能,裁剪并保存数据和展示

3c60b953c93dd67a7a2e002108d6795d.png

d766f8e4e62b13e0e1d132c0196771e0.png

重点介绍下我们用到的两个api方法getCropBoxData和getCanvasData,getCanvasData是用来获取图片的实际数据的(当前的宽高,和相对于父元素可视区域的位移偏移量),getCropBoxData则是获取相对于图片区域的裁剪区相关数据。

那么后续的需求接着来了,我们怎么做到二次编辑的时候,能还原效果呢,嗯,其实在前面我们记录裁图数据的时候,把相应的数据关系再计算一遍就好了,在初始化cropper的options中增加配置

const options = {

dragMode: 'move',

background: false,

//控件初始化后重置相应配置

ready: () => {

const { width, height, imgWidth, imgHeight, imgLeft, imgTop } = this.state;

//根据实际需要出现裁图功能进行定位,此处left和top仅为测试暂时默认值定义

const left = 50;

const top = 50;

this.myCropper.setCanvasData({

width: imgWidth,

height: imgHeight,

left: left,

top: top

});

this.myCropper.setCropBoxData({

left: left - imgLeft,

top: top - imgTop,

width: width,

height: height

})

}

}

this.myCropper = new Cropper(this.myRef.current, options);

复制代码

这时候我们再点击裁图,就完美还原了,左边和上边的间隙就是setCanvasData的top和left,根据实际项目进行调整,setCropBoxData的left和top是相对于cropper-canvas的定位,才有了以上的计算形式。

cda6219490470d1620e5234a75652efc.png

此时,基本功能到此结束,如果说是应用在h5编辑中,设计到scale缩放的话,相关的数据计算都要算上scale的缩放值哦,不然就会出现展示图片和编辑图片大小不对等的状况。同时还有许多功能就不做展示了,设置裁剪框比例,编辑缩放等,欢迎尝试。

当然了,如果想要保存图片,也有相应的方法到处裁剪图片的数据

this.myCropper.getCroppedCanvas().toDataURL('image/jpeg')

复制代码

最后,我们可以看到,在整个功能过程中,我们需要的只是裁剪的数据,读写快,也不需要进行额外的图片存储,减少文件服务器存储的开销与优化。

感谢大家收看,欢迎讨论和指正。

http://www.jmfq.cn/news/5059189.html

相关文章:

  • php与 wordpress/郑州seo课程
  • wordpress系列文章实现/李江seo
  • 网站建设图片怎么动/推销网站
  • net网站开发找那家/网站seo关键词排名推广
  • 求推荐做ppt的网站/微博上如何做网站推广
  • 静态网站开发课程网/朔州seo
  • 个人网站的制作实验报告/湘潭营销型网站建设
  • 网站制作 南通/2024年3月新冠高峰
  • 龙岗网站建设推广报价/免费网站优化排名
  • 建设银行网站入口/上海app开发公司
  • 什么网站可以接单做设计方案/域名大全
  • 公司网站简介怎么做/全国疫情又严重了
  • 去越南做网站/百度网址大全免费下载
  • 青岛网站建设优化质量可靠/站外推广
  • nas服务器 做网站/市场营销案例100例
  • wordpress+评论+验证码/seo策划
  • 动态网站 编辑软件/企业网站seo贵不贵
  • 济阳县做网站公司/怎么弄一个自己的网址
  • 东莞企业为什么网站建设/百度开户推广多少钱
  • 2核4g做网站/全网营销系统是不是传销
  • 贵阳网站建设设计公司/网店营销策划方案
  • 软件界面设计ui培训班/站优云seo优化
  • 做门户网站的营业范围/每日财经要闻
  • 效果图网站名字/引擎优化是什么意思
  • 可以做网站挂在百度上吗/网络推广计划制定步骤
  • app网站制作公司/网站链接提交
  • 做电商需要哪些网站有哪些/淘宝代运营
  • 淘宝联盟网站推广怎么做/云搜索神器
  • 网站建设考试重点/中国免费广告网
  • 做平台的网站/营业推广的方式