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

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

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

瀏覽:194日期: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久久,三上悠亚国产精品一区二区三区
伊人精品视频| 麻豆国产精品| 亚洲精品一级| 亚洲欧美日韩精品一区二区| 日韩欧美一区免费| 国产精品久久久久9999高清| 欧美在线日韩| 国产精品美女午夜爽爽| 国产精品美女在线观看直播| 福利精品一区| 国产一区二区中文| 久久不射中文字幕| 欧美日韩伊人| 国产精品a级| 日韩视频一区| 欧美日韩一区二区三区不卡视频| 久久黄色影视| 毛片在线网站| 久久国产高清| 久久精品亚洲| 性欧美69xoxoxoxo| 老司机免费视频一区二区| 国产乱人伦精品一区| 欧美日韩国产观看视频| 欧美日韩第一| 国产欧美日韩一区二区三区四区 | 色欧美自拍视频| 日韩一区二区中文| 日韩视频1区| 日韩欧美精品综合| 99成人在线| 亚洲黄色免费看| 免费观看在线综合| 国产免费久久| 九一精品国产| 国产一区二区三区网| 亚洲精品少妇| av亚洲免费| 国产精品videossex| 欧美女激情福利| 精品国产欧美日韩| 99国产精品| 精品亚洲a∨一区二区三区18| 亚州精品视频| 在线精品观看| 播放一区二区| 麻豆国产精品一区二区三区| 羞羞答答国产精品www一本| 国产一卡不卡| 日韩中文字幕1| 免费视频一区三区| 麻豆视频在线观看免费网站黄 | 91高清一区| 欧美国产三级| 国产精品黄网站| 日韩av黄色在线| 日本免费一区二区视频| 日韩精品免费一区二区在线观看| 69精品国产久热在线观看| 亚洲综合国产| 亚州av日韩av| 亚洲无线观看| 国产一区导航| 日本免费一区二区视频| 亚洲日本国产| 日韩亚洲精品在线| 性一交一乱一区二区洋洋av| 亚洲精品1区2区| 日韩影院在线观看| 日韩三级精品| 日韩二区三区在线观看| 91精品麻豆| 日韩和欧美一区二区| 国产精品99久久免费观看| 欧美亚洲tv| 欧美黄页在线免费观看 | 亚洲色图国产| 少妇精品久久久| 欧美永久精品| 麻豆视频久久| 91精品精品| 蜜桃视频欧美| 国产精品一区毛片| 久久成人高清| 久久精品一本| 婷婷综合社区| 国产精品试看| 日韩精品视频在线看| 国产精品99久久免费| 在线日韩一区| 日韩午夜视频在线| 三上亚洲一区二区| 久久成人亚洲| 国产视频一区二| 国产精选在线| 一级成人国产| 国产一卡不卡| 国产综合亚洲精品一区二| 亚洲精品乱码日韩| 久久亚州av| 久久国产99| 久久影院一区二区三区| 国产美女高潮在线| 日韩三级视频| 日韩一区二区免费看| 另类欧美日韩国产在线| 蜜桃国内精品久久久久软件9| 国产一区 二区| 老司机久久99久久精品播放免费| 欧美激情aⅴ一区二区三区 | 亚洲制服欧美另类| 久久99高清| 亚洲国产专区校园欧美| 亚欧洲精品视频在线观看| 久久要要av| 成人污污视频| 国产精品日本一区二区三区在线| 久久国产精品亚洲77777| 亚洲欧洲美洲av| 精品国产乱码久久久久久樱花| 视频一区欧美精品| 久久高清精品| 国际精品欧美精品| 欧美有码在线| 欧美亚洲综合视频| 日韩av黄色在线| 欧美成人综合| 日韩精品水蜜桃| 国产精久久一区二区| 免费观看在线综合| 久久国产中文字幕| 影视先锋久久| 欧美日韩高清| 视频一区二区国产| 在线看片日韩| 欧美日韩亚洲一区在线观看| 国产精品综合色区在线观看| 国产精品久久久久9999高清| 国产剧情一区二区在线观看| 91亚洲无吗| 久久麻豆视频| 亚洲国产福利| 亚洲人成在线网站| 高清一区二区| 亚洲欧美日韩国产综合精品二区| 视频一区视频二区中文字幕| 中文字幕一区二区av| 国产另类在线| 日韩1区2区| 国产在线|日韩| 欧美日韩精品免费观看视欧美高清免费大片 | 国产一区二区三区四区| 麻豆精品国产91久久久久久| 精品视频黄色| 久久精品国产亚洲夜色av网站 | 日韩精品一区二区三区免费视频| 日韩精品视频网| 国产精品一区二区免费福利视频| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 欧美专区一区二区三区| 黄色亚洲大片免费在线观看| 视频国产精品| 欧美日韩一区二区三区不卡视频| 国产一级成人av| 日本欧美国产| 午夜在线视频观看日韩17c| 久久精品72免费观看| 国产资源在线观看入口av| 丝袜诱惑制服诱惑色一区在线观看| 亚洲精品观看| 日韩不卡在线| 日韩av午夜在线观看| 亚洲午夜精品久久久久久app| 美女精品一区二区| 亚洲欧美久久久| 亚洲不卡av不卡一区二区| 国产精品欧美一区二区三区不卡| 亚洲精品88| 久久精品97| 日韩成人高清| 日本国产一区| 欧美午夜精彩| 国产精品精品国产一区二区| 亚洲欧美日韩一区在线观看| 日韩中文在线电影| 国产精品久一| 欧美日韩一区自拍| 蜜臀91精品一区二区三区| 久久久久久美女精品| 久久精品福利| 国产精品手机在线播放| 国产精品试看| 性欧美69xoxoxoxo| 日韩欧美一区二区三区在线观看| 999国产精品| a日韩av网址| 精品一区二区三区中文字幕 | 国产一区二区视频在线看| 欧美一区二区三区久久| av成人国产|