直接在html中引入Vue.js的cdn来实现一个简单的上传图片组件

news2024/11/26 10:42:56

摘要

当使用 Vue.js 的 CDN 来实现一个简单的上传图片组件时,你可以利用 Vue 的数据绑定和事件处理能力,结合 HTML 和 CSS,轻松地创建一个交互式的图片上传界面。以下是一个示例:

代码结构

在这里插入图片描述

index.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Vue上传图片</title>
        <script src="vue.min.js"></script>
        <script src="axios.min.js"></script>
        <style>
            body {
                font-family: Arial, sans-serif;
                margin: 0;
                padding: 0;
                background: #f1f1f1;
            }
            
            .container {
                width: 100%;
                margin: 50px auto 0;
            }
            
            .container .upload-pannel {
                width: 500px;
                background: #fff;
                border-radius: 10px;
                margin: 20px auto 0;
                overflow: hidden;
            }
            .container .upload-pannel .pannel-title {
                width: 90%;
                margin: 20px auto;
                font-size: 15px;
                color: #333;
                font-weight: bold;
                display: block;
            }
            .container .upload-pannel .file-select{
                width: 90%;
                height: 250px;
                border: 2px dashed rgb(59,94,225);
                background: rgba(59,94,225,0.05);
                margin: 20px auto;
                display: block;
                border-radius: 10px;
                position: relative;
            }
            .container .upload-pannel input[type="file"]{
                width: 100%;
                height: 100%;
                opacity: 0;
                position: absolute;
                left: 0;
                top: 0;
            }
            .container .upload-pannel .upload-icon{
                width: 40px;
                height: 35px;
                display: block;
                margin: 0 auto;
                line-height: 250px;
            }
            .container .upload-pannel .upload-icon img{
                width: 40px;
                height: 35px;
            }
            .container .upload-pannel .file-select .upload-text{
                text-align: center;
                display: block;
                font-size: 14px;
                color: #999;
                line-height: 230px;
            }
            .container .upload-pannel .upload-progress{
                width: 90%;
                height: 60px;
                background: #f1f1f1;
                margin: 20px auto;
                border-radius: 10px;
                overflow: hidden;
            }
            .container .upload-pannel .upload-progress .progress-bar-container {
                position: relative;
                width: 90%;
                height: 10px;
                margin: 25px auto;
                background: #f1f1f1;
                border-radius: 10px;
                overflow: hidden;
            }
            
            .container .upload-pannel .upload-progress .progress-bar {
                height: 100%;
                background: rgb(59,94,225);
                border-radius: 10px;
                transition: width 0.3s ease-in-out;
            }
            
            .container .upload-pannel .upload-progress .progress-text {
                position: absolute;
                top: 50%;
                left: 50%;
                transform: translate(-50%, -50%);
                font-size: 12px;
                color: #fff;
            }
            
            .container .upload-pannel .imgPreview{
                width: 90%;
                margin: 20px auto;
                display: block;
            }
        
        </style>
    </head>
    <body>
        <div id="app"></div>
        <script>
            new Vue({
                el: '#app',
                data() {
                return {
                    imgUrl: '',
                    uploadProgress: 0,
                    uploadProgressbg: false
                };
              },
              methods: {
                async handleImageUpload(event) {
                    const file = event.target.files[0];
                    if (file) {
                        
                        // 上传图片
                        this.uploadProgressbg = true;
                        const formData = new FormData();
                        formData.append('image', file);
                        
                        try {
                            const response = await axios.post('upload.php', formData, {
                            onUploadProgress: progressEvent => {
                                
                                // 改变进度条
                                this.uploadProgress = Math.round((progressEvent.loaded / progressEvent.total) * 100);
                            },
                        });
                        
                        const imageUrl = response.data.url;
                        if (imageUrl) {
                            
                            // 上传成功
                            this.imgUrl = imageUrl;
                        }
                        
                        } catch (error) {
                            
                            // 上传失败
                            console.error('Error uploading image:', error);
                        } finally {
                        
                        // 隐藏进度条
                        setTimeout(() => {
                            this.uploadProgress = 0;
                            this.uploadProgressbg = false;
                        }, 1500);
                    }
                  }
                },
            },
            template: `
                <div class="container">
                        <div class="upload-pannel">
                            <span class="pannel-title">Vue.js 图片上传</span>
                            <span class="file-select">
                                <input type="file" @change="handleImageUpload">
                                <span class="upload-icon">
                                    <img src="upload.png" />
                                </span>
                                <span class="upload-text">仅支持上传jpg、png、gif格式的图片</span>
                            </span>
                            <div class="upload-progress" v-if="uploadProgressbg == true">
                                <div class="progress-bar-container" :class="{ active: uploadProgressbg }">
                                    <div class="progress-bar" :style="{ width: uploadProgress + '%' }"></div>
                                <span class="progress-text" v-if="uploadProgressbg">{{ uploadProgress }}%</span>
                            </div>
                        </div>
                        <img v-if="imgUrl" :src="imgUrl" class="imgPreview">
                    </div>
                </div>`,
            });
        </script>
    </body>
</html>

动图演示

在这里插入图片描述

作者

TANKING

源码下载

https://afdian.net/item/ffa3292a337c11ee9a8c5254001e7c00

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

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

相关文章

springcloud3 springcloud stream的学习以及案例

一 springcloud stream的作用 1.1 springcloud stream作用 stream屏蔽底层消息中间件的差异&#xff0c;降低切换成本&#xff0c;统一消息的编程模型。 stream中的消息通信模式遵循了“发布-订阅”模式。 1.2 Binder作用 通过定义绑定器Binder作为中间层&#xff0c;实现…

tomcat7.exe 启动闪退解决

标题tomcat7.exe 启动闪退解决 双击tomcat7.exe启动&#xff0c;但是出现闪退问题&#xff0c;无法启动tomcat 解决&#xff1a; 1.解决 tomcat7.exe 启动闪退解决 第一步&#xff1a;双击打开tomcat7w.exe 文件 如果出现 “指定的服务未安装。 Unable to open the service ‘…

编译iOS系统可用的FFmpeg

在进行编译之前&#xff0c;需要做一些准备工作安装必备文件&#xff1a; 1 安装 gas-preprocessor FFmpeg-iOS-build-script 自动编译脚本需要使用到 gas-preprocessor . 执行 sudo git clone https://github.com/bigsen/gas-preprocessor.git /usr/local/bin/gas sudo c…

工作每天都在用的 DNS 协议,你真的了解么?(文末有惊喜,别错过)

♥ 前 言 我们经常访问一些网址的时候&#xff0c;浏览器里输入类似于 www.baidu.com 这样的地址&#xff0c;那么在浏览器里输入这个地址---> 百度服务器给我们返回这个百度的页面&#xff0c;中间的过程是什么样的呢&#xff1f; 带着这个问题&#xff0c;我们一起来解…

HECI-Securtiy 防火墙路由技术

目录 一、防火墙路由基本原理 1.路由分类 2.路由优先级 3.路由查询先后顺序 4.静态路由基本原理 &#xff08;1&#xff09;指定出接口场景 &#xff08;2&#xff09;指定下一跳地址场景 5.静态路由与多出口 &#xff08;1&#xff09;主备备份 &#xff08;2&#…

FastSAM初体验,比SAM快50倍

一、FastSAM介绍 1.简介 由美国Meta公司提出的能够“分割一切”的视觉基础大模型SAM引起了较大影响&#xff0c;为探索通用视觉大模型提供了一个新的方向。 2023年6月22日&#xff0c;中科院自动化所的研究团队针对“分割一切”任务&#xff0c;提出了FastSAM方法。中科院自动…

Boost开发指南-4.3optional

optional 在实际的软件开发过程中我们经常会遇到“无效值”的情况&#xff0c;例如函数并不是总能返回有效值&#xff0c;很多时候函数正确执行了&#xff0c;但结果却不是合理的值。如果用数学语言来解释&#xff0c;就是返回值位于函数解空间之外。 求一个数的倒数&#xf…

Twitter霸屏:掌握社交流量密码

Twitter群推王发现&#xff0c;Twitter以其简短而有力的信息传递方式而著名&#xff0c;其中字符限制仅有280个。这意味着在Twitter的世界中&#xff0c;迅速高效的沟通至关重要。拥有约321亿月活跃用户的Twitter&#xff0c;成为塑造资源品牌知名度的强大平台。如今&#xff0…

PHP智能人才招聘网站mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP智能人才招聘网站 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 下载地址 https://download.csdn.net/download/qq_41221322/88199392 视频演示 PH…

Alpine Ridge控制器使其具备多种使用模式 - 英特尔发布雷电3接口:竟和USB Type-C统一了

同时又因为这建立在Type-C的基础上&#xff0c;雷电3也将利用现有的标准Type-C线缆引入有源支持。当使用Type-C的线缆时&#xff0c;雷电的速度就降到了20Gbps全双工——这与普通的Type-C的带宽相同——这是为了成本牺牲了一些带宽。可以比较一下&#xff0c;Type-C线的成本只有…

基于Kubeadm部署k8s集群:下篇

继续上篇内容 目录 7、安装flannel 8、节点管理命令 三、安装Dashboard UI 1、部署Dashboard 2、开放端口设置 3、权限配置 7、安装flannel Master 节点NotReady 的原因就是因为没有使用任何的网络插件&#xff0c;此时Node 和Master的连接还不正常。目前最流行的Kuber…

【内网穿透】实现无公网IP远程连接Linux服务器并安装部署MongoDB数据库

【内网穿透】实现无公网IP远程连接Linux服务器并安装部署MongoDB数据库 ​ 憧憬Blog主页 在强者的眼中&#xff0c;没有最好&#xff0c;只有更好。 全栈开发领域优质创作者&#xff0c;阿里云专家博主 文章目录 【内网穿透】实现无公网IP远程连接Linux服务器并安装部署MongoDB…

智慧工地源码,Spring Cloud+ Vue+UniApp开发,微服务架构

智慧工地源码&#xff0c;智慧工地云平台源码 智慧工地APP源码 智慧工地的核心是数字化&#xff0c;它通过传感器、监控设备、智能终端等技术手段&#xff0c;实现对工地各个环节的实时数据采集和传输&#xff0c;如环境温度、湿度、噪音等数据信息&#xff0c;将数据汇集到云…

扎实推动产学研深入合作,携手共谋高质量发展新篇

近日&#xff0c;华南理工大学自动化学院胡跃明教授等一行4人莅临科东软件&#xff0c;双方就“产学研融合”进行会谈交流。在科东软件总经理余世清等人的陪同下&#xff0c;华工胡教授一行参观了科东软件展厅&#xff0c;对科东软件自主研发的Intewell工业实时操作系统及其在智…

xxx酒业有限责任公司突发环境事件应急预案WORD

导读&#xff1a;原文《xxx酒业有限责任公司突发环境事件应急预案word》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 目 录 1 总则 1.1 编制目的 1.2 编制…

JavaFx异常: Not on FX application thread; currentThread = Timer-0

我的定时器任务中有两个控件&#xff1a; FXML TextArea Display; FXML Label Label_Display; 执行下方代码会抛出&#xff1a;Exception in thread "Timer-0" java.lang.IllegalStateException: Not on FX application thread; currentThread Timer-0 Timer_tas…

企业信息查询,一站式数据服务

企业信息查询对销售人员是具有非常重要的意义&#xff0c;通过查询客户的基本信息&#xff0c;将这些转化为筛选客户的标准&#xff0c;这一过程可以理解为拓客。市面上这么多常见查询方法&#xff0c;如&#xff1a;搜索引擎查询&#xff08;百度、搜狗等&#xff09;、企业黄…

数字万用表测量基础知识--使用DMM测量电压

概览 DMM&#xff08;即数字万用表&#xff09;是一种电气测试和测量仪器&#xff0c;可测量直流和交流信号的电压、电流和电阻。本文介绍如何正确使用和理解数字万用表(DMM)。 使用DMM测量电压 实际上&#xff0c;每个DMM都具有直流和交流测量功能。电压测试通常用于测试和验…

命名实体识别方法:W2NER

一、介绍 代码:https://github.com/ljynlp/W2NER 论文:Unified Named Entity Recognition as Word-Word Relation Classification(武汉大学) 在平铺实体、重叠实体、非连续实体的数据集上,取得了SOTA的效果 建模方式:word-word的关系分类(中文:字-字的关系分类) …

编程中的宝藏:二分查找

二分查找 假设你需要在电话簿中找到一个以字母 “K” 开头的名字&#xff08;虽然现在谁还在用电话簿呢&#xff01;&#xff09;。你可以从头开始翻页&#xff0c;直到进入以 “K” 打头的部分。然而&#xff0c;更明智的方法是从中间开始&#xff0c;因为你知道以 “K” 打头…