【html】生成聊天记录网页能导出图片

news2024/11/27 1:26:31

例如有一段有趣的对话,需要通过聊天记录形式展现出来分享,想到通过网页设计是可以实现的,那么如何生成出来呢,在这里给具体讲一讲吧。

网页布局

创建一个网页文件index.html,代码如下

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>chat-room</title>
    <script src="./comon/dom-to-image.min.js"></script>
    <style>
        <!-- 样式 -->
    </style>
</head>
<body>
    <div id="app" class="chat-room">
        <div class="expand" id="box">
            <div class="chat-room-header">
                <div>{{navigatoBarTitleText}}</div>
            </div>
            <div class="chat-room-body">
                
            </div>
        </div>
        <div class="chat-room-footer">
            <button @click="onclick">生成图像</button>
        </div>
    </div>
	<!-- template 1 -->
	<!-- template 2 -->
    <script>

        window.onload = function(){
            //...加载,初始化逻辑
        }
    </script>
</body>
</html>

使用时要引入一个插件dom-to-image.min.js,这是一个能将页面显示效果生成一个图片的功能

模板布局

之前有写了注释如template 1template 2,那里写实现两个不同的模板布局,

气泡模板

再写两个模板布局,用于显示两个不同的聊天气泡布局,

这是表示自己的,代码如下

<script id="template1" type="html/plain">
     <div class="msg">
         <div class="my">
             <div class="m">
                 {{item.msg}}
             </div>
             <div>
                 <img class="head" src="{{item.head}}" />
             </div>
         </div>
     </div>
 </script>

这是表示对方的,代码如下

 <script id="template2" type="html/plain">
     <div class="msg">
         <div class="other">
             <div>
                 <img class="head" src="{{item.head}}" />
             </div>
             <div class="m">
                 {{item.msg}}
             </div>
         </div>
     </div>
 </script>

注意了,看着页面代码好像Vue写法,若是使用vue框架生成好像有问题,就写纯html网页纯脚本处理就会没问题的

加载逻辑

分两步实现,一个提供数据,另一个渲染,

聊天数据

定义的数据是这样的,代码如下

const data = {
 	navigatoBarTitleText:'TA',
     list:[],
     myHead:'favicon.ico',
 };

 data.list = [
     { ismy:true, msg:'hello tom', head:data.myHead },
     { ismy:false, msg:'hello', name:'tom', head:data.myHead },
     //省略更多...
 ];
// ...

渲染模板

实现渲染模板的方法是这样的,代码如下

function renderHTML(node,key,value){
     let obj = {};
     if(typeof key == 'string') {
         obj[key] = value;
     }else{
         for(let k in key) {
             obj['item.'+k] = key[k];
         }
     }
     let html;
     if(typeof node == 'string'){
         html = node;
     }else{
         html = node.innerHTML;
     }
     for(let k in obj){
         let reg = new RegExp(`{{${k}}}`,'g');
         html = html.replace(reg,obj[k]);
     }
     if(node.innerHTML) node.innerHTML = html;
     return html;
 }

然后,写加载初始化逻辑,代码如下

 let node = document.getElementById('box');

 const tLabel = 'timer';
 console.time(tLabel);
 
 renderHTML(node,'navigatoBarTitleText',data.navigatoBarTitleText);

 let template1 = document.getElementById('template1');
 let template2 = document.getElementById('template2');

 console.timeEnd(tLabel);

 let body = node.querySelector('.chat-room-body');

 let template = '';
 data.list.forEach(item=>{
     if(item.ismy) template += renderHTML(template1,item);
     else template += renderHTML(template2,item);
 })

 body.innerHTML = template;


 let button = document.querySelector('button');
 button.addEventListener('click',()=>{
     domtoimage.toPng(node).then((dataUrl)=>{
         clickDownloadLink(dataUrl)
     }).catch(function(err){
         console.error('oops, something went wrong!', err);
         
     })
 });

这里看到domtoimage.toPng(node)就是从一个网页节点生成图片的,
可以生成海报,但只能是纯HTML页面才有效哦

图片预览

这个就是在浏览器上实现下载图片和图片预览的方法,代码如下

 function clickDownloadLink(url){
     let elem = document.createElement('a');
     elem.setAttribute('href',url);
     elem.setAttribute('target','_blank');
     elem.style.display='none';
     document.body.appendChild(elem);
     elem.click();
     document.body.removeChild(elem);
 }

修改样式

最后,边浏览边修改,调整样式,达到聊天记录逼真效果

body{
	margin: 0;
}
.chat-room{
    display: flex;
    flex-direction: column;
    height: 100vh;
}
.chat-room .chat-room-header{
    padding: 10px;
    text-align: center;
    color: aliceblue;
    background-color: black;
}
.chat-room .expand,
.chat-room .chat-room-body{
    flex: 1;
}
.chat-room .chat-room-body{
    overflow-y: auto;
}
.chat-room .msg{
    flex: 1;
    margin: 10px;
}
.chat-room .msg .m{
    flex: 1;
    margin: 5px;
    padding: 5px;
    border: 1px solid #ccc;
    border-radius: 6px;
    box-sizing: border-box;
    line-height: 34px;
}
.chat-room .msg .head{
    width: 50px;
    height: 50px;
    margin: 0 2px;
}
.chat-room .msg .my,
.chat-room .msg .other{
    display: flex;
    flex-direction: row;
}
.chat-room .msg .my .m{
    margin-left: 50px;
    background-color: #fff;
    border-bottom-right-radius: 0;
}
.chat-room .msg .other .m{
    margin-right: 50px;
    background-color: rgb(16, 199, 138);
    border-bottom-left-radius: 0;
}

运行测试

在浏览器上运行,点击生成图像按钮,生成图片效果图如下
在这里插入图片描述

经过测试,获取长条图没问题;

⚠ 不要伪造聊天记录哦,真真假假还是容易分辨出来的

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/749981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql之窗口函数学习

聚合是分组后,聚合到一行 而窗口函数,既可以聚合到一行,也可以不聚合 1.序号函数 分组排序并添加序号 row_number rank dense_rank 1.row_number() 按照部门名称进行分组,然后按照薪资进行排序,但是,我们要注意 1.这里分组,但是并没有进行聚合 2.序号排序,是根据num的组进行…

驱动开发-day10

驱动代码&#xff1a; #include <linux/cdev.h> #include <linux/device.h> #include <linux/fs.h> #include <linux/gpio.h> #include <linux/init.h> #include <linux/interrupt.h> #include <linux/mod_devicetable.h> #include …

Oracle语句优化 (汇总)

大部分写sql语句都是为了实现而实现&#xff0c;如果最后在投入使用的过程中没有很难接受的性能&#xff0c;基本不怎么去考虑其性能。最近刚好有点时间&#xff0c;对优化方面进修进修&#xff0c;以备不时之需。 选择最有效率的表名顺序 Oracle的解析器按照从右到左的顺序处…

【PHP面试题29】什么是PHP-FPM?它与PHP和Nginx有什么关系

文章目录 一、前言二、什么是PHP-FPM&#xff1f;三、PHP-FPM的生命周期3.1 启动阶段3.2 初始化阶段3.3 请求处理阶段3.4 关闭阶段 四、PHP-FPM与PHP的关系五、PHP-FPM与Nginx的通信方式六、总结 一、前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP面试专区。 计划将全覆盖P…

JavaScript 判断 null 、undefined、NaN的可靠方法、验证以及注意事项

索引 判断方法判断undefined判断null判断NaN 注意事项undefined和null和比较NaN和自己比较 有些时候需要判断类型是否为null、undefined或者NaN&#xff0c;常用的方法有以下&#xff1a; 判断方法 判断undefined 使用typeof typeof xxx undedfined注意&#xff1a;typeof…

Python+”多技术融合在蒸散发与植被总初级生产力估算

熟悉蒸散发ET及其组分&#xff08;植被蒸腾Ec、土壤蒸发Es、冠层截留Ei&#xff09;、植被总初级生产力GPP的概念和碳水耦合的基本原理&#xff1b;掌握利用Python与ArcGIS工具进行课程相关的操作&#xff1b;熟练掌握国际上流行的Penman-Monteith模型&#xff0c;并能够应用该…

低代码自动化解析:企业所需要了解的一切

根据2020年以来与低代码技术相关的积极趋势&#xff0c;Gartner预测到2023年低代码开发技术市场将增长20%。此外&#xff0c;他们还预计&#xff0c;到2026年&#xff0c;非正式IT部门的开发人员将占低代码开发工具用户群至少80%的比例&#xff0c;而这一比例在2021年为60%。基…

基本概念【变量和数据类型和运算符、二进制和十进制、十进制转二进制 、二进制转十进制 】(一)-全面详解(学习总结---从入门到深化)

目录 变量和数据类型和运算符 二进制和十进制的转化 十进制转二进制 二进制转十进制 注释 标识符和关键字 关键字/保留字 变量(variable) 变量的分类和作用域 常量(Constant) 基本数据类型(primitive data type) 整型 浮点型(Floating Point Number) 字符型 …

网工内推 | 坐标长沙,CKA、红帽、华为认证均可

01 上海海典软件 招聘岗位&#xff1a;运维工程师 职责描述&#xff1a; 1、负责和支撑业务系统日常运维工作&#xff1b; 2、负责公司机房网络设备、服务器的日常管理和维护&#xff1b; 3、负责公司电脑软件、硬件的安装及维护&#xff1b; 4、领导交办的其它事务。 任职要求…

行业内对低代码开发是什么看法?低代码/aPaaS未来将走向何方?

有人觉得低代码只是个概念&#xff0c;一无是处&#xff1b; 有人将低代码吹上了天&#xff0c;将其送上神坛&#xff1b; 我们先来看看低代码是什么。 低代码&#xff08;Low-Code&#xff09;顾名思义&#xff0c;是以少量的代码完成项目的开发。广义的低代码也包括零代码&a…

Shell第三章——循环语句与函数(2)

while循环&#xff1a;满足条件才会执行循环&#xff0c;不满足就结束&#xff0c;用于不知道循环次数&#xff0c;需要主动结束循环或者达到条件循环的场景 语法结构&#xff1a; while [ 条件判断 ] do 命令序列 done 例&#xff1a; 先在循环外把变量起好 let i 防止…

Python入门基础知识总结(赶紧收藏)

一&#xff1a;简介&#xff1a; Python 是一种解释型、面向对象的语言 Python的语法和动态类型&#xff0c;以及解释性语言的本质&#xff0c;使它成为多数平台上写脚本和快速开发应用的编程语言 二&#xff1a;Python基础语法 2.1.字面量 字面量&#xff1a;在代码中&am…

版本控制工具 - git的安装与使用

版本控制工具 - git的安装与使用 一、介绍二、git的下载与安装2.1 下载2.2 安装 三、git基本使用3.1 初始化git本地仓库3.2 把文件添加到版本库3.3 连接远程仓库 三、IntelliJ idea 中使用Git的配置3.1 配置git3.2 IDEA中 将本地项目提交到本地仓库和远程仓库(github)3.3 在 In…

算法----2 的幂

题目 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2x &#xff0c;则认为 n 是 2 的幂次方。 示例 1&#xff1a; 输入&#xff1a;n 1 输出&#x…

算法与数据结构(二)--【2】链表进阶

一.循环链表 1.单循环链表/循环链表 【1】概念&#xff1a;在单链表中&#xff0c;将终端结点的指针域NULL改为指向第一个结点&#xff0c;就使整个链表形成一个环&#xff0c;这种首尾详解的链表成为循环链表。 【2】特点&#xff1a;从表中任一结点出发均可找到表中其他结点…

排序算法笔记-归并排序

归并排序 简介 通过找到中间值&#xff0c;然后递归分别从左区间和右区间找中间值&#xff0c;最终将所给的值划分为单个块&#xff0c;然后进行一步一步回溯&#xff0c;分块由两个单个分区排序后合成一个&#xff0c;以此类推&#xff0c;最后实现有序排序 时间复杂度 最…

小红书如何推广 方法总结

大家好&#xff0c;我是权知星球&#xff0c;今天来跟大家分享一下小红书如何推广&#xff0c;方法总结。 一、小红书介绍 小红书成立于2013年6月6日&#xff0c;最初的核心业务是社区内容分享。最初分享的主要是美妆和个人护理方面的内容。之后&#xff0c;平台扩展了分享内…

选择「程序员」职业的8个理由

软件开发人员是具有创建软件程序的创意和技术技能的专业人员&#xff0c;是一个具有高回报和挑战性的职业选择。如今&#xff0c;软件开发人员几乎在每个行业工作。随着世界变得越来越数字化&#xff0c;越来越需要具有技术背景的人来创建特定的软件应用程序。 如果您考虑做一…

opencv基础:环境配置

最近人工智能很火&#xff0c;所以蹭个热度&#xff0c;聊一个跨平台计算机视觉库----Opencv。 定义 先看一下其定义&#xff1a; OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、…

js手动画平滑曲线,贝塞尔曲线拟合

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"…