前言

已经有好久没有更新博客了,大三下了要准备找实习了,才发现自己很多东西都不会,所以赶紧找了个现在流行的MVVM框架学习一下。我学习的是Vue,所以拿Vue写了一个FullPage的模板,可以供自己和其他人使用。
项目的地址是:https://github.com/hzxszsk/vue-fullpage
项目讲解
为了加深理解,我把我制作这个FullPage页面的思路和流程记录下来,也可以给其他和我一样的初学者一个参考。
分解思路
首先,我根据Vue的组件开发思想,把这个FullPage页面分为两个主要的组件模块:页面组件(Page)和页面控制组件(PageController)。除了这两个组件模块之外,还有一个整合的App.vue文件。
其中,Page组件主要负责每个FullPage页面的样式和位置控制,而PageController组件则用来发起页面的切换请求。
因为Vue是单向数据流形式的,因此将所有需要的数据都定义在App.vue文件中,由App组件向下传递数据。
数据需求分析
要制作一个FullPage页面,每个Page页面需要的是页面自身的内容(页面的内容和样式配置),而控制器所需要的数据有当前正在显示的页面以及总的页面数,用这两个属性计算出其他需要的属性。
其中,总页面数即是Page总数,有多少个Page,就有多少个Page的配置,因此可以通过计算Page配置信息对象的数量来获得总页面数。
我在App.vue的组件data中定义了两个属性:
Page组件只需要知道当前页面是第几个页面和自身的配置,因此只含有两个属性:
PageController需要对页面进行切换控制,因此需要两个属性:
编写页面样式
App组件的结构为:
<div id="app" class="app"> <!-- page为单独的页面组件,page内可以编写任意的页面内容 --> <page :currentPage="currentPage"></page> <!-- page-controller为控制器组件 --> <page-controller :pageNum="pageNum" :currentPage="currentPage" @changePage="changePage" :arrowsType="arrowsType"></page-controller> </div>
App组件主要样式:
/* 页面宽高为100%,overflow为hidden隐藏溢出部分 */
html,body {
margin: 0;
padding: 0;
height: 100%;
width: 100%;
overflow: hidden;
}
.app {
height: 100%;
width: 100%;
}
Page组件结构为:
<section class="page" v-if="options"
:style="{background:options.background,color:options.color||'#fff'}"
:class="{'page-before': options.index < currentPage,'page-after': options.index > currentPage}">
<div :class="{'page-center': options.isCenter}">
<slot></slot>
</div>
</section>
<section class="page" v-else>页面正在渲染中。。。</section>
其中slot内为在App.vue的page标签内编写的html内容,并且根据Page组件内的option属性,为Page页面添加不同的样式(包括背景颜色、字体颜色、居中等,而且可以自由扩展)
Page组件的主要样式为:
.page {
position: absolute;
width: 100%;
height: 100%;
transition: all 0.5s ease 0s;
}
.page-before {
transform: translate3d(0,-100%,0);
}
.page-after {
transform: translate3d(0,100%,0);
}
通过比较当前页面的index与currentPage的大小,可以判断Page组件处于之前的页面,当前的页面和之后的页面三个状态中的哪一种。
将所有页面都用absolute定位在同一个位置上,对于处于之前的页面的Page,添加page-before类标签,使其在Y轴上向上偏移自身高度距离,同理,对之后的页面做Y轴上向下的自身高度偏移。
在page标签上添加transition样式,使其在切换时可以产生动画效果。
PageController组件的结构为:
<nav class="controller">
<button v-if="arrowsType != 'no'" class="prev-btn" :class="{moving:arrowsType === 'animate'}" @click="changePage(prevIndex)"></button>
<ul>
<li @click="changePage(index)" v-for="index in pageNum" :key="'controller-'+index" class="controller-item"></li>
</ul>
<button v-if="arrowsType != 'no'" class="next-btn" :class="{moving:arrowsType === 'animate'}" @click="changePage(nextIndex)"></button>
</nav>
PageController组件中分为两块,控制上下滚动的上下箭头按钮和控制所有页面的ul列表。
因为PageController中的样式较多,因此不在文章中详细说明,只做简单介绍。
button和ul标签用fixed定位,使其处于整个页面的上方、下方和右侧。
button使用rotate和border属性,制作出箭头的样式,并添加对应的动画效果(可以通过传递props选择关闭)。
编写页面逻辑
切换页面逻辑
因为所有的页面切换都是由PageController发起,而控制currentPage的组件并不是PageController,所以需要有一个父子组件事件,由子组件PageController发起,传递一个参数表示要切换到第几个页面,因此在PageController中定义一个method:
changePage (index) {
this.$emit('changePage', index);
}
父组件接受该事件并调用自己定义的changePage方法,修改自身的currentPage属性
changePage (index) {
// 改变page
this.currentPage = index;
}
箭头按钮上下滚动
为了实现上下滚动,需要知道当前页面的前一个页面和后一个页面分别是第几个页面,因此可以使用计算属性,计算出前一个和后一个页面的index值:
// PageController.vue
nextIndex () {
if (this.currentPage === this.pageNum) {
return 1;
} else {
return this.currentPage + 1;
}
},
prevIndex () {
if (this.currentPage === 1) {
return this.pageNum;
} else {
return this.currentPage - 1;
}
}
在点击箭头时,将对应的nextIndex或prevIndex值当做参数传给changePage方法。
滚轮滚动和移动端滚动
滚轮滚动和移动端滚动主要依靠window的监听事件,根据传入的event属性,计算出页面是应该向上还是向下滚动,将需要滚动的方向作为参数传递给处理函数handler。
因为代码略长,因此不全部显示在文章中,只显示处理函数相关逻辑
let _this = this;
let timer = null;
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;
}, 500);
}
需要注意的一点是,移动端做滚动判断时,要求touches和changedTouches之间需要一定的间隔,不然容易误触发滚动事件。
OPTIONS属性的分发
为了使使用者更加方便地编写页面内容而不在意具体的页面序号,我采用了自动对page内的option赋值的方法。其实现原理是在App.vue文件中,使用钩子函数mounted,对page中的option属性进行设置。
mounted () {
this.$children.forEach((child, index) => {
// 动态设置各个page内的options
if (child.option === null) {
let childOption = this.options[index];
this.$set(childOption,'index',index+1);
child.option = childOption;
}
});
}
高级属性:新的钩子函数
为了满足部分使用者的需求,我在设置了两个钩子函数:beforeLeave和afterEnter。
这两个钩子函数可以设置在对应页面的options属性对象中,并且含有一个默认的参数,为对应页面的page组件实例对象。
其实现方式为在原先的changePage函数(App.vue)内添加新的逻辑:
changePage (index) {
// beforeLeave
let beforeIndex = this.currentPage - 1;
let leaveFunction = this.options[beforeIndex].beforeLeave;
typeof leaveFunction === 'function' && leaveFunction.call(this,this.$children[beforeIndex]);
// 改变page
this.currentPage = index;
// afterEnter
let nextIndex = index-1;
let enterFunction = this.options[nextIndex].afterEnter;
this.$nextTick(function () {
typeof enterFunction === 'function' && enterFunction.call(this,this.$children[nextIndex]);
})
}
总结
这篇文章记录了我开发一个FullPage页面的总体流程,将主要的逻辑重新顺理了一遍,还有一些小的细节没有写在文章中,有兴趣的可以去具体的项目页面看源码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# vue
# 页面滚动
# FullPage页面滚动
# FullPage
# 解决Vue页面固定滚动位置的处理办法
# vue监听滚动事件实现滚动监听
# Vue.js实战之通过监听滚动事件实现动态锚点
# vue实现消息的无缝滚动效果的示例代码
# vue elementUI table表格数据 滚动懒加载的实现方法
# vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
# 详解 vue better-scroll滚动插件排坑
# vue实现ajax滚动下拉加载
# 同时具有loading效果(推荐)
# vue使用mint-ui实现下拉刷新和无限滚动的示例代码
# vue实现广告栏上下滚动效果
# 的是
# 几个
# 这两个
# 可以通过
# 使其
# 我在
# 计算出
# 是一个
# 是在
# 就有
# 和我
# 是由
# 把我
# 只需
# 下了
# 一遍
# 而不
# 采用了
# 才发现
# 详细说明
相关文章:
如何快速生成橙子建站落地页链接?
高端建站如何打造兼具美学与转化的品牌官网?
建站之星北京办公室:智能建站系统与小程序生成方案解析
郑州企业网站制作公司,郑州招聘网站有哪些?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
如何彻底删除建站之星生成的Banner?
个人网站制作流程图片大全,个人网站如何注销?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
如何在香港免费服务器上快速搭建网站?
如何选择香港主机高效搭建外贸独立站?
建站主机CVM配置优化、SEO策略与性能提升指南
Swift中switch语句区间和元组模式匹配
佛山网站制作系统,佛山企业变更地址网上办理步骤?
如何高效生成建站之星成品网站源码?
如何在阿里云香港服务器快速搭建网站?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
如何安全更换建站之星模板并保留数据?
建站之星安装需要哪些步骤及注意事项?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
教学论文网站制作软件有哪些,写论文用什么软件
?
广东企业建站网站优化与SEO营销核心策略指南
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
,购物网站怎么盈利呢?
建站VPS推荐:2025年高性能服务器配置指南
怀化网站制作公司,怀化新生儿上户网上办理流程?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
太平洋网站制作公司,网络用语太平洋是什么意思?
在线制作视频的网站有哪些,电脑如何制作视频短片?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
如何通过服务器快速搭建网站?完整步骤解析
建站之星价格显示格式升级,你的预算足够吗?
在线教育网站制作平台,山西立德教育官网?
网页设计网站制作软件,microsoft office哪个可以创建网页?
Python lxml的etree和ElementTree有什么区别
移民网站制作流程,怎么看加拿大移民官网?
php json中文编码为null的解决办法
临沂网站制作企业,临沂第三中学官方网站?
制作电商网页,电商供应链怎么做?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
如何用虚拟主机快速搭建网站?详细步骤解析
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
网站图片在线制作软件,怎么在图片上做链接?
建站ABC备案流程中有哪些关键注意事项?
如何用搬瓦工VPS快速搭建个人网站?
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
,怎么用自己头像做动态表情包?
如何快速上传建站程序避免常见错误?
建站主机是否等同于虚拟主机?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
*请认真填写需求信息,我们会在24小时内与您取得联系。