成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

使用vue制作FullPage頁面滾動效果

前言

公司主營業(yè)務:成都網站制作、成都網站設計、移動網站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現互聯網宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯公司推出井陘免費做網站回饋大家。

已經有好久沒有更新博客了,大三下了要準備找實習了,才發(fā)現自己很多東西都不會,所以趕緊找了個現在流行的MVVM框架學習一下。我學習的是Vue,所以拿Vue寫了一個FullPage的模板,可以供自己和其他人使用。

項目的地址是:https://github.com/hzxszsk/vue-fullpage

項目講解

為了加深理解,我把我制作這個FullPage頁面的思路和流程記錄下來,也可以給其他和我一樣的初學者一個參考。

分解思路

首先,我根據Vue的組件開發(fā)思想,把這個FullPage頁面分為兩個主要的組件模塊:頁面組件(Page)和頁面控制組件(PageController)。除了這兩個組件模塊之外,還有一個整合的App.vue文件。

其中,Page組件主要負責每個FullPage頁面的樣式和位置控制,而PageController組件則用來發(fā)起頁面的切換請求。

因為Vue是單向數據流形式的,因此將所有需要的數據都定義在App.vue文件中,由App組件向下傳遞數據。

數據需求分析

要制作一個FullPage頁面,每個Page頁面需要的是頁面自身的內容(頁面的內容和樣式配置),而控制器所需要的數據有當前正在顯示的頁面以及總的頁面數,用這兩個屬性計算出其他需要的屬性。

其中,總頁面數即是Page總數,有多少個Page,就有多少個Page的配置,因此可以通過計算Page配置信息對象的數量來獲得總頁面數。

我在App.vue的組件data中定義了兩個屬性:

  • currentPage表示的是當前頁面的序號(從1開始計算);
  • options是一個數組,其中的每一個對象表示的是對應序號的頁面的配置信息,可以通過修改里面的對象屬性從而改變對應Page的樣式。

Page組件只需要知道當前頁面是第幾個頁面和自身的配置,因此只含有兩個屬性:

  • currentPage
  • option 表示自身的配置

PageController需要對頁面進行切換控制,因此需要兩個屬性:

  • currentPage
  • pageNum 表示總的頁面數量

編寫頁面樣式

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"
: 
: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組件處于之前的頁面,當前的頁面和之后的頁面三個狀態(tài)中的哪一種。

將所有頁面都用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發(fā)起,而控制currentPage的組件并不是PageController,所以需要有一個父子組件事件,由子組件PageController發(fā)起,傳遞一個參數表示要切換到第幾個頁面,因此在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的監(jiān)聽事件,根據傳入的event屬性,計算出頁面是應該向上還是向下滾動,將需要滾動的方向作為參數傳遞給處理函數handler。

因為代碼略長,因此不全部顯示在文章中,只顯示處理函數相關邏輯

let _this = this;
let timer = null;
function scrollHandler (direction) {
 // 防止重復觸發(fā)滾動事件
 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之間需要一定的間隔,不然容易誤觸發(fā)滾動事件。

OPTIONS屬性的分發(fā)

為了使使用者更加方便地編寫頁面內容而不在意具體的頁面序號,我采用了自動對page內的option賦值的方法。其實現原理是在App.vue文件中,使用鉤子函數mounted,對page中的option屬性進行設置。

mounted () {
 this.$children.forEach((child, index) => {
 // 動態(tài)設置各個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]);
 })
}

總結

這篇文章記錄了我開發(fā)一個FullPage頁面的總體流程,將主要的邏輯重新順理了一遍,還有一些小的細節(jié)沒有寫在文章中,有興趣的可以去具體的項目頁面看源碼

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯。

網站題目:使用vue制作FullPage頁面滾動效果
網頁網址:http://jinyejixie.com/article36/jdoepg.html

成都網站建設公司_創(chuàng)新互聯,為您提供網站內鏈電子商務、外貿建站、網站設計公司、軟件開發(fā)、域名注冊

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

外貿網站建設
赤峰市| 遵义县| 德阳市| 龙陵县| 巫溪县| 招远市| 都安| 普格县| 绥芬河市| 额济纳旗| 黎平县| 林口县| 龙山县| 于田县| 荔浦县| 新宾| 松阳县| 马公市| 伊川县| 崇左市| 彝良县| 永靖县| 台东县| 湟中县| 武功县| 尼木县| 茂名市| 南丰县| 蓬溪县| 石门县| 宁都县| 丰台区| 丹凤县| 浮梁县| 林西县| 合山市| 图们市| 凤城市| 天峨县| 苗栗县| 龙泉市|