Maison > Article > interface Web > Comment implémenter une barre de progression dynamique dans D3.js
D3 est un document basé sur les données. Cet article présente principalement la méthode de dessin d'une barre de progression dynamique basée sur D3.js. Les amis qui en ont besoin peuvent se référer à
Qu'est-ce que D3
Nous utilisons souvent du svg ou du canevas pour dessiner des graphiques dynamiques, mais le processus de dessin est relativement lourd. Pour des barres de progression intuitives et esthétiques, la communauté propose également des solutions matures telles que highcharts/ECharts, etc., mais la méthode de développement basée sur la configuration ne permet pas d'obtenir un dessin 100 % personnalisé. Cet article vous guidera étape par étape pour implémenter une barre de progression dynamique à partir de zéro à l'aide de D3.js et partagera les principes de la logique du code.
Exigences de base
Dessinez une barre de progression circulaire
Pour une barre de progression circulaire, nous divisons d'abord les tâches :1. Dessinez des arcs imbriqués
Pour les cercles, SVG fournit des balises de cercle prêtes à l'emploi, mais son inconvénient est que pour les cercles La barre de progression peut être satisfaite en utilisant un cercle, mais lorsque le graphique est développé davantage, comme en dessinant un demi-cercle, le traitement du cercle devient délicat. D3.js fournit une API liée à l'arc pour encapsuler la méthode de dessin de cercle :var arc = d3.arc() .innerRadius(180) .outerRadius(240) //.startAngle(0) //.endAngle(Math.PI) arc(); // "M0,-100A100,100,0,0,1,100,0L0,0Z"Le code ci-dessus implémente le dessin de deux cercles imbriqués, logiquement, d3. arc() renvoie un constructeur d'arc et définit le rayon des cercles intérieur et extérieur, l'angle de départ et l'angle de fin via des appels en chaîne. Exécutez le constructeur arc() pour obtenir les données de chemin à lier sur 98953a78f52873edae60a617ec082494. Le code complet est le suivant :
<!--html--> <svg width="960" height="500"></svg> <script> var arcGenerator = d3.arc().innerRadius(80).outerRadius(100).startAngle(0); var picture = d3.select('svg').append('g').attr('transform','translate(480,250)'); </script>Le code ci-dessus implémente 2 étapes : 1 Générer un arc avec 0 degré comme le point de départ Constructeur arcGenerator2. Définissez le décalage du graphique de transformation pour que le graphique soit au centre du canevas Il n'y a actuellement aucun élément sur le canevas. dessinez le graphique réel.
var backGround = picture.append("path") .datum({endAngle: 2 * Math.PI}) .style("fill", "#FDF5E6") .attr("d", arcGenerator);Nous ajoutons l'élément 98953a78f52873edae60a617ec082494 à l'image du canevas. Selon la fonctionnalité endAngle(), utilisez la méthode datum() pour {. endAngle:Math.PI } Autrement dit, l'angle du point final 2π est lié à l'élément 98953a78f52873edae60a617ec082494 et le constructeur d'arc est affecté au chemin chemin d. Cela génère un arc avec une couleur de fond spécifiée. Le graphique réel est le suivant : Le premier arc est dessiné, puis selon la relation hiérarchique z-index de svg, ce qu'on appelle la barre de progression est en fait la deuxième couche d'arcs recouvrant la première couche d'arcs. De même, vous pouvez obtenir :
var upperGround = picture.append('path') .datum({endAngle:Math.PI / 2}) .style('fill','#FFC125') .attr('d',arcGenerator)Après avoir exécuté le code, vous pouvez obtenir :
2. Affichage des données en temps réel au centre du cercle
Dans la première partie, nous avons implémenté un cercle imbriqué basé sur deux chemins. Dans la deuxième partie, nous implémenterons l'affichage des données en temps réel au centre du cercle. Lorsque la barre de progression est en cours de chargement, nous ajoutons des données au centre du cercle pour exprimer la progression actuelle du chargement et utilisons la balise 28f128881ce1cdc57a572953e91f7d0f pour l'affichage :var dataText = g.append('text') .text(12) .attr('text-anchor','middle') .attr('dominant-baseline','middle') .attr('font-size','38px')Réglez temporairement les données sur 12 et définissez le centrage horizontal et le centrage vertical. L'effet est le suivant :
3. 🎜> 通过1,2两部分内容我们已经知道了: 绘制进度条的实质是改变上层弧的角度 当弧度是 2π 时为整圆,当弧度是 π 时为半圆 圆形中的数据即为当前弧度相对 2π 的百分比 综上我们只要改变弧度值和数值同时设定改变过程所需时长即可实现所谓"动画"。在ECharts提供的官方实例中,通过 setInterval 来实现每隔固定一段时间进行数据更新,其实在D3.js中同样提供了类似方法来实现类似 setInterval 的功能: 对这段代码进行拆解: d3.interval() 方法提供了 setInterval() 的功能 selection.transition.duration() 设置了当前DOM属性过渡变化为指定DOM属性的过程所需时间,毫秒为单位 transation.attrTween 为插值功能API,那么何谓插值? 概括来说,在给定的离散数据中补插函数,可以使这条连续函数通过全部数据点。举个例子,给定一个p,想实现其背景颜色的从左边红(red)到右边绿(green)的线性渐变,每一区域的色值该如何计算呢?只需: compute 即为插值函数,参数范围为[0,1],只要你输入该范围内的数字,那么 compute 函数将返回对应的颜色值。这样的插值有什么用呢?可看下图: 假设上图的p长度width为100,那么将[0,100]依比例关系转化为[0,10]的范围数据并输入 compute 函数中,即可得到某一区域对应的颜色。当然,对于线性面积的处理我们不应该使用离散数据作为输入和输出,所以D3.js提供更方便的线性渐变API d3.linear 等,这里就不展开描述了。 言归正传,代码 ["当前角度值","随机角度值"] //表达区间而非数组 而后返回一个参数为 t 的函数,那么该函数的作用是什么呢? t 参数与 d 类似,是D3.js内部实现的插值,其范围为[0,1]。 t 参数根据设置的 duration() 时长自动计算在[0,1]内合适的插值数量,并返回插值结果,实现线性平稳的过渡动画效果。 完成滚动条的动画加载效果,我们接下来写圆心实时数据的变化逻辑,只要实现简单的赋值即可,完整代码如下: 最终效果如下: 4.美化 1,2,3部分我们实现了最基本的进度条样式和功能,但样式看起来还是很单调的,我们接下来我们对进度条进行线性渐变处理。我们使用D3.js提供的线性插值API: colorLinear 同样是一个插值函数,我们输入[0,100]区间中的数值,就会返回对应["#EEE685","#EE3B3B"]区间内的颜色值。比如当进度条显示进度为"80%"时: 实现了颜色取值后,我们只需在进度条变化时,将原有颜色改变即可: styleTween 与 attrTween 类似,是实现改变样式的插值函数。采用链式调用的形式同时对进度条数值和颜色的设置即可。最终实现的效果如下: 综上我们实现了在不同数值下颜色变化的圆形进度条,可常用于告警,提醒等业务场景。 绘制矩形进度条 矩形进度条相比圆形进度条简单了很多,同样基于插值原理,平滑改变矩形的长度即可。直接上代码: 实现的效果如下: 总结 Le point clé du dessin d'une barre de progression basée sur D3.js est l'interpolation, afin de lisser correctement la transition des graphiques. Si vous devez utiliser du SVG ou du CSS pur pour implémenter des barres de progression rectangulaires et circulaires, c'est bien sûr également réalisable, mais le traitement des chemins et des animations, ainsi que les exigences d'écriture du CSS, sont beaucoup plus compliqués. Nous avons observé que le code logique pour dessiner les deux barres de progression ci-dessus à l'aide de D3.js est presque entièrement implémenté à l'aide de js. En même temps, la quantité de code peut être contrôlée à environ 20 lignes et peut être encapsulée et réutilisée. déjà très raffiné et très utile dans le développement de graphiques personnalisés. Avantages. Pour la version dérivée du tableau de bord de la barre de progression, par rapport à la barre de progression de base, la description de l'échelle et le calcul du pointeur sont ajoutés, mais cela reste le même tant que vous maîtrisez le principe et l'utilisation de. interpolation, vous pourrez gérer facilement des graphiques similaires. J'ai compilé ce qui précède pour vous, j'espère que cela vous sera utile à l'avenir. Articles associés : Méthodes pour obtenir les paramètres de requête et les règles de routage basées sur express Explication détaillée de l'utilisation simple de vuex
d3.interval(function(){
foreground.transition().duration(750).attrTween('d',function(d){
var compute = d3.interpolate(d.endAngle,Math.random() * Math.PI * 2);
return function(t){
d.endAngle = compute(t);
return arcGenerator(d);
}
})
},1000)
var compute = d3.interpolate(d3.rgb(255,0,0),d3.rgb(0,255,0));
d3.interpolate(d.endAngle,Math.random() * Math.PI * 2);
实现了如下插值范围:d3.interval(function(){
foreground.transition().duration(750).attrTween('d',function(d){
var compute = d3.interpolate(d.endAngle,Math.random() * Math.PI * 2);
return function(t){
d.endAngle = compute(t);
var data = d.endAngle / Math.PI / 2 * 100;
//设置数值
d3.select('text').text(data.toFixed(0) + '%');
//将新参数传入,生成新的圆弧构造器
return arcGenerator(d);
}
})
},2000)
var colorLinear = d3.scaleLinear().domain([0,100]).range(["#EEE685","#EE3B3B"]);
var color = colorLinear(80);
//color即为"80%"对应的色值
d3.interval(function(){
foreground.transition().duration(750).attrTween('d',function(d){
var compute = d3.interpolate(d.endAngle,Math.random() * Math.PI * 2);
return function(t){
d.endAngle = compute(t);
var data = d.endAngle / Math.PI / 2 * 100;
//设置数值
d3.select('text').text(data.toFixed(0) + '%');
//将新参数传入,生成新的圆弧构造器
return arcGenerator(d);
}
})
.styleTween('fill',function(d){
return function(t){
var data = d.endAngle / Math.PI / 2 * 100;
//返回数值对应的色值
return colorLinear(data);
}
})
},2000)
<head>
<style>
#slider {
height: 20px;
width: 20px;
background: #2394F5;
margin: 15px;
}
</style>
</head>
<body>
<p id='slider'></p>
<script>
d3.interval(function(){
d3.select("#slider").transition()
.duration(1000)
.attrTween("width", function() {
var i = d3.interpolate(20, 400);
var ci = d3.interpolate('#2394F5', '#BDF436');
var that = this;
return function(t) {
that.style.width = i(t) + 'px';
that.style.background = ci(t);
};
});
},1500)
</script>
</body>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!