Das erste scheint mir einfacher zu sein. Hast Du es damit versucht?
Beiträge von Sempervivum
-
-
Das ist kein Problem: Für jeden Kreis definierst Du ein Display-Canvas mit jeweils einer anderen ID und die Funktionen rufst Du mehrmals, jeweils mit der richtigen ID auf. Würde dann so aussehen:
https://jsfiddle.net/Sempervivum/u4x71bvr/2/Wenn alle Kreise gleich aussehen sollen und die selben Maximalwerte haben, kannst Du auch eine Klasse vergeben und die Initialisierung darauf machen.
-
Hast Du es mit dem Timer genau so gemacht wie bei Stackoverflow beschrieben? Poste doch mal den Code.
-
Schau mal ob dies dir weiter hilft:
https://stackoverflow.com/questions/3196…brary-is-loadedDemnach wird Angular asynchron geladen.
-
Ich denke, Angular baut auf jQuery auf. Ändere mal die Reihenfolge:
// @require https://code.jquery.com/jquery-2.1.3.min.js
// @require https://cdn.rawgit.com/brinley…er/libs/jSignature.min.js
// @require https://cdnjs.cloudflare.com/a…r.js/1.4.2/angular.min.js
-
Nein, so wie Du es beschreibst, funktioniert es leider nicht, weil die Kreise keine HTML-Elemente sondern Layers von jCanvas sind.
Ich habe mal etwas ausgearbeitet, was deinen Wunsch erfüllen sollte:
HTML
Alles anzeigen<!doctype html> <html> <head> <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"> <script src="//code.jquery.com/jquery-1.10.2.js"></script> <script src="//code.jquery.com/ui/1.12.1/jquery-ui.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/jcanvas/20.1.2/jcanvas.js"></script> </head> <body> <canvas id="display" class="circlecountdown" width="220" height="220"></canvas> <input id="val" /> <script> // hier wird ein Eventlistener für das input-Feld // mit der ID "val" (Zeile 12) registriert // staende dieses Skript im Head, wäre dieses input-Feld noch nicht definiert $("#val").on("change", function () { updateCircleDisplay("#display", this.value); }); function getColor(value, opts) { if (opts.threshold) { if (value < opts.threshold) return opts.colorCircle; else return opts.colorAbove; } else { return opts.colorCircle; } } function updateCircleDisplay(selector, value) { $(selector).each(function (idx, ele) { var canv = $(this); var max = canv.data("max"); var deg = value / max * 360; canv.setLayer('text', { text: canv.data("opts").templateText.replace("{value}", value), }).stopLayer('circle') .animateLayer('circle', { end: deg, strokeStyle: getColor(value, canv.data("opts")) }, { duration: 1000, easing: 'linear', step: function (now, fx, layer) { console.log(now, fx); } }); }); } function createCircleDisplay(selector, value, max, options) { var opts = { radius: 100, colorCircle: "blue", strokeWidthCircle: 20, colorBgCircle: "lightgrey", strokeWidthBgCircle: 20, colorText: "orange", templateText: "{value} $", threshold: 50, colorAbove: 'green' } $.extend(opts, options); // hier wird auf das Canvas-Element mit der ID "display" (Zeile 10) zugegriffen // siehe Aufruf der Funktion in Zeile 94 // staende dieses Skript im Head, waere dieses Element noch nicht definiert $(selector).each(function (idx, ele) { var canv = $(this); canv.data("opts", opts); canv.data("max", max) var deg = value / max * 360; var colorCircle = getColor(value, opts); var size = 2 * opts.radius + opts.strokeWidthCircle; var pos = opts.radius + opts.strokeWidthCircle / 2; canv.attr("width", size); canv.attr("height", size); canv.drawArc({ layer: true, name: 'circle2', strokeStyle: opts.colorBgCircle, strokeWidth: opts.strokeWidthBgCircle, x: pos, y: pos, radius: opts.radius, // start and end angles in degrees start: 0, end: 360 }); canv.drawArc({ layer: true, name: 'circle', strokeStyle: colorCircle, strokeWidth: opts.strokeWidthCircle, rounded: true, x: pos, y: pos, radius: opts.radius, // start and end angles in degrees start: 0, end: deg }); canv.drawText({ layer: true, name: 'text', fillStyle: opts.colorText, strokeWidth: 4, x: pos, y: pos, fontSize: 40, fontFamily: 'Arial', text: opts.templateText.replace("{value}", value) }); }); } createCircleDisplay('#display', 80, 100, { threshold: 60, colorCircle: 'red', colorAbove: 'green' }); </script> </body> </html>Eine coole Erweiterung wäre jetzt noch, wenn der Text nicht springt sondern während der Animation herauf- bzw. herunter gezählt würde :-;
-
Da haben wir ja einen gemeinsamen Hintergrund. Ich habe auch mit Assembler angefangen und mich mit Leiterplatten beschäftigt. Ist aber lange her ...
-
Hallo Basti, gut gemacht! Bei der Ermittlung der Koordinaten getAbsoluteX und getAbsoluteY hättest Du vorteilhaft nur eine Funktion verwenden und x und y in einem Objekt zurück geben können, wie wir es in anderem Zusammenhang mal besprochen hatten.
Hallo Yamah, dann poste noch Mal den neuen Code und das CSS, das dort eingebunden wird.
-
Ich habe die Developertools von meinem Browser Opera verwendet, da ist ein Debugger eingeschlossen. Gibt es bei jedem gängigen Browser.
-
Bei diesem:
HTML
Alles anzeigen<html> <link href="MyGame.css" type="text/css" rel="stylesheet"> <head> <title> MyAnimation </title> <body> <center> <font face="arial" color="White" size="7"> Black'n <font face="arial" color="Black" size="7"> White </font> </center> <style> </style> <script> </script> </body> </head> </link> </html>ist die Struktur völlig daneben:
Kein Doctype, </link> überflüssig, <link> gehört in den Head, schließendes </head> fehlt, <center> veraltet.
So wäre die Struktur richtig:
HTML
Alles anzeigen<doctype html> <html> <head> <title> MyAnimation </title> <link href="MyGame.css" type="text/css" rel="stylesheet"> </head> <body> <font face="arial" color="White" size="7"> Black'n <font face="arial" color="Black" size="7"> White </font> <style> </style> <script> </script> </body> </html> -
Der Debugger bringt es an den Tag: Die Reihenfolge stimmt nicht: Der Code für die Validierung wird ausgeführt bevor die Combobox erzeugt wird. Lösung, indem Du beide Codes in je einer Funktion unter bringst und diese in der richtigen Reihenfolgen aufrufst.
-
Zitat
Alleine funktioniert das Script, bei mir jedoch nicht.
Wie meinst Du das? Ja, es funktioniert einwandfrei. Funktioniert es bei dir nicht, wenn Du es in eine andere Seite einbettest? Dann poste die URL dieser Seite, damit man den Fehler finden kann.
-
Hallo und willkommen im Forum,
bei deiner Testseite steige ich leider nicht durch.
Zitatden validator konnte ich leider so nicht mit einbinden, daher gibt es als Datei einzeln dazu.
Eine solche Datei kann ich nicht finden. Hast Du statt dessen das JS des Validators inline in die HTML-Datei kopiert?
-
Zitat
Dann habe ich im Internet ein paar standart Scripts in den Editor kopiert, was auch nicht klappte.
Man findet allerdings einige Skripts, die so etwas realisieren. Suche noch einmal eines aus, von dem Du glaubst, dass es passt und poste den Code wenn es nicht funktioniert.
Wenn Du nur einen Kreis bewegen willst, reicht es aus, wenn Du eine Lösung mit HTML, CSS und Javascript nimmst. Soll das Spiel später etwas ausgefeilter werden, solltest Du überlegen, ob Du gleich mit Canvas oder SVG anfängst, jeweils mit einer Bibliothek wie z. B. jCanvas oder d3.js für SVG.
-
Was das 10x10-div betrifft, zwei Empfehlungen:
1. Vergiss document.write, nicht nur, weil es in Userscript nicht geht, sondern weil das Ergebnis auch sonst schwer zu durchschauen ist.
2. Verwende absolute Positionierung nur, wenn es unbedingt nötig ist, z. B. weil Du Elemente übereinander anordnen willst, wie bei der Animation. Häufig schafft sie mehr Probleme als sie löst.
Versuche dies:
Code
Alles anzeigen<script> var ff = document.createElement("div"); ff.id = 'ff'; document.getElementsByTagName('body')[0].appendChild(ff); var nrcols = 10, nrrows = 10; for (var i = 0; i < nrrows; i++) { var row = document.createElement("div"); ff.appendChild(row); for (var j = 0; j < nrcols; j++) { var box = document.createElement("div"); box.className = "gridbox"; row.appendChild(box); } } </script> <style> .gridbox { width: 20px; height: 20px; display: inline-block; vertical-align: top; } #ff div:nth-child(odd) .gridbox:nth-child(odd) { background-color: blue; } #ff div:nth-child(odd) .gridbox:nth-child(even) { background-color: lightgray; } #ff div:nth-child(even) .gridbox:nth-child(even) { background-color: blue; } #ff div:nth-child(even) .gridbox:nth-child(odd) { background-color: lightgray; } </style>Das Wechselmuster habe ich mal mit CSS gemacht. In diesem Fall könnte man es auch erzeugen, indem man mit dem Skript verschiedene Klassen für odd und even anlegt.
-
Zitat
einmal bild wo mal ein bild rein soll und bildunten wo animierter kram rein kommt
Verstehe, Du brauchst ein zusätzliches Bild, dann ist es natürlich OK. Hat dann aber nichts mit der Animation zu tun. Die spielt sich mit #bildunten und#bildinner ab.
-
Sorry, ich habe das Erzeugen von #bildinner vergessen. So muss es aussehen:
Codevar bild = document.createElement("div"); bild.id ="bild" document.getElementsByTagName('body')[0].appendChild(bild); var bildunten = document.createElement("div"); bildunten.id ="bildunten"; document.getElementsByTagName('body')[0].appendChild(bildunten)); var bildinner = document.createElement("div"); // dies hatte ich vergessen bildinner.id ="bildinner"; bildunten.appendChild(bildinner);d. h. #bildinner muss innerhalb von #bildunten geschachtelt sein.
-
Nicht ganz, Du musst dieses:
Zitatdurch dieses ersetzen:
Codevar bild = document.createElement("div"); bild.id ="bild" document.getElementsByTagName('body')[0].appendChild(bild); var bildunten = document.createElement("div"); bildunten.id ="bildunten"; document.getElementsByTagName('body')[0].appendChild(bildunten) bildinner.id ="bildinner"; bildunten.appendChild(bildinner);und dann das:
CodeaddGlobalStyle('#bildinner { position: absolute; width: 200%; height: 200%; top: -50%; left: -50%; z-index: -1; background: url('+urlbild+') 0 0 no-repeat;animation: rot '+tempo+'.'+tempoplus+'s linear infinite;} ');Kein Ahnung, wofür Du #bild brauchst.
-
Glaube nicht, dass es daran liegt, dass es ein Userskript ist. Poste doch mal deinen neuen Code oder aktualisiere ihn dort bei greasyfork.
-
Beim Fiddle funktionieren die Eventlistener nicht, wenn man sie inline notiert, da die Funktionen nicht global sind, sondern im Scope von body.onload liegen.