- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我将圆圈元素拖出组时,如何取消附加圆圈元素?目前我可以将它附加到组中,但无法在拖动时取消附加。如果任何人有想法,请提供帮助。我是 d3js 和 javascript 的新手
演示:http://jsfiddle.net/q7L9qdyv/
代码:
var svg = d3.select("body").append("svg")
.attr("width", 800)
.attr("height", 803);
//Draw the Circle
var circle = svg.append("circle")
.attr("r", 25)
.attr("cx", 35)
.attr("cy", 145)
.style("stroke-opacity", .9)
.style("stroke", "green")
.style("fill", "white")
.style("stroke-width", "2px")
.classed("baseCircle", true); // created a class to identify
var targetCircle = circle;
var tempCircle = circle;
//unique id for circles
function guid()
{
function _p8(s)
{
var p = (Math.random().toString(16) + "000000000").substr(2, 8);
return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p;
}
return _p8() + _p8(true) + _p8(true) + _p8();
}
//function to move circles
function moveCircle()
{
d3.select(this)
.attr('cx', d3.event.x)
.attr('cy', d3.event.y);
}
//Move the group along wth elements/Drag Behaviour for Group
var dragGroup = d3.behavior.drag()
.origin(function () {
var g = this;
return {x: d3.transform(g.getAttribute("transform")).translate[0],
y: d3.transform(g.getAttribute("transform")).translate[1]};
})
.on("drag", function (d, i) {
g = this;
translate = d3.transform(g.getAttribute("transform")).translate;
console.log(translate);
x = d3.event.dx + translate[0],
y = d3.event.dy + translate[1];
d3.select(g).attr("transform", "translate(" + x + "," + y + ")");
d3.event.sourceEvent.stopPropagation();
});
//Group element
var targetG = svg.append("g")
.call(dragGroup)
.style('cursor', 'move')
.attr("transform", "translate(150,150)");
//Append rectangle to group
targetG.append("rect")
.attr("fill", "none")
.style("stroke", "black")
.style("stroke-width", "2px")
.attr("width", 200)
.attr("height", 200)
.style("fill", "white");
//Drag behaviour starts for circles
var drag = d3.behavior.drag()
.on("dragstart", dragstart)
.on("drag", drag)
.on("dragend", dragend);
//Start
function dragstart() {
console.log("circle dragged is::" + d3.select(this).attr("id"));
if (d3.select(this).classed("baseCircle") === true) {
targetCircle = svg.append("circle")
.attr("r", 25) //get radius from targetCircle and also styles?
.attr("cx", targetCircle.attr("cx"))
.attr("cy", targetCircle.attr("cy"))
.style("fill", "white")
.style("stroke", "green")
.style("stroke-width", "2px");
targetCircle.call(drag);
}
else
{
targetCircle = d3.select(this);
tempCircle = this;
}
targetCircle.classed("dragTarget", true).attr("id", "dragTargetId");
}
//Drag
function drag()
{
targetCircle.attr("cx", d3.event.x)
.attr("cy", d3.event.y);
}
//End
function dragend(d) {
//Get event x and y
var tx = targetCircle.attr("cx"),
ty = targetCircle.attr("cy");
var flag = 0;
//Select all elements in svg
try {
var elemArr = svg.selectAll("*").each(function (d, i) {
//If the element is a member of a group, check
if ($(this.parentNode).is("g")) {
//Get coordinates
var box = this.getBBox();
var bx = box.x,
by = box.y,
bw = box.width,
bh = box.height;
//Make shape inherit translate of parent element
var translate = d3.select(this.parentNode).attr("transform");
var translate = translate.substring(translate.indexOf("translate(") + 10, translate.length);
translate = (translate.substring(0, translate.indexOf(")"))).split(",");
bx += parseInt(translate[0]);
by += parseInt(translate[1]);
//Check if within x and y bounds
if (tx >= bx && tx <= (bx + bw) && !flag && ty >= by && ty <= (by + bh))
{
//Flag to prevent further action
flag = 1;
//Append target circle to g element
targetG.append("circle")
.attr("r", 25) //get radius from targetCircle and also styles?
.attr("id", guid())
.classed("circleAddedClass", true)
.attr("cx", d3.mouse(this)[0])
.attr("cy", d3.mouse(this)[1])
.style("fill", "white")
.style("stroke", "black")
.style("stroke-width", "2px")
.call(
d3.behavior.drag()
.on("dragstart", function () {
d3.event.sourceEvent.stopPropagation();
})
.on('drag', moveCircle).origin(function () {
var t = d3.select(this);
return {x: t.attr("cx"), y: t.attr("cy")};
}));
targetCircle.remove();
}
}
});
} catch (e) {
log(e);
}
}
function log(s) {
console.log(s);
return s;
}
circle.call(drag);
最佳答案
CSS
.baseCircle {
stroke-opacity: 0.9;
stroke: green;
stroke-width: 2px;
fill: white;
}
.dragTarget {
stroke: green;
stroke-width: 2px;
fill: white;
}
.circleAddedClass {
stroke: black;
stroke-width: 2px;
fill: white;
}
脚本
我稍微重组了你的代码
// unique id for circles
function guid() {
function _p8(s) {
var p = (Math.random().toString(16) + "000000000").substr(2, 8);
return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p;
}
return _p8() + _p8(true) + _p8(true) + _p8();
}
function getNode(d3Element) {
return d3Element[0][0];
}
// check if within bounds
function isWithin(x, y, box) {
return (x >= box.x && x <= (box.x + box.width) && y >= box.y && y <= (box.y + box.height))
}
function getTranslate(t) {
var translate = d3.transform(t.getAttribute("transform")).translate;
return {
x: Number(translate[0]),
y: Number(translate[1])
};
}
var svg = d3.select("body")
.append("svg")
.attr("width", 800)
.attr("height", 803);
// movement for a transformed element
var dragG = d3.behavior.drag()
// set the origin to the start position
.origin(function () {
return getTranslate(this);
})
.on("drag", function () {
d3.select(this).attr(
"transform",
"translate(" +
d3.event.x + "," +
d3.event.y + ")");
});
// drop group
var targetG = svg.append("g")
.style('cursor', 'move')
.attr("transform", "translate(150,150)")
.call(dragG)
// append rectangle to group
targetG.append("rect")
.attr("fill", "none")
.style("stroke", "black")
.style("stroke-width", "2px")
.attr("width", 200)
.attr("height", 200)
.style("fill", "white");
// drag functions
var draggedCircle;
var circleDrag = function () {
draggedCircle
.attr("cx", d3.event.x)
.attr("cy", d3.event.y);
}
function circleDragEnd() {
// get event x and y
var dx = Number(draggedCircle.attr("cx"));
var dy = Number(draggedCircle.attr("cy"));
if (draggedCircle.classed("circleAddedClass")) {
var t = getTranslate(getNode(draggedCircle).parentNode);
console.log([dx, dy])
dx += t.x;
dy += t.y;
console.log([dx, dy])
}
svg.selectAll("g").each(function () {
var rect = d3.select(this).select("rect");
if (rect.length === 1) {
var box = getNode(rect).getBBox();
// the actual coordinates of the element must include the parent's transform too
var t = getTranslate(this);
box = {
x: box.x + t.x,
y: box.y + t.y,
width: box.width,
height: box.height
}
if (isWithin(dx, dy, box)) {
if (!draggedCircle.classed("circleAddedClass")) {
draggedCircle = draggedCircle.remove()
.attr("cx", dx - t.x)
.attr("cy", dy - t.y)
.attr("id", guid())
.classed("dragTarget", false)
.classed("circleAddedClass", true);
// append target circle to g element
this.appendChild(getNode(draggedCircle))
}
} else if (draggedCircle.classed("circleAddedClass")) {
if (getNode(draggedCircle).parentNode === this) {
draggedCircle = draggedCircle.remove()
.attr("cx", dx)
.attr("cy", dy)
.classed("dragTarget", true)
.classed("circleAddedClass", false);
getNode(svg).appendChild(getNode(draggedCircle))
}
}
}
});
}
// drag behaviour for circle instances
var dragCircleInstance = d3.behavior.drag()
.on("dragstart", function () {
draggedCircle = d3.select(this)
d3.event.sourceEvent.stopPropagation();
})
.on("drag", circleDrag)
.on("dragend", circleDragEnd);
// drag behaviour for circle template
var dragCircleTemplate = d3.behavior.drag()
.on("dragstart", function () {
draggedCircle = svg.append("circle")
.attr("r", 25) //get radius from targetCircle and also styles?
.attr("cx", d3.select(this).attr("cx"))
.attr("cy", d3.select(this).attr("cy"))
.classed("dragTarget", true)
.call(dragCircleInstance);
})
.on("drag", circleDrag)
.on("dragend", circleDragEnd);
// draw the circle template
var circle = svg.append("circle")
.attr("r", 25)
.attr("cx", 35)
.attr("cy", 145)
.classed("baseCircle", true)
.call(dragCircleTemplate);
fiddle - http://jsfiddle.net/f7u11xm4/
关于jointjs - 拖出组时取消附加圆圈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31476321/
我想知道JointJS提供了什么样的动画? 有没有我可以引用的文档或链接? 最佳答案 您可以阅读 JointJS 中可用的转换 here 关于jointjs - 我们在 JointJS 中可以做哪些动
我已经实现了纸张的缩放,效果很好。 我将它与鼠标滚轮的滚动联系起来,但我仍然遇到一个问题:在 API 中,缩放函数定义为 scale paper.scale(sx, sy, [ox, oy])我认为
如何使链接在 1 点内保持与单元或端口的连接? 如果端口是圆形,则当单元移动时,与其连接的链路端会移动穿过该圆形。 我希望能够使其保持在同一点 - 圆边缘的中心。 期望: 当我向下移动单元格时会发生什
JointJs 是否有启用/绘制图表网格线的选项? 如果没有,有没有办法自定义实现并绘制网格线? 最佳答案 根据jointjs changelog您现在可以通过 joint.dia.paper 的 d
我有一个使用 JointJs 生成的图形,它使用 jointjs 提供的 Dagre 布局。目前,图表从上到下对齐,这是正确的方式,但随后完整的图表将对齐到纸张的左侧。 我需要图表在纸的中间水平对齐。
你好我正在尝试使用 JointJS 库执行 Hello world 应用程序,如下所示: http://www.jointjs.com/tutorial#hello-world我已经下载了 joint
我想获得与元素关联的所有传出链接。在jointJs 中实现这一点的方法是什么。实际上我已经尝试过类似的方法,但它同时给出了传出和传入的结果。 paper.findViewByModel(start).
我想禁用 JointJS 图表中元素和链接的移动,同时保持其他功能,如元素的超链接和鼠标悬停时链接的突出显示。我引用了以下链接: https://groups.google.com/forum/#!s
想象一下,我有一个 Rect 元素,我希望在左上角用一个小的(比如 16x16)PNG 图像装饰它。我无法确定如何完成该任务。我已经研究了文档,但(到目前为止)无法找到有关如何实现该任务的示例或引用。
如果纸张对于显示的 div 来说太大,我想让纸张可拖动。 我尝试了空白:pointerdown 和pointerup 事件的论文,但不能只跟随鼠标移动。我还尝试通过 jquery 使纸张元素可拖动,但
我有一份带有图表的工作文件。我已向图表中添加了多个单元格,并且正在尝试监听 cell:highlight 事件,但我从未收到它。 我正在做: paper.on('cell:highlight', fu
我正在尝试将 JointJS 与端口功能一起使用: (...) var model = joint.shapes.devs.Model({ siz
当我将圆圈元素拖出组时,如何取消附加圆圈元素?目前我可以将它附加到组中,但无法在拖动时取消附加。如果任何人有想法,请提供帮助。我是 d3js 和 javascript 的新手 演示:http://js
我试图避免链接在空间中结束,我只想允许链接将一个元素与另一个元素连接起来。我当前的代码是: new joint.shapes.basic.Rect({ id: id, size: {
如何在联合js中的矩形内输入文本区域/文本输入? 我有几个矩形。我想首先将文本输入到矩形中。我必须为此创建自定义元素还是可以使用预定义的形状? 这是我的代码: var
我有一个只读图表来可视化一些数据。我的最终用户希望“过滤”数据,以便一次只能显示数据的一个子集。我意识到每次应用过滤器时都可以重新绘制整个图表,忽略不显示的元素,但我想知道是否有一种方法可以简单地动态
我正在研究 JointJS。我有各种带有文字的元素。然而,元素的宽度随着文本的增加而增加。我想动态设置元素的大小,以便框可以达到最大高度和宽度,并通过文本换行相应地扩展。如果文本操作系统无法适应最大高
我正在使用此解决方案 ( Joint.js Drag and Drop Element between two papers ) 拖放两篇论文,效果非常好。 我想知道是否存在一种方法可以知道您是否将幽
我正在使用joint.shapes.devs.js插件在我的jointJS文档上创建元素。我想创建一个在您单击某个元素时出现的菜单,以便显示和修改其所有数据以及删除该元素。 由于我不是 Backbon
我的应用程序中有一个可以滚动纸张的平移 Controller 。如何获取所显示内容的坐标以查看元素是否完全在屏幕上? 最佳答案 您需要知道纸张元素的坐标(x、y、宽度、高度)。 x、y 可以是 scr
我是一名优秀的程序员,十分优秀!