首页 经验

d3js拖动 在 D3.js 中实现拖动功能时,dragged 函数的实现需要确保你正确处理坐标和变换

时间: 2024-12-07 17:08:19

(部分内容来自网络,其真实性存疑,为了避免对您造成误导,请谨慎甄别。)

在 D3.js 中实现拖动功能时,dragged 函数的实现需要确保你正确处理坐标和变换。你提到 dragged 函数无法正常拖动,可能是因为没有正确更新元素的位置或没有考虑到当前的缩放和变换状态。以下是一些可能的改进和建议:

改进 dragged 函数

  1. 使用 event.x 和 event.y:直接使用 event.x 和 event.y 来更新元素的位置,而不是计算变换后的位置。

  2. 考虑缩放:如果你在使用缩放(zoom),你需要将拖动的值应用到当前的缩放比例。

  3. 更新位置:可以直接在 dragged 函数中更新位置,而不需要使用 transform 属性。

以下是改进后的代码示例:

const dragListener = d3.drag()  
    .on("start", dragstarted)  
    .on("drag", dragged)  
    .on("end", dragended);  

// 设置拖拽事件  
function dragstarted(event) {  
    d3.select(this).raise().classed("active", true);  
}  

function dragged(event, d) {  
    // 获取当前的缩放变换  
    const transform = d3.zoomTransform(svg.node());  
    
    // 更新元素的位置,考虑缩放  
    const newX = (event.x - transform.x) / transform.k; // 计算缩放后的X坐标  
    const newY = (event.y - transform.y) / transform.k; // 计算缩放后的Y坐标  

    d3.select(this)  
        .attr("transform", translate(${newX}, ${newY}));  
}  

function dragended(event) {  
    d3.select(this).classed("active", false);  
}  

// 注意:确保你的 SVG 元素已经设置了缩放行为  
const zoom = d3.zoom()  
    .scaleExtent([1, 10]) // 设置缩放范围  
    .on("zoom", (event) => {  
        svg.attr("transform", event.transform); // 应用缩放变换  
    });  

svg.call(zoom);

关键点解释

  1. 缩放变换:d3.zoomTransform(svg.node()) 用于获取当前的缩放和位移状态。

  2. 位置计算:在 dragged 函数中,使用 event.x 和 event.y 减去当前的缩放位移(transform.x 和 transform.y),然后除以缩放比例 transform.k 来获得实际的拖动位置。

  3. SVG 缩放:确保你的 SVG 元素已经应用了缩放行为,这样才能正确处理拖动和缩放。

其他注意事项

通过这些改进,你的拖动功能应该能够正常工作。如果还有其他问题,请提供更多上下文或代码片段。

还有问题,向AI提问。


上一个 d3.js 原来translate 不为 0,0 文章列表 下一个 d3js拖拽改变曲线形状

我公司是丽水市科技型企业。主要经营电脑、交换机、服务器、LED液晶屏、监控电子围栏、进出口道闸等电子化智能产品。只要你有需求,我们都能提供完备的建设方案。 Tel: 18201798243

最新

工具

© 2019-至今 适观科技

沪ICP备17002269号