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

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

vue swipeCell滑動單元格(仿微信)的實現示例

瀏覽:198日期:2022-06-11 15:46:43

抽離Vant weapp滑動單元格代碼改造而成

帶有拉動彈性回彈效果

vue swipeCell滑動單元格(仿微信)的實現示例

demo展示:https://littaotao.github.io/me/index(切換為瀏覽器調試的手機模式并且再次刷新一次)

<template><divclass='cell_container'@touchstartv-click-outside='handleClickOutside'@click='getClickHandler(’cell’)'><div:style='{’transform’:’translateX(’+(offset+(isElastic?elasticX:0))+’px)’,’transition-duration’:dragging?’0s’:’0.6s’}'><!-- <div ref='cellLeft' @click='getClickHandler(’left’, true)'><div>收藏</div><div>添加</div></div> --><div@touchend='onClick()':class='offset?’cell_content’:’cell_content_active’'>SwipeCell</div><div ref='cellRight'class='cell_right'@click='getClickHandler(’right’, true)'><div:class='type?’divPostion’:’’'ref='remove':style='{’background’:’#ccc’,’padding-left’:’10px’,’padding-right’:10+(isElastic?Math.abs(elasticX/3):0)+’px’,’transition-duration’:dragging?’0s’:’0.6s’}'>標記</div><div : ref='tag' :style='{’transform’: type?’translateX(’+(-offset*removeWidth/cellRightWidth-(isElastic?elasticX/3:0))+’px)’:’’,’padding-left’:’10px’,’padding-right’:10+(isElastic?Math.abs(elasticX/3):0)+’px’,’transition-duration’:dragging?’0s’:’0.6s’,’background’:’#000’}'>不再關注</div><div : :style='{’transform’: type?’translateX(’+(-offset*(removeWidth+tagWidth)/cellRightWidth-(isElastic?elasticX/3*2:0))+’px)’:’’,’padding-left’:’10px’,’padding-right’:10+(isElastic?Math.abs(elasticX/3):0)+’px’,’transition-duration’:dragging?’0s’:’0.6s’}'>刪除</div></div></div></div></template><script>import ClickOutside from ’vue-click-outside’;import { TouchMixin } from ’@/components/mixins/touch’;export default{name:'SwipeCell',props: {// @deprecated// should be removed in next major version, use beforeClose insteadonClose: Function,disabled: Boolean,leftWidth: [Number, String],rightWidth: [Number, String],beforeClose: Function,stopPropagation: Boolean,name: {type: [Number, String],default: ’’,},//type:{type:[Number,String],default:1 //0 常規 1 定位},isElastic:{ //彈性type:Boolean,default:true}},data(){return {offset: 0,dragging: true,//-位移elasticX:0,removeWidth:0,tagWidth:0,cellRightWidth:0,cellLeftWidth:0}},computed: {computedLeftWidth() {return +this.leftWidth || this.getWidthByRef(’cellLeft’);},computedRightWidth() {return +this.rightWidth || this.getWidthByRef(’cellRight’);},},mounted() {//防止彈性效果影響寬度this.cellRightWidth = this.getWidthByRef(’cellRight’);this.cellLeftWidth = this.getWidthByRef(’cellLeft’);this.removeWidth = this.getWidthByRef(’remove’);this.tagWidth = this.getWidthByRef(’tag’);this.bindTouchEvent(this.$el);},mixins: [TouchMixin],directives: {ClickOutside},methods: {getWidthByRef(ref) {if (this.$refs[ref]) {const rect = this.$refs[ref].getBoundingClientRect();//type=1定位時獲取寬度為0,為此采用獲取子元素寬度之和if(!rect.width){let childWidth = 0;for(const item of this.$refs[ref].children){childWidth += item.getBoundingClientRect().width}return childWidth;}return rect.width;}return 0;},handleClickOutside(e){if(this.opened) this.close()},// @exposed-apiopen(position) {const offset =position === ’left’ ? this.computedLeftWidth : -this.computedRightWidth;this.opened = true;this.offset = offset;this.$emit(’open’, {position,name: this.name,// @deprecated// should be removed in next major versiondetail: this.name,});},// @exposed-apiclose(position) {this.offset = 0;if (this.opened) {this.opened = false;this.$emit(’close’, {position,name: this.name,});}},onTouchStart(event) {if (this.disabled) {return;}this.startOffset = this.offset;this.touchStart(event);},range(num, min, max) {return Math.min(Math.max(num, min), max);},preventDefault(event, isStopPropagation) {/* istanbul ignore else */if (typeof event.cancelable !== ’boolean’ || event.cancelable) {event.preventDefault();}if (this.isStopPropagations) {stopPropagation(event);}},stopPropagations(event) {event.stopPropagation();},onTouchMove(event) {if (this.disabled) {return;}this.touchMove(event);if (this.direction === ’horizontal’) {this.dragging = true;this.lockClick = true;const isPrevent = !this.opened || this.deltaX * this.startOffset < 0;if (isPrevent) {this.preventDefault(event, this.stopPropagation);}this.offset = this.range(this.deltaX + this.startOffset,-this.computedRightWidth,this.computedLeftWidth);//增加彈性if(this.computedRightWidth && this.offset === -this.computedRightWidth || this.computedLeftWidth && this.offset === this.computedLeftWidth){//this.preventDefault(event, this.stopPropagation);//彈性系數this.elasticX = (this.deltaX + this.startOffset - this.offset)/4;}}else{//上下滑動后取消closethis.dragging = true;this.lockClick = true;}},onTouchEnd() {if (this.disabled) {return;}//回彈this.elasticX = 0if (this.dragging) {this.toggle(this.offset > 0 ? ’left’ : ’right’);this.dragging = false;// compatible with desktop scenariosetTimeout(() => {this.lockClick = false;}, 0);}},toggle(direction) {const offset = Math.abs(this.offset);const THRESHOLD = 0.15;const threshold = this.opened ? 1 - THRESHOLD : THRESHOLD;const { computedLeftWidth, computedRightWidth } = this;if (computedRightWidth &&direction === ’right’ &&offset > computedRightWidth * threshold) {this.open(’right’);} else if (computedLeftWidth &&direction === ’left’ &&offset > computedLeftWidth * threshold) {this.open(’left’);} else {this.close();}},onClick(position = ’outside’) {this.$emit(’click’, position);if (this.opened && !this.lockClick) {if (this.beforeClose) {this.beforeClose({position,name: this.name,instance: this,});} else if (this.onClose) {this.onClose(position, this, { name: this.name });} else {this.close(position);}}},getClickHandler(position, stop) {return (event) => {if (stop) {event.stopPropagation();}this.onClick(position);};},}}</script><style lang='stylus' scoped>.cell_container{position: relative;overflow: hidden;line-height: 68px;height:68px;div{height: 100%;.cell_content{height: 100%;width: 100%;text-align: center;}.cell_content_active{height: 100%;width: 100%;text-align: center;&:active{background: #e8e8e8;}}.cell_left,.cell_right{position: absolute;top: 0;height: 100%;display: flex;color: #fff;.divPostion{position: absolute;}div{white-space:nowrap;display: flex;align-items: center;background: #ccc;}}.cell_left{left: 0;transform:translateX(-100%);}.cell_right{right: 0;transform:translateX(100%);}}}</style>

touch.js

import Vue from ’vue’;export const isServer=false;const MIN_DISTANCE = 10;const TouchMixinData = { startX: Number, startY: Number, deltaX: Number, deltaY: Number, offsetX: Number, offsetY: Number, direction: String};function getDirection(x,y) { if (x > y && x > MIN_DISTANCE) { return ’horizontal’; } if (y > x && y > MIN_DISTANCE) { return ’vertical’; } return ’’;}export let supportsPassive = false;export function on( target, event, handler, passive = false) { if (!isServer) { target.addEventListener( event, handler, supportsPassive ? { capture: false, passive } : false ); }}export const TouchMixin = Vue.extend({ data() {TouchMixinData return { direction: ’’ } ; }, methods: { touchStart() { this.resetTouchStatus(); this.startX = event.touches[0].clientX; this.startY = event.touches[0].clientY; }, touchMove() { const touch = event.touches[0]; this.deltaX = touch.clientX - this.startX; this.deltaY = touch.clientY - this.startY; this.offsetX = Math.abs(this.deltaX); this.offsetY = Math.abs(this.deltaY); this.direction = this.direction || getDirection(this.offsetX, this.offsetY); }, resetTouchStatus() { this.direction = ’’; this.deltaX = 0; this.deltaY = 0; this.offsetX = 0; this.offsetY = 0; }, // avoid Vue 2.6 event bubble issues by manually binding events // https://github.com/youzan/vant/issues/3015 bindTouchEvent( el ) { const { onTouchStart, onTouchMove, onTouchEnd } = this; on(el, ’touchstart’, onTouchStart); on(el, ’touchmove’, onTouchMove); if (onTouchEnd) { on(el, ’touchend’, onTouchEnd); on(el, ’touchcancel’, onTouchEnd); } }, },});

引入即可?。?!

到此這篇關于vue swipeCell滑動單元格(仿微信)的實現示例的文章就介紹到這了,更多相關vue swipeCell滑動單元格內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: 微信
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本精品不卡| 日韩欧美中文在线观看| 国产高清精品二区| 国产情侣久久| 国产精品日韩精品中文字幕| 久久a爱视频| 国产91在线播放精品| yellow在线观看网址| 久久精品1区| 日韩视频一区| 亚洲欧洲日韩精品在线| 日韩av一级片| 免费日韩成人| 国产成人免费精品| 久久亚洲国产精品尤物| 91免费精品| 国产二区精品| 亚洲人成网站在线在线观看| 国产精品最新| 成人福利视频| 欧美午夜不卡| 男女性色大片免费观看一区二区| 亚洲视频二区| 国产精品永久| 丁香六月综合| 亚洲免费网址| 国产乱码精品一区二区亚洲| 色一区二区三区四区| 午夜久久福利| 一区二区三区四区在线观看国产日韩| 午夜亚洲福利| 国产videos久久| 欧美另类专区| 91麻豆精品| 欧美久久天堂| 蜜臀va亚洲va欧美va天堂| 国产日韩欧美一区二区三区 | 欧美日韩国产高清电影| 美女精品一区| 欧美黑人巨大videos精品| 亚洲一级网站| 国产精品最新自拍| 久久麻豆精品| 首页国产欧美久久| 老鸭窝一区二区久久精品| 亚洲一级影院| 国产精品最新| 91精品二区| 国产精品日本一区二区三区在线| 久久高清免费| 国产一级成人av| 久久要要av| 国产欧美日韩精品高清二区综合区 | 欧美日韩午夜电影网| 国产91欧美| 视频一区视频二区在线观看| 精品亚洲成人| 男人天堂欧美日韩| 激情不卡一区二区三区视频在线| 婷婷丁香综合| 久久婷婷国产| 蜜桃久久久久久| 日韩电影免费在线观看| 日本在线不卡视频一二三区| 免费在线小视频| 久久精品99久久久| 精品一区在线| 国产福利一区二区三区在线播放| 国精品一区二区| 免费亚洲婷婷| 日韩精品一级二级| 日韩欧美1区| 国产精品资源| 蜜臀av一区二区在线免费观看| 综合日韩av| 国产欧美一区二区色老头| 黄色成人精品网站| 日韩.com| 欧美精品观看| 综合干狼人综合首页| 日韩中文欧美| 麻豆极品一区二区三区| 亚洲色图网站| 视频一区中文| 国产欧美一区二区三区精品酒店| 亚洲欧美专区| 国产亚洲亚洲| 久久精品亚洲人成影院| 久久麻豆视频| 久久国产免费看| 亚洲ww精品| 另类国产ts人妖高潮视频| 日韩高清中文字幕一区二区| 精品三级在线观看视频| 国产午夜久久av| 亚洲va久久久噜噜噜久久| 亚洲国产成人精品女人| 日产精品一区二区| 狂野欧美性猛交xxxx| 欧美日韩亚洲一区在线观看| 久久午夜精品一区二区| 久久久久国产| 日韩一区电影| 国产精品麻豆久久| 久久精品国产一区二区| 国产精品一区2区3区| 奇米色欧美一区二区三区| 亚洲精品无播放器在线播放| 99国产一区| 婷婷激情综合| 欧美日韩激情| 99久久激情| 欧美日韩一区二区综合 | 久久国产电影| 成人啊v在线| 久久久久美女| 国产主播一区| 五月天久久久| 亚洲黄色在线| 性一交一乱一区二区洋洋av| 影音先锋久久| 99热免费精品| 丝瓜av网站精品一区二区| 视频在线观看一区二区三区| 日韩制服丝袜先锋影音| 免费在线成人网| 蜜桃久久久久久久| 日韩久久99| 亚洲va久久久噜噜噜久久| 日本综合精品一区| 日韩国产在线观看一区| 国产亚洲一区二区三区啪| 欧美激情麻豆| 国产 日韩 欧美 综合 一区| 国产欧洲在线| 久久精品卡一| 蜜臀91精品国产高清在线观看| 婷婷综合在线| 综合一区av| 国产精品最新| 新版的欧美在线视频| 欧美午夜精彩| 国产精品呻吟| 亚州国产精品| 国产福利资源一区| 高清不卡亚洲| 女同性一区二区三区人了人一| 久久99伊人| 国产伦精品一区二区三区在线播放 | 不卡一区综合视频| 手机精品视频在线观看| 日韩国产欧美视频| 精品一区二区三区亚洲| 日韩一区二区三区免费播放| 亚洲福利一区| 蜜臀精品一区二区三区在线观看 | 亚洲国产成人二区| 91精品二区| 日韩1区2区3区| 精品色999| 亚洲一本视频| 日本aⅴ亚洲精品中文乱码| 麻豆视频久久| 99久久精品网站| 亚洲不卡视频| 成人在线免费观看91| 黄色日韩在线| 国产日韩欧美一区在线| 亚洲一区资源| 六月婷婷一区| 久久不见久久见免费视频7| 日韩中文字幕高清在线观看| aⅴ色国产欧美| 久久不卡国产精品一区二区| 久久精品av| 日韩欧美高清一区二区三区| 国内自拍视频一区二区三区| 欧美日韩国产在线观看网站| 日本午夜精品久久久| 特黄毛片在线观看| 一二三区精品| 神马午夜在线视频| 日韩中文字幕| 久久久一二三| 日韩午夜视频在线| 日韩精品欧美| 国产精品网址| 亚洲精品一区二区在线看| 欧美日韩一区二区三区不卡视频| 视频二区不卡| 日韩**一区毛片| av亚洲一区二区三区| 日韩一区二区三区在线看| av免费不卡国产观看| 日韩精品视频在线看| 日韩免费福利视频| 欧美在线91| 亚洲精品va| 精品久久一区| 91欧美极品|