最近公司事情比較少,正好早上有人問我那個滑動粘着頭部不動的怎麼實現,我想了半天,前幾天剛剛寫過,那就記錄一下咯。因而,女友送了我一張圖
javascript
其實思路還蠻簡單的,監聽容器div的滾動時間,及每一個須要fixed的高度,滑到這個對應高度了,fixed住就好了。可能有點籠統,咱們結合代碼說吧。
今天咱們從基本的template-script-style模式來貼代碼好了
[圖片上傳失敗...(image-444c6e-1536305058022)]css
<!--滑動的容器--> <div class="scroll-div"> <!--一個頭部加一個item的容器--> <div class="for-class" v-for="item in baseArray"> <!--須要fixed住的頭部,id爲獲取具體位置使用,可替換成ref 綁定class實現添加fixed樣式做用--> <div class="info-line" :id="item.idName" :class="{fiexd_line:fiexdItem===item.fiexdItem}"> {{item.name}} </div> <!--下方的item,這裏與本文關係不到,可忽略--> <div class="detail-container" :class="{margin_top:fiexdItem===1000}"> <div class="detail-item" v-for="sub_item in item.list" @click="setLocation(sub_item)"> {{sub_item}} </div> </div> </div>
而後是css部分,這裏用了scss的寫法,具體是什麼,自行百度或谷歌,其中只列出了有關的樣式,剩餘部分用...省略html
.scroll-div { width: 100%; overflow: auto; ... } .info-line { ... //這個都不是特別重要 } .fiexd_line { position: fixed; width: 100%; ... }
重頭戲來了,咱們一步一步順清楚。
1.數據初始化
2.事件監聽
3.邏輯判斷java
具體的數據可根據實際狀況修改,這裏的數據以效果圖爲準 //添加A-Z數組 let baseAtoZArray = [];//生成A-Z的字母 for (let i = 65; i < 91; i++) { baseAtoZArray.push(String.fromCharCode(i)); } //均分數組並添加相應的數據,每一個子數組最多有7個元素 this.baseArray = [...chunk(baseAtoZArray, 7)]; for (let item of this.baseArray) { this.baseArray[this.baseArray.indexOf(item)] = { name: item.join(''),//顯示的文本 idName: `${item[0]}2${item[item.length - 1]}-line`,//惟一id,es6模版字符串和下方的...運算符瞭解下 fiexdItem: this.baseArray.indexOf(item),//fixed標識 list: this.getRegList(item[0], item[item.length - 1]),//符合該條件的下方內容,與本文關係不大 }; } //添加指望工做城市與熱門城市 this.baseArray = [ { name: '指望工做城市', idName: `base-line`, fiexdItem: 1000, list: [this.location], }, { name: '熱門城市', idName: `hot-line`, fiexdItem: 100, list: this.$config.HOT_CITIES, },...this.baseArray];
//監聽滾動事件 //界面加載完成後,將每一層header距離頭部的距離記錄下來 for (let item of that.baseArray) { item.top = $('#' + item.idName).offset().top } $('.scroll-div').on('scroll', function () { //對每一項數據監測 for (let item of that.baseArray) { if (this.scrollTop > item.top - 20) { //由於在同一高度中,只可能有一個header,因此設置一個,其餘header不匹配,而後duang的一下符合條件的就fixed住了 that.fiexdItem = item.fiexdItem; } } });
代碼就這麼多,主要是數據準備上以及獲取上要下點功夫,還有不少須要優化的地方,騷年們加油吧,在這裏我就給大家喊:
git
最近產出有點多,但願能對你們有所幫助
es6
好了,要被老闆拖過去搬磚了,下次見,有空點點github嘛。
github