首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Kefir.js拖动示例-拖尾

Kefir.js拖动示例-拖尾
EN

Stack Overflow用户
提问于 2016-04-02 09:42:58
回答 1查看 197关注 0票数 0

我一直在尝试在Kefir拖动div示例中加入一个拖曳流/可观测值,但没有得到任何结果。在鼠标向下、摩丝表情和鼠标向上组合后触发事件似乎是有意义的,但我只是想不出一种方法让它发挥作用。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-06 00:00:56

这件事对我来说效果很好:

代码语言:javascript
复制
var dragTarget = document.querySelector('#draggable');

var mouseDowns = Kefir.fromEvents(dragTarget, 'mousedown');
var mouseMoves = Kefir.fromEvents(document, 'mousemove');


var moves = mouseDowns.flatMap(function(downEvent) {
  var mouseUp = Kefir.fromEvents(dragTarget, 'mouseup').take(1).onEnd(function(){
    alert('done dragging');
  });
  return mouseMoves.takeUntilBy(mouseUp)
    .diff(eventsPositionDiff, downEvent);
});

代码语言:javascript
复制
// Pure functions

function eventsPositionDiff(prevEvent, nextEvent) {
  return {
    x: nextEvent.clientX - prevEvent.clientX,
    y: nextEvent.clientY - prevEvent.clientY
  };
}

function applyMove(currentPosition, move) {
  return {
    x: currentPosition.x + move.x,
    y: currentPosition.y + move.y
  };
}


var dragTarget = document.querySelector('#draggable');

var mouseDowns = Kefir.fromEvents(dragTarget, 'mousedown');
var mouseMoves = Kefir.fromEvents(document, 'mousemove');


var moves = mouseDowns.flatMap(function(downEvent) {
  var mouseUp = Kefir.fromEvents(dragTarget, 'mouseup').take(1).onEnd(function(){
    alert('done dragging');
  });
  return mouseMoves.takeUntilBy(mouseUp)
    .diff(eventsPositionDiff, downEvent);
});



var position = moves.scan(applyMove, {x: 0, y: 0});


// Add side effect

var el = document.querySelector('#draggable');
position.onValue(function(pos) {
  el.style.top = pos.y + 'px';
  el.style.left = pos.x + 'px';
});
代码语言:javascript
复制
#draggable {
    width: 50px;
    height: 50px;
    position: absolute;
    background: #b9ffb9;
    cursor: move;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    padding: .2em;
}
代码语言:javascript
复制
<script src="https://cdn.jsdelivr.net/kefir/3.1.0/kefir.js"></script>
<div id="draggable">Drag me</div>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36371640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档