d3 转换改变了哪些属性?

2024-04-27

我试图了解 d3 中到底发生了什么转换。

例如

var bars = svg.selectAll(null)
  .data(my_values)
  .enter()
  .append("rect") // statement before transition
  .attr("x", 10)  // statement before transition
  .transition()   // transition
  .delay(200)
  .duration(1500)
  .attr("height", 10) // statement after transition
  .transition()   // another transition
  .delay(200)
  .duration(1500);
  1. 转换是否影响转换之前的任何语句,还是转换仅影响转换之后的语句

  2. 多重转换如何运作?


你的第二个问题...

  1. 多重转换如何运作?

回答起来很简单。到这里,API就很清楚了:

过渡.transition()

返回与此转换相同的选定元素上的新转换,计划在此转换结束时开始。

因此,新的过渡将在前一个过渡完成后开始,依此类推。让我们来看看它:

var rect = d3.select("svg").append("rect")
  .attr("width", 100)
  .attr("height", 0)
  .style("fill", "black")
  .transition()
  .duration(1000)
  .attr("height", 100)
  .transition()
  .duration(1000)
  .style("fill", "teal")
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg></svg>

有趣的问题

然而,这里有趣的问题是你的第一个问题:

  1. 转换是否影响转换之前的任何语句,还是转换仅影响转换之后的语句?

嗯,这也是非常基本的:transition()方法创建起始值和目标值之间的转换。您必须在转换之前(起始值)和转换之后(目标值)设置属性。

问题是先前未设置的属性将具有null value.

让我们看看:没有指定height的矩形,它是null:

var rect = d3.select("svg").append("rect");

console.log(rect.attr("height"))
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg></svg>

因此,如果在转换之前没有设置高度,则高度不会平滑转换:

var rect = d3.select("svg").append("rect")
  .attr("width", 100)
  .transition()
  .duration(1000)
  .attr("height", 100);
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg></svg>

有趣的一点是:我写了一个答案(现已删除,>10k 的用户可以看到)解释插值器无法从null到给定值。然而,它can插:

var interpolator = d3.interpolateNumber(null, 100);
d3.range(0,1.1,.1).forEach(function(d){
	console.log(interpolator(d))
});
<script src="https://d3js.org/d3.v4.min.js"></script>

所以,这里发生的事情有点复杂。使用interpolateNumber我们可以从中插值null到给定值。看看这个演示,其中height未设置:

var rect = d3.select("svg").append("rect")
  .attr("width", 100)
  .transition()
  .duration(1000)
  .attrTween("height", function() {
    return d3.interpolateNumber(d3.select(this).attr("height"), 100);
  });
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg></svg>

为什么默认transition.attr()当您在转换之前未设置属性时不起作用?

经过一番调查后,我认为transition()正在将数字目标值转换为字符串(例如100 to "100")。这很奇怪,因为API 明确表示 https://github.com/d3/d3-transition#transition_attr that...

...使用以下算法根据目标值的类型选择插值器:

  1. 如果值是数字,则使用interpolateNumber.
  2. 如果 value 是颜色或可强制转换为颜色的字符串,请使用interpolateRgb.
  3. Use interpolateString.

这里是源代码 https://github.com/d3/d3-transition/blob/master/src/transition/attr.js#L73,看最后一行:

export default function(name, value) {
    var fullname = namespace(name),
        i = fullname === "transform" ? interpolateTransform : interpolate;
    return this.attrTween(name, typeof value === "function" 
        ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, "attr." + name, value)) 
        : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname) 
        : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value + ""));
        //converting to string here ------------------------------------------^
}

正如我们所看到的,它将值强制转换为字符串。因此,转换将不起作用,因为它将使用interpolateString代替interpolateNumber:

var interpolator = d3.interpolateString(null, "100");
d3.range(0,1.1,.1).forEach(function(d){
	console.log(interpolator(d))
});
<script src="https://d3js.org/d3.v4.min.js"></script>

结论

transition()创建从起始值到目标值的转换。如果没有设置起始值,则默认为null。然而,作为transition() uses interpolateString,插值将无法正常工作。

更新于 18/11/2017

根据 Mike Bostock(D3 创建者)的说法,源代码是正确的(因此,文档是错误的)。正如他在这篇文章中所说GitHub问题 https://github.com/d3/d3-transition/pull/67:

interpolateString (or interpolateRgb) 是这里的正确行为。interpolateNumber永远不应该用于属性。

解释是像这样的值"100px" or "1.3em"不会与interpolateNumber。所以,再次强调,不要依赖null起始值:始终在之前和之后设置属性transition().

感谢 @altocumulus 对 GitHub 问题的评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

d3 转换改变了哪些属性? 的相关文章

  • angular.copy() 和 JSON.parse(JSON.stringify()) 之间的区别?

    有人可以解释 angular copy 和 JSON parse JSON stringify 之间的区别吗 有吗 您会推荐使用什么 angular fromJson angular toJson 与 JSON parse JSON str
  • 如何使用 jquery 从 iframe 内部滚动?

    我正在使用一个 Shadowbox 它生成一个 iframe 以在页面上显示产品详细信息 由于详细信息页面可能相当长 因此客户端需要一个 更多 按钮来向下滚动页面 显然 iframe 右侧的滚动条还不够 这是我为了让 iframe 滚动而尝
  • JavaScript 中的常用数字

    在我的任务中 我必须编写一个程序来查找数组中最常见的数字以及它重复的次数 我写了一些东西 但只打印最大重复次数 所以我的问题是如何打印这个元素的值 最大数量 在我的例子中是 4 var array 13 4 1 1 4 2 3 4 4 1
  • 是否可以用 json 进行表达式/计算?

    我使用出色的 json server 作为应用程序的后端 它对于访问自定义端点以检索一些数据非常有用 但是如果它允许我进行计算 表达式以便我也可以模仿后端行为 那将会非常有用 以这个数据结构为例 products name football
  • GeoJSON 要素坐标未显示在 OpenLayers 地图上

    我正在尝试显示一个GeoJSON地图上的多边形 我使用了 OpenLayers 提供的示例以及以下数据 但仅显示第二个多边形 var geojsonObject type FeatureCollection crs type name fe
  • 向 FTP 服务器执行跨域 XMLHTTPREQUEST 的语法是什么?

    我有一个 webDav CORS 插件 可以使用它在 webDav 服务器上 POST PUT GET REMOVE ALLDOCS 文件 我现在想对 FTP 做同样的事情 但我正在努力获取xmlhttprequest 工作语法 我只是收到
  • HTML5 拖放 - 没有透明度?

    当我将一个元素拖放到页面上时 该元素会变成 幻影 基本上它获得了一些透明度值 有什么办法可以做到吗opacity 1 看来是做不到了 拖动的元素被放入具有自己的不透明度 低于 1 的容器中 这意味着虽然您可以降低拖动元素的不透明度 但您无法
  • Rails - 使链接与 ajax 一起工作

    我有一个链接 应该使用 ajax 加载它旁边的部分内容 而无需重新加载页面 链接在这里 这是链接应该转到的控制器 class ProfilesController lt ApplicationController def profile f
  • 反转二进制网络

    如何反转二元方程 以便找到哪些输入将产生给定的输出 Example Inputs i0 through i8 Outputs o0 through o8 Operators XOR AND 二元方程 1 i0 1 i1 0 i2 1 i3
  • 网页抓取 - 如何识别网页上的主要内容

    给定一个新闻文章网页 来自任何主要新闻来源 例如时报或彭博社 我想识别该页面上的主要文章内容 并丢弃其他杂项元素 例如广告 菜单 侧边栏 用户评论 在大多数主要新闻网站上都可以使用的通用方法是什么 有哪些好的数据挖掘工具或库 最好是基于Py
  • 用于客户端存储和服务器端同步的javascript库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 javascript 库 它可以让我将数据存储在客户端数据库中 并在后台自动将数据库同
  • 将 javascript 变量发送到服务器端 ASP .NET

    我需要在回发时将 JavaScript 数据传递到服务器端 Exvar jsVariableToPass new Object jsVariableToPass key1 value1 jsVariableToPass key2 value
  • 如何在 svelte 中制作搜索过滤器

    我有两个组件在组件树中距离很远 我对如何在两者之间进行通信存有疑问 我有搜索组件 listItems 和商店 商店 svelte
  • 可选链接在 create-react-app 中不起作用

    In a create react app项目 我正在使用 babel plugin proposal optional chaining在我的 babelrc中 但是 我有这个错误 Module parse failed Unexpect
  • 如何修复 AJAX 在选中复选框时始终触发?

    有时这个 AJAX 会触发 有时不会 让我解释一下 habit js document ready function habit check change function habit this parent siblings habit
  • 如何将 default.html 的字符编码设置为 UTF-8?

    我花了几个小时来验证我的网站HTML 4 01 严格事实上我已经成功了 但仍然有一个警告我无法摆脱 警告是 字符编码不匹配 中指定的字符编码 HTTP 标头 iso 8859 1 是 与中的值不同 元素 utf 8 我将使用该值 来自 HT
  • 垃圾收集器不适用于 NodeJS / Chrome 中的类型化数组

    我最初将其记录为原项目中的一个问题 https github com nodejs help issues 3590 它立即转移到帮助主题 没有很好的解释 所以现在我想在这里提问 如果我们在 NodeJS v14 v16 v17 中运行以下
  • 如何使盒子阴影显示在容器中的下一个元素上?

    请看这段代码 http codepen io Varin pen kkGgVd http codepen io Varin pen kkGgVd div class container div class outside2 div clas
  • addEventListener keydown 不起作用

    我在互联网上找到了一些基本的 Pong 代码 并尝试添加按键 代码在这里 http cssdeck com labs ping pong game tutorial with html5 canvas and sounds http css
  • 截断段落前 100 个字符并隐藏段落的其余内容,以通过更多/更少链接显示/隐藏其余内容

    我有一个超过 500 个字符的段落 我只想获取最初的 100 个字符并隐藏其余部分 我还想在 100 个字符旁边插入 更多 链接 单击更多链接时 整个段落应显示并编辑文本 更多 到 更少 单击 更少 时 它应切换行为 段落是动态生成的 我无

随机推荐

  • 序列化 - 如何保护序列化的 JAVA 对象?

    如果通过网络发送序列化对象 如何保护序列化对象的安全 我怀疑黑客可能会中断 破解我的数据 谁能详细讲述如何实现这一点 本演示介绍了攻击者如何有效地篡改 Java 序列化流 https www owasp org images e eb OW
  • Numpy 逐元素点积

    有没有一种优雅的 numpy 的方法来按元素应用点积 或者如何将下面的代码翻译成更好的版本 m0 shape 5 3 2 2 m1 shape 5 2 2 r np empty 5 3 2 2 for i in range 5 for j
  • 检查注释是否属于特定类型

    我正在使用反射来查看附加到类属性的注释是否属于特定类型 目前我正在做的 if javax validation Valid equals annotation annotationType getName 这让我觉得有点麻烦 因为它依赖于一
  • 为什么通过UdpClient发送会导致后续接收失败?

    我正在尝试创建一个 UDP 服务器 它可以向所有向其发送消息的客户端发送消息 真实情况要复杂一些 但最简单的方法是将其想象为一个聊天服务器 之前发送过消息的每个人都会收到其他客户端发送的所有消息 所有这一切都是通过UdpClient 在单独
  • LongListSelector 内的缓慢故事板动画

    我有一个 LongListSelector 其中填充了一些项目 每个项目都有一个子菜单 可以使用滑动动画显示或折叠该子菜单 问题是动画非常慢 具体取决于您在列表中点击的项目 开始和结束的时候很慢 中间很顺利 我怀疑每个动画帧都会使长列表选择
  • 将行添加到文件开头

    我可以使用单独的文件来执行此操作 但如何在文件的开头附加一行 f open log txt a f seek 0 get to the first position f write text f close 由于文件是以附加模式打开的 因此
  • cmake 在执行其他操作之前执行进程

    我在执行其他操作之前 CMake 执行进程时遇到问题 下面的代码片段显示了这种情况 if NOT EXISTS CMAKE CURRENT BINARY DIR generated file MAKE DIRECTORY CMAKE CUR
  • a 是什么意思? (点)在 PHP 中做什么?

    以下命令在 PHP 中执行什么操作 string string is something which I declared in the program 就其本身而言 它根本没有任何作用 它不是有效的语法 但是 如果你有这样的事情 你会看见
  • 如何通过命令行缩小/扩大 aws ecs 集群中的容器,我应该使用 aws cli 还是 ecs-cli?

    我正在使用 EC2 实例运行 AWS ECS 集群 我想要一个命令将任务扩展到 1 个正在运行的实例 然后在一段时间后 当我不需要它时 我想将其缩小到 0 这应该会破坏底层 EC2实例以避免收费 我没有使用 Fargate 因为它不属于免费
  • XML布局在android studio中不换行

    在我更新 android studio 后 布局编辑器中的 XML 格式被破坏了 最初 每个属性都位于单独的行上 然而现在有两个或三个属性占据一条线 我进入 设置 gt 编辑器 gt 代码样式 gt XML 在 布局文件 区域下 将 换行属
  • 旋转 UISplitViewController 后模态消失

    我有一个奇怪的问题 UISplitViewController 我的主视图控制器中有一个按钮 点击时会打开一个模式视图 使用简单的故事板转场 但是 当我旋转 iPad 时 模式视图会消失 但仅限于从纵向旋转到横向时 我的主视图控制器以纵向隐
  • Intellij Idea 中 Dockerfile 部署失败(未连接到 docker)

    我是 Docker 新手 只是想按照此中的说明进行操作 我创建了非常简单的 Dockerfile 但部署失败 问题是没有太多信息 Docker 已启动并正在运行 我可以从 IDE 连接到它 码头工人信息 如果您最近更改了 Docker De
  • DbContext.Entry 附加实体

    从我的研究中 我了解到调用 DbContext Entry someEntity 会自动将实体附加到上下文 然而 当我这样做时 我发现实体的状态是分离的 任何人都可以阐明这一点以及 DbContext Entry 的工作原理吗 我正在使用
  • 如何纠正 Rails 控制台命令的错误?

    当我位于 Rails 应用程序的根目录中时 我可以成功执行rails server 但是当我尝试做时rails console or rails c我收到以下错误 myrailsapp master rails c Users myuser
  • 如何从 ActionBar 中删除顶部边框阴影

    我正在开发一个新的 Android 应用程序 由于某种原因 这个新应用程序 我自己没有添加额外的代码 在操作栏上有一个顶部边框阴影 好像是我使用 Android Studio 创建新项目时默认添加的 我怎样才能有一个只有底部阴影的普通操作栏
  • 使用 Javascript(或任何客户端)绘制方程

    有没有可以用来绘制数学方程的库 最好使用 javascript 我也可以使用 Java 或者任何客户端 你看过 弗洛特 吗 http code google com p flot http code google com p flot
  • 如何在 Bluez/Linux 上从 GATT 服务器获取断开连接事件

    环境 Bluez 5 14 Linux 3 1 USB 可插拔 BLE 无线电 TI BLE 密钥卡 CC2541 开发套件 Linux 设备 USB BLE 无线电 我们使用 gatttool 启用 TI 密钥卡上的按键事件并开始监听事件
  • 如何在应用样式器功能后删除列

    应用样式器后如何删除列 这是我的样式函数 def highlight late x c1 background color red condition m x price 1 lt x price main x m2 x price 2 l
  • Android 错误:二进制 XML 文件第 16 行:添加地图片段时膨胀类片段时出错

    我正在尝试使用地图 api v2 显示地图 这是我的 xml 代码
  • d3 转换改变了哪些属性?

    我试图了解 d3 中到底发生了什么转换 例如 var bars svg selectAll null data my values enter append rect statement before transition attr x 1