Integració de continguts interactius

En el món del desenvolupament d’interfícies web, la capacitat de visualitzar i manipular dades de manera efectiva i atractiva és crucial per a la millora de l’experiència d’usuari. Les biblioteques especialitzades en aquest àmbit, com Chart.js, D3.js i Google Charts, proporcionen eines fàcils d’utilitzar i altament personalitzables per a la representació de dades en gràfics i visualitzacions interactives. Les animacions avançades amb Anime.js permeten afegir un element dinàmic i atractiu a les aplicacions web, així com millorar la transició entre diferents estats de la interfície.

El contingut interactiu amb Canvas proporciona una manera flexible i altament personalitzable de crear elements gràfics i animacions en temps real en una pàgina web.

Aquestes eines són de gran utilitat a l’hora de desenvolupar aplicacions web més funcionals i atractives.

Biblioteques per a la visualització i manipulació de dades: Chart.js, D3.js, Google Charts

La visualització de dades és una eina crucial per a la comprensió i l’anàlisi de conjunts de dades. A través de gràfics, diagrames i altres tipus de representacions visuals, es poden destacar patrons, tendències i relacions entre diferents variables que poden passar desapercebudes en dades numèriques o text.

Hi ha moltes biblioteques i eines disponibles per a la visualització de dades, cada una amb les seves pròpies característiques i funcionalitats. Tres de les biblioteques més conegudes per a la visualització de dades són: ChartJS, D3.js i Google Charts.

  • Chart.js és una biblioteca JavaScript que permet crear gràfics dinàmics i interactius amb poca configuració.
  • D3.js és una biblioteca JavaScript que proporciona eines per a la representació de dades en el navegador web. És especialment útil per a la creació de gràfics personalitzats i visualitzacions de dades molt complexes.
  • Google Charts és una eina de Google que permet crear gràfics i diagrames personalitzats en poc temps, amb diferents opcions de personalització i integració amb altres eines de Google com ara Google Sheets.

Cada biblioteca presenta característiques i funcionalitats concretes que es poden veure amb exemples d’ús per a diferents tipus de gràfics.Els avantatges i desavantatges de cada biblioteca ens permeten decidir la millor opció segons les necessitats de visualització de dades.

Biblioteca Chart.js

  • Logo de Chart.js
  • Logo de Chart.js

Chart.js és una biblioteca JavaScript de codi obert que permet crear gràfics dinàmics i interactius amb poca configuració. Està disponible com a biblioteca autònoma o com a part d’entorns de treball (frameworks) de JavaScript com ara Angular, React i Vue.js.

Podeu trobar la documentació oficial de Chart.js a: bit.ly/2CKWgx1

Les característiques principals de Chart.js inclouen:

  • Suport per a diferents tipus de gràfics: línia, barra, àrea, torta, radar, circular, polar, diana, etc.
  • Personalització dels eixos, llegendes i etiquetes de dades
  • Suport per a dades de múltiples conjunts i conjunts de dades mixtes
  • Eines per a l’animació i el control de l’aspecte visual de les gràfics
  • Suport per a l’interacció amb els gràfics mitjançant hovers i clics
  • Integració amb altres eines de visualització de dades com ara Google Maps

Teniu molts exemples d’ús de Chart.js a: bit.ly/2TcBTBH

Els principals avantatges de fer servir Chart.js per integrar gràfics a les pàgines web són:

  • És una biblioteca lleugera i ràpida de carregar, cosa que la fa ideal per a projectes que requereixen una visualització ràpida de dades.
  • Té una gran varietat de tipus de gràfics disponibles, cosa que la fa útil per a diferents usos.
  • Proporciona moltes opcions de personalització per adaptar els gràfics a les necessitats de cada projecte.
  • És fàcil d’utilitzar, ja que disposa de documentació detallada i exemples d’ús.

Els seus principals inconvenients són:

  • Algunes de les opcions de personalització poden ser complexes de configurar, especialment per a usuaris menys experimentats.
  • No és tan potent com altres biblioteques de visualització de dades, com ara D3.js, cosa que pot limitar la complexitat de gràfics creats amb Chart.js.
  • No és recomanable utilitzar Chart.js per a la visualització de grans conjunts de dades de manera eficient, ja que pot resultar lent.

En resum, Chart.js és una biblioteca molt útil per a la visualització ràpida i senzilla de dades, però pot ser limitada en algunes situacions o per a projectes més complexos. És important valorar les característiques i funcionalitats de Chart.js i altres biblioteques similars per determinar quina és la més adequada per a cada projecte en qüestió.

Gràfic de línia

Es pot usar un exemple bàsic de codi per crear una gràfic de línia amb Chart.js. El primer pas és incloure la biblioteca de ChartJS a la pàgina web utilitzant l’etiqueta <script>. A continuació, es crea un llenç (canvas) en HTML on es mostra el gràfic.

Chart.js és compatible amb navegadors moderns, incloent-hi Internet Explorer 11 i superiors.

Després, a JavaScript, es crea una referència al context del llenç mitjançant la funció getContext. A partir d’aquest context, es crea un nou objecte Chart passant el context i unes opcions de configuració. Les opcions inclouen el tipus de gràfic (en aquest cas, un gràfic de línia), les dades a mostrar i la configuració de les escales (en aquest cas, la configuració de l’eix Y perquè comenci a zero).

Aquests són només els elements bàsics per crear un gràfic amb Chart.js. La biblioteca ofereix moltes més opcions i personalitzacions per ajudar a crear gràfics més elaborats i atractius.

  1. <!-- Incloure la biblioteca de Chart.js. -->
  2. <script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.3/dist/Chart.min.js"></script>
  3.  
  4. <!-- Crear un llenç on es mostri el gràfic. -->
  5. <canvas id="myChart"></canvas>
  6. <script>
  7. // Obtenir el context del llenç.
  8. var ctx = document.getElementById('myChart').getContext('2d');
  9.  
  10. // Crear un nou gràfic a partir del context i les opcions de configuració.
  11. var myChart = new Chart(ctx, {
  12. type: 'line',
  13. data: {
  14. labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
  15. datasets: [{
  16. label: 'Temperatura mensual',
  17. data: [12, 19, 3, 5, 2, 3],
  18. backgroundColor: 'rgba(255, 99, 132, 0.2)',
  19. borderColor: 'rgba(255, 99, 132, 1)',
  20. borderWidth: 1
  21. }]
  22. },
  23. options: {
  24. scales: {
  25. yAxes: [{
  26. ticks: {
  27. beginAtZero: true
  28. }
  29. }]
  30. }
  31. }
  32. });
  33. </script>

Podeu veure l’aspecte d’aquest gràfic a la figura:

Figura Gràfic de línies amb Chart.js

Podeu veure el codi d’aquest exemple en funcionament a: codepen.io/iocdawm9/pen/LYJPPpV.

En el codi de l’exemple de CodePen s’ajusta la mida de la finestra del gràfic amb un contenidor amb amplada relativa al viewport, perque s’ajusti a la finestra de previsualització de codepen.io. Aquesta tècnica és útil per fer que el gràfic s’ajusti al disseny de la pàgina web on s’ha d’incrustar.

  1. <div class="chart-container" style="position: relative; width:35vw">

Gràfic de barres

El codi per crear un gràfic de barres utilitzant la biblioteca Chart.js és molt similar al del gràfic de línies, però té algunes diferències.

La biblioteca Chart.js és de codi obert i és mantinguda per una comunitat activa d’usuaris i desenvolupadors. El repositori amb el codi font es troba a: bit.ly/2GgUzsK

A la secció <head> del document HTML, s’hi inclou la biblioteca de Chart.js mitjançant una etiqueta <script>. A la secció <body> es crea un llenç on es mostra el gràfic.

Després, a la secció de <script> es crea un context per al llenç utilitzant document.getElementById(‘myChart’).getContext(‘2d’). A continuació, es crea una nova instància de Chart, passant-li el context i les opcions de configuració.

Les opcions de configuració són similars a les del gràfic de línies, amb la diferència que el tipus de gràfic ara és bar en lloc de line. A més, en aquest cas, hi ha una sèrie de dades per a cada mes, anomenades datasets, que inclouen informació sobre el color de fons i el color de la vora per a cada barra, així com la quantitat de dades que s’han de mostrar.

Finalment, les opcions de les escales són les mateixes que en el gràfic de línies, però cal especificar que les marques de l’eix Y han de començar en zero.

  1. <html>
  2. <head>
  3. <title>Gràfic de barres amb Chart.js</title>
  4. <!-- Incloure la biblioteca de Chart.js. -->
  5. <script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.3/dist/Chart.min.js"></script>
  6. </head>
  7. <body>
  8. <!-- Crear un llenç on es mostri el gràfic. -->
  9. <canvas id="myChart"></canvas>
  10. <script>
  11. // Obtenir el context del llenç.
  12. var ctx = document.getElementById('myChart').getContext('2d');
  13.  
  14. // Crear un nou gràfic a partir del context i les opcions de configuració.
  15. var myChart = new Chart(ctx, {
  16. type: 'bar',
  17. data: {
  18. labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
  19. datasets: [{
  20. label: 'Vendes mensuals',
  21. data: [12, 19, 3, 5, 2, 3],
  22. backgroundColor: [
  23. 'rgba(255, 99, 132, 0.2)',
  24. 'rgba(54, 162, 235, 0.2)',
  25. 'rgba(255, 206, 86, 0.2)',
  26. 'rgba(75, 192, 192, 0.2)',
  27. 'rgba(153, 102, 255, 0.2)',
  28. 'rgba(255, 159, 64, 0.2)'
  29. ],
  30. borderColor: [
  31. 'rgba(255, 99, 132, 1)',
  32. 'rgba(54, 162, 235, 1)',
  33. 'rgba(255, 206, 86, 1)',
  34. 'rgba(75, 192, 192, 1)',
  35. 'rgba(153, 102, 255, 1)',
  36. 'rgba(255, 159, 64, 1)'
  37. ],
  38. borderWidth: 1
  39. }]
  40. },
  41. options: {
  42. scales: {
  43. yAxes: [{
  44. ticks: {
  45. beginAtZero: true
  46. }
  47. }]
  48. }
  49. }
  50. });
  51. </script>
  52. </body>
  53. </html>

L’aspecte final d’aquest gràfic es pot apreciar a la figura:

Figura Gràfic de barres amb Chart.js

Podeu veure el codi d’aquest exemple en funcionament a: codepen.io/iocdawm9/pen/XWBvyXj.

Gràfic de pastís

Per crear un gràfic de pastís (pie chart) amb Chart.js el procés és semblant al dels gràfics de línies i de barres, amb algunes diferències en les opcions de configuració.

Primer s’ha d’afegir la biblioteca de Chart.js a la pàgina web. A continuació, es crea un llenç (canvas) on es mostra el gràfic. Després, es fa una referència al context del llenç per poder crear el gràfic. En el cas d’un gràfic de pastís o pie chart a la definició de les opcions de configuració cal especificar: type: pie.

A la secció de dades, cal definir les etiquetes per a cada secció del pastís (en aquest exemple, Apple, Banana i Orange) i les dades associades a cada etiqueta. A més, cal definir les opcions de color per a les seccions del pastís (per exemple, backgroundColor i borderColor).

Després de definir les opcions de configuració, es crea el gràfic a partir del context i les opcions definides, utilitzant var myChart = new Chart(ctx, { … });. En aquest exemple, no es defineixen les opcions per a les escales, ja que en un gràfic de pastís no és necessari.

  1. <!-- Incloure la biblioteca de Chart.js al <head>. -->
  2. <script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.3/dist/Chart.min.js"></script>
  3.  
  4. <!-- Crear un llenç on es mostri el gràfic al <body>. -->
  5. <canvas id="myChart"></canvas>
  6.  
  7. <script>
  8. // Obtenir el context del canvas
  9. var ctx = document.getElementById('myChart').getContext('2d');
  10.  
  11. // Crear un nou gràfic a partir del context i les opcions de configuració
  12. var myChart = new Chart(ctx, {
  13. type: 'pie',
  14. data: {
  15. labels: ['Apple', 'Banana', 'Orange'],
  16. datasets: [{
  17. data: [12, 19, 3],
  18. backgroundColor: [
  19. 'rgba(255, 99, 132, 0.2)',
  20. 'rgba(54, 162, 235, 0.2)',
  21. 'rgba(255, 206, 86, 0.2)'
  22. ],
  23. borderColor: [
  24. 'rgba(255, 99, 132, 1)',
  25. 'rgba(54, 162, 235, 1)',
  26. 'rgba(255, 206, 86, 1)'
  27. ],
  28. borderWidth: 1
  29. }]
  30. }
  31. });
  32. </script>

Vegeu a la figura com es representa aquest tipus de gràfic:

Noteu que no posem el codi sencer HTML, tan sols les instruccions que s’han d’incloure al <head> i al <body> de la pàgina web).

Figura Gràfic de pastís amb Chart.js

Podeu veure el codi d’aquest exemple en funcionament a: codepen.io/iocdawm9/pen/YzOKKxN.

Gràfics interactius amb D3.js

  • Logo de D3.js
  • Logo de D3.js

D3.js és una biblioteca JavaScript per a la visualització de dades i la creació d’interfícies web dinàmiques. Utilitza els estàndards web (HTML, CSS i SVG) per visualitzar i manipular dades de manera flexible i personalitzada.

Documentació oficial de D3.js a: github.com/d3/d3/wiki

Les característiques i funcionalitats de D3.js inclouen:

  • Suport per a diferents tipus de gràfics i diagrames, com ara barres, línies, pastís, mapes, etc.
  • Possibilitat de visualitzar dades en qualsevol format, ja sigui en taules, gràfics o mapes.
  • Possibilitat de crear animacions i transicions per mostrar canvis en les dades de manera atractiva.
  • Possibilitat de crear gràfics interactius amb eines com ara hover, filtres i llegendes.
  • Possibilitat de crear visualitzacions de dades amb un alt nivell de detall i complexitat.

Els principals avantatges de D3.js són:

  • Ofereix una gran flexibilitat i personalització per crear gràfics i visualitzacions de dades.
  • Permet crear gràfics amb dades en temps real gràcies a la seva capacitat d’actualitzar les visualitzacions en funció de canvis en les dades.
  • Té una comunitat activa i una gran quantitat de recursos en línia, com tutorials i exemples, que faciliten l’aprenentatge i l’ús de la biblioteca.

Per contra, D3.js presenta els següents inconvenients que cal considerar abans de la implementació de gràfics dinàmics al lloc web:

  • Pot ser difícil d’aprendre per a persones que no estan familiaritzades amb JavaScript i el maneig de dades.
  • Pot requerir un esforç més gran per crear gràfics complexos i personalitzats, ja que no té un conjunt predefinit de gràfics com altres biblioteques.
  • Pot ser ineficient en la gestió de grans conjunts de dades, ja que utilitza la CPU del client per processar les dades en lloc de fer servir servidors, encara que és més eficient que altres biblioteques com Chart.js.

En conclusió, D3.js és una biblioteca molt potent per a la visualització de dades, però pot requerir una mica més de temps i esforç per aprendre-la i utilitzar-la. Això és especialment cert per a gràfics més complexos i personalitzats. No obstant, la seva flexibilitat i capacitat per mostrar dades en temps real fan que valgui la pena considerar-la per a projectes que requereixin visualitzacions de dades avançades.

Gràfic de barres

Per crear un gràfic de barres amb D3.js, igual que amb Chart.js, s’inclou la biblioteca de D3.js en l’encapçalament de la pàgina i es crea un element SVG (en lloc del llenç canvas que es feia servir a Chart.js) on es mostra el gràfic.

En aquest cas, les dades del gràfic són una matriu de nombres, definits a la variable data. A continuació, es creen les escales per a l’eix Y i X: yScale i xScale, respectivament. Les escales són necessàries per mapejar les dades numèriques a les posicions corresponents en el gràfic. Les escales es defineixen utilitzant la funció d3.scaleLinear() i d3.scaleBand(). La funció d3.scaleLinear() és per a l’eix Y, mentre que d3.scaleBand() és per a l’eix X.

A continuació, s’utilitza la funció d3.select per seleccionar l’element SVG, i la funció .selectAll(“rect”), per seleccionar tots els elements rectangles dins d’aquest element. La funció .data és usada per vincular les dades del gràfic a les barres. La funció .enter és usada per crear un element rectangle per a cada dada.

Finalment, es configuren les propietats de les barres mitjançant les funcions .attr. Això inclou la posició en el gràfic, l’amplada i l’alçada i el color de farciment.

  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <title>Gràfic de barres amb D3.js</title>
  6. <!-- Incloure la biblioteca de D3.js. -->
  7. <script src="https://d3js.org/d3.v6.min.js"></script>
  8. </head>
  9.  
  10. <body>
  11. <!-- Crear un element SVG on es mostri el gràfic. -->
  12. <svg width="600" height="400"></svg>
  13. <script>
  14. // Definir les dades del gràfic.
  15. var data = [12, 19, 3, 5, 2, 3];
  16.  
  17. // Crear una escala per a l'eix Y.
  18. var yScale = d3.scaleLinear()
  19. .domain([0, d3.max(data)])
  20. .range([0, 400]);
  21.  
  22. // Crear una escala per a l'eix X.
  23. var xScale = d3.scaleBand()
  24. .domain(data)
  25. .range([0, 600])
  26. .padding(0.1);
  27.  
  28. // Afegir les barres al gràfic.
  29. d3.select("svg")
  30. .selectAll("rect")
  31. .data(data)
  32. .enter()
  33. .append("rect")
  34. .attr("x", function (d) { return xScale(d); })
  35. .attr("y", function (d) { return 400 - yScale(d); })
  36. .attr("width", xScale.bandwidth())
  37. .attr("height", function (d) { return yScale(d); })
  38. .attr("fill", "teal");
  39.  
  40. // Afegir els valors a dins de les barres.
  41. d3.select("svg")
  42. .selectAll("text")
  43. .data(data)
  44. .enter()
  45. .append("text")
  46. .text(function (d) { return d; })
  47. .attr("x", function (d) { return xScale(d) + xScale.bandwidth() / 2; })
  48. .attr("y", function (d) { return 400 - yScale(d) + 14; })
  49. .attr("text-anchor", "middle")
  50. .style("fill", "white");
  51.  
  52. // Afegir les etiquetes per a l'eix X.
  53. d3.select("svg")
  54. .append("g")
  55. .attr("transform", "translate(0, 400)")
  56. .call(d3.axisBottom(xScale))
  57. .selectAll("text")
  58. .attr("y", "10")
  59. .attr("x", "-5")
  60. .attr("text-anchor", "end")
  61. .attr("transform", "rotate(-40)");
  62.  
  63. // Afegir les etiquetes per a l'eix Y.
  64. d3.select("svg")
  65. .append("g")
  66. .call(d3.axisLeft(yScale));
  67.  
  68. // Afegir el valor a cada barra.
  69. d3.select("svg")
  70. .selectAll("text")
  71. .data(data)
  72. .enter()
  73. .append("text")
  74. .text(function (d) { return d; })
  75. .attr("x", function (d) { return xScale(d) + xScale.bandwidth() / 2; })
  76. .attr("y", function (d) { return 400 - yScale(d) + 14; })
  77. .attr("text-anchor", "middle")
  78. .style("fill", "white");
  79.  
  80. </script>
  81. </body>
  82.  
  83. </html>

A diferència del gràfic de barres amb Chart.js, aquest codi és més flexible i permet una gran personalització en la forma com es crea el gràfic. No obstant, requereix una mica més de codi per aconseguir el mateix resultat que amb Chart.js.

D3.js és una eina poderosa per a crear gràfics interactius i personalitzats en el navegador. Permet un gran control sobre la visualització de les dades i ofereix moltes possibilitats per a animacions, interacció i manipulació de dades. No obstant això, pot ser una mica més complex d’utilitzar que altres eines com Chart.js, ja que demana un major coneixement de JavaScript i les seves biblioteques.

Vegeu a la figura el resultat del codi anterior:

Figura Gràfic de barres amb D3.js

Podeu accedir al codi d’aquest exemple a: codepen.io/iocdawm9/pen/GRXKZbx.

Galeries de visualitzacions de dades amb D3.js

A través d’aquests exemples, es poden veure diferents tipus de gràfics i visualitzacions de dades, com ara gràfics de barres, gràfics de línies, mapes de calor, mapes geogràfics, visualitzacions de xarxes i molts altres. Així mateix, les galeries inclouen codi font per als diferents exemples, de manera que els desenvolupadors poden aprendre i utilitzar aquest codi per a les seves pròpies visualitzacions de dades:

Gràfic de línia

Un gràfic de línia amb D3.js, una biblioteca de JavaScript per a visualització de dades, es crea a partir d’un element SVG, on es defineixen les dades del gràfic a través d’un objecte JavaScript.

Després, es creen les escales per a les diferents dimensions del gràfic (en aquest cas, els eixos X i Y). Les escales serveixen per convertir les dades en coordenades al gràfic.

Finalment, es crea una línia de dades, que representa les dades en el gràfic, i es fa servir la funció d3.select per seleccionar l’element SVG i afegir la línia al gràfic.

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Gràfic de línia amb D3.js</title>
  5. <!-- Incloure la biblioteca de D3.js. -->
  6. <script src="https://d3js.org/d3.v6.min.js"></script>
  7. </head>
  8. <body>
  9. <!-- Crear un element SVG on es mostri el gràfic. -->
  10. <svg width="600" height="400"></svg>
  11. <script>
  12. // Definir les dades del gràfic.
  13. var data = [
  14. { x: 0, y: 10 },
  15. { x: 1, y: 20 },
  16. { x: 2, y: 15 },
  17. { x: 3, y: 25 },
  18. { x: 4, y: 30 }
  19. ];
  20.  
  21. // Crear una escala per a l'eix Y.
  22. var yScale = d3.scaleLinear()
  23. .domain([0, d3.max(data, function(d) { return d.y; })])
  24. .range([400, 0]);
  25.  
  26. // Crear una escala per a l'eix X.
  27. var xScale = d3.scaleLinear()
  28. .domain([0, d3.max(data, function(d) { return d.x; })])
  29. .range([0, 600]);
  30.  
  31. // Crear una línia de dades.
  32. var line = d3.line()
  33. .x(function(d) { return xScale(d.x); })
  34. .y(function(d) { return yScale(d.y); });
  35.  
  36. // Afegir la línia al gràfic.
  37. d3.select("svg")
  38. .append("path")
  39. .attr("d", line(data))
  40. .attr("stroke", "teal")
  41. .attr("stroke-width", 2)
  42. .attr("fill", "none");
  43. </script>
  44. </body>
  45. </html>

El codi anterior:

  • Inclou la biblioteca de D3.js en l’encapçalament de la pàgina.
  • Crea un element SVG dins del cos de la pàgina on es mostra el gràfic. El SVG té una amplada de 600 píxels i una alçada de 400 píxels.
  • Defineix les dades del gràfic en una variable anomenada data. Aquesta variable conté una llista d’objectes que tenen dues propietats: x i y.
  • Crea una escala per a l’eix Y i la guarda a la variable yScale. Aquesta escala utilitza la funció scaleLinear de D3.js per crear una escala lineal. El domini de l’escala és determinat per la màxima Y de les dades mentre que el rang és determinat per l’alçada del SVG.
  • Crea una escala per a l’eix X i la guarda a la variable xScale. Aquesta escala és similar a la creada per a l’eix Y.
  • Crea una línia de dades i la guarda a la variable line. Aquesta línia utilitza les escales X i Y per especificar les coordenades x i y per a cada punt de dades.
  • Afegeix la línia al gràfic fent servir el mètode select de D3.js. El mètode append afegeix un path dins del SVG i el mètode attr assigna atributs al path, com ara d, stroke, stroke-width i fill. La propietat d conté la línia de dades en format SVG. stroke i stroke-width determinen el color i l’amplada de la línia, mentre que fill determina que l’interior de la línia estigui buit.

Vegeu a la figura el resultat del codi:

Figura Gràfic de línia amb D3.js

En comparació amb el gràfic de barres amb D3.js, aquest gràfic de línia no requereix la creació d’eixos ni marques, ni la generació de línies per a cada sèrie de dades.

Comparat amb el gràfic de línia amb Chart.js, no requereix la creació de les escales i les línies, ja que aquestes es generen automàticament a partir de les dades.

Teniu el codi d’aquest exemple a: codepen.io/iocdawm9/pen/zYJOBwN.

Aquest gràfic és bastant simple en comparació amb el gràfic fet amb ChartJS; per tant, es pot millorar una mica. Es pot ampliar el gràfic de línia anterior ajustant les escales per a l’eix X i Y, de manera que quedi centrada a la imatge. A més, es poden afegir les etiquetes per als eixos X i Y, indicant els valors mínims i màxims que poden prendre les dades. Els punts a la línia serveixen per millorar la visualització de les dades. Això ajuda a identificar clarament les dades en el gràfic i a identificar fàcilment tendències o patrons en les dades.

Trobareu tutorials i exemples de D3.js a: www.d3-graph-gallery.com

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Gràfic de línia amb D3.js</title>
  5. <!-- Incloure la biblioteca de D3.js.-->
  6. <script src="https://d3js.org/d3.v6.min.js"></script>
  7. </head>
  8. <body>
  9. <!-- Crear un element SVG on es mostri el gràfic. -->
  10. <svg width="600" height="400"></svg>
  11. <script>
  12. // Definir les dades del gràfic.
  13. var data = [
  14. { x: 0, y: 10 },
  15. { x: 1, y: 20 },
  16. { x: 2, y: 15 },
  17. { x: 3, y: 25 },
  18. { x: 4, y: 30 }
  19. ];
  20.  
  21. // Crear una escala per a l'eix Y.
  22. var yScale = d3.scaleLinear()
  23. .domain([0, 40])
  24. .range([400, 0]);
  25.  
  26. // Crear una escala per a l'eix X.
  27. var xScale = d3.scaleLinear()
  28. .domain([-2, 5])
  29. .range([0, 600]);
  30.  
  31. // Crear una línia de dades.
  32. var line = d3.line()
  33. .x(function(d) { return xScale(d.x); })
  34. .y(function(d) { return yScale(d.y); });
  35.  
  36. // Afegir la línia al gràfic.
  37. d3.select("svg")
  38. .append("path")
  39. .attr("d", line(data))
  40. .attr("stroke", "teal")
  41. .attr("stroke-width", 2)
  42. .attr("fill", "none");
  43.  
  44. // Afegir punts a la línia.
  45. d3.select("svg")
  46. .selectAll("circle")
  47. .data(data)
  48. .enter()
  49. .append("circle")
  50. .attr("cx", function(d) { return xScale(d.x); })
  51. .attr("cy", function(d) { return yScale(d.y); })
  52. .attr("r", 5)
  53. .style("fill", "teal");
  54.  
  55. // Afegir rètols a l'eix Y.
  56. d3.select("svg")
  57. .append("g")
  58. .attr("transform", "translate(30,0)")
  59. .call(d3.axisLeft(yScale));
  60.  
  61. // Afegir rètols a l'eix X.
  62. d3.select("svg")
  63. .append("g")
  64. .attr("transform", "translate(0,370)")
  65. .call(d3.axisBottom(xScale));
  66. </script>
  67. </body>
  68. </html>

Vegeu el resultat d’aquesta millora a la figura:

Figura Gràfic de línia millorat

Teniu aquest exemple a: codepen.io/iocdawm9/pen/dyqbXme.

En qualsevol cas, en comparació amb Chart.js, amb D3.js és més difícil aconseguir resultats vistosos encara que sigui més versàtil.

Gràfic de pastís

Les dades del gràfic de pastís (vegeu la figura) són una llista d’objectes cada un dels quals té un nom i un valor associat. Aquests valors representen la quantitat de cada categoria de menjar, com ara llegums, verdures, fruits, cereals, làctics i ous, carn i peix.

El gràfic comença creant un objecte color que és una escala ordinal que defineix el color per a cada categoria de menjar. Aquesta escala utilitza la funció d3.scaleOrdinal per crear una escala d’identificació basada en un conjunt de valors únics: en aquest cas, els noms de les categories de menjar. El mètode .domain defineix aquest conjunt de valors i el mètode .range defineix la gamma de colors a utilitzar.

Després es defineix la radiació del gràfic de pastís amb la variable radius i es crea una pie layout utilitzant la funció d3.pie. La funció pie defineix la distribució dels valors en un gràfic de pastís. El mètode .sort permet definir l’ordre de les dades i el mètode .value especifica el valor a utilitzar per a la distribució.

Es crea un gràfic d’arc amb la funció d3.arc. L’arc és una funció que defineix la forma de les seccions del gràfic de pastís. Els mètodes .outerRadius i .innerRadius defineixen la longitud dels arcs externs i interns, respectivament.

Finalment, es crea el gràfic de pastís seleccionant el svg en el document HTML i afegint un element g que contingui el gràfic. Aquest element es trasllada al centre de la finestra de visualització utilitzant l’atribut transform.

Després es creen les seccions del gràfic de pastís seleccionant tots els elements amb la classe .arc i fent-los coincidir amb les dades. Aquesta tasca es realitza mitjançant el mètode .data, que enllaça les dades als elements de la selecció. El mètode .enter selecciona els elements que no tenen dades associades i el mètode .append afegeix un nou element path per a cada secció.

Per a cada secció del gràfic de sectors, es defineix el camí utilitzant l’arc (funció arc en D3.js). Això implica definir el radi interior i exterior de la secció, així com l’angle d’inici i final del camí. Aquesta operació s’haurà de fer per a cada secció del gràfic.

D’altra banda, el color de cada secció es defineix utilitzant la funció color i la informació de nom de l’element de dades. La funció color retorna un color de l’escala de colors basada en el nom de l’element de dades, de manera que cada secció tindrà un color diferent basat en el nom de l’element corresponent. En resum, això significa que cada secció del gràfic tindrà un color únic basat en la informació de l’element de dades que representa. Després, per a cada element g es crea un element de text que mostra el nom de la categoria. La posició del text és determinada per la funció transform, que transforma la coordenada basada en el centre de l’arc, que es calcula utilitzant la funció arc.centroid. La propietat dy de la secció de text es defineix com a .35em per ajustar la posició vertical del text.

La funció text retorna el nom de la categoria que es vol mostrar.

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Gràfic de pastís amb D3.js</title>
  5. <script src="https://d3js.org/d3.v6.min.js"></script>
  6. </head>
  7. <body>
  8. <svg width="500" height="500"></svg>
  9. <script>
  10. // Definir les dades del gràfic de pastís.
  11. var data = [
  12. {name: "Llegums", value: 25},
  13. {name: "Verdures", value: 30},
  14. {name: "Fruits", value: 15},
  15. {name: "Cereals", value: 20},
  16. {name: "Làctics", value: 5},
  17. {name: "Ous, carn i peix", value: 5}
  18. ];
  19.  
  20. // Definir l'escala de color.
  21. var color = d3.scaleOrdinal()
  22. .domain(data.map(function(d) { return d.name; }))
  23. .range(d3.schemeCategory10);
  24.  
  25. // Definir la radiació del gràfic de pastís.
  26. var radius = Math.min(500, 500) / 2;
  27.  
  28. // Definir la 'pie layout'.
  29. var pie = d3.pie()
  30. .sort(null)
  31. .value(function(d) { return d.value; });
  32.  
  33. // Definir l''arc layout'.
  34. var arc = d3.arc()
  35. .outerRadius(radius - 10)
  36. .innerRadius(0);
  37.  
  38. // Crear el gràfic de pastís.
  39. var pieChart = d3.select("svg")
  40. .append("g")
  41. .attr("transform", "translate(" + 500 / 2 + "," + 500 / 2 + ")");
  42.  
  43. var g = pieChart.selectAll(".arc")
  44. .data(pie(data))
  45. .enter().append("g")
  46. .attr("class", "arc");
  47.  
  48. g.append("path")
  49. .attr("d", arc)
  50. .style("fill", function(d) { return color(d.data.name); });
  51.  
  52. g.append("text")
  53. .attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
  54. .attr("dy", ".35em")
  55. .text(function(d) { return d.data.name; });
  56. </script>
  57. </body>
  58. </html>

Aquest gràfic de pastís creat amb D3.js requereix una mica més de codi que el gràfic de pastís creat amb Chart.js. Això és perquè D3.js no ofereix una API específica per a gràfics de pastís, sinó que demana una mica més de codi per crear aquest tipus de gràfics.

El gràfic de pastís creat amb D3.js pot ser més ràpid que el gràfic de pastís creat amb Chart.js en grans conjunts de dades. Això és així perquè D3.js és més eficient en el tractament de grans quantitats de dades que Chart.js.

Podeu accedir al codi d’aquest exemple a: codepen.io/iocdawm9/pen/dyqyNXW.

Vegeu a la figura el resultat del codi anterior:

Figura Gràfic de pastís amb D3.js

Visualització de dades amb Google Charts

Google Charts és una biblioteca de visualització de dades que ofereix una gran varietat de gràfics i mapes interactius per a la representació de dades. A diferència de ChartJS i D3.js, Google Charts no es basa en JavaScript, sinó que utilitza la tecnologia de dibuix SVG (Scalable Vector Graphics) per a la creació de gràfics.

Les característiques principals de Google Charts inclouen:

  • Gran varietat de tipus de gràfics, incloent-hi la línia, la barra, l’àrea, pastís, el radar, el circular, el polar, el diana, etc.
  • Personalització dels eixos, llegendes i etiquetes de dades
  • Suport per a dades de múltiples conjunts i conjunts de dades mixtes
  • Eines per a l’animació i el control de l’aspecte visual de les gràfiques
  • Suport per a l’interacció amb les gràfiques mitjançant hovers i clics
  • Integració amb altres eines de visualització de dades com ara Google Maps
  • Possibilitat de descarregar gràfics en diferents formats (PNG, JPEG, SVG, etc.)

Els principals avantatges que presenta Google Charts són:

  • És gratuïta i fàcil d’utilitzar.
  • Ofereix una gran varietat de tipus de gràfics.
  • Es pot integrar amb les dades d’un full de càlcul de Google Sheets.
  • Permet personalitzar l’aparença dels gràfics amb opcions de format i estil.

Per contra, presenta els següents desavantatges:

  • Depèn de la connexió a Internet per funcionar.
  • No és tan potent com altres biblioteques de visualització de dades, com D3.js.
  • No ofereix tant control sobre els gràfics com altres biblioteques, ja que utilitza un constructor gràfic en línia en lloc de codi JavaScript.

En conclusió, Google Charts és una eina molt útil per crear gràfics i visualitzacions de dades de manera senzilla i ràpida. No obstant, no és tan flexible com altres biblioteques de visualització de dades com D3.js, ja que depèn de la connexió a Internet per funcionar i no ofereix tant control sobre els gràfics. Així doncs, depèn de les necessitats de cada projecte decidir quina biblioteca és la més adequada. Si es busca una eina ràpida i fàcil d’utilitzar per crear gràfics amb una gran varietat de tipus, Google Charts pot ser una bona opció. En canvi, si es busca més flexibilitat i control sobre els gràfics, altres biblioteques com D3.js poden ser més adequades.

Vegeu alguns exemples d’ús de Google Charts per crear diferents tipus de gràfics en documents HTML vàlids, amb totes les referències a recursos externs necessaris.

Gràfic de línia

El gràfic de línia utilitza la biblioteca de gràfics de Google Charts. En aquest cas, l’exemple mostra les temperatures mitjanes mensuals.

La biblioteca de Google Charts es pot incloure a la pàgina web amb l’etiqueta <script> i la seva font externa:

  1. <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>

Es crea un element div amb l’ID “linechart_div”, que serà el lloc on es mostrarà el gràfic:

  1. <div id="linechart_div"></div>

Definim una funció drawChart que es cridarà quan la pàgina estigui completament carregada:

  1. google.charts.load('current', { 'packages': ['corechart'] });
  2. google.charts.setOnLoadCallback(drawChart);
  3. function drawChart() {
  4. ...
  5. };

Dins de la funció drawChart es defineixen les dades per al gràfic mitjançant un objecte DataTable:

  1. var data = google.visualization.arrayToDataTable([ ['Temps', 'Temperatura'],
  2. ['Jan', 7.0],
  3. ['Feb', 6.9],
  4. ['Mar', 9.5],
  5. ...
  6. ]);

Després, es crea un objecte LineChart i es defineix la seva ubicació a la pàgina web mitjançant l’ID “linechart_div”:

  1. var chart = new google.visualization.LineChart(document.getElementById('linechart_div'));

Finalment, es dibuixa el gràfic amb les dades i les opcions específiques, com ara la mida, el títol i la posició de la llegenda:

  1. chart.draw(data, {
  2. width: 400,
  3. height: 240,
  4. title: 'Temperatura mitjana mensual (°C)',
  5. curveType: 'function',
  6. legend: { position: 'bottom' }
  7. });

Amb Google Charts, el procés de creació d’un gràfic de línia és força senzill. Primer, s’inclou la biblioteca de Google Charts a la pàgina web, i després es defineixen les dades del gràfic en un format de taula de dades. A continuació, es crea un objecte LineChart i es passen les dades i les opcions per al gràfic. El gràfic es dibuixa automàticament en el div especificat. Això fa que Google Charts sigui una opció adequada per a usuaris que busquen una manera fàcil i ràpida de crear gràfics sense haver de preocupar-se per la programació complexa.

El procés de creació d’un gràfic de línia amb Chart.js és similar al de Google Charts, però requereix més codi. El procés de creació d’un gràfic de línia amb D3.js és força diferent del de Google Charts i Chart.js, ja que requereix una comprensió més profunda de la biblioteca i de les dades.

Vegeu a la figura el resultat del codi anterior:

Figura Gràfic de línia

Podeu accedir al codi d’aquest exemple a: codepen.io/iocdawm9/pen/dyqyNXW.

Gràfic de barres

El gràfic de barres amb Google Charts és similar al gràfic de línies en molts aspectes. També s’inclou la biblioteca de Google Charts i es crea un element div on es mostrarà el gràfic. A més, també es crida la funció drawChart un cop la biblioteca estigui carregada.

Com volem crear un gràfic de barres en lloc d’un gràfic de línies, en l’exemple següent, crearem un objecte de google.visualization.LineChart, en comptes d’un objecte de google.visualization.BarChart.

Les dades també són diferents. En el gràfic de barres es mostra la població de les ciutats espanyoles, mentre que en el gràfic de línies es mostrava la temperatura mitjana mensual.

Per últim, les opcions també són diferents. En aquest gràfic de barres es pot veure que s’ha especificat un títol per a l’eix horitzontal i un altre per a l’eix vertical. A més, s’ha definit un títol per al gràfic i s’ha ocultat la llegenda, ja que no és necessària en aquest cas.

El codi per dibuixar aquest tipus de gràfic amb Google Charts és:

  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <title>Gràfic de barres amb Google Charts</title>
  6. <!-- Incloure la biblioteca de Google Charts. -->
  7. <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
  8. </head>
  9.  
  10. <body>
  11. <!-- Crear un element div on es mostrarà el gràfic. -->
  12. <div id="barchart_div"></div>
  13. <script>
  14. google.charts.load('current', { 'packages': ['corechart'] });
  15. google.charts.setOnLoadCallback(drawChart);
  16. function drawChart() {
  17. // Definir les dades del gràfic.
  18. var data = google.visualization.arrayToDataTable([
  19. ['Ciutat', 'Població'],
  20. ['Barcelona', 7.5],
  21. ['Madrid', 3.3],
  22. ['València', 2.1],
  23. ['Sevilla', 1.7],
  24. ['Màlaga', 1.2]
  25. ]);
  26.  
  27. // Crear l'objecte del gràfic.
  28. var chart = new google.visualization.BarChart(document.getElementById('barchart_div'));
  29.  
  30. // Dibuixar el gràfic amb les dades i les opcions i les opcions especificades.
  31. chart.draw(data, {
  32. width: 400,
  33. height: 240,
  34. title: 'Població de les ciutats espanyoles',
  35. legend: { position: 'none' },
  36. hAxis: { title: 'Ciutat ' },
  37. vAxis: { title: 'Població (milions)' }
  38. });
  39.  
  40. };
  41. </script>
  42. </body>
  43.  
  44. </html>

Vegeu a la figura el resultat del codi anterior:

Figura Gràfic de barres amb Google Charts

Podeu accedir al codi d’aquest exemple a: codepen.io/iocdawm9/pen/xxaxqom.

Gràfic de pastís

El procés de creació d’un gràfic de pastís amb Google Charts és semblant al que s’ha explicat en els exemples de gràfics de línies i de barres, però amb algunes diferències importants:

  • Cal carregar la biblioteca.
  • Definir les dades: en aquest exemple les dades es defineixen en una taula bidimensional on cada fila representa una secció del pastís, la primera columna és el nom de la secció, i la segona columna és el valor numèric associat.
  • Crear l’objecte gràfic: es crea l’objecte de gràfic de pastís amb la següent línia de codi:
  1. var chart = new google.visualization.PieChart(document.getElementById('piechart_div'));
  • Dibuixar el gràfic amb les dades i les opcions especificades, com en els exemples anteriors.

El codi resultant és el següent:

  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <title>Gràfic de pastís amb Google Charts</title>
  6. <!-- Incloure la biblioteca de Google Charts. -->
  7. <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
  8. </head>
  9.  
  10. <body>
  11. <!-- Crear un element div on es mostrarà el gràfic. -->
  12. <div id="piechart_div"></div>
  13. <script>
  14. google.charts.load('current', { 'packages': ['corechart'] });
  15. google.charts.setOnLoadCallback(drawChart);
  16. function drawChart() {
  17. // Definir les dades del gràfic.
  18. var data = google.visualization.arrayToDataTable([
  19. ['Producte', 'Vendes'],
  20. ['Producte 1', 12],
  21. ['Producte 2', 8],
  22. ['Producte 3', 6],
  23. ['Producte 4', 4]
  24. ]);
  25.  
  26. // Crear l'objecte del gràfic.
  27. var chart = new google.visualization.PieChart(document.getElementById('piechart_div'));
  28.  
  29. // Dibuixar el gràfic amb les dades i les opcions especificades.
  30. chart.draw(data, {
  31. width: 400,
  32. height: 240,
  33. title: 'Vendes per producte',
  34. is3D: true,
  35. legend: { position: 'right' }
  36. });
  37.  
  38. };
  39. </script>
  40. </body>
  41.  
  42. </html>

Vegeu a la figura el resultat del codi anterior:

Figura Gràfic de pastís amb Google Charts

Podeu accedir al codi d’aquest exemple a: codepen.io/iocdawm9/pen/zYJYpKE.

Anàlisi comparativa entre Chart.js, D3.js i Google Charts

Les biblioteques Chart.js, D3.js i Google Charts són eines molt útils per a la visualització de dades i la creació de gràfics. Cada biblioteca té les seves pròpies característiques i els seus avantatges, i depèn de les necessitats de cada projecte decidir la millor opció.

Chart.js és una biblioteca gratuïta i fàcil d’utilitzar que ofereix una gran varietat de tipus de gràfics i permet personalitzar l’aparença dels gràfics amb opcions de format i estil. No obstant, no és tan potent com altres biblioteques i no ofereix tant control sobre els gràfics com altres biblioteques.

D3.js és una biblioteca molt potent i flexible per crear gràfics i visualitzacions de dades. Permet utilitzar codi JavaScript per crear gràfics de forma molt detallada i personalitzada, tot i que pot ser més difícil d’aprendre i utilitzar que altres biblioteques.

Google Charts és una biblioteca gratuïta i fàcil d’utilitzar que ofereix una gran varietat de tipus de gràfics i permet personalitzar l’aparença dels gràfics amb opcions de format i estil. No obstant, depèn de la connexió a Internet per funcionar i no és tan potent com altres biblioteques.

En resum, per triar la millor biblioteca de visualització de dades, es recomana avaluar les necessitats del projecte i les característiques de cada biblioteca per determinar la més adequada. També es pot tenir en compte el nivell de coneixements del programador i el temps disponible per crear els gràfics .

Vegeu a la taula una comparativa amb algunes de les característiques més importants de cada biblioteca:

Taula Comparació de biblioteques gràfiques
biblioteca Tipus de gràfics Personalització Flexibilitat Corba d’aprenentatge Connexió a Internet
Chart.js Molts Alta Baixa Baixa No
D3.js Molts Mitjana Alta Mitjana No
Google Charts Molts Alta Baixa Baixa

Cada biblioteca té les seves pròpies característiques i pot ser millor per a un tipus de projecte o un altre. Així, per exemple, si busqueu una biblioteca fàcil d’aprendre i amb molts tipus de gràfics, ChartJS o Google Charts poden ser les millors opcions. Si busqueu més flexibilitat i control sobre els gràfics, D3.js pot ser més recomanable.

A més de les característiques esmentades, també cal tenir en compte si es necessita o no la connexió a Internet per utilitzar la biblioteca, ja que això pot ser un factor determinant en alguns casos.

En resum, la millor biblioteca depèn de les necessitats de cada projecte i de les consideracions esmentades. És important fer una avaluació de les diferents opcions i triar la que s’ajusti millor a les necessitats del projecte.

Animacions avançades amb Anime.js

  • Logo d'Anime.js

Anime.js és una biblioteca de codi obert que s’utilitza per crear animacions fluides i atractives en pàgines web. Anime.js es basa en el llenguatge JavaScript i utilitza l’API de transformació CSS per animar elements de la pàgina.

Un dels principals avantatges d’Anime.js és la seva facilitat d’ús i flexibilitat per crear animacions personalitzades. Anime.js proporciona una sintaxi senzilla i intuïtiva per definir les propietats d’animació, així com una gran varietat de funcions i opcions per personalitzar les animacions segons les necessitats del projecte.

A la web d’Anime.js trobareu tota la documentació oficial de la biblioteca, així com enllaços a repositoris i galeries d’exemples a CodePen.

Hi ha moltes raons per utilitzar Anime.js per crear animacions web. Alguns dels avantatges més destacats són:

  • Fàcil d’utilitzar: té una API molt intuïtiva i fàcil d’aprendre, cosa que la fa ideal per a desenvolupadors web que busquin una manera senzilla de crear animacions.
  • Lleugera i ràpida: és una de les biblioteques d’animació més lleugeres disponibles, cosa que la fa ideal per a projectes web on es busqui un bon rendiment. A més, les animacions creades amb Anime.js són molt fluides i s’executen de manera ràpida.
  • Compatible amb altres biblioteques i entorns de treball: Anime.js és compatible amb altres biblioteques i frameworks de JavaScript, com ara GSAP, React o Angular, cosa que la fa ideal per a projectes web que utilitzin altres eines de desenvolupament.
  • Gran quantitat de propietats d’animació: ofereix una gran quantitat de propietats d’animació, com ara durada, retard, acceleració, easing i moltes altres que permeten crear animacions molt elaborades i personalitzades.

Hi ha diverses maneres d’instal·lar i carregar Anime.js. Una de les maneres més senzilles és descarregar el fitxer JavaScript de la pàgina web oficial d’Anime.js i afegir-lo al projecte. També es pot fer una referència a un recurs extern hostatjat a un CDN. Una altra manera és utilitzar una gestor de paquets com npm o yarn per instal·lar Anime.js i carregar-lo des de l’aplicació. Una vegada instal·lat Anime.js, només cal afegir un enllaç al fitxer JavaScript al codi HTML per poder utilitzar-lo.

A la documentació oficial d’Anime.js teniu instruccions i exemples per començar a treballar amb aquesta biblioteca: bit.ly/3L0XRlA

Primers passos amb Anime.js

Per començar a utilitzar Anime.js en un projecte web, cal seguir els següents passos:

  1. Descarregar i instal·lar Anime.js (opcional). Anime.js es pot descarregar des de la seva pàgina oficial o instal·lar-lo a través d’una eina de gestió de paquets com NPM. Alternativament, es pot utilitzar un CDN per carregar la biblioteca directament des de la web.
  2. Configuració inicial. Una vegada que Anime.js està instal·lat, es pot començar a utilitzar-lo a la pàgina web. Per fer-ho, cal afegir una referència al fitxer de la biblioteca a l’encapçalament de la pàgina HTML.
  3. Selecció d’elements. Per animar un element de la pàgina amb Anime.js, cal seleccionar-lo utilitzant la sintaxi de selecció de JavaScript. Això es pot fer amb la funció document.querySelector() o altres funcions de selecció d’elements.
  4. Propietats d’animació. Anime.js permet animar una gran varietat de propietats d’estil CSS, com ara posició, escalat, rotació, opacitat i color. Per animar aquestes propietats, cal utilitzar les funcions corresponents de la biblioteca, com ara anime(), que permet definir les propietats d’animació i el temps d’animació.
  5. Control del temps d’animació i de les transicions. Anime.js proporciona una gran varietat d’opcions per controlar el temps i les transicions d’animació, com ara la funció delay(), que permet retardar l’inici de l’animació, o la funció easing(), que permet especificar una funció de transició personalitzada.

Amb aquests passos bàsics, ja es pot començar a crear animacions amb Anime.js a la pàgina web. A mesura que l’usuari es familiaritza amb la biblioteca, pot experimentar amb les funcions avançades i les opcions per crear animacions més sofisticades i personalitzades.

Primer exemple d'animació bàsica amb Anime.js

  • Inclusió d’Anime.js a la pàgina web. Per referenciar Anime.js a través d’un CDN (Content Delivery Network), es pot utilitzar el següent codi en la capçalera de la pàgina HTML:

  1. <head>
  2. <script src="https://cdn.jsdelivr.net/npm/animejs/lib/anime.min.js"></script>
  3. </head>

  • Selecció d’elements. Per seleccionar el botó que s’ha d’animar, es pot utilitzar la funció document.querySelector().

  1. const boto = document.querySelector('#boto');

  • Propietats d’animació. Per animar les propietats del botó, es pot utilitzar la funció anime(). Per exemple, per animar el canvi de color i la mida del botó en 500ms, s’utilitzaria el codi següent:

  1. anime({
  2. targets: boto,
  3. backgroundColor: '#ff0000',
  4. width: '50%',
  5. duration: 500,
  6. easing: 'easeInOutQuad'
  7. });

Aquest codi anima les propietats backgroundColor i width del botó a #ff0000 (vermell) i 50% de mida, respectivament, durant 500ms, amb una transició d’eix acceleració-desacceleració (easeInOutQuad).

  • Control del temps d’animació i de les transicions. Anime.js ofereix moltes opcions per controlar el temps i les transicions d’animació. Per exemple, es pot utilitzar la funció delay() per retardar l’inici de l’animació, i la funció easing() per especificar una funció de transició personalitzada.

  1. anime({
  2. targets: boto,
  3. backgroundColor: '#ff0000',
  4. width: '50%',
  5. duration: 500,
  6. delay: 1000,
  7. easing: 'easeOutElastic'
  8. });

Aquest codi anima les propietats backgroundColor i width del botó a #ff0000 i 50% de mida, respectivament, després d’un retard de 1000ms, amb una transició elàstica (easeOutElastic).

El codi resultant de l’animació amb Anime.js defineix una pàgina web amb un botó (<button>) i un script de JavaScript que anima el botó quan l’usuari el clica, afegint un gestor a l’event click amb el mètode addEventListener:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Exemple d'animació amb Anime.js</title>
  6. <script src="https://cdn.jsdelivr.net/npm/animejs/lib/anime.min.js"></script>
  7. </head>
  8. <body>
  9. <button id="boto">Animar botó.</button>
  10.  
  11. <script>
  12. const boto = document.querySelector('#boto');
  13.  
  14. boto.addEventListener('click', () => {
  15. anime({
  16. targets: boto,
  17. backgroundColor: '#ff0000',
  18. width: '50%',
  19. duration: 500,
  20. easing: 'easeInOutQuad'
  21. });
  22. });
  23. </script>
  24. </body>
  25. </html>

Aquesta és l’animació resultant:

Conceptes bàsics d'animació amb Anime.js

Els procediments bàsics de l’animació amb Anime.js es basen en la selecció d’elements, les propietats d’animació que es poden utilitzar (la posició, l’escalat, la rotació i altres) i el control del temps d’animació i de les transicions. Amb aquestes eines és possible crear animacions personalitzades i dinàmiques que millorin l’experiència de l’usuari en el lloc web.

Selecció d'elements

Per animar un element amb Anime.js, primer s’ha de seleccionar. Anime.js utilitza la funció anime() per animar els elements seleccionats. Aquesta funció rep dos paràmetres: una selecció d’elements i un objecte de propietats d’animació.

La selecció d’elements pot ser un selector CSS o un objecte JavaScript que representi l’element que s’ha d’animar. Si usem un selector CSS, Anime.js seleccionarà tots els elements que coincideixen amb el selector i els animarà simultàniament. Si utilitzem un objecte JavaScript, Anime.js només animarà l’element seleccionat.

Aquí teniu un exemple senzill de codi que utilitza un selector CSS per seleccionar tots els elements amb la classe .box i animar-los amb una durada d’un segon:

  1. anime({
  2. targets: '.box',
  3. translateY: 100,
  4. duration: 1000
  5. });

En aquest exemple Anime.js selecciona tots els elements amb la classe .box i els anima aplicant-hi una translació de 100 píxels cap avall en l’eix Y en 1 segon.

Per seleccionar un element específic en lloc de tots els elements que coincideixen amb un selector CSS, es pot passar un objecte JavaScript a la funció anime(). Per exemple:

  1. var element = document.getElementById('my-element');
  2.  
  3. anime({
  4. targets: element,
  5. translateX: 250,
  6. duration: 1000
  7. });

En aquest altre exemple Anime.js selecciona l’element amb l’ID “my-element” i l’anima aplicant-hi una translació de 250 píxels cap a la dreta en l’eix X en 1 segon. Així, és possible seleccionar un únic element per animar-lo en lloc de tots els elements amb una determinada classe o etiqueta.

Propietats d'animació

Anime.js permet animar diferents propietats d’un element, com la posició, l’escalat, la rotació, la transparència, el color, la mida de la font, etc.

Per animar una propietat, s’ha de definir a l’objecte de propietats d’animació. Per exemple, si volem animar la posició d’un element, cal utilitzar la propietat translateX o translateY. Si volem animar la mida de font d’un element, cal utilitzar la propietat fontSize.

Vegeu un exemple que anima la posició i la mida de font d’un element al mateix temps:

  1. anime({
  2. targets: '#my-element',
  3. translateX: 250,
  4. fontSize: '3rem',
  5. duration: 1000
  6. });

En aquest exemple Anime.js selecciona l’element amb l’ID “my-element” i li aplica una translació de 250 píxels cap a la dreta en l’eix X i un augment de la mida de font a 3 rem en 1 segon.

Anime.js també permet utilitzar múltiples propietats alhora per animar un element. Per exemple:

  1. anime({
  2. targets: '#my-element',
  3. translateX: 250,
  4. translateY: 100,
  5. scale: 2,
  6. rotate: '1turn',
  7. duration: 1000
  8. });

En aquest exemple Anime.js selecciona l’element amb l’ID “my-element” i li aplica una translació de 250 píxels cap a la dreta en l’eix X, una translació de 100 píxels cap avall en l’eix Y, un escalat de 2 i una rotació d’una volta (360 graus) en 1 segon.

Exemple d'animació bàsica de dues caixes

Veurem el codi sencer per a dues caixes animades de forma diferent identificades amb la classe CSS “box” i l’identificador “box1” i “box2”.

Se seleccionen aquestes caixes a través del mètode “getElementById” i es passen com a paràmetres a la funció “anime”. Aquesta funció és la que s’encarrega de dur a terme l’animació, i rep diversos paràmetres per definir les propietats de l’animació.

En aquest cas, s’ha definit que els elements són les dues caixes, s’ha especificat una propietat de translació en l’eix X (“translateX”) per moure les caixes 200 píxels i 400px cap a la dreta, respectivament, una propietat de rotació (“rotate”) per fer-les girar una volta completa, una durada de 2 segons i una funció d’easing “easeInOutQuad” per controlar la transició de l’animació.

  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <title>Animació amb Anime.js</title>
  6. <script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js"></script>
  7. <style>
  8. #container{
  9. width:90%;
  10. }
  11. .box {
  12. margin:auto;
  13. width: 100px;
  14. height: 100px;
  15. margin: 50px;
  16. }
  17.  
  18. #box1 {
  19. background-color: #FFC107;
  20. }
  21.  
  22. #box2 {
  23. background-color: #2196F3;
  24. }
  25. </style>
  26. </head>
  27.  
  28. <body>
  29. <div id="container">
  30. <div class="box" id="box1"></div>
  31. <div class="box" id="box2"></div>
  32. </div>
  33. <script>
  34. var box1 = document.getElementById('box1');
  35. var box2 = document.getElementById('box2');
  36.  
  37. anime({
  38. targets: '#box1',
  39. translateX: '200px',
  40. rotate: '1turn',
  41. duration: 2000,
  42. easing: 'easeInOutQuad'
  43. });
  44.  
  45. anime({
  46. targets: '#box2',
  47. translateX: '400px',
  48. rotate: '1turn',
  49. duration: 2000,
  50. easing: 'easeInOutQuad'
  51. });
  52.  
  53. </script>
  54. </body>
  55.  
  56. </html>

Teniu el codi d’aquest exemple disponible a: codepen.io/iocdawm9/pen/yLxyBvE.

Podeu veure aquesta animació bàsica a continuació:

Control del temps d'animació i de les transicions

Per controlar el temps d’animació i les transicions, Anime.js ofereix una gran varietat de propietats que es poden ajustar per personalitzar l’animació. Algunes d’aquestes propietats inclouen:

  • duration: aquesta propietat defineix la durada de l’animació. El valor per defecte és de 1000ms (1 segon), però es pot ajustar a qualsevol valor en mil·lisegons.
  • delay: aquesta propietat defineix el retard abans que l’animació comenci. El valor per defecte és de 0ms, però es pot ajustar a qualsevol valor en mil·lisegons.
  • easing: aquesta propietat defineix el tipus de transició que s’utilitza per a l’animació. Anime.js ofereix una gran varietat de transicions predefinides, com ara linear, easeIn, easeOut, easeInOut, entre d’altres. També es pot utilitzar una funció personalitzada per definir una transició única.
  • direction: aquesta propietat defineix la direcció de l’animació. Per exemple, es pot fer que l’animació es desenvolupi d’esquerra a dreta (normal) o bé de dreta a esquerra (reverse), o bé que es repeteixi de forma alternada (alternate).

Exemple de control del temps d'animació i transicions

Vegeu un exemple de codi que utilitza algunes d’aquestes propietats per crear una animació que canvia el color de fons de la caixa quan hi passa el ratolí per sobre.

  1. <div class="box"></div>
  2. <script>
  3. anime({
  4. targets: '.box',
  5. backgroundColor: ['#00F', '#F00'],
  6. scale: [1, 1.5, 1],
  7. duration: 2000,
  8. delay: 500,
  9. easing: 'easeInOutQuad',
  10. direction: 'alternate',
  11. loop: true
  12. });
  13.  
  14. </script>

Podeu consultar i veure en execució el codi d’aquest exemple a: codepen.io/iocdawm9/pen/NWLPPNK.

En aquest exemple, s’ha utilitzat l’objecte backgroundColor per definir un gradient de colors que passa del blau (#00F) al vermell (#F00). També s’anima l’escalat de l’element de la seva mida original (1) a 1,5, i després torna a la mida original (1). Això farà que l’element es vegi més gran durant l’animació. S’ha definit una durada de 1.000ms (1 segon) per a l’animació, amb un retard de 500ms abans que comenci. També s’ha utilitzat la transició easeInOutQuad per fer que l’animació comenci i acabi suaument. Finalment, s’ha definit que l’animació es repeteixi de forma alternada amb la propietat direction, i que es repeteixi indefinidament amb la propietat loop. L’aspecte final d’aquesta animació es pot apreciar a continuació:

Animació avançada amb Anime.js

Anime.js ofereix moltes funcionalitats per crear animacions avançades. Algunes d’aquestes funcionalitats són les línies de temps múltiples i les seqüències d’animació, i la possibilitat d’anar més enllà de les propietats CSS.

Línies de temps múltiples i seqüències d'animació

Anime.js permet definir múltiples línies de temps d’animació, que es poden executar simultàniament o seqüencialment. Això permet realitzar animacions més complexes i coordinar diferents elements a la vegada. Per exemple, per animar tres quadrats de forma que el primer es mogui cap a l’esquerra, el segon s’ampliï i el tercer es desplaci cap amunt, es poden definir les tres animacions per separat i executar-les de forma seqüencial.

  1. var timeline = anime.timeline();
  2.  
  3. timeline
  4. .add({
  5. targets: '.box-1',
  6. translateX: -200,
  7. easing: 'easeInOutSine'
  8. })
  9. .add({
  10. targets: '.box-2',
  11. scale: 1.5,
  12. easing: 'easeInOutSine'
  13. })
  14. .add({
  15. targets: '.box-3',
  16. translateY: -100,
  17. easing: 'easeInOutSine'
  18. });

En aquest exemple, primer es defineix una nova línia de temps amb anime.timeline(). Després, amb el mètode add() s’hi afegeixen les tres animacions. Per a cada animació, cal especificar els objectius (targets) als quals s’aplica l’animació (en aquest cas, les caixes amb les classes .box-1, .box-2 i .box-3), així com les propietats que es volen animar. També cal especificar la funció d’interpolació per a cada animació.

Anime.js també permet utilitzar diferents mètodes per executar les línies de temps: play(), per executar-les; pause(), per aturar-les; restart(), per reiniciar-les o reverse(), per invertir la direcció de l’animació.

Més enllà de les propietats CSS

Anime.js també permet animar propietats que no estan disponibles directament a través de CSS, com ara la posició d’un objecte en una trajectòria corba o la transparència de l’objecte. Això es fa mitjançant la definició d’una funció que s’executa durant l’animació.

Per exemple, es pot definir una funció per animar la posició d’un objecte en una trajectòria corba. Aquesta funció rep com a paràmetres el moment actual de l’animació (en mil·lisegons) i la posició inicial i final de l’objecte. A partir d’aquests paràmetres, la funció calcula la nova posició de l’objecte en cada moment de l’animació.

Aquí teniu un exemple d’una animació en què un cercle es mou en una trajectòria el·líptica:

  1. anime({
  2. anime({
  3. targets: '#circle',
  4. translateX: function(elapsedTime, initialTranslateX, finalTranslateX) {
  5. var x = Math.cos(elapsedTime / 1000) * 50;
  6. return initialTranslateX + x;
  7. },
  8. translateY: function(elapsedTime, initialTranslateY, finalTranslateY) {
  9. var y = Math.sin(elapsedTime / 1000) * 25;
  10. return initialTranslateY + y;
  11. },
  12. duration: 2000,
  13. easing: 'linear'
  14. });

En aquest exemple els paràmetres initialTranslateX i initialTranslateY són la posició inicial del cercle, mentre que els paràmetres finalTranslateX i finalTranslateY són la posició final. La funció translateX calcula la posició de l’eix X en cada moment de l’animació, utilitzant la funció Math.cos per moure el cercle en una trajectòria el·líptica. La funció translateY calcula la posició de l’eix Y en cada moment de l’animació, utilitzant la funció Math.sin. Els valors calculats són afegits a les posicions inicials del cercle per determinar la seva nova posició en cada moment de l’animació.

Anime.js també permet animar altres propietats que no estan disponibles directament a través de CSS, com ara la transparència, la mida dels caràcters o les ombres.

Per exemple, es pot definir una funció que animi la transparència d’un element amb el codi següent:

  1. anime({
  2. targets: '#text',
  3. opacity: function(elapsedTime, initialOpacity, finalOpacity) {
  4. var t = elapsedTime / 1000;
  5. var a = 0.5 + 0.5 * Math.sin(t);
  6. return initialOpacity + (finalOpacity - initialOpacity) * a;
  7. },
  8. duration: 2000,
  9. easing: 'linear'
  10. });

En aquest exemple la funció opacity calcula la transparència de l’element en cada moment de l’animació utilitzant la funció Math.sin. La transparència varia entre 0 i 1, per la qual cosa la funció multiplica la sortida de Math.sin per 0,5, i li suma 0,5 per obtenir un valor entre 0,5 i 1. Això significa que la transparència de l’element començarà a 0,5 i augmentarà fins a 1 i, després disminuirà fins a 0,5 de nou. Aquesta animació crea un efecte de respiració que dona vida a l’element:

Anime.js també permet utilitzar funcions personalitzades per a altres propietats, com ara la posició o la mida d’un element. Això ofereix la capacitat de crear animacions més complexes i personalitzades que no es poden aconseguir amb les propietats CSS estàndard.

Per exemple, per crear una animació on un element es redueix de mida i es desplaça al mateix temps. Això no es pot fer amb les propietats CSS estàndards, però es pot aconseguir creant una funció personalitzada per calcular les propietats mida i posició de l’element en cada moment de l’animació.

Altres propietats no definides en CSS que permet gestionar Anime.js són el volum d’un element d’àudio o la posició d’un objecte en un entorn 3D. Per exemple, per animar la posició d’un objecte en tres dimensions, es pot fer de la següent manera:

  1. anime({
  2. targets: '#object',
  3. translateX: 100,
  4. translateY: -50,
  5. translateZ: 25,
  6. duration: 4500,
  7. easing: 'easeInOutQuad',
  8. rotateY: 180,
  9. delay: 500,
  10. loop: true
  11. });

Aquest codi fa que l’element amb l’ID object es desplaci 100 píxels a la dreta, 50 píxels cap amunt i 25 píxels cap enrere en un moviment diagonal cap a la dreta i cap amunt. A continuació, s’afegeix una animació de gir (rotate) que fa que l’element giri 180 graus a l’eix Y. La durada d’aquesta animació és de 4.500 mil·lisegons, amb una funció d’easing que s’aplica a la transició de manera que comença a accelerar, arriba a la velocitat màxima i després disminueix fins que s’atura. L’animació de gir començarà 500 mil·lisegons després que l’animació de translació comenci per crear un efecte de pausa. Finalment, l’animació es repetirà indefinidament gràcies a la propietat loop.

L’aspecte final d’aquesta animació es pot apreciar a continuació:

Per modificar el volum d’àudio, Anime.js proporciona la propietat volume, que permet establir el volum d’un element d’àudio en una animació. Aquesta propietat accepta valors entre 0 i 1: 0 és silenci i 1 és el volum màxim. Aquí hi ha un exemple d’ús de la propietat volume per animar el volum d’un element d’àudio:

  1. // Seleccionem l'element d'àudio.
  2. var audioElement = document.getElementById('audio');
  3.  
  4. // Anem de 0 a 1 de volum en 2 segons.
  5. anime({
  6. targets: audioElement,
  7. volume: [0, 1],
  8. duration: 2000
  9. });

Exemples pràctics d'animació amb Anime.js

Anime.js és una eina potent per a la creació d’animacions fluides i interactives en l’àmbit web. Per comprendre millor com funcionen les animacions amb Anime.js, hi ha alguns exemples pràctics que podeu utilitzar com a punt de partida per a les animacions.

Exemple de creació d'una animació de logo amb Anime.js

Crearem una animació de logo amb biblioteca Anime.js que fa aparèixer el logo a la pantalla amb un efecte de moviment des de fora de la finestra.

El funcionament és el següent:

  • Es defineix l’element HTML del logo amb un identificador únic (“logo”) i utilitzant la funció document.getElementById.
  • S’estableixen les propietats inicials de l’element a través de la funció anime.set. En aquest cas, les propietats són la posició del logo a l’esquerra de la finestra, fora de la pantalla, i una opacitat de 0 per a l’efecte d’aparició.
  • Es defineix l’animació amb les propietats desitjades amb la funció anime, especificant l’element objectiu i les propietats que s’animaran (en aquest cas, translateX i opacity). La funció anime també permet especificar la durada de l’animació i el tipus d’animació.
  • Quan s’executa el codi, l’animació es dispara i l’element del logo es mou des de fora de la finestra fins a la seva posició original. Al mateix temps, la seva opacitat augmenta fins que arriba a 1, que és la seva opacitat completa.

El codi és el següent:

  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <title>Animació de logo amb Anime.js</title>
  6. <script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js"></script>
  7. </head>
  8.  
  9. <body>
  10. <img id="logo" src="logo_ioc.png" />
  11. <script>
  12. // Defineix l'element objectiu.
  13. var logo = document.getElementById('logo');
  14.  
  15. // Defineix les propietats inicials de l'element.
  16. anime.set(logo, {
  17. translateX: '-100%', // mou l'element a l'esquerra de la finestra
  18. opacity: 0 // establix l'opacitat a 0 per a l'efecte d'aparició
  19. });
  20.  
  21. // Defineix l'animació amb les propietats desitjades.
  22. anime({
  23. targets: logo,
  24. translateX: 0, // mou l'element a la posició original
  25. opacity: 1, // establix l'opacitat a 1 per mostrar l'element
  26. duration: 2500, // durada de l'animació
  27. easing: 'easeOutExpo', // tipus d'animació
  28. });
  29.  
  30. </script>
  31. </body>
  32.  
  33. </html>

Podeu accedir al codi d’aquest exemple a: codepen.io/iocdawm9/pen/RwYNEpY.

Vegeu aquest efecte d’aparició:

L’animació d’una galeria d’imatges és un altre exemple pràctic de com utilitzar Anime.js per a animacions atractives al lloc web.

Exemple de galeria d'imatges amb Anime.js

Crearem una galeria d’imatges que es mouen cap a l’esquerra i cap a la dreta quan l’usuari fa clic als botons corresponents.

Per començar, cal crear una estructura HTML senzilla que inclou una secció per a la galeria i dos botons: un per moure la galeria cap a l’esquerra i un altre per moure-la cap a la dreta. Aquí teniu el codi HTML bàsic:

  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <title>Animació de galeria d'imatges amb Anime.js</title>
  6. <script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js"></script>
  7. </head>
  8.  
  9. <body>
  10. <div id="slideshow">
  11. <img src="img1.jpg">
  12. <img src="img2.jpg">
  13. <img src="img3.jpg">
  14. <img src="img4.jpg">
  15. <img src="img5.jpg">
  16. </div>
  17.  
  18. <div id="buttons">
  19. <button id="prevButton">Anterior</button>
  20. <button id="nextButton">Següent</button>
  21. </div>
  22.  
  23. <script>
  24. // Aquí hi va el codi d'Anime.js.
  25. </script>
  26. </body>
  27.  
  28. </html>

Després, s’han d’afegir estils CSS per a la galeria i els botons. Les imatges han d’estar posicionades absolutament a dins del div de la galeria de manera que se superposin. Totes les imatges tenen opacitat 0 excepte la que té la classe active, que té opacitat 1 i, per tant, és la visible. Hi ha una transició de 0,5 segons en la propietat d’opacitat per a les imatges. Els botons estan posicionats dins d’un div a la part inferior de la galeria. Aquí teniu el codi CSS bàsic:

  1. #slideshow {
  2. position: relative;
  3. width: 600px;
  4. height: 400px;
  5. }
  6.  
  7. #slideshow img {
  8. position: absolute;
  9. top: 0;
  10. left: 0;
  11. opacity: 0;
  12. transition: opacity 0.5s;
  13. }
  14.  
  15. #slideshow img.active {
  16. opacity: 1;
  17. }
  18. }

Amb l’estructura HTML i els estils CSS, es pot començar a treballar en la funcionalitat JavaScript que farà que la galeria vagi visualitzant la imatge corresponent. Anime.js serveix per animar el desplaçament dels elements de la galeria.

Hi ha una funció que canvia la diapositiva actual a la següent o anterior, depenent de la direcció proporcionada. Això es fa mitjançant l’afegit o l’eliminació de la classe active a les imatges. Hi ha també dos esdeveniments d’escolta d’esdeveniments que detecten el clic als botons anterior i següent i que criden la funció de canvi de diapositiva. Finalment, la diapositiva actual s’estableix com la primera imatge a través de l’addició de la classe active al primer element img. Aquí teniu el codi JavaScript bàsic:

  1. var slides = document.querySelectorAll('#slideshow img');
  2. var currentSlideIndex = 0;
  3.  
  4. // Funció per canviar la diapositiva.
  5. function changeSlide(direction) {
  6. // Amaga la diapositiva actual.
  7. slides[currentSlideIndex].classList.remove('active');
  8.  
  9. // Actualitza la posició actual de la diapositiva.
  10. currentSlideIndex += direction === 'left' ? -1 : 1;
  11. if (currentSlideIndex < 0) {
  12. currentSlideIndex = slides.length - 1;
  13. } else if (currentSlideIndex >= slides.length) {
  14. currentSlideIndex = 0;
  15. }
  16.  
  17. // Mostra la nova diapositiva.
  18. slides[currentSlideIndex].classList.add('active');
  19. }
  20.  
  21. // Inicia l'animació de la diapositiva actual.
  22. slides[currentSlideIndex].classList.add('active');
  23.  
  24. // Afegeix un esdeveniment de clic al botó anterior.
  25. document.querySelector('#prevButton').addEventListener('click', function() {
  26. changeSlide('left');
  27. });
  28.  
  29. // Afegeix un esdeveniment de clic al botó següent.
  30. document.querySelector('#nextButton').addEventListener('click', function() {
  31. changeSlide('right');
  32. });

Així, en resum, aquest codi HTML, CSS i JavaScript defineix una galeria d’imatges que mostra tres imatges a l’usuari amb botons per passar a la imatge següent o anterior.

Podeu accedir al codi d’aquest exemple a: codepen.io/iocdawm9/pen/oNPXjgX.

Vegeu el resultat final:

Exemple de carrusel d'imatges amb Anime.js

Aquest exemple fa servir la biblioteca Anime.js per crear una animació de carrusel que mou les imatges cap a la dreta o cap a l’esquerra. Es fa servir CSS per ocultar les imatges, excepte la primera que té la classe active, i JavaScript per afegir els esdeveniments als botons de navegació i un temporitzador per aconseguir un efecte de carrusel automàtic.

  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <title>Carrusel d´imatges amb Anime.js</title>
  6. <script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js"></script>
  7. <style>
  8. #carousel {
  9. width: 100%;
  10. height: 500px;
  11. overflow: hidden;
  12. position: relative;
  13. }
  14.  
  15. #carousel img {
  16. position: absolute;
  17. top: 0;
  18. left: 0;
  19. opacity: 0;
  20. }
  21.  
  22. #carousel img.active {
  23. opacity: 1;
  24. }
  25. </style>
  26. </head>
  27.  
  28. <body>
  29. <div id="carousel">
  30. <img src="galeria_1.png" />
  31. <img src="galeria_2.png" />
  32. <img src="galeria_3.png" />
  33. </div>
  34. <script>
  35. var carousel = document.getElementById('carousel');
  36. var images = carousel.getElementsByTagName('img');
  37. var currentImageIndex = 0;
  38.  
  39. function animateCarousel() {
  40. var animation = anime({
  41. targets: images[currentImageIndex],
  42. translateX: '-100%',
  43. duration: 3000,
  44. easing: 'easeInOutCubic',
  45. complete: function () {
  46. images[currentImageIndex].classList.remove('active');
  47. currentImageIndex++;
  48. if (currentImageIndex >= images.length) {
  49. currentImageIndex = 0;
  50. }
  51. images[currentImageIndex].classList.add('active');
  52. images[currentImageIndex].style.transform = 'translateX(100%)';
  53. animateCarousel();
  54. }
  55. });
  56. }
  57.  
  58. images[currentImageIndex].classList.add('active');
  59. animateCarousel();
  60.  
  61. </script>
  62. </body>
  63.  
  64. </html>

En el codi s’ha creat un contenidor amb la ID “carrusel” que conté tres imatges diferents. A través de CSS, s’han ocultat totes les imatges, excepte la primera, que té la classe active.

La funció animateCarousel() s’encarrega de fer l’animació d’una imatge cap a l’esquerra i després crida a si mateixa per fer l’animació de la següent imatge. S’utilitza la biblioteca Anime.js per fer l’animació.

Dins de la funció animateCarousel() s’especifica la imatge que es vol animar en el paràmetre targets de la crida a la funció anime(). Els altres paràmetres especifiquen la durada de l’animació, el tipus d’acceleració, i una funció que s’executa quan l’animació s’ha completat, amb el paràmetre complete. Aquesta última funció s’encarrega de canviar la classe de l’element perquè no es vegi i passar a l’animació de la següent imatge.

Podeu accedir al codi d’aquest exemple a: codepen.io/iocdawm9/pen/QWVjyNY.

Podeu veure el resultat final:

Bones pràctiques per a les animacions amb Anime.js

Anime.js és una eina potent i flexible per a la creació d’animacions atractives i efectives a les pàgines web. Amb la seva gran varietat d’opcions, és important conèixer algunes de les millors pràctiques que podem aplicar per optimitzar el rendiment de les animacions i crear un impacte més significatiu en els usuaris.

Algunes pràctiques que es poden seguir per optimitzar el funcionament de les animacions amb Anime.js són:

  • Utilitzar una biblioteca de CDN per carregar Anime.js. Carregar la biblioteca de Anime.js a través d’una xarxa de lliurament de contingut (CDN) pot optimitzar el temps de càrrega i millorar la velocitat de la pàgina. Això es pot fer afegint el següent codi a l’etiqueta <head> del document HTML:
  1. <script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js"></script>
  • Reduir el nombre d’animacions. Tenir moltes animacions en una pàgina pot disminuir-ne el rendiment. Per tant, és recomanable minimitzar la quantitat d’animacions a la pàgina i optimitzar-les adequadament. És millor prioritzar les animacions que tenen un impacte important en l’experiència de l’usuari i eliminar les animacions que no aporten res significatiu.
  • Utilitzar l’atribut will-change. L’atribut will-change permet al navegador optimitzar la representació d’un element que està a punt de ser animat. Això redueix la càrrega en la GPU i millora la fluidesa de l’animació. Per exemple, per animar el color de fons d’un element, es pot afegir l’atribut will-change al CSS de la següent manera:
  1. .element {
  2. background-color: blue;
  3. will-change: background-color;
  4. }

També es pot utilitzar la regla will-change: transform per a les animacions que modifiquin la posició, mida o rotació d’un element:

  1. .element {
  2. will-change: transform;
  3. }
  • Evitar l’ús de posicions absolutes. L’ús de posicions absolutes pot tenir un impacte negatiu en el rendiment de l’animació. Si és possible, és millor utilitzar altres opcions de posicionament, com ara posicions relatives, flexbox o CSS Grid. Si no és possible, és important assegurar-se que els elements animats amb posicions absolutes no se superposin.
  • Predefinir les dimensions de l’element. Definir les dimensions de l’element abans de l’animació redueix la quantitat de càlculs que el navegador ha de fer durant l’animació i, per tant, millora el rendiment. Si no es poden definir les dimensions abans de l’animació, és important assegurar-se que les dimensions es defineixen almenys abans que l’element sigui visible per primera vegada.
  1. .element {
  2. width: 100px;
  3. height: 100px;
  4. background-color: blue;
  5. transform: translateX(-100%);
  6. }
  • Provar l’animació en diferents dispositius i navegadors. És important provar l’animació en diferents dispositius i navegadors per assegurar que funciona correctament i que ofereix una experiència de qualitat als usuaris. Algunes animacions poden ser més exigents en termes de rendiment i, per tant, pot ser necessari adaptar-les per a dispositius mòbils o navegadors més vells.
  • Utilitzar la funció requestAnimationFrame. Aquesta funció permet a l’animació actualitzar-se quan el navegador estigui llest per a això, el que millora el rendiment i la suavitat de l’animació. No es recomana fer servir la funció setInterval, ja obsoleta en termes de rendiment.
  1. function animate() {
  2. requestAnimationFrame(animate);
  3. // Codi d'animació
  4. }
  5. animate();
  • Reduir el nombre d’elements animats. Animar massa elements alhora pot disminuir el rendiment i fer que l’animació es vegi poc fluida. Si es vol animar diversos elements alhora, es pot utilitzar un Timeline per agrupar les animacions i garantir que s’executen de manera sincronitzada.
  1. var timeline = anime.timeline({
  2. easing: 'easeOutExpo',
  3. duration: 750
  4. });
  5. timeline.add({
  6. targets: '.element-1',
  7. translateX: 250
  8. })
  9. .add({
  10. targets: '.element-2',
  11. translateX: 250
  12. });

Per crear animacions més atractives i efectives amb Anime.js, també hi ha algunes bones pràctiques. A través de l’ús d’efectes i elements visuals adequats, es poden crear animacions més impactants i que connectin millor amb el públic.

  • No saturar l’usuari amb moltes animacions. Evitar fer servir moltes animacions simultàniament. Això pot sobrecarregar l’usuari i fer que la pàgina sigui lenta.
  • Fer servir una durada adequada. La durada d’una animació ha de ser prou llarga perquè l’usuari la pugui percebre, però no massa llarga perquè s’avorreixi. CAl utilitzar una durada adequada segons el contingut i l’objectiu de l’animació.
  • Cuidar els detalls. Cuidar els detalls de l’animació, com ara la velocitat, l’easing, la posició, la mida i el color. Aquests detalls poden ajudar a donar una millor sensació d’interacció i dinamisme a la pàgina.

Continguts interactius amb Canvas

Canvas és una eina que permet dibuixar continguts gràfics dinàmics en una pàgina web. En lloc de carregar una imatge estàtica, Canvas permet crear formes, text i imatges personalitzades en temps real amb codi JavaScript.

Per accedir a la referència completa de l’API de Canvas consulteu l’enllaç a la documentació de Mozilla Developer Network (MDN): mzl.la/3GK3D8B. Aquesta documentació inclou una descripció detallada de totes les propietats i mètodes disponibles per a l’ús de Canvas, així com exemples de codi i il·lustracions de les diferents operacions que es poden realitzar en aquesta eina.

Canvas forma part de l’estàndard HTML5 i la seva API és accessible via DOM.

Canvas com a element HTML5 amb una API dins del model DOM facilita la creació i la integració d’interfícies web interactives i animades, ja que es pot manipular i estilitzar fàcilment a través de codi i es pot integrar sense problemes i sense referències a recursos externs en una pàgina web existent. Aquesta característica també permet als desenvolupadors web utilitzar biblioteques i frameworks de JavaScript per simplificar la seva feina.

Canvas és molt útil per a la creació d’interfícies d’usuari interactives i animades. Per exemple, es pot utilitzar per crear gràfics personalitzats, jocs senzills i animacions que responguin a les accions de l’usuari. Un dels avantatges de Canvas és que permet un gran control sobre el contingut gràfic de la pàgina. En lloc de confiar en l’estil predefinit dels elements HTML, amb Canvas es pot personalitzar tota l’experiència gràfica amb codi. Això permet una gran flexibilitat a l’hora de dissenyar l’aparença i la interacció dels elements de la pàgina.

Així com Canvas, SVG (Scalable Vector Graphics) és una eina que permet dibuixar continguts gràfics en una pàgina web. La principal diferència entre ambdues eines és que SVG és una eina basada en vectors, mentre que Canvas està basada en píxels.

La diferència més important entre aquestes dues eines és que mentre que SVG és ideal per a la creació d’imatges estàtiques i gràfics, Canvas és millor per a la creació d’animacions i continguts dinàmics. Això és perquè SVG és més lenta a l’hora de processar les actualitzacions d’estat dels seus elements, mentre que Canvas és molt ràpida.

Vegeu un exemple senzill de codi per dibuixar un cercle amb Canvas:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Canvas exemple</title>
  5. </head>
  6. <body>
  7. <canvas id="myCanvas" width="200" height="200"></canvas>
  8. <script>
  9. var canvas = document.getElementById("myCanvas");
  10. var context = canvas.getContext("2d");
  11. context.beginPath();
  12. context.arc(100, 100, 50, 0, 2 * Math.PI);
  13. context.stroke();
  14. </script>
  15. </body>
  16. </html>

En aquest exemple, es crea un cercle mitjançant la creació d’un context Canvas i l’ús de la funció arc(). Així mateix, el codi inclou la línia context.stroke(), que fa que el cercle es dibuixi al Canvas. A mesura que s’aprèn més sobre Canvas, es poden utilitzar altres funcions com fillRect() per dibuixar formes geomètriques i altres elements visuals.

Podeu veure aquest exemple a: codepen.io/iocdawm9/pen/RwYWpEB.

En conclusió, Canvas és una eina molt potent i versàtil per a la creació d’interfícies web personalitzades i animades. Amb el coneixement adequat, es poden crear animacions i gràfics sorprenents que millorin la interacció amb els usuaris i ofereixin una experiència més atractiva i satisfactòria.

Fonaments

Canvas és un element HTML5 que es pot utilitzar per a dibuixar gràfics, formes i altres elements visuals. L’element canvas es pot crear en HTML de la següent manera:

  1. <canvas id="myCanvas" width="500" height="500"></canvas>

Aquest codi crea un llenç o canvas amb una amplada de 500 píxels i una alçada de 500 píxels i li dona l’identificador “myCanvas”. Per dibuixar en el llenç, s’ha de crear un context a través del qual s’hi pugui accedir. Això es fa de la següent manera:

  1. var canvas = document.getElementById('myCanvas');
  2. var context = canvas.getContext('2d');

En aquest codi, s’obté el llenç (canvas) pel seu identificador i s’obté el context per poder dibuixar-hi. El context proporciona les funcions necessàries per a dibuixar formes, imatges i text en el llenç.

Dibuix de formes bàsiques

Un cop creat el context, es poden utilitzar diverses funcions per dibuixar formes bàsiques. Les funcions més comunes són:

  • fillRect(x, y, width, height): dibuixa un rectangle ple.
  • strokeRect(x, y, width, height): dibuixa un rectangle amb vores.
  • clearRect(x, y, width, height): elimina una àrea del canvas.
  • beginPath(): inicia un nou camí.
  • moveTo(x, y): mou el punt de dibuix a les coordenades especificades.
  • lineTo(x, y): dibuixa una línia des del punt actual fins a les coordenades especificades.
  • stroke(): dibuixa el contorn de la forma.
  • fill(): omple la forma.

Per exemple, el següent codi dibuixa un rectangle amb una línia vermella:

  1. context.beginPath();
  2. context.rect(50, 50, 100, 100);
  3. context.strokeStyle = 'red';
  4. context.stroke();

Vegeu el codi sencer de l’exemple a: codepen.io/iocdawm9/pen/NWLGpoQ.

Ús d'imatges i text en Canvas

Amb Canvas, també es poden utilitzar imatges i text. Les funcions més comunes són:

  • drawImage(image, x, y): dibuixa una imatge a les coordenades especificades.
  • fillText(text, x, y): escriu un text a les coordenades especificades.
  • strokeText(text, x, y): escriu un text amb vores a les coordenades especificades.

Per exemple, el següent codi carrega una imatge i la dibuixa al llenç (canvas):

  1. var canvas = document.getElementById("myCanvas");
  2. var ctx = canvas.getContext("2d");
  3.  
  4. var img = new Image();
  5. img.onload = function() {
  6. ctx.drawImage(img, 10, 10);
  7. };
  8. img.src = "path/to/image.jpg";

Aquest codi obté l’element canvas del DOM amb l’identificador “myCanvas” i després. el seu context 2D. A continuació, es crea una nova instància de l’objecte Image i se li assigna una funció que s’executarà quan la imatge s’hagi acabat de carregar. Aquesta funció simplement crida el mètode drawImage del context 2D del llenç, passant-li l’objecte imatge i les coordenades.

Vegeu aquest exemple a: codepen.io/iocdawm9/pen/NWLGjqW.

Per afegir text en el llenç, s’utilitza el mètode fillText del context 2D. Aquest mètode rep com a paràmetres el text a escriure, les coordenades on es vol escriure i la mida de la font. Per exemple, el següent codi escriu la paraula “Hola” en la posició (50, 50) del llenç:

  1. var canvas = document.getElementById("myCanvas");
  2. var ctx = canvas.getContext("2d");
  3.  
  4. ctx.font = "30px Arial";
  5. ctx.fillText("Hola", 50, 50);

Vegeu el codi sencer de l’exemple a: codepen.io/iocdawm9/pen/YzOyVXJ.

Estilització de formes bàsiques

Per estilitzar les formes Canvas disposa d’un seguit de mètodes que permeten canviar el color, la mida i altres propietats de les formes i els textos dibuixats en el llenç. Per exemple, per establir el color de les formes, s’utilitza la propietat fillStyle.

Vegeu un exemple de codi que dibuixa un rectangle i l’omple de color vermell:

  1. var canvas = document.getElementById("myCanvas");
  2. var ctx = canvas.getContext("2d");
  3.  
  4. ctx.fillStyle = "red";
  5. ctx.fillRect(10, 10, 50, 50);

Aquest codi obté l’element canvas i el seu context 2D. A continuació, es canvia el valor de la propietat fillStyle a “red”, que farà que totes les formes que es dibuixin siguin de color vermell. Finalment, s’utilitza el mètode fillRect per dibuixar un rectangle en la posició (10, 10) amb una amplada de 50 i una alçada de 50.

Vegeu el codi sencer a: codepen.io/iocdawm9/pen/abavWmE.

A més del fillStyle, també hi ha el mètode strokeStyle, que permet definir el color de la línia que es dibuixa al voltant de les formes.

Per canviar la mida de les formes, hi ha el mètode scale, que permet escalar les formes en les dimensions x i y. També es pot utilitzar el mètode rotate per girar les formes al seu voltant.

Altres propietats que es poden estilitzar són la font i la mida del text, que es poden canviar amb els mètodes font i fontSize, respectivament.

Vegeu un exemple de codi amb algunes d’aquestes característiques de Canvas:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Exemple Canvas</title>
  6. <style>
  7. canvas {
  8. border: 1px solid #ccc;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13. <canvas id="myCanvas" width="400" height="300"></canvas>
  14.  
  15. <script>
  16. var canvas = document.getElementById("myCanvas");
  17. var context = canvas.getContext("2d");
  18.  
  19. // Dibuixar un rectangle ple
  20. context.fillStyle = "blue";
  21. context.fillRect(50, 50, 100, 100);
  22.  
  23. // Dibuixar una línia
  24. context.strokeStyle = "red";
  25. context.lineWidth = 5;
  26. context.beginPath();
  27. context.moveTo(200, 50);
  28. context.lineTo(300, 150);
  29. context.stroke();
  30.  
  31. // Dibuixar un cercle amb gradient
  32. var gradient = context.createRadialGradient(350, 75, 10, 350, 75, 100);
  33. gradient.addColorStop(0, "yellow");
  34. gradient.addColorStop(1, "green");
  35. context.fillStyle = gradient;
  36. context.beginPath();
  37. context.arc(350, 75, 50, 0, 2*Math.PI);
  38. context.fill();
  39. </script>
  40. </body>
  41. </html>

Aquest codi dibuixa un rectangle blau, una línia vermella gruixuda i un cercle amb un gradient de color de groc a verd. També hi ha estil de línia, estil de farcit i mida de la línia establerts. Els estils es configuren utilitzant les propietats del context, i les formes es dibuixen utilitzant mètodes com fillRect(), beginPath(), moveTo(), lineTo(), stroke(), arc() i fill().

Podeu veure aquest exemple a: codepen.io/iocdawm9/pen/XWPmRMe.

Animacions i interactivitat en Canvas

Amb Canvas es poden afegir animacions i interactivitat als dibuixos. Això permet crear animacions personalitzades i interactuar amb l’usuari.

Animació de formes

Per animar formes en Canvas, es pot utilitzar el mètode requestAnimationFrame(), que actualitza el contingut del llenç a una velocitat determinada per l’ordinador de l’usuari, creant una animació suau i fluida.

Vegeu un exemple senzill de com animar un cercle en Canvas:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Exemple animació Canvas</title>
  6. <style>
  7. canvas {
  8. border: 1px solid #ccc;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13. <canvas id="myCanvas" width="400" height="300"></canvas>
  14.  
  15. <script>
  16. var canvas = document.getElementById("myCanvas");
  17. var context = canvas.getContext("2d");
  18.  
  19. var x = canvas.width / 2;
  20. var y = canvas.height / 2;
  21. var radius = 50;
  22. var startAngle = 0;
  23. var endAngle = 2 * Math.PI;
  24.  
  25. function drawCircle() {
  26. context.clearRect(0, 0, canvas.width, canvas.height);
  27. context.beginPath();
  28. context.arc(x, y, radius, startAngle, endAngle);
  29. context.fillStyle = "blue";
  30. context.fill();
  31.  
  32. x += 2;
  33. if (x > canvas.width + radius) {
  34. x = -radius;
  35. }
  36.  
  37. requestAnimationFrame(drawCircle);
  38. }
  39.  
  40. drawCircle();
  41. </script>
  42. </body>
  43. </html>

En aquest exemple, s’ha definit la funció drawCircle(), que es crida a si mateixa recursivament utilitzant requestAnimationFrame(). La funció actualitza la posició del cercle i després el dibuixa en una nova posició, eliminant el cercle anterior amb el mètode clearRect(). Això crea l’efecte d’una animació que mou el cercle de forma suau i fluida.

Podeu veure aquesta animació:

Teniu l’exemple en funcionament a: codepen.io/iocdawm9/pen/OJoymQP.

Detecció d'interaccions de l'usuari amb les formes

Per detectar interaccions de l’usuari amb les formes, es poden utilitzar esdeveniments de ratolí i de teclat. Canvas té una sèrie de mètodes que permeten obtenir la posició del ratolí dins del llenç, com ara offsetX, offsetY, clientX i clientY. Les propietats clientX i clientY indiquen la posició del punter del ratolí respecte a la vora superior esquerra de la finestra del navegador, mentre que offsetX i offsetY indiquen la posició del punter del ratolí respecte a la vora superior esquerra de l’element sobre el qual s’ha produït l’esdeveniment.

Vegeu un exemple senzill de detecció del clic de l’usuari en un cercle dibuixat en Canvas:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Exemple d'interactivitat Canvas</title>
  6. <style>
  7. canvas {
  8. border: 1px solid #ccc;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13. <canvas id="myCanvas" width="400" height="300"></canvas>
  14.  
  15. <script>
  16. var canvas = document.getElementById("myCanvas");
  17. var context = canvas.getContext("2d");
  18.  
  19. // Dibuixar cercle inicial
  20. context.beginPath();
  21. context.arc(200, 150, 50, 0, 2*Math.PI);
  22. context.fillStyle = "green";
  23. context.fill();
  24.  
  25. // Afegir esdeveniment de moviment del ratolí al canvas
  26. canvas.addEventListener("mousemove", function(event) {
  27. var x = event.clientX - canvas.offsetLeft;
  28. var y = event.clientY - canvas.offsetTop;
  29. var distance = Math.sqrt(Math.pow(x - 200, 2) + Math.pow(y - 150, 2));
  30. if (distance < 50) {
  31. context.clearRect(0, 0, canvas.width, canvas.height);
  32. context.beginPath();
  33. context.arc(200, 150, 50, 0, 2*Math.PI);
  34. context.fillStyle = "red";
  35. context.fill();
  36. } else {
  37. context.clearRect(0, 0, canvas.width, canvas.height);
  38. context.beginPath();
  39. context.arc(200, 150, 50, 0, 2*Math.PI);
  40. context.fillStyle = "green";
  41. context.fill();
  42. }
  43. });
  44. </script>
  45. </body>
  46. </html>

Aquest codi dibuixa un cercle verd inicial i afegeix un esdeveniment de moviment del ratolí al llenç. Quan el ratolí es mou dins de l’àrea del cercle, canvia el seu color a vermell. Si el ratolí es mou fora de l’àrea del cercle, torna a ser verd. La funció de l’esdeveniment “mousemove” calcula la distància entre la posició del ratolí i el centre del cercle per determinar si el ratolí és a dins o fora de l’àrea del cercle. Si és a dins, es dibuixa el cercle en vermell; si és a fora, es dibuixa en verd.

Les propietats clientX i clientY són propietats de l’objecte MouseEvent que contenen les coordenades del cursor en píxels en el moment de l’esdeveniment.

En aquest exemple, s’utilitza l’esdeveniment de moviment del ratolí al llenç (mousemove) per detectar si el cursor es mou dins del cercle dibuixat. Els valors de clientX i clientY s’utilitzen per calcular la distància entre la posició del cursor i el centre del cercle.

Per obtenir les coordenades del centre del cercle, s’ha establert el valor x com la meitat de l’amplada del canvas, i el valor y com la meitat de l’alçada del llenç. Així, el centre del cercle és (x, y) = (200, 150) en aquest cas.

A continuació, s’utilitza la fórmula de la distància euclidiana per calcular la distància entre el cursor i el centre del cercle:

  1. distance = Math.sqrt(Math.pow(x - 200, 2) + Math.pow(y - 150, 2));

Les coordenades x i y són les coordenades del cursor, i 200 i 150 són les coordenades del centre del cercle.

Si la distància calculada és menor que el radi del cercle (que és 50 en aquest cas), el cursor és a dins del cercle i queda pintat de color vermell. En cas contrari, el cursor és a fora del cercle i es pinta el cercle de color verd.

A continuació podeu veure com funciona aquest script Canvas:

Podeu veure aquest exemple a: codepen.io/iocdawm9/pen/bGxVWQw.

Resposta a les accions de l'usuari amb animacions personalitzades

Per respondre a les accions de l’usuari amb animacions personalitzades en un llenç, primer de tot cal capturar les interaccions de l’usuari amb l’aplicació, com ara clics del ratolí, moviments del ratolí, tocs a la pantalla en dispositius mòbils, etc.

Un cop capturades aquestes interaccions, podem utilitzar-les per modificar el contingut del llenç i crear animacions personalitzades. Per exemple, les dades dels moviments del ratolí es poden fer servir per modificar la posició d’una figura en temps real, o bé fer que una figura canviï de mida o de color quan l’usuari hi faci clic.

Per implementar aquesta lògica, és important utilitzar les funcions de dibuix, com ara fillRect, strokeRect, drawImage, etc., per a crear i modificar el contingut del llenç en temps real.

Un aspecte important a tenir en compte en el desenvolupament d’animacions personalitzades en un llenç és la gestió de la velocitat d’animació, per evitar que l’aplicació es torni lenta o inestable. Per això, és recomanable utilitzar funcions com requestAnimationFrame, que controla la velocitat de refresc.

Exemple de resposta a accions de l'usuari amb Canvas

Volem crear un joc on l’usuari ha de fer clic en una bola que apareix a l’atzar. Quan l’usuari clica la bola, aquesta desapareix i n’apareix una de nova en una posició aleatòria. S’ha d’animar el procés de desaparició de la bola fent que desaparegui gradualment.

En primer lloc, cal crear la bola en una posició aleatòria quan la pàgina es carrega. Això es pot fer al codi JavaScript utilitzant les funcions Math.random() i canvas.width i canvas.height per generar posicions aleatòries.

  1. var canvas = document.getElementById("myCanvas");
  2. var context = canvas.getContext("2d");
  3.  
  4. var ball = {
  5. x: Math.floor(Math.random() * canvas.width),
  6. y: Math.floor(Math.random() * canvas.height),
  7. radius: 20,
  8. color: "blue"
  9. };
  10.  
  11. function drawBall() {
  12. context.beginPath();
  13. context.arc(ball.x, ball.y, ball.radius, 0, 2 * Math.PI);
  14. context.fillStyle = ball.color;
  15. context.fill();
  16. }

A continuació, cal detectar quan l’usuari fa clic a la bola. Amb l’esdeveniment mousedown del llenç es pot detectar el clic i la funció isClicked() serveix per determinar si el clic es fa dins de la bola.

  1. function isClicked(x, y) {
  2. var distance = Math.sqrt(Math.pow(x - ball.x, 2) + Math.pow(y - ball.y, 2));
  3. return distance < ball.radius;
  4. }
  5.  
  6. canvas.addEventListener("mousedown", function(event) {
  7. var x = event.pageX - canvas.offsetLeft;
  8. var y = event.pageY - canvas.offsetTop;
  9. if (isClicked(x, y)) {
  10. ball.color = "transparent";
  11. setTimeout(function() {
  12. ball.x = Math.floor(Math.random() * canvas.width);
  13. ball.y = Math.floor(Math.random() * canvas.height);
  14. ball.color = "blue";
  15. }, 1000);
  16. }
  17. });

Cal definir la funció fadeOut(), que redueix gradualment l’opacitat de la bola fins que desapareix. Hem creat una funció anomenada animate() que fa la mateixa tasca que la funció setInterval, però en lloc d’executar el bucle cada 20 mil·lisegons, crida requestAnimationFrame per redibuixar la bola a una taxa que el navegador pugui gestionar.

Dins de la funció animate() es redueix l’opacitat de la bola i redibuixem la bola amb una opacitat menor fins que arribi a zero. A continuació, cridem requestAnimationFrame per redibuixar la bola a la següent crida de quadre. Quan l’opacitat de la bola arriba a zero, la funció animate() es deté.

Finalment, en el gestor d’esdeveniments mousedown, cridem la funció fadeOut() quan l’usuari fa clic a la bola. També programem que la bola aparegui de nou en una posició aleatòria després d’un segon de retard.

Vegeu el codi sencer resultant:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Canvas Animations</title>
  6. <style>
  7. canvas {
  8. border: 1px solid black;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13. <canvas id="myCanvas" width="400" height="400"></canvas>
  14. <script>
  15. var canvas = document.getElementById("myCanvas");
  16. var context = canvas.getContext("2d");
  17.  
  18. var ball = {
  19. x: Math.floor(Math.random() * canvas.width),
  20. y: Math.floor(Math.random() * canvas.height),
  21. radius: 20,
  22. color: "blue"
  23. };
  24.  
  25. function drawBall() {
  26. context.beginPath();
  27. context.arc(ball.x, ball.y, ball.radius, 0, 2 * Math.PI);
  28. context.fillStyle = ball.color;
  29. context.fill();
  30. }
  31.  
  32. function isClicked(x, y) {
  33. var distance = Math.sqrt(Math.pow(x - ball.x, 2) + Math.pow(y - ball.y, 2));
  34. return distance < ball.radius;
  35. }
  36.  
  37. function fadeOut() {
  38. var opacity = 1;
  39. var request = requestAnimationFrame(function animate() {
  40. opacity -= 0.1;
  41. if (opacity <= 0) {
  42. cancelAnimationFrame(request);
  43. } else {
  44. context.clearRect(0, 0, canvas.width, canvas.height);
  45. context.globalAlpha = opacity;
  46. drawBall();
  47. context.globalAlpha = 1;
  48. request = requestAnimationFrame(animate);
  49. }
  50. });
  51. }
  52.  
  53. canvas.addEventListener("mousedown", function(event) {
  54. var x = event.pageX - canvas.offsetLeft;
  55. var y = event.pageY - canvas.offsetTop;
  56. if (isClicked(x, y)) {
  57. fadeOut();
  58. setTimeout(function() {
  59. ball.x = Math.floor(Math.random() * canvas.width);
  60. ball.y = Math.floor(Math.random() * canvas.height);
  61. ball.color = "blue";
  62. drawBall();
  63. }, 1000);
  64. }
  65. });
  66.  
  67. drawBall();
  68. </script>
  69. </body>
  70. </html>

Teniu el codi a: codepen.io/iocdawm9/pen/mdGewde.

Vegeu l’animació:

Exemples pràctics de continguts interactius amb Canvas

L’ús del Canvas ofereix un ampli ventall de possibilitats per crear continguts interactius i animacions en línia. Hi ha diversos exemples pràctics sobre com utilitzar Canvas per crear jocs senzills, visualitzacions de dades i animacions complexes. A través d’aquests exemples, descobrireu algunes de les funcions i eines que ofereix aquesta tecnologia per expressar-vos visualment en línia i interactuar amb l’usuari.

Joc senzill

Crear un joc senzill en Canvas és una excel·lent manera de començar a explorar les funcionalitats d’aquesta tecnologia. Per exemple, podeu crear un joc on l’usuari ha de controlar una paleta per evitar que una bola caigui del llenç. El joc pot ser més difícil a mesura que la bola rebota a la paleta en angles diferents.

Per crear aquest joc, primer cal crear les variables necessàries. En aquest cas, es necessita una variable per representar la bola i una altra per a la paleta.

  1. var ball = {
  2. x: canvas.width/2,
  3. y: canvas.height-30,
  4. radius: 10,
  5. dx: 2,
  6. dy: -2,
  7. color: "#0095DD"
  8. };
  9.  
  10. var paddle = {
  11. height: 10,
  12. width: 75,
  13. x: (canvas.width-75)/2,
  14. y: canvas.height-10,
  15. dx: 7,
  16. color: "#0095DD"
  17. };

La variable ball representa la bola, amb les seves propietats com la posició (x, y), la velocitat (vx, vy), el radi i el color. La variable paddle representa la paleta, amb la posició (x, y), l’amplada i l’alçada, i el color.

Cal dibuixar la bola i la paleta al llenç. Això es fa a les funcions drawBall() i drawPaddle():

  1. function drawBall() {
  2. context.beginPath();
  3. context.arc(ball.x, ball.y, ball.radius, 0, Math.PI*2);
  4. context.fillStyle = ball.color;
  5. context.fill();
  6. context.closePath();
  7. }
  8.  
  9. function drawPaddle() {
  10. context.beginPath();
  11. context.rect(paddle.x, paddle.y, paddle.width, paddle.height);
  12. context.fillStyle = paddle.color;
  13. context.fill();
  14. context.closePath();
  15. }

La funció drawBall() dibuixa la bola. Comença creant un arc amb beginPath() i defineix les propietats de l’arc (posició, radi i angles) amb arc(). A continuació, especifica el color de farcit de la bola amb fillStyle i omple l’arc amb fill(). Finalment, closePath() tanca el traçat.

La funció drawPaddle() dibuixa la paleta. Comença definint un rectangle amb rect() amb les coordenades i dimensions especificades per a paddle.x, paddle.y, paddle.width i paddle.height. A continuació, especifica el color de farcit de la paleta amb fillStyle i omple el rectangle amb fill(). Finalment, closePath() tanca el traçat.

Després de dibuixar la bola i la paleta, s’ha de moure la bola i detectar les col·lisions amb la paleta. Això es fa amb la funció update().

  1. function update() {
  2. context.clearRect(0, 0, canvas.width, canvas.height);
  3. drawBall();
  4. drawPaddle();
  5.  
  6. // Detecta col·lisions amb les parets.
  7. if(ball.x + ball.dx > canvas.width-ball.radius || ball.x + ball.dx < ball.radius) {
  8. ball.dx = -ball.dx;
  9. }
  10. if(ball.y + ball.dy < ball.radius) {
  11. ball.dy = -ball.dy;
  12. // Detecta col·lisions amb la paleta.
  13. } else if(ball.y + ball.dy > canvas.height-ball.radius-paddle.height && ball.x > paddle.x && ball.x < paddle.x + paddle.width) {
  14. ball.dy = -ball.dy;
  15. }
  16. //Mou la paleta.
  17. if(rightPressed && paddle.x < canvas.width-paddle.width) {
  18. paddle.x += paddle.dx;
  19. } else if(leftPressed && paddle.x > 0) {
  20. paddle.x -= paddle.dx;
  21. }
  22. // Mou la bola.
  23. ball.x += ball.dx;
  24. ball.y += ball.dy;
  25. }

La funció update() és el bucle principal del joc, que s’encarrega de moure la bola, moure la paleta, detectar col·lisions i tornar a dibuixar tots els elements en cada iteració.

Primer, s’usa la funció clearRect() per netejar el llenç abans de tornar a dibuixar els elements. A continuació, es crida la funció drawBall() i drawPaddle() per dibuixar la bola i la paleta.

Després, es comprova si la bola ha col·lidit amb les parets del llenç. Si la bola col·lideix amb les parets verticals, s’inverteix la seva velocitat horitzontal (dx) per fer-la rebotar. Si la bola col·lideix amb la paret superior, s’inverteix la seva velocitat vertical (dy) per fer-la rebotar.

Si la bola arriba a la part inferior, es comprova si ha col·lidit amb la paleta. Si la bola col·lideix amb la paleta, s’inverteix la seva velocitat vertical (dy) per fer-la rebotar.

Després es comprova si les tecles de la dreta (rightPressed) o de l’esquerra (leftPressed) estan premudes. Si ho estan, es mou la paleta cap a la dreta o cap a l’esquerra, respectivament.

Finalment, s’actualitza la posició de la bola sumant la seva velocitat horitzontal (dx) i vertical (dy) a les seves coordenades x i y. Així, la bola es mou.

La part final de l’exemple consisteix en la crida a una funció loop(). Aquesta funció simplement crida la funció update(), que actualitza la posició de la bola i la paleta, i després crida requestAnimationFrame(loop), que realitza la següent animació en la següent refrescada del navegador.

  1. function loop(){
  2. update();
  3. requestAnimationFrame(loop);
  4. }
  5.  
  6. loop();

requestAnimationFrame és una funció que executa la funció que se li passa com a argument en el proper cicle de renderització del navegador. Això proporciona una forma més eficient i precisa d’actualitzar la pantalla en lloc de fer-ho amb un interval de temps fix, ja que el navegador s’encarrega de sincronitzar l’animació amb la taxa de refresc del monitor.

El bucle loop() es continua executant indefinidament, la funció update() actualitza constantment la posició de la bola i la paleta, i aquesta actualització es fa visible a mesura que la bola es mou i interactua amb la paleta i les parets:

Teniu el codi sencer d’aquest joc a: codepen.io/iocdawm9/pen/OJoygzg.

Visualització de dades

Crear una visualització de dades en Canvas és una aplicació molt utilitzada. És freqüent representar gràfics en una pàgina web perquè l’usuari pugui veure la informació de manera visual.

Per crear una visualització de dades primer cal decidir quin tipus de gràfic es vol representar, com ara gràfics de línies, de barres, circulars, etc.

Un exemple senzill de visualització de dades en Canvas és un gràfic de barres. Primer de tot es necessita una sèrie de dades a representar i el color i la mida de les barres.

Els passos per crear una visualització de dades de forma general són:

  • Definir el llenç: crear el llenç on es representarà el gràfic.
  • Definir les dades: definir les dades que es volen representar.
  • Definir els paràmetres del gràfic: definir els paràmetres del gràfic, com el tipus de gràfic, el color de les barres, l’amplada, l’alçada, etc.
  • Dibuixar les dades: dibuixar les dades amb les especificacions establertes.
  • Opcionalment, afegir animació o interactivitat al gràfic.

Així doncs, el procés depèn del tipus de gràfic que es vulgui crear i dels paràmetres que s’estableixin. Per crear una visualització de dades en Canvas podem utilitzar diferents formes de gràfics, com ara línies, barres o corbes.

Exemple de creació d'un gràfic de línia amb Canvas

Vegeu com dibuixar un gràfic de línies senzill a partir d’unes dades que representen una sèrie temporal.

Primer, es necessiten les dades. Per a aquest exemple, volem mostrar les temperatures mitjanes diàries durant una setmana. Les dades es guardaran en una variable anomenada data, amb el següent format:

  1. const data = [
  2. { day: "Monday", temp: 18 },
  3. { day: "Tuesday", temp: 20 },
  4. { day: "Wednesday", temp: 22 },
  5. { day: "Thursday", temp: 19 },
  6. { day: "Friday", temp: 16 },
  7. { day: "Saturday", temp: 17 },
  8. { day: "Sunday", temp: 21 }
  9. ];

A continuació, cal crear una funció anomenada drawChart, que dibuixarà el gràfic a partir de les dades. Aquesta funció rep com a paràmetres el context del llenç i les dades a representar.

  1. function drawChart(ctx, data) {
  2. // Configura l'estil de la línia.
  3. ctx.strokeStyle = "blue";
  4. ctx.lineWidth = 2;
  5.  
  6. // Dibuixa l'eix X.
  7. ctx.beginPath();
  8. ctx.moveTo(50, 200);
  9. ctx.lineTo(450, 200);
  10. ctx.stroke();
  11.  
  12. // Dibuixa l'eix Y.
  13. ctx.beginPath();
  14. ctx.moveTo(50, 50);
  15. ctx.lineTo(50, 200);
  16. ctx.stroke();
  17.  
  18. // Dibuixa els punts i la línia.
  19. ctx.beginPath();
  20. ctx.moveTo(50, 200 - data[0].temp * 5);
  21. for (let i = 1; i < data.length; i++) {
  22. const temp = data[i].temp;
  23. const x = i * 60 + 50;
  24. const y = 200 - temp * 5;
  25. ctx.lineTo(x, y);
  26. ctx.stroke();
  27. ctx.beginPath();
  28. ctx.arc(x, y, 5, 0, Math.PI * 2);
  29. ctx.fill();
  30. ctx.moveTo(x, y);
  31. }
  32. }

La funció drawChart dibuixa l’eix X i l’eix Y del gràfic, amb els seus corresponents rètols. Després dibuixa la línia de les temperatures mitjanes i els punts corresponents a cada dia.

Per acabar, només cal cridar la funció drawChart passant-li el context del llenç i les dades a representar.

  1. const canvas = document.getElementById("myCanvas");
  2. const context = canvas.getContext("2d");
  3.  
  4. drawChart(context, data);

Així es dibuixa el gràfic de línies a partir de les dades.

El resultat final ha de ser una visualització de les temperatures mitjanes durant la setmana (vegeu la figura).

Figura Gràfic de línia amb Canvas

Teniu aquest codi disponible a: codepen.io/iocdawm9/pen/zYJvzaV.

Animació complexa

Per crear una animació complexa en Canvas, es poden combinar diferents elements de les animacions senzilles. Això permet crear animacions amb moviments i transicions fluides i complexos.

En aquest exemple es crea una animació de fons estrellat. Aquesta animació consisteix en un fons negre amb un munt d’estrelles que es mouran a diferents velocitats i direccions. La idea és que sembli que viatgem a través de l’espai.

El codi per a aquest exemple és el següent:

  1. const canvas = document.getElementById("canvas");
  2. const context = canvas.getContext("2d");
  3.  
  4. // Crea estrelles.
  5. const stars = [];
  6. for (let i = 0; i < 200; i++) {
  7. const star = {
  8. x: Math.random() * canvas.width,
  9. y: Math.random() * canvas.height,
  10. size: Math.random() * 3,
  11. speed: Math.random() * 5,
  12. };
  13. stars.push(star);
  14. }
  15.  
  16. function update() {
  17. // Actualitza la posició de les estrelles.
  18. for (let i = 0; i < stars.length; i++) {
  19. const star = stars[i];
  20. star.y += star.speed;
  21.  
  22. // Reinicia l'estrella quan surt del llenç.
  23. if (star.y > canvas.height) {
  24. star.y = 0;
  25. star.x = Math.random() * canvas.width;
  26. star.speed = Math.random() * 5;
  27. }
  28. }
  29. }
  30.  
  31. function draw() {
  32. //Dibuixa un fons d'espai negre.
  33. context.fillStyle = "black";
  34. context.fillRect(0, 0, canvas.width, canvas.height);
  35. // Dibuixa estrelles.
  36. context.fillStyle = "white";
  37. for (let i = 0; i < stars.length; i++) {
  38. const star = stars[i];
  39. context.fillRect(star.x, star.y, star.size, star.size);
  40. }
  41. }
  42.  
  43. function loop() {
  44. // Actualitzar i dibuixar
  45. update();
  46. draw();
  47. // Animar
  48. requestAnimationFrame(loop);
  49. }
  50.  
  51. loop();

En aquest exemple, primer es crea un array de 200 estrelles amb posicions aleatòries al llenç, mides aleatòries i velocitats aleatòries. En la funció update s’actualitzen les posicions de les estrelles afegint la seva velocitat a la posició en l’eix y. Si una estrella surt del llenç, es reinicia amb una posició aleatòria a l’eix x, una nova velocitat i es col·loca al principi del llenç.

A la funció draw es dibuixen les estrelles amb un rectangle blanc sobre fons negre. Finalment, a la funció loop s’actualitza i es dibuixa el canvas; després cridem requestAnimationFrame per fer una animació fluida:

Podeu veure aquest exemple a: codepen.io/iocdawm9/pen/LYJpjNb.

Combinant diferents moviments i animacions, es poden crear animacions complexes en Canvas.

Anar a la pàgina anterior:
Contingut
Anar a la pàgina següent:
Índex general