分享一个上传按钮

news2024/11/26 13:43:47

先看效果:
在这里插入图片描述
再看代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传</title>
    <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200">
    <style>
        html, body { height: 100%; }

        body {
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            color: lightblue;
        }

        label {
            cursor: pointer;
        }

        .icon {
            font-size: 96px;
            font-variation-settings: 'OPSZ' 96, 'FILL' 0.0;

        &.uploading {
             animation: hithere 1s ease infinite;
         }

        &.done {
             animation: bounce 0.6s ease forwards;
         }
        }

        #f { display: none; }

        @keyframes hithere {
            30% { transform: scale(1.2); }
            40%, 60% { transform: rotate(-20deg) scale(1.2); }
            50% { transform: rotate(20deg) scale(1.2); }
            70% { transform: rotate(0deg) scale(1.2); }
            100% { transform: scale(1); }
        }

        @keyframes bounce {
            0% { transform:translateY(0%); }
            20% { transform:translateY(-15%); }
            40% { transform:translateY(0%); }
            50% { transform:translateY(-7%); }
            70% { transform:translateY(0%); }
            90% { transform:translateY(-3%); }
            100% { transform:translateY(0); }
        }
    </style>
</head>
<body>
<label for="f">
    <span class="material-symbols-outlined icon" id="icon">cloud_upload</span>
</label>
<input type="file" id="f">
</body>
<script>

    const slice = (file, start, end) => {
        const sliceExec = file.slice || file.mozSlice || file.webkitSlice;
        return sliceExec(start, end);
    };

    const upload = (file) => {
        const filename = file.name,
            size = file.size,
            numSlices = 40,
            step = size / numSlices,
            totalDemoUploadTime = 4000,
            demoUploadTimeout = totalDemoUploadTime / numSlices;

        document.getElementById('icon').innerHTML = 'cloud';
        document.getElementById('icon').classList.add('uploading');

        try {
            let sendslice = (start, id = 0) => {
                let end = start + step < size ? start + step : size;
                let progress = Math.round(end / size * 100) / 100;
                document.getElementById('icon').style.fontVariationSettings = `'OPSZ' 96, 'FILL' ${progress}`;

                if (end < size) return setTimeout((end, id) => sendslice(end, id), demoUploadTimeout, end, id);

                // done
                document.getElementById('icon').innerHTML = 'cloud_done';
                document.getElementById('icon').classList.remove('uploading');
                document.getElementById('icon').classList.add('done');

                // 重置
                setTimeout(() => {
                    document.getElementById('icon').style.fontVariationSettings = `'OPSZ' 96, 'FILL' 0.0`;
                    document.getElementById('icon').innerHTML = 'cloud_upload';
                    document.getElementById('icon').classList.remove('done');
                }, 2000);
            };

            sendslice(0);

        } catch (err) {
            document.getElementById('icon').innerHTML = 'cloud_off';
            document.getElementById('icon').classList.remove('uploading');
            console.warn(err);
        }
    }

    document.getElementById("f").addEventListener("change", (e) => {
        if (e.target.files.length == 0) return;
        upload(e.target.files[0])
    });
</script>
</html>

不要害怕,文件没有传上任何地方,这里只是模拟一下而已~

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

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

相关文章

面对Android开发高薪诱惑,如何拿到大厂offer?

前言 出来打工最看重的就是薪资&#xff0c;作为一名5年开发经验的Android人员。在如今的大环境中薪资一降再降&#xff0c;还没人要。技术还还算可以但是面试一直被刷下来&#xff1f;这是为什么&#xff0c;本篇我们来聊聊Android开发面试中的关键。 面试过程 通常面试过程…

【Vue3】学习笔记-watch函数

与Vue2.x中watch配置功能一致 两个小“坑”&#xff1a; 监视reactive定义的响应式数据时&#xff1a;oldValue无法正确获取、强制开启了深度监视&#xff08;deep配置失效&#xff09;。监视reactive定义的响应式数据中某个属性时&#xff1a;deep配置有效。 <template&…

数据分析三大件

一、jupyter的基本使用 二、Numpy 2.1 numpy的创建 #使用array&#xff08;&#xff09;创建一个多维数组 import numpy as np arrnp.array([1,2,3])2.2 numpy的属性 修改数组的元素类型 2.3 索引和切片 &#xff08;1&#xff09;行切片 &#xff08;2&#xff09;列切片 注…

高压线路距离保护程序逻辑原理(二)

二、选相子程序原理 距离保护的故障处理程序逻辑的第一步是判别故障相&#xff0c;即选相。只有判定了故障的种类及相别&#xff0c;才能确定阻抗计算应取用什么相别的电流和电压&#xff0c;例如BC相故障取和&#xff0c;A相接地故障取和十3&#xff08;详见第二章第二节解微…

远程桌面连接已开启无法连接?快解析助力远程访问

一、如何开启远程桌面 查询并记录远程计算机的IP&#xff0c;点击“开始——运行”&#xff0c;输入“cmd”命令后回车&#xff0c;准确查看并记录ipadress在计算机上右键&#xff0c;选择属性&#xff0c;点击远程设置&#xff0c;在弹出来的设置界面中&#xff0c;勾选“允许…

HFUT Data Structure Experiment: SkipList

写给我的学弟 如果你看到了这个题&#xff0c;赶快跑&#xff0c;千万别选。 这个题的图形化会让你非常痛苦。并且这道题只有小小85分&#xff0c;为啥不换个85分的更简单的&#xff1f;或者换个90分以上的题不好吗。 如果你单单想学习一下这个数据结构&#xff0c;那挺好的&…

xftp下载安装及简单使用

一、xftp简介 Xftp是一个功能强大的SFTP、FTP 文件传输软件。使用了 Xftp 以后&#xff0c;MS Windows 用户能安全地在 UNIX/Linux 和 Windows PC 之间传输文件。Xftp 能同时适应初级用户和高级用户的需要。它采用了标准的 Windows 风格的向导&#xff0c;它简单的界面能与其他…

GEACC-5595交换机

GE反射内存交换机特性 l 1 到 8 口可配置SFP收发器 l 大可级联256个节点 l 自动旁路故障节点 l 自动旁路模式可选 l 配置可选节点传输距离达10公里 l 可插拔收发器支持单模或者多模模式 l 1x8 口或者2x4 口 l 可以通过串口了解状态进行设置 概述 GE反射内存交换机&#xff08;以…

Linux-- . 和 ..

一、含义&#xff1a; . :表示当前路径 .. :表示直接上级路径 二、验证&#xff1a; 三、..用来返回上级目录&#xff0c;.有上面作用&#xff1f; 我们在Linux下写代码后生成的可执行程序a.out,我们运行它时的指令是./a.out 故使用.可以限定我们要执行的可执行程序在什么…

C语言编程—内存管理

C语言中的动态内存管理。C语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。 在C语言中&#xff0c;内存是通过指针变量来管理的。指针是一个变量&#xff0c;它存储了一个内存地址&#xff0c;这个内存地址可以指向任何数据类型的变量&…

JavaScript 中的行继续符

这个简短的 JavaScript 文章涵盖了 JavaScript 中的词法语法。 此外&#xff0c;还将使用各种新的换行技术深入介绍字符串&#xff0c;以及在处理这些字符串时如何处理换行符。 JavaScript 中的词法语法 在计算机科学中&#xff0c;词法语法是一种描述标记句法的技术语法。 该…

Spring Boot中的Profile:原理、用法与示例

Spring Boot中的Profile&#xff1a;原理、用法与示例 前言 Spring Boot 是一个快速开发 Spring 应用程序的框架&#xff0c;它提供了很多有用的功能和特性。其中&#xff0c;Profile 是一个常用的功能&#xff0c;它可以根据不同的环境配置来加载不同的配置文件&#xff0c;…

轻量级网络CNN系列(二):GhostNetV2

欢迎关注公众号 – AICV与前沿 欢迎关注公众号 – AICV与前沿 回顾 &#xff08;1&#xff09;Depthwise与Pointwise卷积 DW卷积的一个卷积核负责一个通道&#xff0c;例如对一个355的图片&#xff0c;输出通道数要与输入通道数相同&#xff0c;则普通卷积操作需要3333的卷积…

记一次Smartbi登录绕过

FOFA&#xff1a;app"SMARTBI" 找到目标站点验证是否存在漏洞 域名后面拼接以下路径 /smartbi/vision/RMIServlet 有下面的回显说明有可能存在漏洞(有些站点不行) 用Hackbar发送post请求 失败的话更改用户:system,public,service三个内置用户都尝试一遍 发送请求…

AutoSAR系列讲解(入门篇)3.6-RTE与Interface接口

RTE与Interface接口 一、Interface接口总览 二、AutoSAR接口 三、标准接口 四、标准AutoSAR接口 一、Interface接口总览 少说废话&#xff0c;先上图 上图将所有的接口以及其分布的位置都详细的标识了出来&#xff0c;还是用的原来的那张ECU的图添加的&#xff0c;方便大家…

用友NC uapjs RCE漏洞复现(CNVD-C-2023-76801)

0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具&#xff0c;用友NC提供了一系列业务管理模块&#xff0c;包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等&#xff0c;帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友NC及N…

基于Java+Vue前后端分离医学生在线学习交流平台设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

条件变量wait的另一种形式

flag.wait()里面可以有两个参数&#xff0c;第一个是锁&#xff0c;第二份一般是lambda表达式之类的谓词&#xff0c;其返回值一般是bool类型。 此时由于lambda表达式返回不为真&#xff0c;所以此时仍在等待。 此时lambda表达式就算正常的。

java学习记录之struts2注解校验ognl自定义拦截器

Result: 在struts中,Reuslt用于处理Action返回的结果.将我们之前在Servlet中耦合的功能代码.解耦了.将结果处理的代码封装到了Result中.Struts2已经预置了一些处理类.Dispatcher 转发Redirect 重定向redirectAction 重定向到一个Action(与redirect配合)plaintext 纯文本stream …

帆软report10.0,从人工智能到人工+智能,day1

前言&#xff1a; 最近在全基地推进品质CTQ&#xff0c;这个功能说实话在一年前已经开发完成了&#xff0c;中间修修补补&#xff0c;跌跌代代不下10-20版。看起来好像有点夸张吧。其实说实话&#xff0c;真正的BI系统用好&#xff0c;是需要业务人员和IT部门反复碰撞的。一年前…