iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0
Modern Web

30天每天寫網站系列 第 16

Day16-舊網站重寫成Vue_7_點擊滾動

  • 分享至 

  • xImage
  •  

今天終於把整個網站改完了

今天主要講點擊按鈕滾動至該區塊的部分

先把內容補完,因為我的留言版並沒有真正連結到後台,是裝飾用的,所以比較容易寫
HTML跟CSS加上之後長這樣
https://ithelp.ithome.com.tw/upload/images/20211001/20141991e673SAzUok.jpg
然後寫兩個函式給按鈕跟文字區塊

clear() {
    if (confirm("是否清除所有輸入文字") == true) {
        document.getElementById("username").value = "";
        document.getElementById("userplace").value = "";
        document.getElementById("textmessage").value = "";
    }
},
no() {
    alert("此為裝飾用留言板,僅可做輸入與清除")
}

並在留言版的每一個input加上@click.once="no()",清除按鈕加上@click="clear()"
.once是能讓這個函式只有第一次呼叫時會有反應
因為我希望警告版不會一直被呼叫,只有第一次點擊到各個input時會提醒,所以加上了.once
https://i.imgur.com/vEuhVX3.gif
https://i.imgur.com/TlnI7nX.gif

然後用v-for,把"作者介紹"跟"footer"寫好
並寫上nav跟backtotop,由於nav跟backtotop是會浮在同一個位置,所以要記得幫這兩個div加上position: fixed;
https://ithelp.ithome.com.tw/upload/images/20211001/20141991kfBAiFoDkA.jpg

接著就可以進入scroll啦~~~
先寫點擊連結然後移動到該區塊的部分
在連結加上href,區塊加上ID

連結

<a class="menu-item" :class="{'menu_item2': menu_open}" href="#ABT">
    <i class="fas fa-list" id="itemA"></i>
</a>

區塊

<div class="ABT" id="ABT">
    ...
</div>

然後就能連結過去了
https://i.imgur.com/PdQ4Jqk.gif

但是他是直接跑過去沒有滑動的感覺
然後我試著自己寫,寫不出來,所以,找了套件~
vue-scrollto

<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-scrollto"></script>

連結的地方加上

<a class="menu-item" :class="{'menu_item2': menu_open}" href="#ABT" 
v-scroll-to="{el:'#ABT', offset: -45}">
    <i class="fas fa-list" id="itemA"></i>
</a>

因為我希望標題不要被nav擋住,所以有加上offset: -45減掉一些距離
區塊一樣要加上id然後就能滑動過去了

沒加offset: -45
https://i.imgur.com/xwQu8KJ.gif
有加offset: -45
https://i.imgur.com/3UvNnIP.gif

最後來寫滾動大於HOME時nav跟backtotop會出現的部分
先幫nav跟backtotop加上transform: translate3d()跟transition: transform

.nav {
    transform: translate3d(0, -55px, 0);
    transition: transform ease-out 200ms;
}
.backtotop {
    transform: translate3d(0, 85px, 0);
    transition: transform ease-out 200ms;
}

然後寫兩個讓vue新增的class

.nav_open {
    transform: translate3d(0, 0, 0);
}
.backtotop_show {
    transform: translate3d(0, 0, 0);
}

並在data加上兩個變數來偵測是否要呼叫新增的兩個class

data: {
    nav_open: false,
    backtotop_show: false
}

記得在HTML加上

:class="{'nav_open': nav_open}"

:class="{'backtotop_show': backtotop_show}"

然後來寫函數
首先,這邊會運用到vue的$refs來取得DOM Element 的資訊
所以需要在HTML的HOME多加一個ref屬性

<div id="HOME" ref="HOME">
    …
</div>

然後在methods寫新函式

ScrollTop() {
    var element = this.$refs.HOME;
    var height = element.clientHeight;
    this.nav_open = window.scrollY > height ? true : false;
    this.backtotop_show = window.scrollY > height ? true : false;
}

函式要用來抓取現在網頁是否滾動大於首頁,若大於了就讓設定的變數變成true,反之則false
https://i.imgur.com/DO0BCDz.gif
這邊因為我的v-scroll-to有往上45,點擊"關於"時會因為還未到完整的height而無法讓nav跟backtotop跑出來
https://i.imgur.com/ANRp8L8.gif
所以我同樣有讓height扣掉45,var height = element.clientHeight - 45;
https://i.imgur.com/y3qkq06.gif
這樣便完成這次改造成vue的全部了


上一篇
Day15-舊網站重寫成Vue_6_多圖片輪播
下一篇
Day17-選取器_單選+多選
系列文
30天每天寫網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言