热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

vue中image标签的样式怎么写

本文主要分享【vue中image标签的样式怎么写】,技术文章【dom-to-image将vue中未显示的组件转成图片,并上传】为【一条大河全靠浪】投稿,如果你遇到前端实践相关问题,本文相关知识或能

本文主要分享【vue中image标签的样式怎么写】,技术文章【dom-to-image 将vue中未显示的组件转成图片, 并上传】为【一条大河全靠浪】投稿,如果你遇到前端实践相关问题,本文相关知识或能到你。

vue中image标签的样式怎么写

目录 一、dom-to-image基本使用二、注意点三、生成的图片上传至服务器1、base64 转 File 格式2、blob 转 File 格式3、在页面展示生成的图片4、最终dom转图片函数5、上传图片6、问题未解决 四、vue实现将不显示的组件转成图片,而组件之间出现循环引用

一、dom-to-image基本使用

npm地址

import domtoimage from 'dom-to-image'

export function dom2img(node) {
   
  return domtoimage.toPng(node, {
    cacheBust: true })
    .then(function(dataUrl) {
   
      var img = new Image();
      img.src = dataUrl;
      document.body.appendChild(img);
      return dataUrl
    })
    .catch(function(error) {
   
      console.error('oops, dom2img went wrong!', error);
    });
}

// 实现将dom转成图片
// node: this.$refs.id 或者 document.getElementById('id')
dom2img(node).then(img => {
   
 // 处理base64格式的img
}

可以添加参数 , 比如控制大小,修改样式

domtoimage.toJpeg(node, {
   
   width: 330,
    height: 155,
    cacheBust: true,
    style: {
   
      margin: 0,
      background: '#fff',
    }
  })
二、注意点

dom-to-image
将dom转图片有个前提,就是一定要在文档中显示,任何样式导致不显示都导致无法生成图片,比如:visibility:hidden,display: none;
宽高不能是100%,否则也是转换失败

如果是动态引入的组件转换,要保证组件没有需要异步加载的部分,比如一些背景图是请求接口的, 只能在页面显示后,通过$refs来获取dom,动态引入不知道什么时候加载完成的

toPng 要去掉dom样式中的margin,否则切图出来的会有被截断的问题

三、生成的图片上传至服务器

平时上传图片主要是用到元素, 用户选择的文件最终是File对象,所以,我们将生成的图片转成File对象,然后通过formData上传即可。
这里主要用png格式和blob格式举例

1、base64 转 File 格式
function base64toFile(dataUrl, fileName = 'image') {
   
  let arr = dataUrl.split(',')
  let mime = arr[0].match(/:(.*?);/)[1]

  let bstr = window.atob(arr[1]) // base64编码
  let n = bstr.length
  let u8arr = new Uint8Array(n)
  while (n--) {
   
    u8arr[n] = bstr.charCodeAt(n) // unicode 编码
  }
  return new File([u8arr], `${
     fileName}.png`, {
   
    type: mime
  })
}
2、blob 转 File 格式

File继承自Blob,是特殊类型的 Blob。

function blobtoFile(blob, fileName = 'image') {
   
  const file = new File([blob], fileName, {
   
    type: blob.type
  })
  return file
}
3、在页面展示生成的图片
function showImg(dataUrl) {
   
  var img = new Image()
  img.src = dataUrl
  document.body.appendChild(img)
}

4、最终dom转图片函数
// XXX domtoimage 转图片有个前提,一定要在文档中显示,任何样式导致不显示都导致无法生成图片
// toPng(node, {width: 330, height: 155, quality: 0.95 }), 可以添加参数
// toPng 要去掉dom样式中的margin, 否则切图会有问题
import domtoimage from 'dom-to-image'
export function dom2img(node, fnType = 'toPng') {
   
  return domtoimage[fnType](node, {
   
      cacheBust: true
    })
    .then(function(dataUrl) {
   
      // png
      if (fnType === 'toPng') {
   
        // 显示图片
        showImg(dataUrl)
        // 生成file格式用于上传
        return base64toFile(dataUrl)
      }

      // blob 
      if (fnType === 'toBlob') {
   
        // 显示图片: 通过Blob Url,blob://模式类似于http://, 
        const blobUrl = URL.createObjectURL(dataUrl)
        showImg(blobUrl)
        // 防止内存溢出,要手动释放
        setTimeout(() => {
   
          URL.revokeObjectURL(blobUrl)
        }, 200)

        // 生成file格式用于上传, 这个有问题,接口报错-- FIXME
        return blobtoFile(dataUrl)
      }

      return dataUrl
    })
    .catch(function(error) {
   
      console.error('oops, dom2img went wrong!', error)
    })
}
5、上传图片
function uploadImgToBoot(imgFile) {
   
  const formData = new FormData();
  formData.append('file', imgFile)
  return uploadZhImg(formData).then(res => {
   
    return res
  })
}
6、问题未解决

blob转File后,上传图片接口报错, 未找到原因


四、vue实现将不显示的组件转成图片,而组件之间出现循环引用

vue中image标签的样式怎么写

1、首先在html中放一个占位div,用于渲染dom

 
    
   
// 不能使用visibility:hidden 或者 display:none, 会导致dom转换失败 .show-in-back
{ position: absolute; top: 0; z-index: -1000; }

2、这里使用动态引入避免组件死循环:

// 这里采用的是模板编译, 与现有使用的runtime模式不一致,
// 默认runtime模式,指向了"dist/vue.runtime.common.js"位置, 这里要修改成模板编译的路径
import Vue from 'vue/dist/vue.esm.js'
// XXX 可以使用这种动态引入的前提是: 组件没有需要异步加载的部分,比如合集中的背景图是请求接口的, 只能通过$refs来
// 动态引入组件,避免组件之间出现循环引入,当出现死循环时,import的结果为undefined
const ApplyCard = () => import('@/views/apply/components/ApplyCard.vue')

3、挂载点内容会被vue组件覆盖,所以每次要新建一个挂载点内容,设置id="toImg"

// 新建挂载点内容
const node = document.getElementById('hideNode')
node.innerHTML = '
   
'

4、利用vue动态构建组件,并挂载到id="toImg"

ApplyCard().then(res => {
   
  // 获取vue组件
  const temp = res.default

  // 获取组件,这里采用的是模板编译, 与现有使用的runtime模式不一致,要么修改成render函数,要么修改vue的引入, 这里用后者
  const Card = Vue.extend(temp)

  // 动态挂载相应的组件
  const vueComponent = new Card({
   
    el: '#toImg',
    propsData: {
   
      info: '', // 该组件构建所需props信息
    }
  })

  // 等加载完之后,获取dom
  vueComponent.$nextTick(() => {
   
    const node = vueComponent.$el
    // 生成图片并分享招乎
    dom2img(node).then(img => {
   
      // 处理base64格式的img
    })
  })
})

本文《dom-to-image 将vue中未显示的组件转成图片, 并上传》版权归一条大河全靠浪所有,引用dom-to-image 将vue中未显示的组件转成图片, 并上传需遵循CC 4.0 BY-SA版权协议。


推荐阅读
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 前段时间做一个项目,需求是对每个视频添加预览图,这个问题最终选择方案是:用canvas.toDataYRL();来做转换获取视频的一个截图,添加到页面中,达到自动添加预览图的目的。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
  • jQuery如何判断一个元素是否被点击?
    本文介绍了使用jQuery判断一个元素是否被点击的方法,并通过示例进行了具体说明。注意要指定父级,否则会执行多次。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 本文整理了Java中org.gwtbootstrap3.client.ui.Icon.addDomHandler()方法的一些代码示例,展示了Icon.ad ... [详细]
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
  • ps:写的第一个,不足之处,欢迎拍砖---只是想用自己的方法一步步去实现一些框架看似高大上的小功能(比如说模型中的toArraytoJsonsetAtt ... [详细]
author-avatar
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有