全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

vue实现页面加载动画效果

我们经常看到数据未出现时,页面中会有一条提示消息, 页面正在加载中,如何实现该效果呢 ,请看下面代码

<template>
 <section class="page" v-if="option" 
  :style="{background: option.background,color: option.color||'#fff'}"  
  :class="{'page-before': option.index < currentPage,
    'page-after': option.index > currentPage,
    'page-current': option.index === currentPage}">
  <div :class="{'all-center': option.isCenter}">
   <slot></slot>
  </div>
 </section>
 <section class="page" v-else>页面正在渲染中。。。</section>
</template>

有木有感觉很简单
下面上点干货,实现页面的动画效果

<template>
 <nav class="controller">
  <button v-if="option.arrowsType" class="prev-btn" :class="{moving:option.arrowsType === 'animate'}" @click="changePage(prevIndex)"></button>
  <ul v-if="option.navbar">
   <li v-for="index in pageNum" @click="changePage(index)" :class="{current:option.highlight && index === currentPage}" :key="'controller-'+index" :data-index="index" class="controller-item"></li>
  </ul>
  <button v-if="option.arrowsType" class="next-btn" :class="{moving:option.arrowsType === 'animate'}" @click="changePage(nextIndex)"></button>
 </nav>
</template>

<script>
export default {
 name: 'page-controller',
 props: {
 pageNum: Number,
 currentPage: Number,
 option: {
  type: Object,
  default: {
  arrowsType: 'animate',
  navbar: true,
  highlight: true,
  loop: true  //是否开启滚动循环
  }
 }
 },
 methods: {
 changePage (index) {
  this.$emit('changePage', index);
 }
 },
 computed: {
 nextIndex () {
  if (this.currentPage === this.pageNum) {
  if(this.option.loop){
   return 1
   }else{
   return this.pageNum
   }
  } else {
  return this.currentPage + 1;
  }
 },
 prevIndex () {
  if (this.currentPage === 1) {
  if(this.option.loop){
   return this.pageNum
   }else{
   return 1
   }
  } else {
  return this.currentPage - 1;
  }
 }
 },
 created () {
 if (this.option.navbar === undefined) {
  this.option.navbar = true;
 }
 },
 mounted () {
 let _this = this;
 let timer = null;
 let start = 0;
 // 滚轮处理
 function scrollHandler (direction) {
  // 防止重复触发滚动事件
  if (timer != null) {
  return;
  }
  if (direction === 'down') {
  _this.changePage(_this.nextIndex);
  } else {
  _this.changePage(_this.prevIndex);
  }
  timer = setTimeout(function() {
  clearTimeout(timer);
  timer = null;
  }, 300);
 }
 // if (Object.hasOwnProperty.call(window,'onmousewheel')) {
 if (Object.hasOwnProperty.call(window,'onmousewheel')) {
  // 监听滚轮事件
  window.addEventListener('mousewheel',function (event) { // IE/Opera/Chrome
  let direction = event.wheelDelta > 0 ? 'up':'down';
  scrollHandler(direction);
  },false);
 } else {
  window.addEventListener('DOMMouseScroll',function (event) { // Firefox
  let direction = event.detail > 0 ? 'up':'down';
  scrollHandler(direction);
  },false);
 }
 // 移动端触摸事件处理
 window.addEventListener('touchstart', function (event) {
  start = event.touches[0].clientY;
 })
 window.addEventListener('touchmove', function (event) {
  event.preventDefault();
 })
 window.addEventListener('touchend', function (event) {
  let spacing = event.changedTouches[0].clientY - start;
  let direction;  
  if (spacing > 50) {
  direction = 'up';
  scrollHandler(direction);
  } else if (spacing < -50) {
  direction = 'down';
  scrollHandler(direction);
  }
 })
 }
}
</script>

<style scoped>
.controller {
 position: fixed;
 right: 20px;
 top: 50%;
 z-index: 99;
}
.controller ul {
 transform: translate3d(0,-50%,0);
 list-style: none;
 margin: 0;
 padding: 0;
}
.controller-item {
 cursor: pointer;
 width: 20px;
 height: 20px;
 border-radius: 50%;
 margin-top: 10px;
 background-color: rgba(255, 255, 255, 0.3);
 transition: background-color 0.3s ease 0s;
}
.controller-item:hover {
 background-color: rgba(255, 255, 255, 0.7);
}
.controller-item.current {
 background-color: rgba(255, 255, 255, 1);
}
.prev-btn,.next-btn {
 cursor: pointer;
 display: block;
 text-align: center;
 width: 20px;
 height: 20px;
 position: fixed;
 left: 50%;
 margin-left: -10px;
 border: 4px solid #fff;
 background-color: transparent;
 outline: none;
}
.prev-btn {
 top: 80px;
 transform: rotate(-45deg);
 border-bottom-color: transparent;
 border-left-color: transparent;
}
.next-btn {
 bottom: 80px;
 transform: rotate(45deg);
 border-top-color: transparent;
 border-left-color: transparent;
}
.prev-btn.moving {
 animation: prev-up-down 0.7s linear 0s infinite;
}
.next-btn.moving {
 animation: next-up-down 0.7s linear 0s infinite;
}
@keyframes next-up-down {
 0% {
 transform: translate3d(0,0,0) rotate(45deg);
 }
 25% {
 transform: translate3d(0,6px,0) rotate(45deg);
 }
 50% {
 transform: translate3d(0,0,0) rotate(45deg);
 }
 75% {
 transform: translate3d(0,-6px,0) rotate(45deg);
 }
 100% {
 transform: translate3d(0,0,0) rotate(45deg);
 }
}
@keyframes prev-up-down {
 0% {
 transform: translate3d(0,0,0) rotate(-45deg);
 }
 25% {
 transform: translate3d(0,-6px,0) rotate(-45deg);
 }
 50% {
 transform: translate3d(0,0,0) rotate(-45deg);
 }
 75% {
 transform: translate3d(0,6px,0) rotate(-45deg);
 }
 100% {
 transform: translate3d(0,0,0) rotate(-45deg);
 }
}
</style>

本文已被整理到了《Vue.js前端组件学习教程》,欢迎大家学习阅读。

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# vue  # 页面加载  # Vue实现上拉加载下一页效果的示例代码  # vue前端页面数据加载添加loading效果的实现  # vue实现滑动到底部加载更多效果  # Vue ElementUI this.$confirm async&n  # vue+el使用this.$confirm  # 不能阻断代码往下执行的解决  # Vue+Element-ui弹窗 this.$alert is not a function问题  # Vue给 elementUI 中的 this.$confirm、this.$alert、 this.  # 有一  # 已被  # 请大家  # 很简单  # 欢迎大家  # 现时  # 面上  # 中会  # 大家多多  # 如何实现  # 加载中  # item  # amp  # key  # data  # export  # default  # nextIndex  # script  # highlight 


相关文章: 建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  建站之星收费标准详解:套餐费用及年费价格表一览  制作门户网站的参考文献在哪,小说网站怎么建立?  建站之星如何实现五合一智能建站与营销推广?  如何用已有域名快速搭建网站?  如何在云主机上快速搭建多站点网站?  建站之星在线版空间:自助建站+智能模板一键生成方案  如何零成本快速生成个人自助网站?  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  高端网站建设与定制开发一站式解决方案 中企动力  如何通过WDCP绑定主域名及创建子域名站点?  建站主机选虚拟主机还是云服务器更好?  视频网站制作教程,怎么样制作优酷网的小视频?  网站制作网站,深圳做网站哪家比较好?  如何快速搭建高效服务器建站系统?  建站主机核心功能解析:服务器选择与网站搭建流程指南  微信小程序 input输入框控件详解及实例(多种示例)  网站制作知乎推荐,想做自己的网站用什么工具比较好?  宝塔面板如何快速创建新站点?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  详解jQuery停止动画——stop()方法的使用  如何快速生成可下载的建站源码工具?  建站之星后台密码遗忘?如何快速找回?  如何快速搭建高效可靠的建站解决方案?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  ui设计制作网站有哪些,手机UI设计网址吗?  nginx修改上传文件大小限制的方法  广平建站公司哪家专业可靠?如何选择?  建站之星客服服务时间及联系方式如何?  如何快速查询域名建站关键信息?  定制建站是什么?如何实现个性化需求?  制作网站的软件免费下载,免费制作app哪个平台好?  太平洋网站制作公司,网络用语太平洋是什么意思?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  如何用PHP工具快速搭建高效网站?  如何基于云服务器快速搭建个人网站?  如何访问已购建站主机并解决登录问题?  如何通过VPS建站无需域名直接访问?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  黑客如何利用漏洞与弱口令入侵网站服务器?  建站主机SSH密钥生成步骤及常见问题解答?  ,南京靠谱的征婚网站?  香港服务器部署网站为何提示未备案?  建站主机选哪种环境更利于SEO优化?  安云自助建站系统如何快速提升SEO排名?  如何自定义建站之星网站的导航菜单样式?  如何通过wdcp面板快速创建网站?  如何通过二级域名建站提升品牌影响力?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  红河网站制作公司,红河事业单位身份证如何上传? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。