Vue 实现loading进度条

项目中遇到的,用vue实现下:

  1 <template>
  2   <div class="plLoading">
  3     <div class="plLoadingContent">
  4       <div class="plLoadingLogo">
  5         <img src="http://static.crecgec.com/Kaipiao/loadingLogo.png"/>
  6       </div>
  7       <div class="plLoadingCon">
  8         <div class="plLoadingShow" ref="plLoadingShow" :style="{width: plsStyleWidth}"></div>
  9         <div class="plLoCir" ref="plLoCir" :style="{left: plcStyleLeft}" v-show="plcShow"></div>
 10       </div>
 11       <div class="plLoadingNum" ref="plLoadingNum">0%</div>
 12     </div>
 13     <!--测试用的,使用的时候,在父组件创建一个隐藏的Ddiv,里面放入这个页面用到的所有img-->
 14     <div class="imgsHidden displayNone">
 15       <img class="hImg" src="http://static.crecgec.com/Kaipiao/countDownTitle.png">
 16       <img class="hImg" src="http://static.crecgec.com/Kaipiao/countDown.png">
 17       <img class="hImg" src="http://static.crecgec.com/Kaipiao/countDown1.png">
 18       <img class="bImg" src="http://static.crecgec.com/Kaipiao/background.png">
 19       <img class="hImg" src="http://static.crecgec.com/Kaipiao/loadingLogo.png">
 20     </div>
 21   </div>
 22 </template>
 23
 24 <script type="text/ecmascript-6">
 25   import $ from ‘jquery‘
 26
 27   export default {
 28     props: {
 29       eleH: {
 30         type: String,
 31         default: ‘hImg‘
 32       },
 33       eleB: {
 34         type: String,
 35         default: ‘bImg‘
 36       },
 37       dataIsOk: {
 38         type: Boolean,
 39         default: false
 40       }
 41     },
 42     data () {
 43       return {
 44         plsStyleWidth: 0, // plLoadingShow的初始width
 45         plcStyleLeft: 0, // plLoCir的初始left值
 46         plcShow: true, // plLoCir初始是显示状态
 47         backImgLoading: false, // 背景图片是否加载成功(40)
 48         otherImgLoading: false, // 头部、底部图片加载成功(40)
 49         dataLoading: ‘‘, // 后台返回的数据加载成功(20)
 50         lodingWidth: 0,
 51         otherImgLength: 0,
 52         otherNum: 0,
 53         backImgLength: 0,
 54         backNum: 0
 55       }
 56     },
 57     watch: {
 58       // 整个也没被分为三部分:背景图、其他图片、数据
 59       // 监控otherImgLoading,(其他图片加载成功),this.lodingWidth增加40
 60       otherImgLoading () {
 61         this.lodingWidth = this.lodingWidth + 40
 62       },
 63       // 监控otherImgLoading,(背景图片加载成功),this.lodingWidth增加40
 64       backImgLoading () {
 65         this.lodingWidth = this.lodingWidth + 40
 66       },
 67       // 监控dataIsOk,(数据加载成功,这个有父组件传递过来),this.lodingWidth增加20
 68       dataIsOk () {
 69         if (this.dataIsOk) {
 70           this.lodingWidth = this.lodingWidth + 20
 71         }
 72       },
 73       // 监控lodingWidth的值
 74       lodingWidth () {
 75         if (this.lodingWidth <= 100) {
 76           this.setLoadingWidthTimer(this.lodingWidth)
 77         }
 78       },
 79       // 监控plcStyleLeft(圆球的left值),如果值为484px(自己设置的),表明圆球到了最右边
 80       // 圆球隐藏
 81       plcStyleLeft () {
 82         if (this.plcStyleLeft === ‘484px‘) {
 83           setTimeout(() => {
 84             this.plcShow = false
 85             this.hasScroll()
 86             this.$emit(‘tipShow‘, {loadingIsShow: false})
 87           }, 500)
 88         }
 89       }
 90     },
 91     mounted () {
 92       this.isOtherImgLoading(this.eleH)
 93       this.isBackImgLoading(this.eleB)
 94       this.noScroll()
 95     },
 96     methods: {
 97       // 设置width、left
 98       setLoadingWidthTimer (newPllsWidth) {
 99         if (newPllsWidth <= 40) {
100           setTimeout(() => {
101             this.plsStyleWidth = (500 * newPllsWidth / 100) + ‘px‘
102             this.plcStyleLeft = (475 * newPllsWidth / 100) + ‘px‘
103             this.$refs.plLoadingNum.innerHTML = newPllsWidth + ‘%‘
104           }, 500)
105         } else if (newPllsWidth <= 80) {
106           setTimeout(() => {
107             this.plsStyleWidth = (500 * newPllsWidth / 100) + ‘px‘
108             this.plcStyleLeft = (484 * newPllsWidth / 100) + ‘px‘
109             this.$refs.plLoadingNum.innerHTML = newPllsWidth + ‘%‘
110           }, 1000)
111         } else {
112           setTimeout(() => {
113             this.plsStyleWidth = (500 * newPllsWidth / 100) + ‘px‘
114             this.plcStyleLeft = (484 * newPllsWidth / 100) + ‘px‘
115             this.$refs.plLoadingNum.innerHTML = newPllsWidth + ‘%‘
116           }, 1500)
117         }
118       },
119       // 弹出层显示的时候,没有滚动条
120       noScroll () {
121         document.body.style.cssText = ‘overflow:hidden;‘
122       },
123       // 弹出层消失后,滚动条显示
124       hasScroll () {
125         document.body.style.cssText = ‘overflow:auto;‘
126       },
127       isOtherImgLoading (ele) {
128         this.otherImgLength = $(‘.‘ + ele).length
129         let _this = this
130         if (this.otherImgLength > 0) {
131           $(‘.‘ + ele).each(function () {
132             $(this).on(‘load‘, function () {
133               _this.otherNum = _this.otherNum + 1
134               if (_this.otherImgLength === _this.otherNum) {
135                 _this.otherImgLoading = true
136               }
137             })
138           })
139         } else {
140           this.otherImgLoading = true
141         }
142       },
143       isBackImgLoading (ele) {
144         this.backImgLength = $(‘.‘ + ele).length
145         let _this = this
146         if (this.backImgLength > 0) {
147           $(‘.‘ + ele).each(function () {
148             $(this).on(‘load‘, function () {
149               _this.backNum = _this.backNum + 1
150               if (_this.backImgLength === _this.backNum) {
151                 _this.backImgLoading = true
152               }
153             })
154           })
155         } else {
156           this.backImgLoading = true
157         }
158       }
159     }
160   }
161 </script>
162
163 <style>
164   .plLoading{
165     width: 100%;
166     height: 100%;
167     position: absolute;
168     left: 0;
169     top: 0;
170     z-index: 100;
171     background-color: #00101d;
172   }
173   .plLoadingContent{
174     width: 500px;
175     height: 220px;
176     position: absolute;
177     margin: 0 auto;
178     top: 50%;
179     left: 50%;
180     margin-top: -110px;
181     margin-left: -250px;
182   }
183   .plLoadingLogo{
184     height: 60px;
185   }
186   .plLoadingCon{
187     width: 500px;
188     height: 16px;
189     margin-top: 100px;
190     border-radius: 8px;
191     background-color: #222222;
192   }
193   .plLoadingShow{
194     transition: width .5s;
195     height: 16px;
196     border-radius: 8px;
197     background-color: #0062b2;
198     position: absolute;
199   }
200   .plLoCir{
201     transition: left .5s;
202     position: absolute;
203     width: 16px;
204     height: 16px;
205     border-radius: 8px;
206     background-color: #0062b2;
207     box-shadow: 0 0 20px #008cff;
208   }
209   .plLoadingNum{
210     font-size: 14px;
211     color: #0062b2;
212     margin-top: 20px;
213   }
214   .displayNone{
215     display: none;
216   }
217 </style>
时间: 2024-10-12 00:41:06

Vue 实现loading进度条的相关文章

Android loading进度条使用简单总结

在这里,总结一下loading进度条的使用简单总结一下. 一.说起进度条,必须说说条形进度条,经常都会使用到嘛,特别是下载文件进度等等,还有像腾讯QQ安装进度条一样,有个进度总给人良好的用户体验. 先来找图看看,做这个图完成不用图片就可以做到了. 看下xml布局文件,其实就是直接用xml写的在加两个属性设置一下就好了,一个style,另一个是background. <ProgressBar android:id="@+id/pb_progressbar" style="

模态框的理解 ,jQ: loading,进度条, 省级联动 ,富文本编辑器 表单验证 插件

模态框: 打开一个弹框 不关闭它就不能做框外的操作 必须关闭或弹出另外的弹框 加载延迟loading + 进度条只要有请求 就处理一下监控ajax 全局事件jquery: 开始     $('#box').ajaxStart() 多个ajax共享一个Start 发送 .ajaxSend() 成功 .ajaxSuccess() 完成 . ajaxComplete() 完成后有错误 .ajaxError() 停止 .ajaxStop()多个ajax共享一个Stop Nprogress:进度条引入 c

JS Loading 进度条实现思路

有时候访问网站,在加载的过程中经常会出现显示加载进度的进度条,或者类似的一个旋转的菊花图.如果留心的话不难发现,那些进度条出现的加载进度数字几乎每次都是那几个数字,30% -> 50% -> 80%,这样.这样会极大提高用户的体验,既能告知用户加载进度,让等待过程不再那么无聊,又能防止用户以为网站有问题而直接离开站点.但是这个进度条是怎么实现的呢? 一般在网络情况不好的情况下,加载的首页又比较大的时候就可以使用进度条或者一些有意思的动画.一般的实现方式刚开始时给整个页面加个蒙板层,将加载过程覆

Unity3d中制作异步Loading进度条所遇到的问题

背景 通常游戏的主场景包括的资源较多,这会导致载入场景的时间较长.为了避免这个问题,能够首先载入Loading场景.然后再通过Loading场景来载入主场景. 由于Loading场景包括的资源较少,所以载入速度快.在载入主场景的时候通常会在Loading界面中显示一个进度条来告知玩家当前载入的进度. 在Unity中能够通过调用Application.LoadLevelAsync函数来异步载入游戏场景,通过查询AsyncOperation.progress的值来得到场景载入的进度. 尝试--遇到问

异步加载场景和Loading进度条制作

在切换场景的时候,直接 用 application.LoadLevel()这个方法,如果加载的场景资源过多的话,会卡死一段时间的. 所以,用一个过渡的场景的话,体验会好一点. 那么就先开始做一个过渡的场景(名字叫做:Loading)吧..(比如像下面酱紫,百度的一张图片) 要切换场景的时候,Application.LoadLevel("Loading"):就先切换到这个Loading场景,Loading场景资源少,就一个背景图和一个slider,所以,直接同步加载过来也很快的 然后,在

异步加载场景及Loading进度条制作

实现功能:点击开始游戏以后UI界面进入Loading界面,Loading结束以后自动进入游戏场景. 在这之前先在Build Settings中Add要使用的场景 在场景A中添加StartGame方法: Application.LoadLevel(1)://同步加载Loading界面(因为Loading界面资源较少速度快所以此处用同步方法) 在Loading场景中加入进度条图片:分为上下两层,上层负责显示进度 将上层的进度条Image组件中的Image Ttpe改为Filled 接下来再Loadi

VUE 超好看气泡进度条组件

超好看的气泡进度条, 已封装成组件. 二话不说先上图 ↓↓↓ 一, 先将这张图片放入 assets 文件夹内 (因为是透明背景图片,所以用箭头框起来了) ↓↓↓ →← ↑↑↑ 二, 在 components 文件夹内新建一个 progress-bar.vue 文件 Copy 下面这段代码进去 <template> <div class="template-view"> <div class="progressbar-card">

unity3d___UGui中如何创建loading...进度条

http://blog.sina.com.cn/s/blog_e82e8c390102wh2z.html 实现方法:通过Image组件中Image Type属性中Fill Amount,通过代码改变Fill Amount的值就可以实现进度条效果 首先在Hierarchy中创建UI>Image,调整Image Type为Filled,Fill Method为Horizontal,拉动Fill Amount查看图片效果 代码篇:

JavaScript之Loading进度条

<title>网页loading</title> <script language="javascript"> function setSB(v, el) { var ie5 = (document.all && document.getElementsByTagName); if (ie5 || document.readyState == "complete") { filterEl = el.children