Vue拖拽悬浮按钮

html-css09

Vue拖拽悬浮按钮,第1张

背景: 最近做的页面原本有一个点赞悬浮按钮,但是在不同分辨率的移动设备屏幕上,后边的文字显示位置不固定,有的会被悬浮按钮挡住。所以加了一个拖拽功能。

参考解决办法:   狗尾草-Vue拖拽组件

遇到问题及解决:

1.unable to preventDefault inside passive event listener due to taeget being treated as passive

原因是为了滚动顺滑,touchmove等事件会被浏览器默认设置为passive:true,需要手动设置成false。参考: Unable to preventDefault inside passive event listener 。文中提到的两种办法,第一种可以,第二种css办法试了无效(可能是设置的位置不对?)

2.拖拽之后,被拖拽的组件大小会改变

我是只需要y轴拖拽,拖拽后空间的高度改变了,拖过的路径都变成了div的高度,再点击之前组件挡住的地方,会出现点击到组件的效果。解决办法是设置组件height属性。

3.设置tansition后拖拽“不动”

网上看的一个例子里边加了transition,可能是想让效果平滑一些,但是却有一种拖不动的感觉。当时以为是拖拽功能实现的有问题,于是删了换了上边链接里的方法,拖拽get√。然后试着加了一下transition,又出现了阻塞。所以这里应该是不适合用transition属性的,而且不用也挺平滑的。

学习总结:

拖拽功能的实现,主要是通过监听鼠标事件,计算各种数值,不断调整组件的位置。因此,需要复习的知识点是鼠标事件,各种尺寸数据及之间的关系。存在的不足是,虽然发现了问题并解决了,但还是不知道问题原理层面的原因。知其然,不知其所以然,希望之后能把这块补充起来。

前端框架

Ant Design of Vue 表格使用 vue-draggable-resizabl -- 固定列问题修复

glass_Girl

原创

关注

0点赞·289人阅读

表格如果加了列拖拽功能,并且设置了列fixed。

出现了一个头疼的现象

问题:

因为拖拽需要设置width。这个时候。你屏幕宽度超过了他们设置的widht之和。Ant Des的表格自适应放宽。可是加了resizabl的列依旧是固定宽度。导致。显示了两个相同的列。还是不一样的长度

解决方式 :

在拖拽/加载时判断是否超长。动态去掉fixed配置项

页面引入

import vdr from "vue-draggable-resizable-gorkys"

import "vue-draggable-resizable-gorkys/dist/VueDraggableResizable.css"

import debounce from "lodash/debounce"

登录后复制

:components='components'

this.components = {

header: {

cell: (h, props, children) =>{

const { key, ...restProps } = props

// 此处的this.columns 是定义的table的表头属性变量

const col = this.columns.find((col) =>{

const k = col.dataIndex || col.key

return k === key

})

if (!col || !col.width) {

return h("th", { ...restProps }, [...children])

}

const { minWidth = 200, maxWidth } = col || {}

const dragProps = {

key: col.dataIndex || col.key,

class: "",

attrs: {

w: col.width,

h: "auto",

axis: "x",

minWidth,

maxWidth,

draggable: false,

resizable: true,

handles: ["mr"]

},

on: {

resizing: (l, t, w) =>{

col.width = Math.max(w, 1)

},

resizestop: () =>{

this.resize()

}

}

}

const drag = h(vdr, { ...dragProps }, [...children])

restProps.class += " resize-table-th"

return h(

"th",

{

...restProps

},

[drag]

)

}

}

}

登录后复制

重新计算表列:this.resize()

记得给表格添加 样式:.draggable-table,设置::scroll="{x:true}"

// 动态计算Columns

export function calculateColumns(columns) {

const domTable =

window.document.querySelector(".draggable-table .ant-table-body") || {}

const { scrollWidth = 0,clientWidth = 0 } = domTable

scrollX = clientWidth <scrollWidth - 1

if (scrollX) {

columns = columns.map(o =>{

if (o.fixedInit) {

o.fixed = o.fixedInit// 恢复浮动列配置

}

return o

})

} else {

columns = columns.map(o =>{

if (o.fixed) {

o.fixedInit = o.fixed

o.fixed = undefined

}

return o

})

}

return columns

}

登录后复制

窗口变化都要去更新

mounted() {

this.$options._resize = debounce(this.resize, 150)

window.addEventListener("resize", this.$options._resize)

},

beforeDestroy() {

window.removeEventListener("resize", this.$options._resize)

},

登录后复制

样式:

// 可拖拽表头表格样式

.resize-table-th .vdr {

height: 100% !important

width: 100% !important

padding: @rem7 @rem16 !important

border: none

transform: none !important

position: relative !important

}

.resize-table-th {

padding: 0 !important

&:hover .handle-mr {

background: @yn-auxiliary-color

}

}

.resize-table-th .handle {

cursor: col-resize

border: none !important

box-shadow: none !important

}

.resize-table-th .handle-mr {

width: 2px !important

z-index: 2

cursor: col-resize

background: inherit

border: none

height: calc(100% - @rem12) !important

top: @rem6 !important

right: 0 !important

display: block !important

}

登录后复制

然后不论怎么拖拽。变窗口大小。固定列都能正常展示了

本人也在不断的学习和积累中,文章中有不足和误导的地方还请见谅,可以给我留言指正。希望和大家共同进步,共建和谐学习环境。

1、npm安装

2、bower安装

3、CDN

注: 最好放在<body>中引用,不要放在<head>中。

需要引入一些css样式,在页面中引入 dist/dragula.css 或 dist/dragula.min.css ,如果你使用的是Stylus,你可以这样引入

下面的示例允许用户将元素从中left拖入right和从中right拖入left

您还可以提供一个options对象。以下是默认值的介绍

您可以省略container参数,稍后动态添加容器。

还可以从options对象设置容器

你还可以设置一个没有container和options的draglua

dragula方法返回一个带有简洁API的小对象。我们将把dragula返回的API称为drake。

Dragula只使用四个CSS类。下面将快速解释它们的用途

默认:

Github/dragula