- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我基于 d3.js 的项目中,即使 View 的宽度或高度发生变化,我也想让当前 View 居中的内容保持居中。同时我希望允许用户通过平移和缩放进行交互。
我的想法是使用嵌套组,外部组用于居中,内部组作为 d3.zoom
目标:
<g transform="translate(WIDTH/2, HEIGHT/2)">
<g transform="translate(ZOOM_X, ZOOM_Y) scale(ZOOM_K)">
...
</g>
</g>
请参阅以下尝试:
var svgWrapper = d3.select("#svgWrapper").node(),
svg = d3.select("svg"),
width = svgWrapper.offsetWidth,
height = svgWrapper.offsetHeight;
var outerG = svg.append("g");
var g = outerG.append("g");
outerG.append("line")
.attr("stroke", "red")
.attr("stroke-width", 2)
.attr("x1", -10)
.attr("x2", 10)
.attr("y1", -10)
.attr("y2", 10);
outerG.append("line")
.attr("stroke", "red")
.attr("stroke-width", 2)
.attr("x1", -10)
.attr("x2", 10)
.attr("y1", 10)
.attr("y2", -10);
for (var i = 1; i <= 3; ++i) {
g.append("circle")
.attr("fill", "none")
.attr("stroke", "black")
.attr("stroke-width", 1.5)
.attr("r", i * 5);
}
var zoom = d3.zoom();
svg.call(zoom
.scaleExtent([1 / 2, 4])
.on("zoom", zoomed));
g.call(zoom.transform, d3.zoomIdentity.translate(-width / 2, -height / 2));
function zoomed() {
g.attr("transform", d3.event.transform);
}
// https://developer.mozilla.org/en-US/docs/Web/Events/resize#requestAnimationFrame_customEvent
function throttle(type, name, obj) {
obj = obj || window;
var running = false;
var func = function() {
if (running) {
return;
}
running = true;
requestAnimationFrame(function() {
obj.dispatchEvent(new CustomEvent(name));
running = false;
});
};
obj.addEventListener(type, func);
}
function resize() {
width = svgWrapper.offsetWidth;
height = svgWrapper.offsetHeight;
zoom.extent([
[0, 0],
[width, height]
]);
outerG.attr("transform", "translate(" + (width / 2) + ", " + (height / 2) + ")");
}
resize();
throttle("resize", "optimizedResize");
window.addEventListener("optimizedResize", resize);
html,
body,
#svgWrapper,
svg {
width: 100%;
height: 100%;
overflow: hidden;
}
<div id="svgWrapper">
<svg></svg>
</div>
<script src="https://d3js.org/d3.v4.min.js"></script>
红色十字代表视口(viewport)中心,圆圈代表可以拖动的内容。单击“整页”并调整窗口大小以查看调整大小的效果。
遗憾的是,第一个平移以及向某个点缩放似乎坏了。将两个 translates()
放入单个 transform
中也不起作用。
这是为什么?有什么办法可以解决吗?
将它变成一个单一的转换,即在每次调整大小时调用 zoom.transform
,出于各种原因对我来说不是一个好的解决方案:
这会导致 start
/zoom
/end
事件在调整窗口大小甚至检查 event.sourceEvent
没什么用
平移限制 (.translateExtent()
) 将与显示相关。
与单一转换方法相比,这几乎没有任何优势,而且从我有限的测试来看,这似乎也存在问题。
zoom.extent()
我不明白这对我有什么帮助。
最佳答案
添加 <rect>
它捕获所有输入,如 https://bl.ocks.org/mbostock/4e3925cdc804db257a86fdef3a032a45似乎可行,但我必须将矩形添加到外部组并将其转换回来(否则缩放中心将关闭):
var svgWrapper = d3.select("#svgWrapper").node(),
svg = d3.select("svg"),
width = svgWrapper.offsetWidth,
height = svgWrapper.offsetHeight;
var outerG = svg.append("g");
var g = outerG.append("g");
outerG.append("line")
.attr("stroke", "red")
.attr("stroke-width", 2)
.attr("x1", -10)
.attr("x2", 10)
.attr("y1", -10)
.attr("y2", 10);
outerG.append("line")
.attr("stroke", "red")
.attr("stroke-width", 2)
.attr("x1", -10)
.attr("x2", 10)
.attr("y1", 10)
.attr("y2", -10);
for (var i = 1; i <= 3; ++i) {
g.append("circle")
.attr("fill", "none")
.attr("stroke", "black")
.attr("stroke-width", 1.5)
.attr("r", i * 5);
}
var zoom = d3.zoom();
var rect = outerG.append("rect")
.attr("x", "-50%")
.attr("y", "-50%")
.attr("width", "100%")
.attr("height", "100%")
.style("fill", "yellow")
.style("opacity", ".1")
.style("pointer-events", "all")
.call(zoom
.scaleExtent([1 / 2, 4])
.on("zoom", zoomed));
function zoomed() {
g.attr("transform", d3.event.transform);
}
// https://developer.mozilla.org/en-US/docs/Web/Events/resize#requestAnimationFrame_customEvent
function throttle(type, name, obj) {
obj = obj || window;
var running = false;
var func = function() {
if (running) {
return;
}
running = true;
requestAnimationFrame(function() {
obj.dispatchEvent(new CustomEvent(name));
running = false;
});
};
obj.addEventListener(type, func);
}
function resize() {
width = svgWrapper.offsetWidth;
height = svgWrapper.offsetHeight;
zoom.extent([
[0, 0],
[width, height]
]);
outerG.attr("transform", "translate(" + (width / 2) + ", " + (height / 2) + ")");
}
resize();
throttle("resize", "optimizedResize");
window.addEventListener("optimizedResize", resize);
html,
body,
#svgWrapper,
svg {
width: 100%;
height: 100%;
overflow: hidden;
}
<div id="svgWrapper">
<svg></svg>
</div>
<script src="https://d3js.org/d3.v4.min.js"></script>
这对于示例来说效果很好,但遗憾的是,叠加层捕获了所有事件,因此显然您无法拥有可点击/可悬停的元素。欢迎提出替代解决方案。
由于这些原因,我对我的项目最终采用了单一转换方法。
关于javascript - 保持内容居中并允许在 d3 中平移/缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46533546/
我正在为我的按钮使用 onClick 功能。我的按钮代码如下所示: Button 1 Button 2 我的 JS 函数如下所示: function fadeNext(selectedId, spee
首先,我想提一下,我理解每个人在不提供至少一些试验或错误的情况下提出问题的感受,但这纯粹是一种知识需求,话虽如此,我会去提前问。 我一直无法弄清楚如何将保存在 MySQL 表中的 600-1000 个
我想做的事情有点令人困惑,而且我英语不太好,所以我先把代码贴在这里,这样你就可以很容易地理解: 以下是表单内容: Testing for Stackoverflow Option1
我学习 SDL 二维编程已有一段时间了,现在我想创建一个结合使用 SDL 和 OpenGL 的程序。我是这样设置的: SDL_Init(SDL_INIT_VIDEO); window = SDL_Cr
我创建了 2 个 data-* 标签。数据类别和数据标签。单击 href 标签后,我想复制该数据类别和数据标签以形成输入。我的代码是:
我想用 CSS 换行。我正在使用内容。 td:before { content: "Test\A Test2"; } 它不工作。如何正确
这个问题已经有答案了: Java Class that implements Map and keeps insertion order? (8 个回答) 已关闭 6 年前。 我有一个 HashMap
我正在尝试使用 JMeter 执行端到端测试。测试涉及写入SFTP文件夹并从另一个SFTP文件夹读取写入操作生成的文件。 我能够使用 JMeter SSH SFTP 插件连接到 SFTP 文件夹,并能
您好,我有带有标准服务器端 Servlet 的 GWT 客户端。 我可以从 GWT 客户端上传文件并在服务器端读取其内容 我可以将其作为字符串发送回客户端 但是 我有 GWT FormPanel与操作
我在 Plone 4.3.9 中创建了一个自定义类型的灵巧性,称为 PersonalPage,必须只允许在特定文件夹中使用 成员文件夹/用户文件夹 . 在他的 FTI 中,默认情况下 False .
在新(更新)版本的应用程序中更改小部件布局的最佳做法是什么?当新版本提供更新、更好的小部件时,如何处理现有小部件? 最佳答案 我认为您必须向用户显示一个弹出窗口,说明“此版本中的新功能”并要求他们重新
在我的应用程序中,我使用支持 View 寻呼机和 PagerTabStrip。进入查看寻呼机我有一些 fragment ,进入其中一个我正在使用支持卡片 View 。运行应用程序后,所有卡片 View
我有以下布局文件。基本上我有谷歌地图,在左上角我有一个 TextView,我需要在其中每 15 秒保持一次计数器以刷新 map 。布局很好。
我使用如下结构: HashMap > > OverallMap 如果我这样做: OverallMap . clear ( ) clear() 丢弃的所有内容(HashMap 对象、Integer 对
我在数据库中有 1000 张图像。在页面加载时,我随机显示 60 张图片,当用户滚动时,我通过 AJAX 请求添加 20 张图片。 第一种方法 我所做的是将所有图像加载到一个容器中,然后隐藏所有图像并
我正在使用 woocommerce 创建一个网上商店。 我想在每个产品上添加一个包含产品信息的表格,例如颜色、交货时间等等。 但是当我添加这张表时。本产品消失后的所有内容。 我的表的代码: td {
This question already has an answer here: What does an empty value for the CSS property content do?
因此,我正在与我的 friend 一起为 Google Chrome 开发一个扩展程序,对于大多数功能(即日历、设置等),我们打开一个模式,这样我们就不必重定向到另一个页面。当您在内容之外单击时,我们
我将可变高度的 CSS 框设置为在更大的 div 中向左浮动。现在我想添加一个标题,其中文本在框的左侧垂直显示(旋转 90 度),如下面的链接所示(抱歉还不能发布图片)。 http://imagesh
相关页面位于 www.codykrauskopf.com/circus 如果您查看我页面的右侧,在半透明容器和浏览器窗口边缘之间有一个间隙。我看了看,出于某种原因,wrap、main、content
我是一名优秀的程序员,十分优秀!