阅读 183

图片上传、删除和放大预览,jQuery+layui带你来实现

jQuery老矣,尚能战否?

最近一段时间经常看到这个问题,也见过各式前端开发人员的回答,作者本人觉得在大前端时代,项目模块化开发的今天jQuery还在持续发热,为什么这么说?尽管现在有很多公司有使用Vue、React框架进行项目开发,但对于过去使用jQuery开发的老项目,在修复问题和实现新需求上还是要使用jQuery技术栈,但不得不说,这是一个从jQuery向Vue、React转型的过程。

说到jQuery,就需要提一下BootStrap和layui框架,两者都是jQuery时代的产物,和jQuery相辅相成开发出了很多优秀的项目,尽管layui在今年十月份关闭了官网,但在Gitee(码云)上还继续维护,记得最初看到这个消息的时候,作者内心澎湃,不得不感叹一声时代在变迁,技术在进步!

本文使用jQuery、layui和BootStrap写了一个支持多图片上传、单/多图片删除、本地放大进行预览的案例,在实际项目中,如果有涉及到图片上传,那基本上就离不开这些功能,既然是重复的需求,就可以拿出来写个案例供以后使用,希望读者看得尽兴。

案例引用到的文件如下,都是引用的外部cdn资源,所以本案例所写的代码可以直接复制到本地运行来查看效果。

    <!-- 引入bootstrap的css文件 -->     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">     <!-- 引入bootstrap的js文件 -->     <script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js" integrity="sha384-nvAa0+6Qg9clwYCGGPpDQLVpLNn0fRaROjHqs13t4Ggj3Ez50XnGQqc/r8MhnRDZ" crossorigin="anonymous"></script>     <!-- 引入jQuery文件 -->     <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>     <!-- 引入layui的css文件 -->     <link rel="stylesheet" href="https://layui.itze.cn/layui-v2.6.8/layui/css/layui.css">     <!-- 引入layui的js文件 -->     <script src="https://layui.itze.cn/layui-v2.6.8/layui/layui.js"></script> 复制代码

案例的样式文件如下,都是对imgContainer图片盒子的样式代码。

    <style>         .imgContainer div {             position: relative;             display: inline-block;         }                  .imgContainer img {             width: 200px;             height: 200px;             margin: 10px;         }         /* 每张图片的X删除按钮  通过定位来实现 */                  .imgContainer span {             position: absolute;             top: 5%;             right: 5%;             background-color: pink;             padding: 1px;             display: none;             cursor: pointer;         }     </style> 复制代码

本文案例布局是使用的BootStrap框架,在日常开发中,使用BootStrap框架能帮助我们节省很多的HTML和CSS代码,当然前提是要清楚BootStrap框架提供了哪些类供我们直接使用。

    <div class="container-fluid">         <div class="row form-table-row">             <div class="col-sm-6 form-table-col">                 <div class="form-group form-flex">                     <button class="btn btn-primary" id="selectFile">选择文件</button>                     <button class="btn btn-primary" id="deleteImg">删除全部</button>                 </div>             </div>         </div>         <div class="row form-table-row">             <div class="col-sm-6 form-table-col">                 <div class="form-group form-flex">                     <!--  imgContainer盒子用于预览图片  -->                     <div class="imgContainer" style="">                     </div>                 </div>             </div>         </div>         <div class="row form-table-row">             <div class="col-sm-6 form-table-col">                 <div class="form-group form-flex">                     <div class="" style="">                         <!-- 初始隐藏上传图片按钮,在选择了图片后进行显示 -->                         <button class="btn btn-primary" id="uploadImg" style="display: none">上传</button>                     </div>                 </div>             </div>         </div>     </div> 复制代码

下面是这个案例的重点JS代码,虽然说并不复杂,但作者在自己实现的过程中,发现如单/多图片上传、预览功能、单张图片的删除功能等,还是有些细节需要注意,因为代码注释写的比较详细,如果读者有疑惑的地方,可以多看layui框架的官方文档。

    <script>         var uploadInst;         layui.use('upload', function() {             var upload = layui.upload;             //执行实例             uploadInst = upload.render({                 elem: '#selectFile',                 // url: '/upload/', //上传接口,根据自己实际情况进行配置                 auto: false, // 关闭选择文件后的自动上传                 acceptMime: 'image/*',                 choose: function(obj) {                     var files = obj.pushFile();                     //预读本地文件示例,不支持ie8                     obj.preview(function(index, file, result) {                         // 每选择一张图片,就往imgContainer盒子里追加一个div                         $('.imgContainer').append(`<div><img src="${result}"><span onClick="deleteOne(this)">X<span></div>`);                         // 展示上传按钮                         $('#uploadImg').css('display', 'inline-block');                         // 监听删除全部图片时间                         $('#deleteImg').on('click', function() {                             // delete files[index]; // 删除文件队列中的文件                             $('.imgContainer')[0].innerHTML = '';                             uploadInst.config.elem.next()[0].value = ''; // 允许覆盖选择同一个文件                             if ($('.imgContainer img').length == 0) {                                 $('#uploadImg').css('display', 'none');                             }                         });                         // 鼠标经过图片所在盒子就显示左上角的X                         $('.imgContainer div').on('mouseenter', function(e) {                             $($(this)[0].children[1]).css('display', 'inline-block');                         });                         // 鼠标离开图片所在盒子就隐藏左上角的X                         $('.imgContainer div').on('mouseleave', function(e) {                             $($(this)[0].children[1]).css('display', 'none');                         });                         // 监听图片点击事件                         $('.imgContainer div img').on('click', function() {                             layer.open({                                 type: 4,                                 tips: 1, // 弹出层在下方                                 content: ['<img style="width:400px;height:400px" src="' + $(this)[0].src + '">', this],                                 shade: 0, // 不显示遮罩                                 area: ['450px', '430px'], // 设置宽高                                 time: 1000 // 1秒后自动隐藏弹出层                             });                         })                     });                 },                 done: function(res) {                     //上传完毕回调                 },                 error: function() {                     //请求异常回调                 }             });         });         // 删除单张照片         function deleteOne(that) {             uploadInst.config.elem.next()[0].value = '';             $($(that)[0].parentNode)[0].innerHTML = '';             if ($('.imgContainer img').length == 0) {                 $('#uploadImg').css('display', 'none');             }         }     </script> 复制代码

以上就这篇博客的所有内容啦,希望各位读者能自己动手试一试,就像现在,作者坐在电脑前,写着这个案例的代码,外面一群人在吃烧烤在起哄,在别人玩乐的时间里咱们坚持学习,相信功夫不负有心人。如果读者发现代码有错误的地方或自己有更高明的做法,欢迎评论区留言讨论,如果觉得不错,可以点赞转发给更多的人看到哦,转载请注明出处,感谢~

作者公众号:程序的艺术,欢迎关注一起探寻更多的程序艺术\


作者:不在不再
链接:https://juejin.cn/post/7041846461134290952

文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐