过渡和不透明度不能很好地协同工作

Posted

技术标签:

【中文标题】过渡和不透明度不能很好地协同工作【英文标题】:Transition and opacity does not work well together 【发布时间】:2014-11-05 20:27:55 【问题描述】:

我为点击触发的过渡设置了 1500 毫秒的持续时间

在第一次运行时,转换的持续时间似乎为 0 毫秒,这不是预期的 -_-

带有相应小提琴的最小示例(http://jsbin.com/pasodopeyati/3/edit):

// create svg element
var svg = d3.select("body").append("svg").attr('width', 200).attr('height', 200);

// add 4 red circles
svg.selectAll('circle').data(['n': 0, 'n': 1, 'n': 2, 'n': 3])
  .enter()
  .append('circle')
  .attr(
    cx: function(d, i)  return (i % 2) * 50 + 50;,
    cy: function(d, i)  return Math.floor(i / 2) * 50 + 50;,
    r:10,
    fill: 'red'
  );


// counter
var i = 0;  

// create button and bind on click
d3.select("body").append('button').text('fade').on('click', function () 
  // fade 3 circles alternatively (cf. counter)
  svg.selectAll('circle')
  .transition()
  .duration(2000)
  .attr('opacity', function(d)  return d.n == i ? 1 : 0.1);

  i = (i + 1) % 4;
);

试试吧!您会注意到第一次点击会立即淡出 3 个圆圈,并且从该点击开始,它将按预期以 1500 毫秒的持续时间进行过渡。

如何使第一次转换的持续时间为 1500 毫秒?

奖励:为什么我的代码会这样?

【问题讨论】:

【参考方案1】:

实际上我认为opacitystyle 参数而不是svg attribute。所以你也可以改变你的路线:

.attr('opacity', function(d) return d.n == i ? 1 : 0.1)

.style('opacity', function(d) return d.n == i ? 1 : 0.1)

结果相同。

【讨论】:

【参考方案2】:

当您创建圆圈时,您没有指定任何不透明度,因此没有从/到过渡。试试这个:

  .attr(
    cx: function(d, i)  return (i % 2) * 50 + 50;,
    cy: function(d, i)  return Math.floor(i / 2) * 50 + 50;,
    // need this starting value
    opacity: 1
    r:10,
    fill: 'red'
  );

【讨论】:

以上是关于过渡和不透明度不能很好地协同工作的主要内容,如果未能解决你的问题,请参考以下文章

django-storages + sorl_thumbnail + S3 不能很好地协同工作(URL 不匹配)

如何让`page-break-inside:避免`与`flex-wrap:wrap`很好地协同工作

MyBatis

Flickity 2 - groupCells 和 pageDots 不能同时工作

颜色和纹理如何协同工作?

如何让动画和手势识别器协同工作? (迅速)