錨點定位算是一個很熟悉的功能了,之前都是使用a標籤的href=#XXX來實現,以下:bash
可是這種方法地址欄會變化,會給人一種誤覺得頁面刷新的錯覺,若是須要進行地址欄的操做,還得加一些判斷,比較麻煩,因此採用了一種新的方式來進行錨點定位,就是scrollIntoViewless
如下爲使用scrollIntoView實現的通信錄功能的錨點定位動畫
思路:ui
須要被定位的元素添加id,使用document.getElementById或者querySelector來得到元素,而後點出來scrollIntoView( )方法this
粗略效果圖:spa
具體代碼3d
<template>
<div class="test clear">
<div class="left-letter">
<span
v-for="(letter,letterIndex) in letterList"
:key="letterIndex"
@click="toLetters(letter)">{{letter}}
</span>
</div>
<ul class="student-container">
<li v-for="(student, stIndex) in studentInfo" :key="stIndex">
<span :class="{'spell-letter': true, 'selected': student.spell.toUpperCase().slice(0, 1) === selectLetter}" :id="student.spell.toUpperCase().slice(0, 1)" v-if="stIndex===0 || studentInfo[stIndex].spell.toUpperCase().slice(0, 1) !== studentInfo[stIndex - 1].spell.toUpperCase().slice(0, 1)">{{student.spell.toUpperCase().slice(0, 1)}}</span>
<div>
<var>{{student.name}}</var>
<var>{{student.number}}</var>
</div>
</li>
</ul>
</div>
</template>
<script>
export default {
name: 'test',
data(){
return {
studentInfo: [
{
name: '白芸維',
spell: 'baiyunwei',
number: '001'
},
{
name: '柏楠',
spell: 'bonan',
number: '002'
},
{
name: '陳建熹',
spell: 'chenjianxi',
number: '003'
},
{
name: '陳天佑',
spell: 'chentianyou',
number: '004'
},
{
name: '東西',
spell: 'dongxi',
number: '008'
},
{
name: '桂怡',
spell: 'guiyi',
number: '005'
},
{
name: '黃英',
spell: 'huangyin',
number: '009'
},
{
name: '黃小',
spell: 'huangxiao',
number: '0010'
},
{
name: '黃決賽',
spell: 'huangjuesai',
number: '0011'
},
{
name: '黃英里',
spell: 'huangyinli',
number: '0012'
},
{
name: '雪梨',
spell: 'xueli',
number: '0013'
},
{
name: '楊穎',
spell: 'yangyin',
number: '006'
},
{
name: '曾志偉',
spell: 'zengzhiwei',
number: '007'
},
], //學生信息列表
letterList: [], //字母列表
selectLetter: '', //被選中的字母
}
},
created() {
// 初始化字母列表
this.studentInfo.forEach((e, index)=>{
//過濾字母,重複的不選
if (index === 0) {
this.letterList[0] = e.spell.toUpperCase().slice(0, 1)
this.selectLetter = this.letterList[0]
} else if (index != 0 && this.studentInfo[index].spell.toUpperCase().slice(0, 1) !== this.studentInfo[index - 1].spell.toUpperCase().slice(0, 1)) {
this.letterList.push(e.spell.toUpperCase().slice(0, 1))
}
})
},
methods: {
// 點擊左側字母,右側學生列表滾動到指定位置
toLetters(letter) {
this.selectLetter = letter
let e = document.getElementById(letter)
if (e) {
e.scrollIntoView() //滾動到指定位置
}
}
}
}
</script>
<style lang="less" scoped>
.test {
width: 1200px;
margin: 20px auto 0;
.left-letter {
position: fixed;
top: 228px;
left: 78px;
width: 20px;
border: 1px solid #d8d8d8;
background: #f9f9f9;
span {
display: block;
width: 100%;
height: 30px;
text-align: center;
line-height: 30px;
cursor: pointer;
}
span:hover {
background: #d0e8ed;
color: #0d858e;
}
}
.student-container {
position: relative;
float: left;
width: 200px;
margin-left: 100px;
// border: 1px solid #d8d8d8;
li {
padding: 0 10px;
span {
position: absolute;
color: #999;
font-weight: bold;
}
span.selected {
color: #0d858e;
}
div {
padding: 10px 10px 0;
margin-left: 30px;
border: 1px solid #d8d8d8;
var {
display: block;
margin-bottom: 10px;
}
}
}
}
}
</style>複製代碼
scrollIntoView的默認值爲true:rest
element.scrollIntoView()
= element.scrollIntoView(true)
= element.scrollIntoView({block:'start',inline:'nearest'})複製代碼
element.scrollIntoView(false) = element.scrollIntoView({block:'end',inline:'nearest'})複製代碼
scrollIntoView可選:
behavior定義動畫:'auto' | 'instant' | 'smooth'code
block定義滾動位置: 'start' | 'center' | 'end' | 'nearest'cdn
inline: 'start' | 'center' | 'end' | 'nearest'
參考: