首页 > 其他分享 >vue-cropper图片裁剪(vue2与vue3)

vue-cropper图片裁剪(vue2与vue3)

时间:2024-10-14 09:35:59浏览次数:8  
标签:截图 vue const 裁剪 boolean vue2 vue3 cropper

在项目中,前端开发经常会遇到有图片上传的需求,而别人的组件大多都满足不了当下产品的需求,这是往往我们得去依靠组件自己自定义一个项目通用的裁剪组件

一、vue-cropper安装依赖:

vue2:

npm install vue-cropper  或  yarn add vue-cropper

vue3:

npm install vue-cropper@next  或  yarn add vue-cropper@next

二、引入相关css文件

import 'vue-cropper/dist/index.css' 

vue3才需要引入样式,vue2不需要

注意:这个样式一定记得引啊,我就是忘引入,裁剪框一直弄不出来

三、自定义组件

<!-- 裁剪图片工具-->
<template>
  <view class="upgrade-box">
    <szy-common-popup poptitle="裁剪图片" showPopup position="center" @close_popup="close_popup">
      <view class="prompt-content">
        <view class="inner-box">
          <view class="tip">提示:按微信公众号封面图2:35:1或1:1比例选择保留区域后,裁剪上传。</view>
          <!-- 选择裁剪比例 -->
          <view class="group-btn">
            <view
              class="item"
              :class="option.fixedNumber[0] === 2.35 ? 'item active' : 'item'"
              @click="cropSize(2.35, 1)"
              >2:35:1</view
            >
            <view
              class="item"
              :class="option.fixedNumber[0] === 1 ? 'item active' : 'item'"
              @click="cropSize(1, 1)"
              >1:1</view
            >
          </view>
          <!-- 裁剪区域 -->
          <view
            class="cropper-box"
            :style="{ width: `${imgObj.width}px`, height: `${imgObj.height}px` }"
          >
            <VueCropper
              ref="cropperRef"
              :img="option.img"
              :output-size="option.outputSize"
              :output-type="option.outputType"
              :can-scale="option.canScale"
              :auto-crop="option.autoCrop"
              :full="option.full == '0'"
              :auto-crop-width="option.autoCropWidth"
              :auto-crop-height="option.autoCropHeight"
              :can-move-box="option.canMoveBox"
              :can-move="option.canMove"
              :center-box="option.centerBox"
              :info="option.info"
              :fixed-box="option.fixedBox"
              :fixed="option.fixed"
              :fixed-number="option.fixedNumber"
            />
          </view>
        </view>
        <view class="button-group">
          <view class="dialog-button" @click="close_popup">
            <text class="dialog-button-text">取消</text>
          </view>
          <view class="dialog-button button-confirm" @click="cropperClick">
            <text class="dialog-button-text">保存/上传</text>
          </view>
        </view>
      </view>
    </szy-common-popup>
  </view>
</template>

<script lang="ts" setup>
  import { onMounted, ref } from 'vue';
  import { VueCropper } from 'vue-cropper';
  import 'vue-cropper/dist/index.css'; // vue3才需要引入样式,vue2不要

  const props = defineProps({
    coverFile: {
      type: String,
      require: '',
    },
  });

  // 裁剪组件Ref
  const cropperRef: any = ref({});

  // 裁剪组件需要使用到的参数
  interface Options {
    img: string;
    outputSize: number; // 裁剪生成图片质量
    outputType: string; // 裁剪生成图片格式
    canScale: boolean; // 图片是否允许滚轮播放
    autoCrop: boolean; // 是否默认生成截图框 false
    info: boolean; // 是否展示截图框信息
    autoCropWidth: number; // 生成截图框的宽度
    autoCropHeight: number; // 生成截图框的高度
    canMoveBox: boolean; // 截图框是否可以拖动
    enlarge: number;
    fixedBox: boolean; // 固定截图框的大小
    fixed: boolean; // 是否开启截图框宽高固定比例
    fixedNumber: number[]; // 截图框的宽高比例 默认2.35, 1:1,
    canMove: boolean; // 上传图片是否可拖动
    centerBox: boolean; // 截图框限制在图片里面
    accept: string; // 上传允许的格式
    infoTrue: boolean;
    original: boolean;
    full: boolean | string;
  }

  const option = ref<Options>({
    img: String(props.coverFile), // 裁剪图片地址
    outputSize: 1, // 裁剪生成图片质量
    outputType: 'jpeg', // 裁剪生成图片格式
    canScale: true, // 图片是否允许滚轮播放
    autoCrop: true, // 是否默认生成截图框 false
    info: true, // 是否展示截图框信息
    autoCropWidth: 235, // 生成截图框的宽度
    autoCropHeight: 100, // 生成截图框的高度
    enlarge: 1, // 采集后放大倍数
    full: '0', // 是否开启原尺寸裁剪 0 原尺寸 1当前尺寸
    infoTrue: true,
    original: true,
    canMoveBox: true, // 截图框是否可以拖动
    fixedBox: false, // 固定截图框的大小
    fixed: true, // 是否开启截图框宽高固定比例
    fixedNumber: [2.35, 1], // 截图框的宽高比例 默认2.35, 1:1,
    canMove: true, // 上传图片是否可拖动
    centerBox: true, // 截图框限制在图片里面
    accept: 'image/jpeg,image/jpg,image/png,image/gif,image/x-icon',
  });

  const handleSelectImg = (imgItem: any) => {
    option.value.img = String(imgItem);
  };

  // 外框大小
  const imgObj = ref({
    width: 300,
    height: 200,
  });

  // 修改截图框尺寸,宽,高
  const cropSize = (w: number, h: number) => {
    option.value.fixedNumber = [w, h];
    cropperRef.value.refresh();
  };

  // 裁剪后
  const cropperClick = () => {
    cropperRef.value.getCropData((data: any) => {
      emit('cropperClick', data);
    });
  };

  //
  const emit = defineEmits(['onClose', 'cropperClick']);
  const close_popup = () => {
    emit('onClose');
  };

  onMounted(() => {
    handleSelectImg(String(props.coverFile));
  });
</script>

<style lang="scss" scoped>
  .upgrade-box {
    .inner-box {
      .tip {
        font-size: 30rpx;
        text-align: left;
      }
      .group-btn {
        display: flex;
        align-items: center;
        justify-content: flex-start;
        margin: 20rpx 0rpx;
        .item {
          flex: 1;
          display: inline-flex;
          background: rgba(0, 0, 0, 0.03);
          border-radius: 6rpx 6rpx 0 0;
          text-align: center;
          justify-content: center;
          align-items: center;
          padding: 0 30rpx;
          height: 80rpx;
          white-space: nowrap;
          font-size: 34rpx;
          cursor: pointer;
          color: #353535;
          position: relative;
          &:after {
            content: '';
            position: absolute;
            left: 0;
            top: 0;
            bottom: 0;
            width: 1rpx;
            background: #eee;
            height: 100%;
            display: block;
          }
          &:first-child {
            border-radius: 6rpx 0 0 6rpx;
            &:after {
              display: none;
            }
          }
          &.active {
            background: $uni-main-color;
            color: #fff;
            border-radius: 6rpx;
          }
        }
      }
      .cropper-box {
        background: #eee;
        overflow: hidden;
      }
    }
  }
</style>

四、展示样式

标签:截图,vue,const,裁剪,boolean,vue2,vue3,cropper
From: https://www.cnblogs.com/moranjl/p/18433555

相关文章

  • 【VUE】Vue中的nextTick
    Vue提供的nextTick的方法,可以在下一次DOM更新循环结束之后执行回调函数。可以在回调函数中获取更新后的DOM。技术详解在Vue.js中,当我们修改了数据后,可能需要立即对DOM进行操作。然而,由于Vue.js的异步更新机制,DOM更新并不会立即发生,这就会导致我们在更新数据后无......
  • 基于SpringBoot+Vue药品管理系统
    优质项目:源码已开源,欢迎学习!项目背景本次开发的药品管理系统实现了收货地址管理、购物车管理、客服聊天管理、字典管理、公告管理、留言板管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、药品入库管理、用户管理、员工管理、管理员管理等功能。本药品......
  • vue2进阶篇:vue-router之命名路由
    @目录10.6命名路由案例:将案例改为“命名路由”完整代码本人其他相关文章链接10.6命名路由注意点1:命名路由请使用name属性,替换掉path属性的作用,且name直接指定名称即可,而path必须指定3级目录(path=’/demo/test/welcome’)才行。注意点2:name属性必须包裹在<router-link>标签......
  • Vue day04
    一、组件的三大组成部分(结构、样式、逻辑) 1. scoped样式冲突默认情况下,写在组件中的样式是全局样式,会全局生效。给组件加上scoped属性,可以让样式只作用于当前组件<stylescoped>2. data是一个函数一个组件的data选项必须是一个函数(保证每个组件实例,维护独......
  • 基于SpringBoot+Vue的校园互助任务平台设计和实现(源码+lw+部署+讲解)
    详细视频演示请联系我获取更详细的演示视频具体实现截图技术可行性分析经过调研与分析,我认为使用SpringBoot、Vue和MySQL构建本系统具有很高的技术可行性。具体而言,SpringBoot作为轻量级的Java开发框架,能够快速搭建和简化配置,提高开发效率和降低维护成本;Vue作......
  • 【开题报告】基于django+vue敬老院管理系统(论文+源码)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会的快速发展和人口老龄化的加剧,敬老院作为老年人生活照护的重要场所,其管理效率和服务质量日益受到关注。传统的敬老院管理模式往往......
  • 基于VUE+ssm框架的在线交友系统(Java+ssm+万字文档+系统源码+数据库 +调试)
    摘要本文介绍了在线交友系统的开发全过程。通过分析企业对于在线交友系统的需求,创建了一个计算机管理在线交友系统的方案。文章介绍了在线交友系统的系统分析部分,包括可行性分析等,系统设计部分主要介绍了系统功能设计和数据库设计。本在线交友系统管理员功能有个人中心,用户......
  • 基于SpringBoot+Vue的办公用品销售系统设计和实现(源码+lw+部署+讲解)
    详细视频演示请联系我获取更详细的演示视频具体实现截图技术可行性分析经过调研与分析,我认为使用SpringBoot、Vue和MySQL构建本系统具有很高的技术可行性。具体而言,SpringBoot作为轻量级的Java开发框架,能够快速搭建和简化配置,提高开发效率和降低维护成本;Vue作......
  • JAVA毕业设计189—基于Java+Springboot+vue的自动售水机管理系统(源代码+数据库+13000
    毕设所有选题:https://blog.csdn.net/2303_76227485/article/details/131104075基于Java+Springboot+vue的自动售水机管理系统(源代码+数据库+13000字论文+任务书)189一、系统介绍本项目前后端分离(可以改为ssm版本),分为用户、员工、管理员三种角色1、用户:注册、登录、......
  • [vue3 JavaScript CSS]实现电商网站商品预览,图片放大镜功能
    da效果预览:当鼠标浮在图片上时,灰色小框跟随鼠标运动。右侧大图显示。灰色框不会跑出图片,鼠标移动,右侧大图相应跟随移动。实现思路在实现前,我们想梳理一下我们要实现什么功能灰色框跟随鼠标移动,注意处理边界情况当鼠标进入时右侧大图出现,鼠标移出时右侧大图消失鼠标向左......