日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Vue實現電梯樣式錨點導航效果流程詳解

瀏覽:153日期:2022-06-10 14:31:43
目錄
  • 1、目標效果
  • 2、原理
  • 3、源代碼

1、目標效果

最近喝了不少的咖啡、奶茶,有一個效果我倒是挺好奇怎么實現的:

(1)點擊左側分類菜單,右側滾動到該分類區(qū)域

(2)右側滑動屏幕,左側顯示當前所處的分類區(qū)域

這種功能會出現在商城項目中或者分類數量較多的項目中,專業(yè)名稱稱電梯導航

目標效果:

(1)點擊左側的分類,右側滑動到指定區(qū)域

(2)滾動右側區(qū)域,左邊分類顯示當前所處的分類區(qū)域

2、原理

(1)這要用到原生js關于偏移量和位置相關的api,這些api建立在你的布局是定位的基礎上,父親相對定位,左邊分類和右邊商品都是絕對定位

(2)左邊分類要與右側商品模塊數量一一相等(數量和位置都要對應相等),否則實現不了電梯導航效果

(3)點擊左側分類,右側跳轉到對應模塊;這用到了window.scrollTo(水平方向距離,豎直方向距離)

(4)右側滑動,左側發(fā)生相應的變化,這要用到滾動事件,vue中使用滾動事件需要再onMounted()生命周期注冊一下滾動事件

onMounted(() => {    window.addEventListener("scroll", handleScroll);})

(5)如何判斷滾動到什么程度左側才顯示對應的模塊?

  • dom.offsetTop:每個dom元素有該屬性,表示距離頂部窗口的距離
  • document.documentElement.scrollTop:表示頁面滾動的距離
  • document.documentElement.scrollTop >=dom.offsetTop:顯示對應的模塊,可以通過遍歷商品模塊數組,拿到對應的索引,然后設置左邊分類對應的dom為激活狀態(tài)

(6) 出現一個問題:window.scrollTo()將模塊滾動至某一位置 與頁面滾動事件 發(fā)生了沖突,此時可以添加一個互斥變量isLock,等window.scrollTo()滾動結束之后,再放開鎖

    // 獲取選中的dom元素    const typeItemDom = shop.value[val]    // 開鎖    isLock.value = true    // 第一個參數為水平方向,第二個參數為縱軸方向    window.scrollTo(0, typeItemDom.offsetTop)    setTimeout(() => {//關鎖isLock.value = false    }, 0)

(7)為什么放開鎖要在setTimeout里面?根據js事件循環(huán)機制,同步任務(主線程代碼、new Promise里面的代碼)執(zhí)行速度快于異步任務(setTimeout、setInterval、ajax、promise.then里面的任務),這樣才能確保鎖是在window.scrollTo() 執(zhí)行完畢之后才打開的

3、源代碼

App.vue

 <template>  <div>    <ClassifyByVue></ClassifyByVue>  </div></template><script setup>// import ClassifyByJs from "./components/ClassifyByJS.vue";import ClassifyByVue from "./components/ClassifyByVue.vue";</script><style>* {  padding: 0;  margin: 0;}</style>

ClassifyByVue.vue

<template>    <div><div>    <div :class="{ active: currentIndex == index }" v-for="(item, index) in types"@click="changeType(index)">{{ item }}    </div></div><div @scroll="handleScroll">    <div v-for="(item, index) in shops" :key="index" ref="shop"><div>{{ item.category }}</div><div v-for="(i, j) in item.data" :key="j">    <div><img src="/vite.svg" />    </div>    <div><div>{{ i.name }}</div><div>{{ i.type }}</div><div>{{ i.desc }}</div><div>購買</div>    </div></div>    </div></div>    </div></template><script setup>import { ref, onMounted, onBeforeUnmount, nextTick } from "vue"let isLock = ref(false)// 分類let types = ref([    "人氣Top",    "爆款套餐",    "大師咖啡",    "小黑杯",    "中國茶咖",    "生椰家族",    "厚乳拿鐵",    "絲絨拿鐵",    "生酪拿鐵",    "經典拿鐵",])// 商品let shops = ref([    {category: "人氣Top",data: [    {name: "冰吸生椰拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "生椰拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "摸魚生椰拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "茉莉花香拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "絲絨拿鐵",type: "咖啡",desc: "咖啡"    },    {name: "小甘橘美式",type: "咖啡",desc: "咖啡"    },]    },    {category: "爆款套餐",data: [    {name: "2杯套餐",type: "咖啡",desc: "咖啡"    }, {name: "3杯套餐",type: "咖啡",desc: "咖啡"    }, {name: "4杯套餐",type: "咖啡",desc: "咖啡"    }, {name: "5杯套餐",type: "咖啡",desc: "咖啡"    }, {name: "不喝咖啡套餐",type: "咖啡",desc: "咖啡"    },    {name: "必喝套餐",type: "咖啡",desc: "咖啡"    },]    },    {category: "大師咖啡",data: [    {name: "美式",type: "咖啡",desc: "咖啡"    }, {name: "加濃美式",type: "咖啡",desc: "咖啡"    }, {name: "橙C美式",type: "咖啡",desc: "咖啡"    }, {name: "澳瑞白",type: "咖啡",desc: "咖啡"    }, {name: "卡布奇諾",type: "咖啡",desc: "咖啡"    },    {name: "瑪奇朵",type: "咖啡",desc: "咖啡"    },]    },    {category: "小黑杯",data: [    {name: "云南小柑橘",type: "咖啡",desc: "咖啡"    }, {name: "廣東小柑橘",type: "咖啡",desc: "咖啡"    }, {name: "廣西小柑橘",type: "咖啡",desc: "咖啡"    }, {name: "福建小柑橘",type: "咖啡",desc: "咖啡"    }, {name: "湖南小柑橘",type: "咖啡",desc: "咖啡"    },    {name: "江西小柑橘",type: "咖啡",desc: "咖啡"    },]    },    {category: "中國茶咖",data: [    {name: "碧螺知春拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "茉莉花香拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "菊花香拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "梅花香拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "蘭花香拿鐵",type: "咖啡",desc: "咖啡"    },    {name: "玫瑰花香拿鐵",type: "咖啡",desc: "咖啡"    },]    },    {category: "生椰家族",data: [    {name: "冰吸生椰拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "生椰拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "摸魚生椰拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "椰云拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "絲絨拿鐵",type: "咖啡",desc: "咖啡"    },    {name: "隕石拿鐵",type: "咖啡",desc: "咖啡"    },]    },    {category: "厚乳拿鐵",data: [    {name: "厚乳拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "生椰拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "茉莉花香拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "椰云拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "絲絨拿鐵",type: "咖啡",desc: "咖啡"    },    {name: "海鹽拿鐵",type: "咖啡",desc: "咖啡"    },]    },    {category: "絲絨拿鐵",data: [    {name: "絲絨拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "生椰絲絨拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "黑糖絲絨拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "椰云絲絨拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "香草絲絨拿鐵",type: "咖啡",desc: "咖啡"    }]    },    {category: "生酪拿鐵",data: [    {name: "生酪拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "綠豆拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "紅豆拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "黑豆拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "黃豆拿鐵",type: "咖啡",desc: "咖啡"    }]    },    {category: "經典拿鐵",data: [    {name: "拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "隕石拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "焦糖拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "生椰拿鐵",type: "咖啡",desc: "咖啡"    }, {name: "美式",type: "咖啡",desc: "咖啡"    }]    },])// 獲取右側商品的ref實例let shop = ref(null)// 用來表示當前選中處于激活狀態(tài)的分類的索引let currentIndex = ref(0)// 切換類型const changeType = val => {    currentIndex.value = val    // 獲取選中的dom元素    const typeItemDom = shop.value[val]    // 開鎖    isLock.value = true    // 第一個參數為水平方向,第二個參數為縱軸方向    window.scrollTo(0, typeItemDom.offsetTop)    setTimeout(() => {//關鎖isLock.value = false    }, 0)}// 監(jiān)聽頁面滾動const handleScroll = () => {    // 鎖關了滾動事件才有效    if (!isLock.value) {types.value.forEach((item, index) => {    // console.dir(shop.value[index]);    const shopItemDom = shop.value[index]    // 每個模塊距離頂部的距離    const offsetTop = shopItemDom.offsetTop    // 頁面滾動的距離    const scrollTop = document.documentElement.scrollTop    if (scrollTop >= offsetTop) {// 給左邊分類設置激活的效果currentIndex.value = index    }})    }}onMounted(() => {    window.addEventListener("scroll", handleScroll);})onBeforeUnmount(() => {    window.removeEventListener("scroll", handleScroll);})</script><style scoped lang="less">.classify {    display: flex;    position: relative;    .left {display: flex;flex-direction: column;align-items: center;position: fixed;left: 0;top: 0;bottom: 0;width: 92px;overflow-y: scroll;border-right: 1px solid #C1C2C4;.item {    display: flex;    justify-content: center;    align-items: center;    width: 67px;    height: 29px;    font-size: 15px;    font-family: PingFang SC-Semibold, PingFang SC;    font-weight: 600;    color: #333333;}.active {    color: #00B1FF;}.item:not(:last-child) {    margin-bottom: 25px;}    }    .right {flex: 1;position: absolute;top: 0;right: 17px;overflow-y: scroll;.title {    font-size: 18px;    margin-bottom: 5px;}.item {    display: flex;    justify-content: space-between;    margin-bottom: 17px;    width: 246px;    height: 73px;    .photo {width: 58px;height: 58px;img {    width: 100%;    height: 100%;    border-radius: 12px;    border: 1px solid gray;}    }    .info {display: flex;flex-direction: column;position: relative;width: 171px;height: 73px;box-shadow: 0px 1px 0px 0px rgba(221, 221, 221, 1);.name {    padding-left: 0;    font-size: 17px;    font-weight: 600;    color: #333333;}.type,.desc {    font-size: 14px;    font-weight: 400;    color: #999999;}.buy {    display: flex;    align-items: center;    justify-content: center;    position: absolute;    right: 0;    top: 17px;    width: 67px;    height: 29px;    background: #E7E8EA;    border-radius: 21px;    font-size: 15px;    font-family: PingFang SC-Semibold, PingFang SC;    font-weight: 600;    color: #05AFFA;}    }}    }}</style>

到此這篇關于Vue實現電梯樣式錨點導航效果流程詳解的文章就介紹到這了,更多相關Vue電梯錨點導航內容請搜索以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持!

標簽: JavaScript
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩av首页| 99视频精品| 蜜臀精品久久久久久蜜臀| 成人污污视频| 日韩精品免费观看视频| 日韩精品午夜| 久久精品一本| 国产毛片久久久| 亚洲欧美日韩国产一区| 日韩精品水蜜桃| 成人午夜在线| 日韩avvvv在线播放| 999久久久国产精品| 国产一区二区三区亚洲| 国产精品sss在线观看av| 日韩av黄色在线| 欧美激情视频一区二区三区在线播放| 美女久久精品| 国产亚洲一区二区手机在线观看 | 日本精品不卡| 91精品国产乱码久久久久久久 | 国产福利片在线观看| 日韩国产一区| 99热精品在线观看| 日韩国产欧美三级| 麻豆精品国产91久久久久久| 深夜福利视频一区二区| 日韩一级不卡| 青青青国产精品| 激情久久一区二区| 欧美日韩国产传媒| 日韩av网站在线观看| 国产一区国产二区国产三区| 婷婷成人在线| 午夜性色一区二区三区免费视频| 国产精品亚洲欧美| 成人美女视频| 91久久中文| 久久国产精品色av免费看| 高潮久久久久久久久久久久久久| 激情综合网五月| 奇米777国产一区国产二区| 91亚洲自偷观看高清| 亚洲专区欧美专区| 国产精久久一区二区| 久久久久欧美精品| 亚洲精品三级| 97人人精品| 中文字幕日韩高清在线| 久久一区欧美| 亚洲一区二区成人| 欧美激情视频一区二区三区免费 | 深夜日韩欧美| 韩国女主播一区二区三区| 91超碰国产精品| 国产精品男女| 亚洲免费黄色| 精品国产美女a久久9999| 香蕉精品视频在线观看| 国产欧美一级| 日韩网站在线| 精品一区91| 亚洲伊人精品酒店| 中文字幕色婷婷在线视频| 五月激激激综合网色播| 国产在线|日韩| 欧美日韩 国产精品| 桃色一区二区| 国产精品毛片久久久| 欧美精品一二| 精品网站aaa| 久久午夜精品| 日韩欧美1区| 日本不卡一区二区三区| 日韩不卡在线| 欧美黄页在线免费观看| 99re国产精品| 日韩大片在线| 日韩国产高清在线| 欧美日韩精品在线一区| 久久精品一本| 亚洲另类黄色| 久久青草久久| 国产成人精品一区二区三区视频| 天堂俺去俺来也www久久婷婷| 亚洲夜间福利| 久久电影tv| 老色鬼精品视频在线观看播放| 日韩制服丝袜先锋影音| 少妇久久久久| 国产一区2区在线观看| 欧美片第1页综合| 一区二区精品| 不卡在线一区二区| 日韩不卡免费高清视频| 精品午夜视频| 国产精品久久久久久av公交车| 免费日本视频一区| 影院欧美亚洲| 婷婷久久一区| 成人免费电影网址| 老司机精品视频网| 国产日韩欧美一区二区三区在线观看 | 麻豆精品在线播放| 日韩激情啪啪| 一区二区国产在线观看| 午夜av一区| 久久久久久久久久久妇女| 动漫av一区| 久久精品国产免费| 久久av影视| 国产毛片一区二区三区| 日韩不卡手机在线v区| 亚洲精品一二三**| 一区二区高清| 蜜臀精品久久久久久蜜臀| 国产精品婷婷| 麻豆久久精品| 中文无码日韩欧| 久久成人国产| 日韩精品一级二级 | 亚洲天堂av资源在线观看| 亚洲深夜影院| 亚洲中字黄色| 丝瓜av网站精品一区二区 | 男女性色大片免费观看一区二区 | 日韩黄色在线观看| 日韩精品视频一区二区三区| 中文字幕日韩高清在线| 亚洲三级视频| 日韩av中文字幕一区二区三区| 日本国产一区| 国产精品一级在线观看| 美女视频黄久久| 中文字幕成在线观看| 日本精品在线中文字幕| 亚洲电影在线| 国产亚洲亚洲| 亚洲欧洲专区| 少妇精品久久久一区二区三区| 亚洲精品一区二区在线播放∴| 日韩国产欧美视频| 国产精品大片| 欧美男人天堂| 亚洲二区在线| 蜜臀久久久久久久| 欧美日韩亚洲一区在线观看| 国产精品亚洲综合在线观看| 久久精品国产99国产精品| 久久久久久一区二区| 久久久久久久久99精品大| 欧美午夜精品一区二区三区电影| 在线亚洲观看| 日韩一区二区三区免费视频| 日韩精品中文字幕一区二区| 国产麻豆一区二区三区精品视频| 精品久久久久久久| 宅男在线一区| 亚洲精品日本| 国产videos久久| 国产综合亚洲精品一区二| 美国av一区二区| 国产精品一区亚洲| 日韩在线第七页| 免费日韩av片| 国产精品乱战久久久| 日韩一区自拍| 老司机精品久久| 国产精品成人自拍| 欧美亚洲日本精品| 欧美中文字幕| 久久只有精品| 狠狠爱www人成狠狠爱综合网| 日韩激情精品| av资源亚洲| 亚洲精品伊人| 极品av在线| 亚洲精品伦理| 国产aa精品| 蜜臀国产一区二区三区在线播放| 国产精品扒开腿做爽爽爽软件| 香蕉久久99| 国产精选一区| 色婷婷狠狠五月综合天色拍| 玖玖玖国产精品| 牛牛精品成人免费视频| 一本一道久久a久久精品蜜桃| 国产九一精品| 99国产精品自拍| 久久中文字幕一区二区三区| 日韩一区二区免费看| 欧美激情在线精品一区二区三区| 亚洲免费播放| 福利一区二区三区视频在线观看| 视频一区视频二区中文| 精品国产一区二区三区av片| 老司机精品久久| 精精国产xxxx视频在线播放 | 国产精品一区亚洲| 久久国产小视频|