Advertisement
  1. Web Design
  2. ChartJS

Erstellen Sie ein dynamisches Dashboard mit ChartJS

Scroll to top
Read Time: 16 min

() translation by (you can also view the original English article)

Heute werden wir mithilfe von ChartJS ein dynamisches Dashboard mit Live-Diagrammen erstellen. ChartJS ist eine leistungsstarke, abhängigkeitsfreie JavaScript-Bibliothek, die Diagramme über das Canvas-Element erstellt. Das Beste ist, dass Designer problemlos einsatzbereit sind. Wir konzentrieren uns auf die Teile der Bibliothek, mit denen Sie schnell schöne und funktionale Diagramme erstellen können. Wir werden von Anfang bis Ende ein mobilfreundliches Dashboard erstellen.

Suchen Sie eine schnelle Lösung?

Wenn Sie nach einer schnellen Lösung suchen, gibt es bei Envato Market eine großartige Sammlung von Diagramm- und Diagrammskripten. Ab nur wenigen Dollar können Sie diese Funktionalität schnell auf Ihre Website oder App übertragen. Hier ist einer unserer Favoriten - "Chartli" - zum Erstellen interaktiver Grafiken (die wunderschön aussehen!)


Loslegen

Wir werden unser Dashboard auf HTML5 Boilerplate aufbauen. Laden Sie die Zip-Datei herunter oder klonen Sie das Repository über Git. Wir werden unser Projektverzeichnis "chartjs_dashboard" nennen und alle Dateien direkt dort ablegen.

1
# On the command line

2
git clone git@github.com:h5bp/html5-boilerplate.git chartjs_dashboard

Als nächstes greifen wir zu ChartJS. Gehen Sie zur uminifizierten Version unter raw.github.com/nnnick/Chart.js/master/Chart.js und kopieren Sie den Inhalt in Ihre Datei js/plugins.js. Wenn Sie die nicht minimierte Version haben, werden Fehler besser lesbar, wenn Sie auf sie stoßen.

Tipp: In der Produktion würden Sie die minimierte Version des JavaScript verwenden, um das Dashboard leistungsfähiger zu machen.

Ihre Dateistruktur sollte folgendermaßen aussehen:

1
├── 404.html   
2
├── crossdomain.xml   
3
├── css   
4
│   ├── main.css   
5
│   └── normalize.css   
6
├── favicon.ico   
7
├── img   
8
├── index.html   
9
├── js   
10
│   ├── main.js   
11
│   ├── plugins.js   
12
│   └── vendor   
13
│       ├── jquery-1.10.1.min.js   
14
│       └── modernizr-2.6.2.min.js   
15
└── robots.txt

Hinweis: Einige der in H5BP enthaltenen Dateien, die wir nicht verwenden, sind nicht enthalten.


Farbpalette

Bevor wir uns mit der Codierung der Site befassen, richten wir zunächst eine Farbpalette ein, die wir im gesamten Design verwenden werden. Auf diese Weise können wir eine Art zukünftigen "Styleguide" erstellen. Dies ist eine gängige Praxis für grundsätzlich jedes Design.

Wenn Sie das Dashboard für eine bestimmte Marke erstellen, verwenden Sie zunächst die Farben der Marke. Heute werden wir zwei Hauptfarben und zwei Nebenfarben definieren. Wir werden auch Schattierungen oder ausgeblendete Versionen dieser Farben verwenden.

  • dunkelblau: #637b85
  • grün: #2c9c69
  • gelb: #dbba34
  • rot: #c62f29

Wir werden auch einen helleren dunkelblauen Farbton verwenden, #d0dde3. Zuletzt werden wir Graustufenfarben verwenden.


ChartJS-Grundlagen

ChartJS verwendet das Canvas-Element. Das Canvas-Element bietet eine Nur-JavaScript-Oberfläche zum Zeichnen von Pixeln in einen bestimmten Rechteckbereich. Es wird häufig mit SVG verglichen, das eine auf DOM-Knoten basierende Lösung zum Erstellen von Vektorgrafiken im Browser bietet. Auf das Canvas-Element gezeichnete Pixel werden jedoch nicht gespeichert und reagieren daher nicht auf JavaScript-Ereignisse.

Aber genug mit dem Tech-Talk - wie fangen wir schnell mit ChartJS an?

Glücklicherweise enthält die ChartJS-Homepage viele Beispiele, mit denen wir schnell loslegen können. Das Grundmuster besteht darin, das Canvas-Element in HTML zu erstellen, es mit JavaScript auszuwählen und das Diagramm zu erstellen, während die Daten übergeben werden, aus denen das Diagramm erstellt wurde.

1
<canvas id="something"></canvas>
2
<script>
3
var canvas = document.getElementById("something");
4
var ctx = canvas.getContext("2d");
5
new Chart(ctx).Line(data, options);
6
</script>

Im obigen Beispiel wird davon ausgegangen, dass Sie "Daten" und "Optionen" als Objekte definiert haben, und es wird ein entsprechendes Liniendiagramm erstellt.

In unserem Beispiel verwenden wir das Donut-Diagramm, das Liniendiagramm und das Radar-Diagramm. Diese Diagramme stellen verschiedene geschäftsorientierte Metriken dar, aber natürlich können Sie diese verwenden und an Ihre Bedürfnisse anpassen.

Seiten-Markup

Beginnen wir mit der Definition von grundlegendem HTML für das Layout unserer Seite.

1
<div class="wrapper">
2
<header>
3
	<div class="container clearfix">
4
        <h1>Overview <span>July 8-12, 2013</span><a class="button">Change Date Range</a></h1>
5
    </div>
6
</header>
7
<div class="container clearfix">
8
    <div class="third widget doughnut">
9
        <h3>Breakdown of Hours</h3>
10
        <div class="canvas-container">
11
            <canvas id="hours"></canvas>
12
        </div>
13
    </div>
14
    <div class="third widget line">
15
        <div class="chart-legend">
16
            <h3>Shipments per Day</h3>
17
        </div>
18
        <div class="canvas-container">
19
            <canvas id="shipments"></canvas>
20
        </div>
21
    </div>
22
    <div class="third widget">
23
        <div class="chart-legend">
24
            <h3>Customer Service Assessment</h3>
25
        </div>
26
        <div class="canvas-container">
27
            <canvas id="departments"></canvas>
28
        </div>
29
    </div>
30
</div>
31
<div class="push"></div>
32
</div>
33
<footer>
34
</footer>

Hier können wir sehen, dass wir einen grundlegenden Kopf-, Mittel- und Fußzeilenabschnitt haben. Wir verwenden die Klassen .wrapper und .push, um eine klebrige Fußzeile zu erstellen (weitere Informationen finden Sie hier). Wir werden unser Layout so gestalten, dass es zuerst mobilfreundlich ist und von dort aus skaliert werden kann. Es gibt ein paar Tricks, die wir auf dem Weg ziehen werden, aber diese Struktur wird einen Großteil der Arbeit für uns erledigen.


Bevor wir zu weit gehen...

Beachten Sie, dass Canvas bei Medienabfragen nicht besonders gut funktioniert. In diesem Tutorial erstellen wir eine Problemumgehung, damit die Diagramme in JavaScript in verschiedenen Größen neu gezeichnet werden können.

In unserer Datei main.js benötigen wir eine Größenfunktion, die durch eine Größenänderung des Fensters ausgelöst wird. Wir benötigen auch eine "redraw"-Funktion, um nach dem Auslösen der Größenänderungsfunktion ausgelöst zu werden. Wenn wir die Diagramme neu zeichnen, möchten wir nicht, dass sie animiert werden, als ob dies das erste Mal ist, dass sie gezeichnet werden.

1
(function(){
2
// set up the timeout variable

3
var t;
4
// setup the sizing function,

5
// with an argument that tells the chart to animate or not

6
function size(animate){
7
    // If we are resizing, we don't want the charts drawing on every resize event.

8
    // This clears the timeout so that we only run the sizing function

9
    // when we are done resizing the window

10
    clearTimeout(t);
11
    // This will reset the timeout right after clearing it.

12
    t = setTimeout(function(){
13
        $("canvas").each(function(i,el){
14
            // Set the canvas element's height and width to it's parent's height and width.

15
            // The parent element is the div.canvas-container

16
            $(el).attr({
17
                "width":$(el).parent().width(),
18
                "height":$(el).parent().outerHeight()
19
            });
20
        });
21
        // kickoff the redraw function, which builds all of the charts.

22
        redraw(animate);
23
24
        // loop through the widgets and find the tallest one, and set all of them to that height.

25
        var m = 0;
26
        // we have to remove any inline height setting first so that we get the automatic height.

27
        $(".widget").height("");
28
        $(".widget").each(function(i,el){ m = Math.max(m,$(el).height()); });
29
        $(".widget").height(m);
30
31
    }, 100); // the timeout should run after 100 milliseconds

32
}
33
$(window).on('resize', size);
34
function redraw(animation){
35
    var options = {};
36
    if (!animation){
37
        options.animation = false;
38
    } else {
39
        options.animation = true;
40
    }
41
    // ....

42
        // the rest of our chart drawing will happen here

43
    // ....

44
}
45
size(); // this kicks off the first drawing; note that the first call to size will animate the charts in.

Wenn dies ein wenig entmutigend erscheint, machen Sie sich keine Sorgen! Stellen Sie eine Frage in den Kommentaren, und wir und die Tuts+ Community werden Ihnen helfen, alles zu verstehen!


Einige CSS für den Einstieg

Wir möchten einige grundlegende CSS-Strukturen einrichten, um uns den Einstieg zu erleichtern. HTML5 Boilerplate enthält natürlich Normalisierung und einige andere Standardeinstellungen, die Sie ändern können, aber für das Tutorial schreiben wir unser CSS nach der Zeile "Benutzerdefinierte Stile des Autors".

1
html, body {
2
    height: 100%;
3
}
4
body {
5
    font-family: 'Source Sans Pro', sans-serif;
6
    color: #666;
7
}
8
/* button */
9
.button {
10
    cursor: pointer;
11
    text-decoration: none;
12
    font-size: 0.6em;
13
    font-weight: 400;
14
    text-transform: uppercase;
15
    display: inline-block;
16
    padding: 4px 6px;
17
    margin: 0 10px;
18
    position: relative;
19
    background: #ccc;
20
    color: #fff;
21
    box-shadow: 0 0 2px rgba(0,0,0,0.1);
22
    background: rgb(190,190,190); /* Old browsers */
23
    background: -moz-linear-gradient(top, rgba(190,190,190,1) 0%, rgba(170,170,170,1) 100%); /* FF3.6+ */
24
    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(190,190,190,1)), color-stop(100%,rgba(170,170,170,1))); /* Chrome,Safari4+ */
25
    background: -webkit-linear-gradient(top, rgba(190,190,190,1) 0%,rgba(170,170,170,1) 100%); /* Chrome10+,Safari5.1+ */
26
    background: -o-linear-gradient(top, rgba(190,190,190,1) 0%,rgba(170,170,170,1) 100%); /* Opera 11.10+ */
27
    background: -ms-linear-gradient(top, rgba(190,190,190,1) 0%,rgba(170,170,170,1) 100%); /* IE10+ */
28
    background: linear-gradient(to bottom, rgba(190,190,190,1) 0%,rgba(170,170,170,1) 100%); /* W3C */
29
    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#bebebe', endColorstr='#aaaaaa',GradientType=0 ); /* IE6-9 */
30
}
31
.button:hover {
32
    background: #637b85;
33
}
34
/* Header styles */
35
header {
36
    text-align: center;
37
    background: #637b85;
38
    color: #fff;
39
    margin-bottom: 40px;
40
}
41
header span {
42
    font-weight: 200;
43
}
44
header .button {
45
    font-size: 0.2em;
46
    top: -6px;
47
}
48
49
/* various containers */
50
.container {
51
    width: 200px;
52
    margin: 0 auto;
53
}
54
.canvas-container {
55
    min-height: 300px;
56
    max-height: 600px;
57
    position: relative;
58
}
59
.widget {
60
    position: relative;
61
    margin-bottom: 80px;
62
    background: #efefef;
63
    padding: 12px;
64
    margin-bottom: 30px;
65
    -webkit-box-sizing: border-box;
66
    -moz-box-sizing: border-box;
67
    box-sizing: border-box;
68
}

Hier definieren wir das erforderliche CSS für die Sticky-Fußzeile sowie eine Schaltflächenklasse, eine selbstzentrierende Containerklasse, eine Klasse zum Enthalten unserer Canvas-Elemente in unseren Widgets und unsere Widgets selbst. Wir müssen auch die Google-Schriftart hinzufügen, die wir für den Körper definieren, indem wir diese in unser Head-Tag aufnehmen.

1
<link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro:200,400,700' rel='stylesheet' type='text/css'>

Das Donut-Diagramm

Donut-Diagramme sind Kreisdiagrammen sehr ähnlich, außer dass sie einen Teil des mittleren Ausschnitts haben. Standardmäßig definiert ChartJS, dass 50% der Fläche des Diagramms weggelassen werden sollen. Wir werden bei dieser Standardeinstellung bleiben. Der Code zum Erstellen des Donut-Diagramms ist unten dargestellt.

1
var data = [
2
    {
3
        value: 20,
4
        color:"#637b85"
5
    },
6
    {
7
        value : 30,
8
        color : "#2c9c69"
9
    },
10
    {
11
        value : 40,
12
        color : "#dbba34"
13
    },
14
    {
15
        value : 10,
16
        color : "#c62f29"
17
    }
18
19
];
20
var canvas = document.getElementById("hours");
21
var ctx = canvas.getContext("2d");
22
new Chart(ctx).Doughnut(data);

Hier sehen Sie, dass wir die Daten und Farben unseres Donut-Diagramms definiert haben. Dies ist alles, was benötigt wird, damit das Donut-Diagramm funktioniert. Was repräsentieren die einzelnen Abschnitte? Leider hat ChartJS noch keine einfache Möglichkeit, Beschriftungen für das Donut-Diagramm zu definieren. Wir können jedoch eine eigene Legende erstellen, um die verschiedenen Abschnitte zu beschreiben. Ändern Sie das HTML des Donut-Widgets so, dass es Folgendes enthält.

1
<div class="third widget doughnut">
2
    <h3>Breakdown of Hours</h3>
3
    <p><a href="" class="button">Filter By Employee</a></p>
4
    <div class="canvas-container">
5
        <canvas id="hours"></canvas>
6
        <span class="status"></span>
7
    </div>
8
    <div class="chart-legend">
9
        <ul>
10
            <li class="ship">Shipping &amp; Receiving</li>
11
            <li class="rework">Rework</li>
12
            <li class="admin">Administrative</li>
13
            <li class="prod">Production</li>
14
        </ul>
15
    </div>
16
</div>

Wir verwenden diese Li's von ihren Klassen sehr einfach im CSS, indem wir die Pseudoklasse `:before` nutzen.

1
.chart-legend ul {
2
    list-style: none;
3
    width: 100%;
4
    margin: 30px auto 0;
5
}
6
.chart-legend li {
7
    text-indent: 16px;
8
    line-height: 24px;
9
    position: relative;
10
    font-weight: 200;
11
    display: block;
12
    float: left;
13
    width: 50%;
14
    font-size: 0.8em;
15
}
16
.chart-legend  li:before {
17
    display: block;
18
    width: 10px;
19
    height: 16px;
20
    position: absolute;
21
    left: 0;
22
    top: 3px;
23
    content: "";
24
}
25
.ship:before { background-color: #637b85; }
26
.rework:before { background-color: #2c9c69; }
27
.admin:before { background-color: #dbba34; }
28
.prod:before { background-color: #c62f29; }

Als nächstes wollen wir einen schönen "thumbs-up" in der Mitte des Donuts haben. Dies beinhaltet einige CSS-Tricks, einschließlich einer Version von Onkel Daves Ol' Padded Box, damit der Kreis reagiert. Wir werden die Spanne mit der Klasse .status verwenden, um diesen Kreis zu erreichen. Fügen Sie main.css die folgenden Regeln hinzu:

1
.widget.doughnut .status {
2
    display: block;
3
    position: absolute;
4
    top: 50%;
5
    left: 50%;
6
    width: 30%;
7
    height: 0;
8
    padding-top: 12%;
9
    padding-bottom: 18%;
10
    color: #444;
11
    margin-top: -15%;
12
    margin-left: -15%;
13
    font-size: 1.4em;
14
    font-weight: 700;
15
    text-align: center;
16
    border-radius: 50%;
17
    background-color: #aaa;
18
    background-image: url(data:image/png;base64,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);
19
    background-repeat: no-repeat;
20
    background-size: 30%;
21
    background-position: center;
22
}

Das vielleicht auffälligste Element, das hier auffällt, ist die Verwendung des Daten-URI für das Hintergrundbild. Dies ermöglicht es uns, eine zusätzliche HTTP-Anfrage zu vermeiden und ist syntaktisch gleichbedeutend mit der Verwendung einer tatsächlichen http-URL. Wir setzen dieses Element auch so, dass es absolut innerhalb seines .widget-Elements positioniert ist, das wir zuvor als positionsrelativ festgelegt haben.

Lassen Sie uns nun die Widget-Typografie einrichten. Wir verwenden nur h3- und p-Elemente im Widget. hier ist das begleitende css.

1
.widget p {
2
    margin-top: 0;
3
    text-align: center;
4
}
5
.widget h3 {
6
    margin: -12px 0 12px -12px;
7
    padding: 12px;
8
    width: 100%;
9
    text-align: center;
10
    color: #627b86;
11
    line-height: 2em;
12
    background: #d0dde3;
13
}

Die Rand- und Auffüllregeln für das h3-Element ermöglichen es dem Element, sich bis zum Rand des Widget-Elements über den 12-Pixel-Abstand des Widgets zu erstrecken. Wir setzen auch den oberen Rand des p-Elements auf 0, um näher an die Kopfzeile des Widgets zu passen.


Das Liniendiagramm

Eine der nützlichsten Funktionen von ChartJS ist, dass einige der Diagramme mehrere Datensätze zulassen. Diese Datensätze werden nacheinander in dasselbe Diagramm gezeichnet, sodass ein Datensatz mit einem anderen verglichen werden kann. Ein perfektes Beispiel dafür sind Liniendiagramme. Wir werden zwei Datensätze verwenden, um diese Funktionalität zu untersuchen.

1
var data = {
2
    labels : ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],
3
    datasets : [
4
        {
5
            fillColor : "rgba(99,123,133,0.4)",
6
            strokeColor : "rgba(220,220,220,1)",
7
            pointColor : "rgba(220,220,220,1)",
8
            pointStrokeColor : "#fff",
9
            data : [65,54,30,81,56,55,40]
10
        },
11
        {
12
            fillColor : "rgba(219,186,52,0.4)",
13
            strokeColor : "rgba(220,220,220,1)",
14
            pointColor : "rgba(220,220,220,1)",
15
            pointStrokeColor : "#fff",
16
            data : [20,60,42,58,31,21,50]
17
        },
18
    ]
19
}
20
var canvas = document.getElementById("shipments");
21
var ctx = canvas.getContext("2d");
22
new Chart(ctx).Line(data, options);

Ein paar Dinge, die in diesem neuen Code zu beachten sind: Zuerst verwenden wir die Variablen wieder, die wir zum Erstellen des Donut-Diagramms verwendet haben. Dies ist in JavaScript vollständig gültig und reduziert den vom Skript insgesamt verwendeten Speicher geringfügig. Dies kann jedoch in Zukunft zu Verwirrung führen. Wenn Sie diesen Code für die Verwendung in der Produktion anpassen möchten, ist es möglicherweise effektiver, für jedes neu erstellte Diagramm neue Variablen zu verwenden.

Als nächstes unterstützt das Liniendiagramm Beschriftungen. Dies ist wichtig, da wir so vermeiden können, HTML-basierte Legenden zu erstellen. Es ist jedoch auch wichtig, dass die Datenpunkte mit den angegebenen Beschriftungen übereinstimmen. In diesem Beispiel stimmt unser erster Datenpunkt im ersten Datensatz, 65, mit "Mon" in den Beschriftungen überein.

Schließlich sind unsere fillColors für diese Datensätze RGBa-Versionen der zuvor definierten Farben (dunkelblau und gelb). Wir haben die RGB-Werte durch Eingabe der Farben in den Farbwähler von Photoshop ermittelt. Dies kann jedoch mit einer Reihe von Farbauswahlwerkzeugen erfolgen.

Wir werden auch Markups für einige Schaltflächen und einen für Menschen lesbaren Bereich hinzufügen. Das HTML für die letzte Zeile sieht wie folgt aus.

1
<div class="third widget line">
2
    <div class="chart-legend">
3
        <h3>Shipments per Day</h3>
4
        <p><span>This Week</span> &mdash; <strong>Last Week</strong></p>
5
        <p><a href="" class="button">Change Date Range</a><a href="" class="button">Filter by Location</a></p>
6
    </div>
7
    <div class="canvas-container">
8
        <canvas id="shipments"></canvas>
9
    </div>
10
</div>

Wir können den zusätzlichen HTML-Code verbessern und den Benutzern helfen, die Daten mit dem folgenden CSS zu verbinden:

1
.widget.line p span {
2
    color: #dbba34;
3
}
4
.widget.line p strong {
5
    color: #637b85;
6
    font-weight: 400;
7
}

Radardiagramm

Radardiagramme sind nützlich, um eine Auswahl von Variablen in ein einzeln lesbares Diagramm zu destillieren, um eine allgemeine Wahrnehmung des Zusammenspiels zwischen den verschiedenen Variablen zu erhalten. In unserem Beispiel untersuchen wir beispielsweise die Idee des Kundendienstes anhand der Häufigkeit, mit der bestimmte Schlüsselwörter erwähnt werden. In einem Radardiagramm bilden die gezeichneten Punkte eine Form. Diese Form kann uns ein allgemeines Gefühl für die Effektivität des Kundenservice geben.

Mal sehen, wie das entsteht! Wir werden unsere Variablen noch einmal von früher wiederverwenden.

1
var data = {
2
    labels : ["Helpful","Friendly","Kind","Rude","Slow","Frustrating"],
3
    datasets : [
4
        {
5
            fillColor : "rgba(220,220,220,0.5)",
6
            strokeColor : "#637b85",
7
            pointColor : "#dbba34",
8
            pointStrokeColor : "#637b85",
9
            data : [65,59,90,81,30,56]
10
        }
11
    ]
12
}
13
var canvas = document.getElementById("departments");
14
var ctx = canvas.getContext("2d");
15
new Chart(ctx).Radar(data, options);

Der zugehörige HTML-Code sieht folgendermaßen aus:

1
<div class="third widget">
2
    <div class="chart-legend">
3
        <h3>Customer Service Assessment</h3>
4
        <p>based on words mentioned</p>
5
        <p><a href="" class="button">Track another word</a></p>
6
    </div>
7
    <div class="canvas-container">
8
        <canvas id="departments"></canvas>
9
    </div>
10
</div>

Intuitiv können wir verstehen, dass eine Form, die weiter oben und rechts ist, besser ist als eine Form, die weiter unten und links ist. Wir verlieren jedoch nicht die spezifischen Daten, die uns innerhalb des Diagramms auf einer granularen Ebene mit einer einzelnen Variablen zur Verfügung stehen. In diesem Fall wird das Wort "unhöflich" häufig erwähnt, aber der allgemeine Sinn für Kundenservice scheint aufgrund anderer Schlüsselwörter positiv zu sein.


Alles reaktionsschnell machen

Wir haben unsere Canvas-Elemente bereits so eingerichtet, dass sie mit dem JavaScript reagieren, mit dem wir auf die Größenänderung von Fenstern reagiert haben. Jetzt müssen wir unser CSS mithilfe von Medienabfragen reaktionsfähig machen. Hier ist das CSS, mit dem wir dies tun werden.

1
@media only screen and (min-width:300px){
2
    .container {
3
        width: 300px;
4
        margin: 0 auto;
5
    }
6
}
7
8
@media only screen and (min-width:600px){
9
    .container {
10
        width: 580px;
11
        margin: 0 auto;
12
    }
13
    .third {
14
        float: left;
15
        width: 47.5%;
16
        margin-left: 5%;
17
    }
18
    .third:first-child {
19
        margin-left: 0;
20
    }
21
    .third:last-child {
22
        display: block;
23
        width: 100%;
24
        margin-left: 0;
25
    }
26
}
27
28
@media only screen and (min-width:960px){
29
    .container {
30
        width: 940px;
31
    }
32
    .third {
33
        float: left;
34
        width: 30%;
35
        margin-left: 2.5%;
36
        margin-right: 2.5%;
37
    }
38
    .third:first-child {
39
        margin-left: 0;
40
    }
41
    .third:last-child {
42
        margin-right: 0;
43
        margin-left: 2.5%;
44
        width: 30%;
45
    }
46
}
47
@media only screen and (min-width:1140px){
48
    .container {
49
        width: 1120px;
50
    }
51
}
52
@media only screen and (min-width:1360px){
53
    .container {
54
        width: 1300px;
55
    }
56
}

Das Erste, was Sie an diesem CSS bemerken sollten, ist, dass alle Medienabfragen nur auf der Mindestbreite basieren. Dies bedeutet, dass wir von den Bildschirmen mit der geringsten Breite aus entwerfen und neue Regeln hinzufügen, wenn wir nach oben gehen. Unser Design erfordert nicht viele Änderungen an jedem Haltepunkt, aber dieses Muster ist eine bewährte Methode für Designs aller Maßstäbe.

chartjs-smallchartjs-smallchartjs-small
chartjs-midchartjs-midchartjs-mid
chartjs-largechartjs-largechartjs-large

Wir können einige grundlegende Layoutänderungen an jedem Haltepunkt sehen, einschließlich der Breite des primären Containerelements sowie unserer Behandlung der .third Klasse, die wir für jedes der Widgets verwenden. Unter 400 stapeln wir alle Widgets übereinander. Zwischen 400 und 600 machen wir die ersten beiden Spalten mit half-width und das dritte Widget (das Radardiagramm) mit full-width. Schließlich verwenden wir über 960 drei Spalten inline.


Abschluss

Dieses Tutorial führt Sie durch die grundlegenden Schritte zum Erstellen eines Dashboards mit ChartJS. Die hier beschriebenen grundlegenden Konzepte sollen Ihnen helfen, mit ChartJS komplexere Projekte zu erstellen, und Sie dazu ermutigen, über Responsive Design aus der Perspektive von Bottom-up nachzudenken.

Welche Erfahrungen haben Sie mit Diagrammbibliotheken gemacht? Verwenden Sie SVG oder Canvas zum Zeichnen von Daten? Was wünscht du dir, würde ChartJS tun, was es nicht tut? Fügen Sie Ihre Kommentare unten hinzu!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.