vue.js 2.0 better-scroll 의 스크롤 효과 실례 상세 설명
better-scroll 은 모 바 일 스크롤 솔 루 션 으로 iscroll 의 재 작성 을 바탕 으로 iscroll 과 의 주요 차이 점여기,이곳입 니 다.better-scroll 도 강력 합 니 다.일반적인 스크롤 목록 을 만 들 수 있 을 뿐만 아니 라 라운드 맵,picker 등 도 만 들 수 있 습 니 다.
<template>
<div>
<div class="goods">
<div class="menu-wrapper" ref="menuWrapper">
</div>
<div class="food-wrapper" ref="foodWrapper">
</div>
</div>
</div>
</template>
1.0 버 전과 달리 ref 를 사용 합 니 다.
<script type="text/ecmascript-6">
import BScroll from "better-scroll";
export default {
data(){
return {
currentIndex:1,
goods:[]
}
},
created(){
this.classMap=['decrease','discount','special','invoice','guarantee'];
this.$http.get('/api/goods').then((response)=>{
response=response.body;
if (response.errno===ERR_OK) {
this.goods=response.data;
}
//dom (nextTick dom , dom )
this.$nextTick(()=>{
this._initScroll();
});
});
},
methods:{
_initScroll(){
// better-scroll
this.menuScroll=new BScroll(this.$refs.menuWrapper,{click:true});
this.foodScroll=new BScroll(this.$refs.foodWrapper,{click:true});
}
}
};
</script>
간단 합 니 다.이렇게 하면 페이지 가 굴 러 갈 수 있 습 니 다.다음 그림 입 니 다.그러나 이렇게 좌우 두 페이지 가 연결 되 지 않 았 습 니 다.스크롤 의 높이 를 계산 하 는 방법 과 계산 속성 에서 왼쪽 현재 색인 이 어디 에 있 는 지 계산 하 는 방법 을 다시 정의 해 야 합 니 다.
왼쪽 사 이 드 바 의 위 치 를 정의 합 니 다.
computed:{
// ,
currentIndex(){
for (let i = 0; i < this.listHeight.length; i++) {
var height1=this.listHeight[i] ;
var height2=this.listHeight[i+1];
if(!height2||(this.scrollY >= height1 && this.scrollY < height2)){
return i;
}
}
return 0;
}
},
methods:{
_initScroll(){
// better-scroll
this.menuScroll=new BScroll(this.$refs.menuWrapper,{click:true});
this.foodScroll=new BScroll(this.$refs.foodWrapper,{
click: true,
// ,
probeType: 3
});
this.foodScroll.on('scroll',(pos)=>{
this.scrollY=Math.abs(Math.round(pos.y))
});
},
_calculateHeight(){
let foodList=this.$refs.foodWrapper.getElementsByClassName('food-list-hook');
let height=0;
this.listHeight.push(height);
for (var i = 0; i < foodList.length; i++) {
let item=foodList[i];
height+=item.clientHeight;
this.listHeight.push(height);
}
}
}
//dom (nextTick dom , dom )
this.$nextTick(()=>{
this._initScroll();
this._calculateHeight();
});
dom 렌 더 링 후에 도 높이 를 계산 해 야 합 니 다.오른쪽 을 미 끄 러 뜨리 고 왼쪽 연동 이 이 루어 졌 습 니 다.그 다음 에 왼쪽 메뉴 를 클릭 하면 오른쪽 음식 이 구체 적 인 위치 로 굴 러 갑 니 다.
왼쪽 메뉴 에 이벤트 연결
:@click="selectMenu(index,$event)"
/
selectMenu(index,event){
// (BScroll),_constructed true.
if (!event._constructed) {
return;
}
// BScroll
// index
let foodList=this.$refs.foodWrapper.getElementsByClassName('food-list-hook');
//
let el=foodList[index];
//
this.foodScroll.scrollToElement(el,2000);
}
이로써 전체 연동 이 실 현 된 전체 코드 는 다음 과 같다.
<template>
<div>
<div class="goods">
<div class="menu-wrapper" ref="menuWrapper">
<ul>
<li v-for="(item,index) in goods" class="menu-item" :class="{'current':currentIndex===index}" @click="selectMenu(index,$event)">
<span class="text border-1px">
<span v-show="item.type>0" class="icon" :class="classMap[item.type]"></span>{{item.name}}
</span>
</li>
</ul>
</div>
<div class="food-wrapper" ref="foodWrapper">
<ul>
<li v-for="(item,index) in goods" class="food-list food-list-hook">
<h1 class="title">{{item.name}}</h1>
<ul>
<li v-for="food in item.foods" class="food-item border-1px">
<div class="icon">
<img :src="food.icon" width="57" height="57" alt="">
</div>
<div class="content">
<h2 class="name">{{food.name}}</h2>
<p class="desc">{{food.description}}</p>
<div class="extra">
<span class="count"> {{food.sellCount}} </span>
<span> {{food.rating}}%</span>
</div>
<div class="price">
<span class="now">¥{{food.price}}</span><span class="old" v-show="food.oldPrice">¥{{food.oldPrice}}</span>
</div>
</div>
</li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</template>
<script type="text/ecmascript-6">
import BScroll from "better-scroll";
const ERR_OK=0;
export default {
props:{
seller:{
type:Object
}
},
data(){
return {
goods:[],
listHeight:[],
scrollY:0
}
},
created(){
this.classMap=['decrease','discount','special','invoice','guarantee'];
this.$http.get('/api/goods').then((response)=>{
response=response.body;
if (response.errno===ERR_OK) {
this.goods=response.data;
}
//dom (nextTick dom , dom )
this.$nextTick(()=>{
this._initScroll();
this._calculateHeight();
});
});
},
computed:{
// ,
currentIndex(){
for (let i = 0; i < this.listHeight.length; i++) {
var height1=this.listHeight[i] ;
var height2=this.listHeight[i+1];
if(!height2||(this.scrollY >= height1 && this.scrollY < height2)){
return i;
}
}
return 0;
}
},
methods:{
_initScroll(){
// better-scroll
this.menuScroll=new BScroll(this.$refs.menuWrapper,{click:true});
this.foodScroll=new BScroll(this.$refs.foodWrapper,{
click: true,
// ,
probeType: 3
});
this.foodScroll.on('scroll',(pos)=>{
this.scrollY=Math.abs(Math.round(pos.y))
});
},
_calculateHeight(){
let foodList=this.$refs.foodWrapper.getElementsByClassName('food-list-hook');
let height=0;
this.listHeight.push(height);
for (var i = 0; i < foodList.length; i++) {
let item=foodList[i];
height+=item.clientHeight;
this.listHeight.push(height);
}
},
//
selectMenu(index,event){
// (BScroll),_constructed true.
if (!event._constructed) {
return;
}
// BScroll
// index
let foodList=this.$refs.foodWrapper.getElementsByClassName('food-list-hook');
//
let el=foodList[index];
//
this.foodScroll.scrollToElement(el,2000);
}
}
};
</script>
<style lang="stylus" rel="stylesheet/stylus">
@import "../../common/stylus/mixin.styl";
.goods
display:flex
position:absolute
top:174px
bottom:46px
width:100%
overflow:hidden
.menu-wrapper
flex:0 0 80px
width: 80px
background:#f3f5f7
.menu-item
display:table
height:54px
width:56px
padding:0 12px
line-height:14px
&.current
position:relative
z-index:10
margin-top:-1px
background:#fff
font-weight:700
.text
border-none()
.icon
display:inline-block
vertical-align:top
margin-right:2px
width:12px
height:12px
background-size:12px 12px
background-repeat:no-repeat
&.decrease
bg-image('decrease_3')
&.discount
bg-image('discount_3')
&.guarantee
bg-image('guarantee_3')
&.invoice
bg-image('invoice_3')
&.special
bg-image('special_3')
.text
display:table-cell
vertical-align:middle
width:56px
border-1px(rgba(7,17,27,0.1))
font-size:12px
.food-wrapper
flex:1
.title
padding-left:14px
font-size:12px
color:rgb(147,153,159)
height:26px
border-left:2px solid #d9dde1
line-height:26px
background:#f3f5f7
.food-item
display:flex
margin:18px
padding-bottom:18px
border-1px(rgba(7,17,27,0.1))
&:last-child
border-none()
margin-bottom:0
.icon
flex:0 0 57px
margin-right:10px
.content
flex:1
.name
margin:2px 0 8px 0
height:14px
line-height:14px
font-size:14px
color:rgb(7,17,27)
.desc,.extra
line-height:10px
font-size:10px
color:rgb(147,153,159)
.desc
margin-bottom:8px
line-height:12px
.extra
.count
margin-right:12px
.price
font-weight:700
line-height:24px
.now
margin-right:8px
font-size:14px
color:rgb(240,20,20)
.old
text-decoration:line-through
font-size:10px
color:rgb(147,153,159)
</style>
총결산위 에서 말 한 것 은 편집장 이 소개 한 vue.js 2.0 이 better-scroll 의 스크롤 효 과 를 실현 하 는 실례 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Fastapi websocket 및 vue 3(Composition API)1부: FastAPI virtualenv 만들기(선택 사항) FastAPI 및 필요한 모든 것을 다음과 같이 설치하십시오. 생성main.py 파일 및 실행 - 브라우저에서 이 링크 열기http://127.0.0.1:...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.