前陣子可以看到許多單頁式網頁的設計,單頁式網頁就是在一頁裡面把所有要傳達的訊息都傳達完,而網友可以透過捲動捲軸的方式,讓網頁產生類似輪撥的效果。
本堂課主要是延續上一篇jQuery學習筆記 第八堂-1,這次加入了mousewheel的效果後,可以產生一次轉動一頁的效果,點這裡看結果。。
本次會學習到的函數共包含:
CSS
overflow:當網頁內容超過時要怎麼處理,可以接visible、hidden、scroll等指令。
jQuery
$( ).mousewheel( ):當滑鼠下上捲動時回報訊息1、當滑鼠向下捲動時回報訊息-1。
overflow:當網頁內容超過時要怎麼處理,可以接visible、hidden、scroll等指令。
jQuery
$( ).mousewheel( ):當滑鼠下上捲動時回報訊息1、當滑鼠向下捲動時回報訊息-1。
為了要達到這樣的效果,我們需要用到一個jQuery的外掛,叫做mousewheel。
mousewheel下載
首先到jQuery官網的地方,上方有一個plugin可以點選
搜尋mousewheel
點選download
點選zip下載
下載後把這個javascript檔和網頁存在相近的資料夾中
最後記得在head中引用這個js檔
<script src="jquery.mousewheel.min.js"></script>
mousewheel的使用方法
回到剛剛的網頁中,點選view homepage
往下拉就可以看到這個外掛的使用說明了
我們來用用看會有什麼效果吧!
我們一樣用上一堂課所學到的console.log( )的用法
回報出來的訊息會像這樣
原來mousewheel這個功能可以讓當滑鼠往上捲動時,回報為「1」,當滑鼠往下捲動時,為報為「-1」。
讓滑鼠滾動一次翻動一頁
透過mousewheel,我們就可以製作如同換頁般的網頁功能
首先,我們建立一個變數n,希望滾動滾輪的時候,可以讓n增加或減少,以此來控制要顯示哪張圖片。
一開始n=1,當我滾動滑鼠滾輪往下時(deltaY= -1)則n++,當我滾動滑鼠滾輪往上時(deltaY= 1)則n--
透過這種寫法,我們n就會開始動了,可是這時候的n沒有上限和下限
我們希望n的數值可以介於1~5之間(也就是我們圖片的編號),所以我們可以把語法加上更多的if,像下面這樣,如果n小於圖片數目的話才可以繼續增加,如果n大於1的話才可以減少。
透過這種寫法,n就一定只會介於1~5之間
這時候,我們就可以開始寫動畫的語法了,讓它根據我們的n跳到指定的頁面
下面那一行animate,是根據我們的n跳到指定頁面的語法;上面那一行stop,同樣是避免動畫的bug產生。
這時候,網頁就會根據我們的滾輪來移動了,可是現在的情況下滾動一次就翻動一頁,很少網友使用滑鼠滾輪是會如此小心翼翼的,一次滾動一個,通常都是一此滾很多個,這樣會變成一滾,就直接到最末頁了,這樣並不是我想要的效果。我們希望的是,滑鼠一滾(不管滾了幾顆),會換一頁。
讓滑鼠滾輪滑一次只換一頁
這時候,我們必須透過一點巧思來達到這個效果,我們新增一個變數叫做moving,當moving等於0時,n才會增加或減少(滾動才有效果),當moving等於1時,怎麼滾n都不會改變(滾動沒有效果)。
透過上面這段語法,一開始moving是0,所以n可以改變,n改變之後moving變成1,這時候就把n鎖住了,所以n就不會再改變,因此不管網友怎麼滾動滑鼠都會停留在同一張。
接著,當動畫完成後,我們要把moving變回0,這樣網友才能再滑到其他張圖案,在jQuery的官網同樣有寫到animate這個指令也可以當動畫完成後在執行其他功能
因此,我們就是希望利用這個功能,當動畫完成後,幫我把moving變回0
寫到這裡其實就差不多了,但是使用起來好像「卡卡的」,到底是怎麼回事呢?
消除瀏覽器旁的捲軸
之所以會卡卡的,用一個很重要的原因是因為視窗旁邊的捲軸還在,所以當我們滾動滑鼠中間的滾輪時,它其實是想要先用捲軸來控制我們的視窗,可是我們寫的語法不讓它這麼做,所以兩邊就卡來卡去。
因此,我們要把瀏覽器旁的捲軸消除。消除的方法很簡單,只要在CSS的地方針對body用overflow:hidden這個指令就可以了
如此使用起來就順暢多了!
結合點選導覽列和滾輪
最後一個步驟,是我們要讓被點擊的導覽列和滾輪之間產生關連。這是什麼意思呢?因為我們滾輪抓取的是變數n,而點擊導覽列時抓取的是變數i,這時候會一個問題。在不滾動滾輪的情況下,如果網友點擊導覽列到第4頁,這時候它在往下滾動滾輪時,並不會到第五頁,反而會到第二頁,因為這時候n還是等於1(i = 3;n = 1),他並沒有隨著導覽列被點擊後,變成4,我們現在要解決的就是這個問題,我們希望i這個變數一直都要和n是一致的。
解決的辦法很簡單,讓i+1會等於n就可以了(i因為是eq用的,所以值是介於0-4;n是直接抓圖片編號,所以值是介於1-5,n=i+1)
結果
寫到這裡就完成拉,來看一下我們完整的程式碼吧!
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>單頁輪撥式網站設計</title>
<!-- 匯入jQuery -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="jquery.mousewheel.min.js"></script>
<script>
$(document).ready(function(){
var num_li=$("li").length//偵測我們有幾個標點(圖片)
//滾動滑鼠滾輪時,移動到上一頁、下一頁的效果
n=1
moving=0
$(window).mousewheel(function(e){
$("html,body").stop()
if(moving==0){
moving=1
if(e.deltaY==-1){
if(n<num_li){
n++
}
}else{
if(n>1){
n--
}
}
}
$("html,body").animate({"scrollTop":$(".p0"+n).offset().top},function(){moving=0})
console.log(n)
})
//根據捲軸的位置改變右方導覽列游標的顏色
$(window).scroll(function(){
if($(window).scrollTop()>=$(".p01").offset().top && $(window).scrollTop()<$(".p02").offset().top){
$(".nav li").css("background-color","white")//除了被點擊到的游標,其他都恢復成原來的顏色
$(".nav li:eq(0)").css("background-color","#46dd46")
}else if($(window).scrollTop()>=$(".p02").offset().top && $(window).scrollTop()<$(".p03").offset().top){
$(".nav li").css("background-color","white")//除了被點擊到的游標,其他都恢復成原來的顏色
$(".nav li:eq(1)").css("background-color","#46dd46")
}else if($(window).scrollTop()>=$(".p03").offset().top && $(window).scrollTop()<$(".p04").offset().top){
$(".nav li").css("background-color","white")//除了被點擊到的游標,其他都恢復成原來的顏色
$(".nav li:eq(2)").css("background-color","#46dd46")
}else if($(window).scrollTop()>=$(".p04").offset().top && $(window).scrollTop()<$(".p05").offset().top){
$(".nav li").css("background-color","white")//除了被點擊到的游標,其他都恢復成原來的顏色
$(".nav li:eq(3)").css("background-color","#46dd46")
}else if($(window).scrollTop()>=$(".p05").offset().top){
$(".nav li").css("background-color","white")//除了被點擊到的游標,其他都恢復成原來的顏色
$(".nav li:eq(4)").css("background-color","#46dd46")
}
})
//點選右方導覽列時會到指定圖片
for(i=0;i<=num_li;i++){
$(".nav li:eq("+i+")").click({id:i},function(e){
$("html,body").stop()
$(".nav li").css("background-color","white")//除了被點擊到的游標,其他都恢復成原來的顏色
page=e.data.id+1
$("html,body").animate({"scrollTop":$(".p0"+page).offset().top})
$(".nav li:eq("+e.data.id+")").css("background-color","#46dd46")//被點擊到的游標變色,前面的selector用this也可以
n=e.data.id+1
})
}
//一進入網頁時,將導覽列垂直置中計算導覽列置中的位置
center()
//縮放網頁時,將導覽列垂直置中
$(window).resize(function(){
center()
})
//計算導覽列垂直置中的高度
function center(){
pos=$(window).height()/2-$(".nav").height()/2
$(".nav").css("top",pos)
}
})
</script>
<style>
*{
padding:0;
margin:0;
}
body{
overflow: hidden;
}
/* 插入背景圖片 */
.p01{
background-image:url(images/p01.jpg);
background-size:cover;
background-repeat: no-repeat;
height:100vh;
}
.p02{
background-image:url(images/p02.jpg);
background-size:cover;
background-repeat: no-repeat;
height:100vh;
}
.p03{
background-image:url(images/p03.jpg);
background-size:cover;
background-repeat: no-repeat;
height:100vh;
}
.p04{
background-image:url(images/p04.jpg);
background-size:cover;
background-repeat: no-repeat;
height:100vh;
}
.p05{
background-image:url(images/p05.jpg);
background-size:cover;
background-repeat: no-repeat;
height:100vh;
}
/* 插入導覽列 */
.nav{
position: fixed;
top:50%;
right:0px;
cursor:pointer;
}
li{
width:10px;
height:10px;
margin: 10px;
background-color: white;
border-radius: 5px;
box-shadow: 1px 1px 1px rgba(0,0,0,0.5) inset,-1px -1px 1px rgba(0,0,0,0.5) inset;
list-style-type: none;
}
h1{
font-size:60px;
color:ghostwhite;
text-shadow:0px 0px 15px black;
}
</style>
</head>
<body>
<div class="container">
<div class="nav">
<ul>
<li style="background-color:#46dd46"></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</div>
<div class="p01"><h1>Page 1</h1></div>
<div class="p02"><h1>Page 2</h1></div>
<div class="p03"><h1>Page 3</h1></div>
<div class="p04"><h1>Page 4</h1></div>
<div class="p05"><h1>Page 5</h1></div>
</div>
</body>
</html>
點這裡看結果。




















你好,最近在學網頁程式設計
回覆刪除看見您的教學非常仔細註解也毫不吝嗇
自己慢慢也進步了不少
不知道如何謝謝妳,就在這流言了
希望言語的讚美能給你一些鼓勵