html5 实现网页截屏 页面生成图片

news2024/10/1 3:29:09

效果

代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="referrer" content="no-referrer" />
    <meta name="viewport"
        content="width=device-width,intial-scale=0,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no,shrink-to-fit=no,viewport-fit=cover" />
    <title></title>
    <script type="text/javascript" src="./html2canvas.min.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        html,
        body {
            height: 100%;
            width: 100%;
        }

        body {
            background: linear-gradient(180deg, #c4dced 0%, #d8edf4 52%, #ecf2f5 100%);
            position: relative;
            border-top: 1px solid #c4dced;
            box-sizing: border-box;
            overflow: hidden;
        }

        #poster {
            width: 75VW;
            height: 75VH;
            margin: 6VH auto;
            position: relative;
            background: #d2ecff;
        }

        #poster_bck {
            width: 100%;
            height: 100%;
            position: absolute;
            top: 0;
            left: 0;
            z-index: 1;
        }

        /* 内容 */
        #poster p {
            position: relative;
            text-align: center;
            color: #fff;
            font-size: 1.5vh;
            z-index: 6;
        }

        .headline {
            padding: 16vh 0 1vh 0;
            font-size: 1.8vh !important;
            font-weight: 800;
        }

        .subject {
            padding: 1vh 0 4vh 0;
        }

        .keynote {
            padding: 1vh 0 5vh 0;
        }

        .date {
            padding: 2vh 0 0.5vh 0;
        }

        /* 二维码 */
        #poster #codes {
            width: 15vh;
            height: 15vh;
            background-color: #ffffff;
            position: absolute;
            bottom: 14%;
            left: 50%;
            transform: translateX(-50%);
            z-index: 5;
        }

        /* 保存按钮 */
        .copmol {
            width: 45VW;
            height: 5VH;
            line-height: 5vh;
            font-size: 2vh;
            border: 0;
            border-radius: 1vw;
            background: #27a9df;
            color: #ccc;
            position: absolute;
            bottom: 5%;
            left: 50%;
            transform: translateX(-50%);
        }

        /* <!-- 轮播样式 --> */
        .wrapper a {
            width: 4vh;
            height: 4vh;
            line-height: 4vh;
            text-align: center;
            border-radius: 50%;
            text-decoration: none;
            font-size: 2vh;
            color: #FFF;
            background: #727272;
            position: absolute;
            top: 35%;
        }

        .wrapper a:nth-of-type(1) {
            left: 1%;

        }

        .wrapper a:nth-of-type(2) {
            right: 1%;
        }

        .btn {
            width: 25%;
            display: flex;
            justify-content: space-around;
            position: absolute;
            left: 50%;
            bottom: 15%;
            transform: translateX(-50%);
        }

        .btn span {
            display: block;
            width: 1vh;
            height: 1vh;
            background-color: white;
            border-radius: 50%;
        }

        .active {
            background-color: #27a7de !important;
        }
    </style>


</head>

<body class="wrapper">


    <!-- 切换 -->
    <a href="javascript:void(0);">&lt;</a>
    <a href="javascript:void(0);">&gt;</a>
    <!-- 主题内容 -->
    <div id="poster">
        <img id="poster_bck" crossOrigin="anonymous">
        <p class="headline">《小小的船》</p>
        <p class="subject">一年级语文课文</p>
        <p>主讲人</p>
        <p class="keynote">张珊珊</p>
        <p>时间</p>
        <p class="date">2021-06-24</p>
        <p class="time">09:30--10:30</p>
        <!-- 二维码 -->
        <img id="codes" crossOrigin="anonymous" alt="" srcset="">
    </div>
    <!-- 小圆点 -->
    <div class="btn">
        <span class="active"></span>
        <span></span>
        <span></span>
    </div>
    <button class="copmol" id="screenshotButton">
        保存到手机相册
    </button>
</body>
<script>

    //下一张按钮
    var _nextPic = document.querySelector(".wrapper a:nth-of-type(2)");
    // 上一张按钮
    var _prevPic = document.querySelector(".wrapper a:nth-of-type(1)");
    var _poster = document.querySelector("#poster_bck");

    // 选择照片文件
    const input = document.createElement('input');
    input.type = 'file';

    input.onchange = e => {
        // 读取文件
        const file = e.target.files[0];
        const reader = new FileReader();

        reader.onload = function () {
            // 将文件转换成 base64 格式
            const base64String = reader.result;
            console.log(base64String);
        };

        reader.readAsDataURL(file);
    };

    input.click();

    var _screenshotButton = document.querySelector("#screenshotButton");

    var _btn = document.querySelector(".btn");
    //获取所有小圆点
    var _spots = document.querySelectorAll(".btn span");


    // 下一张
    _nextPic.onclick = function () {
        next_pic();
    }
    var index = 0;
    //背景图片
    var imgList = [
        'https://img2.baidu.com/it/u=2611494013,594253619&fm=253&fmt=auto&app=138&f=JPEG?w=334&h=500',
        'https://pic.616pic.com/bg_w1180/00/16/61/QsRyZgEG6y.jpg',
        'https://i-1-lanrentuku.52tup.com/2020/8/10/5202fa35-c436-41e5-a49a-15c976728358.jpg?imageView2/2/w/1024',
    ];
    _poster.src = imgList[0]; // 设置背景图的 URL
    // 二维码
    var codes = 'https://img2.baidu.com/it/u=1602265477,1695547353&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500'
    document.querySelector("#codes").src = codes //设置二维码

    function next_pic() {
        index++
        // console.log(_poster)
        _poster.src = imgList[index]; // 更换为新的背景图的 URL
        spots();
        if (index >= 2) {
            index = -1
        }

    }

    // 上一张
    _prevPic.onclick = function () {
        prev_pic();
    }
    function prev_pic() {
        if (index <= 0) {
            index = 3
        }
        index--
        _poster.src = imgList[index]; // 更换为新的背景图的 URL
        spots();
    }



    //小圆点变化
    function spots() {
        // console.log(index);
        for (var i = 0; i < _spots.length; i++) {
            if (i == index) {
                _spots[i].className = "active"
            } else {
                _spots[i].className = ""
            }
        }
    }


    //点击小圆点更新图片
    _btn.onclick = function (event) {
        //获取悬浮的小圆点
        var target = event.srcElement || event.target;

        if (target.nodeName == 'SPAN') {
            //查询小圆点下标
            var n = Array.from(_spots).findIndex(function (tag) {
                return tag == target
            })
            //更新下标
            index = n;
            // 更换为新的背景图的 URL
            _poster.src = imgList[index]
            //更新颜色
            spots();
        }
    }
    // 保存到手机相册
    _screenshotButton.onclick = function (event) {
        html2canvas(document.querySelector('#poster'), {
            useCORS: true, // 【重要】开启跨域配置
            scale: window.devicePixelRatio < 3 ? window.devicePixelRatio : 2,
            allowTaint: true, // 允许跨域图片
        }).then((canvas) => {
            const imgData = canvas.toDataURL('image/jpeg', 1.0);
            var image = new Image();
            image.src = imgData;
            // console.log(imgData)
            // / 创建一个链接并模拟点击下载
            const link = document.createElement('a');
            link.download = '课程海报.png';
            link.href = imgData
            link.click();
        });
    }

</script>




</html>

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

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

相关文章

前端开发新趋势:Web3 与虚拟现实的技术融合

在当今互联网技术日新月异的时代&#xff0c;Web技术也在不断地发展和变革。从前端开发的角度来看&#xff0c;新技术的涌现和旧技术的迭代让前端开发者们面临着前所未有的挑战和机遇。Web3 与虚拟现实&#xff08;VR&#xff09;的技术融合&#xff0c;正是当前前端开发领域的…

dpc与线程切换

中断服务例程 延迟过程调用 线程切换 键盘信号传输 1. 背景 我一般用ctrlaltdel能否呼出winlogon桌面作为Windows卡死&#xff08;hang&#xff09;还是个别程序卡死的鉴别手段。因为一则用户态的程序没办法干扰这个呼出流程&#xff0c;二则如果不能呼出任务管理器来终止进程…

openmediavault基本操作

omv基本操作 使用hostname访问共享文件夹设置1.挂载磁盘2.提交更改3.新建用户4.建立共享文件夹5.设置SMB/CIFS服务7.测试7.1.速度测试 使用hostname访问 把网口和wifi设置成DHCP,使用hostname访问,这样把NAS拿到任何地方都不需要配置了,自动联网进行访问. #网络->常规 #设…

搭建谷歌 Gemini,体验谷歌版GPT4

12.06 日谷歌 DeepMind CEO 和联合创始人 Demis Hassabis 正式推出了大模型Gemini 目前&#xff0c;Gemini 1.0 提供了三个不同的尺寸版本&#xff0c;分别如下&#xff1a; Gemini Ultra&#xff1a;规模最大、能力最强&#xff0c;用于处理高度复杂的任务&#xff1b;Gemin…

map容器的基本使用

文章目录 mapmap模板参数默认构造迭代器[ ]{ }inserterasefindlower_bound && upper_boundcountequal_range map和set容器&#xff0c;multimap和multiset是树形结构的关联式容器&#xff0c;这四种容器底层原理都是红黑树&#xff0c;容器中的元素是一个有序序列。 ma…

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。…

存储卡显示0字节怎么办?恢复0字节的存储小技巧

存储卡显示0字节是一个常见的故障现象&#xff0c;可能由多种原因引起。本文将详细分析存储卡出现此类问题的各种原因&#xff0c;并提供针对性的解决方法。通过深入了解这些原因和解决方案&#xff0c;读者可以有效地应对存储卡显示0字节的故障&#xff0c;从而恢复存储卡的正…

博主自制PDF转换工具丨支持PDF转图片丨PDF转word丨PDF转Excel丨PDF文本识别丨免费使用在线下载

博主自制PDF转换工具丨支持PDF转图片丨PDF转word丨PDF转Excel丨PDF文本识别丨免费使用在线下载 点我立即下载

CSB文件上传漏洞 -->Day4(图片挂马)

22二号&#xff0c;冬至啦&#xff0c;深圳这边只有5&#xff08;尊嘟好冷啊&#xff09;&#xff0c;写这篇文章的时候都已经是凌晨一点了&#xff0c;相信大部分的人都在温暖的被窝里面了吧&#xff01;&#xff01;&#xff08;可怜的我&#xff0c;还得写writeup&#xff0…

【XML】TinyXML 详解(一):介绍

【C】郭老二博文之&#xff1a;C目录 1、简介 优点&#xff1a; TinyXML 是一个简单、小型的 C XML 解析器&#xff0c;可以轻松集成到项目中。 TinyXML 解析 XML 文档&#xff0c;并根据该文档构建可读取、修改和保存的文档对象模型 (DOM) TinyXML 是在 ZLib 许可下发布的&a…

UG凸起命令

凸起命令是拉伸命令的补充&#xff0c;可以方便的对曲面进行拉伸切除。 当端盖中几何体类型选择默认的截面平面的时候&#xff0c;相当于拉伸命令 当端盖中几何体类型选择凸起的面的时候&#xff0c;相当于拉伸其实曲线变为选择曲线在凸起面的投影曲线&#xff0c;然后基于凸起…

栈的常见题型

1.有效的括号 char pairs(char a) {if(a})return {;if(a])return [;if(a))return (;return 0; } bool isValid(char* s) {char* stack(char*)malloc(sizeof(char)*10000);int top0;int lenstrlen(s);if(len%21)return false;for(int i0;s[i];i){char chpairs(s[i]);if(ch){if(t…

BTF:实践指南

本文地址&#xff1a;BTF&#xff1a;实践指南 | 深入浅出 eBPF 1. BPF 的常见限制 1.1 调试限制1.2 可移植性2. BTF 是什么&#xff1f;3. BTF 快速入门 3.1 BPF 快速入门3.1 BTF 和 CO-RE4. 结论 BPF 是 Linux 内核中基于寄存器的虚拟机&#xff0c;可安全、高效和事件驱动…

【STM32】STM32学习笔记-TIM定时中断(13)

00. 目录 文章目录 00. 目录01. TIM简介02. 定时器类型03. 基本定时器04. 通用定时器05. 高级定时器06. 定时中断基本结构07. 预分频器时序08. 计数器时序09. 计数器无预装时序10. 计数器有预装时序11. RCC时钟树12. 附录 01. TIM简介 TIM&#xff08;Timer&#xff09;定时器…

数据库中间件介绍

文章目录 什么是数据库中间件&#xff1f;Smart-client 模式优点缺点 Proxy 模式优点缺点 单元化架构优点缺点 总结 数据库中间件是连接数据库和应用程序之间的软件层&#xff0c;用于简化数据库管理、提高性能和可伸缩性&#xff0c;同时提供额外的功能和服务。在分布式系统和…

mybatis的二级缓存使用以及禁用

目录 mybatis 二级缓存配置有两处 全局设置 mapper 设置 测试代码 执行结果 源码执行逻辑 创建 SqlSession 二级缓存配置是否添加 解析 cache 标签 XMLMapperBuilder MapperBuilderAssistant CacheBuilder PerpetualCache SerializedCache LoggingCache 将 cach…

Python教程(17)——python模块是什么?python模块详解

Python模块简介 模块是一个包含了Python定义和语句的文件&#xff0c;可用于将功能组织成可重用和可维护的代码块。每个Python文件都可以作为一个模块&#xff0c;模块可以包含变量、函数、类或可执行代码。通过使用模块&#xff0c;我们可以将代码分离成逻辑单元&#xff0c;…

【vtkWidgetRepresentation】第十八期 vtkHoverWidget

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtkHoverWidget,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. vtkHoverWidget vtkHoverWidget用于在呈现窗口中…

Python生成圣诞节贺卡-代码案例剖析【第18篇—python圣诞节系列】

文章目录 ❄️Python制作圣诞节贺卡&#x1f42c;展示效果&#x1f338;代码&#x1f334;代码剖析 ❄️Python制作圣诞树贺卡&#x1f42c;展示效果&#x1f338;代码&#x1f334;代码剖析&#x1f338;总结 &#x1f385;圣诞节快乐&#xff01; ❄️Python制作圣诞节贺卡 …

商户如何去申请支付宝小程序以及对接团购(天财商龙)

申请支付宝小程序的前提&#xff1a;必须要是支付宝实名认证用户&#xff08;要申请企业支付宝&#xff09; 1.申请企业支付宝 申请网址&#xff1a;支付宝商家后台 https://b.alipay.com 企业支付宝必须是法人扫码进行注册 申请资料&#xff1a;企业的营业执照&#xff0c;没…