首页 > 其他分享 >vue3自定义指令实现截图

vue3自定义指令实现截图

时间:2024-11-29 17:55:28浏览次数:6  
标签:截图 const 自定义 html2canvas clonedNode link vue3 document

  1. 依赖

• 使用 html2canvas(需要先安装:npm install html2canvas)。

  1. 绑定事件

• 在目标 DOM 上绑定 click 事件。

  1. 截图逻辑

• 点击后调用 html2canvas 截取目标元素的截图。

• 使用 Canvas 的 toDataURL() 方法生成 Base64 图片。

  1. 保存文件

• 创建一个 a 标签,通过 download 属性触发文件下载。

实现代码

import html2canvas from "html2canvas";

const screenShot = {
  mounted(el: HTMLElement, binding: DirectiveBinding) {
    el.addEventListener("click", async () => {
      const target = binding.value?.target ? document.getElementById(binding.value.target) : el;
// 获取dom元素
      if (target) {
        try {
          // 使用 html2canvas 截取元素截图
          const canvas = await html2canvas(target as HTMLElement);
          const dataURL = canvas.toDataURL("image/png");

          // 创建下载链接
          const link = document.createElement("a");
          link.href = dataURL;
          link.download = binding.value?.fileName || "screenshot.png";
          link.click();
        } catch (err) {
          console.error("截图失败:", err);
        }
      } else {
        console.error("未找到目标元素进行截图");
      }
    });
  }
};

export default screenShot;
<template>
  <div>
    <div id="capture" style="width: 300px; height: 200px; background: lightblue; text-align: center; line-height: 200px;">
      截图内容
    </div>
    <button v-screenShot="{ target: '#capture', fileName: 'custom-screenshot.png' }">
      点击截图
    </button>
  </div>
</template>

<script setup>
import screenShot from "./directives/screenshot";

export default {
  directives: {
    screenShot,
  },
};
</script>

5 解决图片跨域 以及滚动条过长截图不全

    async cutPicture() {
      const designPreview = this.$refs.designPreview;
      //解决dom里面滚动条截图不全的问题
      //重新复制一个dom 设置想要宽   高度为dom的clientWidth
      let clonedNode = designPreview.cloneNode(true); //复制一个
      clonedNode.setAttribute(
        "style",
        `width: ${"375px"};height: ${designPreview.clientWidth};`
      );
      document.body.appendChild(clonedNode); //放到body后面
          //通过复制的dom拿到想要的截图资源
      const canvas = await html2canvas(clonedNode, {
        backgroundColor: "#ffffff",
        allowTaint: true, //开启跨域  是否允许渲染未经授权的跨域资源
        useCORS: true, // 启用后,html2canvas 会尝试加载跨域资源,但需要图片服务器设置了 Access-Control-Allow-Origin。
        scale: 1,
        // height: clonedNode.scrollHeight,
        // windowHeight: clonedNode.scrollHeight,
      });
     // 因为已经获取了对应的截图 删除clone的dom就可以了
      document.body.removeChild(clonedNode); //最后记得移除截图时添加的
     // 可以通过设置一个a标签直接下载 
        //  const link = document.createElement('a');
        //     link.href = base64Data;
        //     link.download = 'example.txt'; // 设置下载文件的名称
        //     document.body.appendChild(link);
        //     link.click(); // 模拟点击
        //     document.body.removeChild(link); // 移除链接
     
     //这边是给后端传一个base64格式的获取对应图片的url
      let fileParams = {
        base64File: canvas.toDataURL("image/png").split(",")[1],
        token: this.$store.state.login.token,
        fileType: "png",
        fileName: "预览",
      };
      let res = await this.$http.post(
        "/api/mall-web-mos/uploadFile",
        fileParams
      );
      console.log("

标签:截图,const,自定义,html2canvas,clonedNode,link,vue3,document
From: https://www.cnblogs.com/an31742/p/18562225

相关文章

  • RUOYI参数验证异常处理及自定义注解触发验证抛出异常报错
    目录一.ruoyi与参数验证1.触发报错2.后端现象二.源码分析1.前端代码2.后端代码3.报错分析三.自定义函数注解1.NoNumber注解2.NoNumberMain校验器3.将注解添加进SysRole中4.前端&后端现象一.ruoyi与参数验证1.触发报错对参数验证的使用,从触发参数报错开始,首先对ru......
  • 自定义一个WinForm个性化的TabControl
    系列文章目录第一章自定义一个WinForm异形按钮第二章自定义一个WinForm圆角文本框第三章自定义一个WinForm个性化的TabControl文章目录系列文章目录前言一、效果展示自定义TabControl效果展示二、TabControl自定义1.创建一个MyTabControl2.自定义并暴露出一些常......
  • 给定距离与轨迹使用dp过滑块并截图识别结果
    importtimeimportddddocrimportrandomfromDrissionPageimportChromiumPageimportosimportshutilclassSlideCaptchaSolver:def__init__(self):self.page=ChromiumPage()@staticmethoddefdelete_img_folder():"&qu......
  • 客户端WinForm实现Form表单格式自定义
    usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.ComponentModel.Design;usingSystem.ComponentModel.Design.Serialization;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;using......
  • Vue3+Element plus 实现表格可编辑
     <template>  <div>   <el-buttontype="primary"@click="handleAdd">    新增   </el-button>   <el-buttontype="primary"@click="handleAdd10">    新增10个点表   &l......
  • 手动实现vue3的select下拉框的滚动加载和虚拟滚动,简单易懂
    首先,滚动加载和虚拟滚动都是为了解决数据量大的渲染性能问题,但是也有区别,滚动加载并没有从根本上解决问题,只是滚动到可视区域底部动态加载,二虚拟滚动是永远只渲染固定数量(通常是可视区域内)的所以可以从根本上解决这种性能问题。如果只想了解滚动加载只看第一部分即可。这两种技......
  • 开发者必备:构建自定义CLI格式化工具的完整指南 (5)
    一个工具的命令行界面(CLI)背后其实就是调用相应的API。在这里,我们将实现一个简易的CLI工具,通过它来格式化代码。首先,新建一个名为formattool的项目,并使用pnpminit进行初始化:mkdirformattoolcdformattoolpnpminit-y然后,在项目根目录下创建一个index.js文......
  • Paypal最新版本 paypal-server-sdk 使用案例(前端 Vue3 + 后端Spring Boot )
    背景在项目中对接Paypal支付,一开始在网上查了好久,发现资料少,而且陈旧,甚至我都没弄清楚我应该哪个SDK。我到maven中央仓库中,搜索com.paypal.sdk,能查出不少结果,据我所知,至少有三个sdk可以从后端访问到Paypal:paypal-core:非常陈旧,2016年就停止更新了,但网上还有一些关于它的教程......
  • Vue3 的基础使用
    Vue3的基础使用npminitvue@latestref赋值一个新的对象,那么响应式也会存在shallowRef只保留最顶层的响应式更新reactive赋值一个新的对象,失去响应性直接访问对象中的属性,当访问到某个响应式数组(Map这样的原生集合类型)中的ref元素时,不会解包shallowReactive只保留最......
  • vue3实现keep-alive一个组件(一个vue使用多个页面支持缓存)使用多个页面(多个路由)已解决
    代码<router-viewv-if="routerAlive"><template#default="{Component,route}"><keep-alive:include="getCaches"><component:is="formatComponentInstance(Component,route.name)......