element-ui 實現(xiàn)響應式導航欄的示例代碼
開始之前
按照計劃,前端使用Vue.js+Element UI,但在設計導航欄時,發(fā)現(xiàn)element沒有提供傳統(tǒng)意義上的頁面頂部導航欄組件,只有一個可以用在很多需要選擇tab場景的導航菜單,便決定在其基礎上改造,由于我認為實現(xiàn)移動端良好的體驗是必須的,所以便萌生了給其增加響應式功能的想法。
需求分析與拆解
假設我們的導航欄有l(wèi)ogo和四個el-menu-item。
給window綁定監(jiān)聽事件,當寬度小于a時,四個鏈接全部放入右側el-submenu的子菜單:
當寬度大于a時,右側el-submenu不顯示,左側el-menu-item正常顯示:
所以,先創(chuàng)建一個數(shù)組,存儲所有所需的item:
navItems: [ { name: "Home", indexPath: "/home", index: "1" }, { name: "Subscribe", indexPath: "/subscribe", index: "2"}, { name: "About", indexPath: "/about", index: "3" }, { name: "More", indexPath: "/more", index: "4" } ]
監(jiān)聽寬度
很明顯功能實現(xiàn)的關鍵是隨時監(jiān)聽窗口的變化,根據(jù)對應的寬度做出響應,在data中,我使用screenWidth變量來存儲窗口大小,保存初始打開頁面時的寬度:
data() { return { screenWidth: document.body.clientWidth ...... } }
接下來在mounted中綁定屏幕監(jiān)聽事件,將最新的可用屏幕寬度賦給screenWidth:
mounted() { window.onresize = () => { this.screenWidth = document.body.clientWidth } }
(關于document和window中N多的關于高度和寬度的屬性,可以參考這篇文章。)
為了防止頻繁觸發(fā)resize函數(shù)導致頁面卡頓,可以使用一個定時器,控制下screenWidth更新的頻率:
watch: { screenWidth(newValue) { // 為了避免頻繁觸發(fā)resize函數(shù)導致頁面卡頓,使用定時器 if (!this.timer) { // 一旦監(jiān)聽到的screenWidth值改變,就將其重新賦給data里的screenWidth this.screenWidth = newValue; this.timer = true; setTimeout(() => { //console.log(this.screenWidth); this.timer = false; }, 400); } } }
顯示
有了屏幕寬度的實時數(shù)據(jù)后,就可以以computed的方式控制menuItem了。
computed: { ... leftNavItems: function() { return this.screenWidth >= 600 ? this.navItems : {}; }, rightNavItems: function() { return this.screenWidth < 600 ? this.navItems : {}; } },
通過簡單的判斷即可在窗口寬度變化時,將菜單里的內容放入預先設置的正常菜單或者當寬度小于600時顯示的右側下拉菜單,附上html部分代碼:
<el-menu text-color="#2d2d2d" id="navid" class="nav" mode="horizontal" @select="handleSelect"> <el-menu-item class="logo" index="0" route="/home"> <img class="logoimg" src="../assets/img/logo.png" alt="logo" /> </el-menu-item> <el-menu-item :key="key" v-for="(item,key) in leftNavItems" :index="item.index" :route="item.activeIndex" >{{item.name}}</el-menu-item> <el-submenu style="float:right;" class="right-item" v-if="Object.keys(rightNavItems).length === 0?false:true" index="10" > <template slot="title"> <i class="el-icon-s-fold" style="font-size:28px;color:#2d2d2d;"></i> </template> <el-menu-item :key="key" v-for="(item,key) in rightNavItems" :index="item.index" :route="item.activeIndex" >{{item.name}}</el-menu-item> </el-submenu> </el-menu>
總結
總的來說,一個丐版就算完成了,這里只提供了一種可能的思路,如需實踐可以增加更多判斷規(guī)則及功能。(主要是已經(jīng)轉用Vuetify啦~)
到此這篇關于element-ui 實現(xiàn)響應式導航欄的示例代碼的文章就介紹到這了,更多相關element 響應式導航欄內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Vue如何使用ElementUI對表單元素進行自定義校驗及踩坑
有一些驗證不是通過input select這樣的受控組件來觸發(fā)驗證條件的 ,可以通過自定義驗證的方法來觸發(fā),下面這篇文章主要給大家介紹了關于Vue如何使用ElementUI對表單元素進行自定義校驗及踩坑的相關資料,需要的朋友可以參考下2023-02-02vue 項目集成 electron 和 electron 打包及環(huán)境配
文章介紹了如何使用Vue和Electron開發(fā)桌面端應用,包括安裝Electron、配置package.json、創(chuàng)建main.js文件、運行和打包應用等步驟,并分享了一些常見的打包錯誤及其解決方法,感興趣的朋友一起看看吧2025-01-01Vue.js+Layer表格數(shù)據(jù)綁定與實現(xiàn)更新的實例
下面小編就為大家分享一篇Vue.js+Layer表格數(shù)據(jù)綁定與實現(xiàn)更新的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03解決vue 使用axios.all()方法發(fā)起多個請求控制臺報錯的問題
這篇文章主要介紹了解決vue 使用axios.all()方法發(fā)起多個請求控制臺報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11如何解決Element-ui的el-table固定列后出現(xiàn)的表格錯位問題
這篇文章主要介紹了如何解決Element-ui的el-table固定列后出現(xiàn)的表格錯位問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-09-09