【问题标题】:Apply multiple styles with .style() method in D3.js在 D3.js 中使用 .style() 方法应用多种样式
【发布时间】:2020-04-14 16:10:34
【问题描述】:

当我迈出 d3.js 的第一步时,我不禁注意到它的方法与 jQuery 非常相似。

我的问题是:

当我需要修改 style 属性的多个 CSS 属性时 的匹配元素是否有速记方法,如 jQuery 或 ReactJS 提供,如

.style({width:100, height:100, backgroundColor:'lightgreen'})` 

如果我需要申请width:100pxheight:100pxbackground-color:lightgreen<div>

当然,我可以将它们链接起来,但是以这种方式更改多个属性可能会变得乏味:

d3
  .select('#test')
  .style('width','100px')
  .style('height','100px')
  .style('background-color','lightgreen')
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script><div id="test"></div>

或者我可以在一个类中组合多个所需的属性,并为该类分配一个.classed(),这也可能在需要动态属性时使 CSS 样式表过于复杂:

d3
  .select('#test')
  .classed('testclass', true)
.testclass {
  height: 100px;
  width: 100px;
  background-color: lightgreen;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script><div id="test"></div>

但这些不是我感兴趣的技术。

【问题讨论】:

    标签: javascript css d3.js


    【解决方案1】:

    编辑(2021):

    注意:我声称(在此答案的初始版本中)没有解决 OP 问题的嵌入式方法。而且,从 D3 v6.7.0 开始,您仍然不能将样式作为对象直接传递给 .style() 方法

    在撰写本文时您有两个选择:

    • 遍历您的样式对象并逐步应用样式

    const style = {"width":"100px","height":"100px","background-color":"lightgreen"}
    
    Object.entries(style).forEach(([prop,val]) => d3.select("#test").style(prop,val))
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script><div id="test"></div>

    为什么我不鼓励你做后者:

    因此,您是应用单行解决方案还是将旧代码 up to 13kB 添加到您的应用程序包中,完全取决于您。

    【讨论】:

    • @DeanMeehan:我不太清楚你为什么要提到这个,因为它是关于使用 vanilla JS 操作样式属性的方式,并且与将样式分配给 style.cssText 而不是 @987654330 有关@,因为我的解决方案实际上等同于 d3 API 提供的 .style().style.style()
    • 我很抱歉。我以前没有广泛使用过 D3,所以我不知道该功能是 D3 的一部分! :)
    • @DeanMeehan:别担心,伙计。选项集越丰富,选择最佳选项的机会就越大。
    【解决方案2】:

    由于您可以通过在需要的选择上调用.node() 来访问 d3 节点,因此您可以这样做:

    item.node().style.cssText = `property: value; property2: value2`;
    

    另外,如果你使用 styled-components (react),你可以像这样简单地插入你的 css:

    item.node().style.cssText = PreviouslyDefinedCSS.toString();
    

    css 是这样的:

    import { css } from "styled-components";
    const PreviouslyDefinedCSS = css`
        your scss here
    `;
    

    【讨论】:

      【解决方案3】:

      accepted answer 不正确(“API 参考中没有记录此类语法”),您可以使用 d3-selection-multi 设置多种样式。请注意,您必须使用方法styles(),而不是style()。所以,在你的情况下,它会是:

      .styles({width:100, height:100, 'background-color':'lightgreen'})
      

      这是您的 sn-p 更改:

      d3.select('#test')
        .styles({
          'width': '100px',
          'height': '100px',
          'background-color': 'lightgreen'
        })
      <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
      <div id="test"></div>
      <script src="https://d3js.org/d3-selection-multi.v1.min.js"></script>

      由于d3-selection-multi不是默认捆绑包的一部分,您必须单独引用它。

      【讨论】:

      • 注意使用上述方法,因为d3-selection-multi 存储库已存档并且将不再维护,而无论 D3.js 版本如何,accepted answer 仍然有效。
      【解决方案4】:

      不幸的是,没有更好的速记方法来使用 Vanilla JavaScript 将多种样式应用于元素。在我看来,理想的解决方案是将一个类应用于您希望设置样式的元素,其中包含您希望应用的多种样式。

      当然,您可以编写一个复制 JQuery 方法的辅助方法。

         function applyStyle(id, styles){
              Object.keys(styles).forEach(key => document.getElementById(id).setAttribute("style",key +": "+styles[key]+";"));
          } 
      

      【讨论】:

      • 基本上,这就是我已经提出的建议,但有一点不同——它使用纯 JS .getElementById() 而不是 d3.select()
      猜你喜欢
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多