<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.stephanschlegel.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=84.157.18.194</id>
	<title>Wikizone - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.stephanschlegel.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=84.157.18.194"/>
	<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Spezial:Beitr%C3%A4ge/84.157.18.194"/>
	<updated>2026-05-06T14:37:13Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Animation_im_Web&amp;diff=25194</id>
		<title>Animation im Web</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Animation_im_Web&amp;diff=25194"/>
		<updated>2021-01-17T10:40:14Z</updated>

		<summary type="html">&lt;p&gt;84.157.18.194: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quickstart ==&lt;br /&gt;
In früheren Zeiten war die Standardantwort für &amp;quot;bewegte&amp;quot; Webseiten ganz einfach Flash. Heutzutage gibt es viele Lösungen um Animationen auf eine Webseite zu bringen. Dieser Artikel soll eine kleine Übersicht bringen.&lt;br /&gt;
&lt;br /&gt;
Stichworte: Anime.js, GSAP, CSS Transform, CSS Keyframes, Snap, Waypoints, Lottie, ScrollMagic&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 Siehe auch in den Sections&lt;br /&gt;
 [[Scroll-Snap]]&lt;br /&gt;
 [[Anime.js]]&lt;br /&gt;
 http://imakewebthings.com/waypoints/guides/getting-started/&lt;br /&gt;
&lt;br /&gt;
== Überblick ==&lt;br /&gt;
=== GSAP &amp;amp; ScrollMagic ===&lt;br /&gt;
 [[GSAP]]&lt;br /&gt;
Gehört zu den Standardlösungen. GSAP - Greensock Animation Plattform bietet JavaScript Tools für Timeline-basierte Animationen. Ergänzend kann ScrollMagic die Steuerung der Timelines basierend auf der Skrollposition der Webseite steuern.&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* Alle DOM Elemente können animiert werden. Nicht nur in der Bewegung sondern auch in der Farbe, Sichtbarkeit...&lt;br /&gt;
* Gute Performance&lt;br /&gt;
* Mit ScrollMagic einfaches Steuern beim Scrolling inklusive einfaches Pinning (fixieren während der Animation)&lt;br /&gt;
Nachteil: &lt;br /&gt;
* Skriptlastig, wobei es nicht so komplex ist wie bei anderen Lösungen.&lt;br /&gt;
&lt;br /&gt;
=== Vector + AfterFX + Bodymovin + Lottie ===&lt;br /&gt;
 https://www.youtube.com/watch?v=i6qfQ8QDOfs&amp;amp;feature=emb_rel_end&lt;br /&gt;
Ein weiterer vielversprechender Workflow. &lt;br /&gt;
* Vektordateien erstellen &lt;br /&gt;
* In AfterFX importieren. Hier gibt es mehrere Möglichkeiten. Illustrator Dateine kann man direkt importieren, für Sketch gibt es ein Importtool, das auch die Layer mitnimmt. More to check out...&lt;br /&gt;
* Animation in AfterFX erstellen&lt;br /&gt;
* Mit dem AfterFX Bodymovin Plugin exportierst du die Animation als JSON File.&lt;br /&gt;
* Lottie kann die erstellt Datei rendern. Die Lottie Library gibt es für den Browser, aber auch für iOS und Android - dort werden die Dateien Nativ gerendert.&lt;br /&gt;
* Lottie Animationen können auch mit GSAP gesteuert werden.&lt;br /&gt;
 https://greensock.com/forums/topic/18343-timelinemax-scrollmagic-lottie-web-bodymoving-is-it-possible-is-it-necessary/&lt;br /&gt;
 https://www.youtube.com/watch?time_continue=308&amp;amp;v=HeY9qGUT3zQ&amp;amp;feature=emb_logo&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* Einfache Erstellung mit AfterFX&lt;br /&gt;
* Natives Rendern in Apps möglich -&amp;gt; gute Performance&lt;br /&gt;
Nachteil:&lt;br /&gt;
* Keine DOM Elemente&lt;br /&gt;
* Player nicht so frei positionierbar.&lt;br /&gt;
&lt;br /&gt;
=== Only CSS ===&lt;br /&gt;
 [[CSS Transitions]]&lt;br /&gt;
 [[CSS Animation]]&lt;br /&gt;
CSS3 stellt einfache Möglichkeiten zur Verfügung Elemente (auch SVG Pfade) zu animieren.&lt;br /&gt;
Vorteil:&lt;br /&gt;
* Ohne JavaScript&lt;br /&gt;
* Für einfache Animationen einfach zu realisieren&lt;br /&gt;
* Performant wenn Properties verwendet werden, die der Browser nativ rechnen kann (z.B. alle transform Eigenschaften)&lt;br /&gt;
Nachteil:&lt;br /&gt;
* Komplexe Animationen umständlich&lt;br /&gt;
&lt;br /&gt;
[[JQuery - Animation]] &lt;br /&gt;
&lt;br /&gt;
== Animation mit CSS only ==&lt;br /&gt;
 [[CSS Transitions]]&lt;br /&gt;
 [[CSS Animation]]&lt;br /&gt;
&lt;br /&gt;
== Animation mit JavaScript,CSS SVG und Canvas ==&lt;br /&gt;
=== Cooler Triangles Tiles Effekt ===&lt;br /&gt;
http://codepen.io/mistic100/pen/JobPLK (2016-12)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;tiles&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Enhancement of my original &amp;lt;a href=&amp;quot;http://codepen.io/mistic100/pen/GFHkm&amp;quot;&amp;gt;Colorful Tiles&amp;lt;/a&amp;gt; with truly random animation.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;At the end of each cycle (49 steps) a new Perlin noise map is generated.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
body { background:#111; }&lt;br /&gt;
#tiles { margin:0 auto; }&lt;br /&gt;
p { max-width:680px; margin:10px auto; color:white; font:16px &amp;quot;Calibri&amp;quot;, sans-serif; }&lt;br /&gt;
a { color:#3E7289; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
(function(){&lt;br /&gt;
    if (!SVG.supported) {&lt;br /&gt;
        alert(&amp;#039;SVG not supported !&amp;#039;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // parameters&lt;br /&gt;
    var size = { x: 680, y: 400, tile: 40 },&lt;br /&gt;
        speed = 50,&lt;br /&gt;
        tile_nb = { x: Math.ceil(size.x/size.tile)+1, y: Math.ceil(size.y/size.tile)+1 },&lt;br /&gt;
        colors = [&amp;quot;#ED1156&amp;quot;, &amp;quot;#ED194E&amp;quot;, &amp;quot;#ED2247&amp;quot;, &amp;quot;#ED2B3F&amp;quot;, &amp;quot;#EE3438&amp;quot;, &amp;quot;#EE3D31&amp;quot;, &amp;quot;#EE4529&amp;quot;, &amp;quot;#EF4E22&amp;quot;, &amp;quot;#EF571A&amp;quot;, &amp;quot;#EF6013&amp;quot;, &amp;quot;#F0690C&amp;quot;, &amp;quot;#E8720E&amp;quot;, &amp;quot;#E17B10&amp;quot;, &amp;quot;#D98512&amp;quot;, &amp;quot;#D28E14&amp;quot;, &amp;quot;#CB9816&amp;quot;, &amp;quot;#C3A118&amp;quot;, &amp;quot;#BCAA1A&amp;quot;, &amp;quot;#B4B41C&amp;quot;, &amp;quot;#ADBD1E&amp;quot;, &amp;quot;#A6C721&amp;quot;, &amp;quot;#96C62F&amp;quot;, &amp;quot;#87C53E&amp;quot;, &amp;quot;#78C44D&amp;quot;, &amp;quot;#69C35C&amp;quot;, &amp;quot;#5AC26B&amp;quot;, &amp;quot;#4AC17A&amp;quot;, &amp;quot;#3BC089&amp;quot;, &amp;quot;#2CBF98&amp;quot;, &amp;quot;#1DBEA7&amp;quot;, &amp;quot;#0EBDB6&amp;quot;, &amp;quot;#0EBAB0&amp;quot;, &amp;quot;#0EB8AA&amp;quot;, &amp;quot;#0EB5A4&amp;quot;, &amp;quot;#0EB39E&amp;quot;, &amp;quot;#0EB098&amp;quot;, &amp;quot;#0EAE92&amp;quot;, &amp;quot;#0EAB8C&amp;quot;, &amp;quot;#0EA986&amp;quot;, &amp;quot;#0EA680&amp;quot;, &amp;quot;#0EA47B&amp;quot;, &amp;quot;#269376&amp;quot;, &amp;quot;#3F8372&amp;quot;, &amp;quot;#58736E&amp;quot;, &amp;quot;#71626A&amp;quot;, &amp;quot;#895266&amp;quot;, &amp;quot;#A24262&amp;quot;, &amp;quot;#BB315E&amp;quot;, &amp;quot;#D4215A&amp;quot;],&lt;br /&gt;
        objects = [],&lt;br /&gt;
        values = [],&lt;br /&gt;
        nb_colors = colors.length;&lt;br /&gt;
    &lt;br /&gt;
    // function to generate simplex noise map&lt;br /&gt;
    function generateValues(add) {&lt;br /&gt;
        var values = [], foo,&lt;br /&gt;
            simplex = new SimplexNoise();&lt;br /&gt;
        &lt;br /&gt;
        for (var l=0; l&amp;lt;tile_nb.y; l++) {&lt;br /&gt;
            for (var c=0; c&amp;lt;tile_nb.x; c++) {&lt;br /&gt;
                foo = Math.round((simplex.noise(c/10, l/10)+1) / 2 * nb_colors) + add;&lt;br /&gt;
                values.push(foo, foo+1, foo+2, foo+3);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        return values;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // init canvas&lt;br /&gt;
    var container = document.getElementById(&amp;#039;tiles&amp;#039;);&lt;br /&gt;
    container.style.width = size.x+&amp;#039;px&amp;#039;;&lt;br /&gt;
    container.style.height = size.y+&amp;#039;px&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    var paper = SVG(container).size(size.x, size.y),&lt;br /&gt;
        pos, cmd,&lt;br /&gt;
        counter = 0;&lt;br /&gt;
&lt;br /&gt;
    // draw tiles&lt;br /&gt;
    for (var l=0; l&amp;lt;tile_nb.y; l++) {&lt;br /&gt;
        for (var c=0; c&amp;lt;tile_nb.x; c++) {&lt;br /&gt;
            pos = { x: c*size.tile, y: l*size.tile };&lt;br /&gt;
            &lt;br /&gt;
            // tile 1&lt;br /&gt;
            cmd = pos.x +&amp;#039;,&amp;#039;+ pos.y +&amp;#039; &amp;#039;+ (pos.x+size.tile) +&amp;#039;,&amp;#039;+ pos.y +&amp;#039; &amp;#039;+ (pos.x+size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2);&lt;br /&gt;
            objects.push(paper.polygon(cmd, true));&lt;br /&gt;
            // tile 2&lt;br /&gt;
            cmd = (pos.x+size.tile) +&amp;#039;,&amp;#039;+ (pos.y+size.tile) +&amp;#039; &amp;#039;+ pos.x +&amp;#039;,&amp;#039;+ (pos.y+size.tile) +&amp;#039; &amp;#039;+ (pos.x+size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2);&lt;br /&gt;
            objects.push(paper.polygon(cmd, true));&lt;br /&gt;
            // tile 3&lt;br /&gt;
            cmd = pos.x +&amp;#039;,&amp;#039;+ pos.y +&amp;#039; &amp;#039;+ (pos.x+size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2) +&amp;#039; &amp;#039;+ (pos.x-size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2);&lt;br /&gt;
            objects.push(paper.polygon(cmd, true));&lt;br /&gt;
            // tile 4&lt;br /&gt;
            cmd = pos.x +&amp;#039;,&amp;#039;+ (pos.y+size.tile) +&amp;#039; &amp;#039;+ (pos.x+size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2) +&amp;#039; &amp;#039;+ (pos.x-size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2);&lt;br /&gt;
            objects.push(paper.polygon(cmd, true));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // cycle colors&lt;br /&gt;
    values[0] = generateValues(0);&lt;br /&gt;
    values[1] = generateValues(nb_colors);&lt;br /&gt;
    &lt;br /&gt;
    setInterval(function() {&lt;br /&gt;
        var idx;&lt;br /&gt;
        for (var i=0, l=objects.length; i&amp;lt;l; i++) {&lt;br /&gt;
            idx = Math.round((values[1][i]-values[0][i]) * counter/(nb_colors-1) + values[0][i]);&lt;br /&gt;
            if (idx &amp;gt;= nb_colors) idx = idx%nb_colors;&lt;br /&gt;
            objects[i].fill(colors[idx]);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        counter++;&lt;br /&gt;
        if (counter == nb_colors) {&lt;br /&gt;
            counter = 1;&lt;br /&gt;
            values[0] = values[1].map(function(v) { return v-nb_colors; });&lt;br /&gt;
            values[1] = generateValues(nb_colors);&lt;br /&gt;
        }&lt;br /&gt;
    }, speed);&lt;br /&gt;
&lt;br /&gt;
    // bug in svg.js&lt;br /&gt;
    var temp = document.getElementById(&amp;#039;SvgjsSvg1002&amp;#039;);&lt;br /&gt;
    temp.parentNode.removeChild(temp);&lt;br /&gt;
}());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.157.18.194</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Animation_im_Web&amp;diff=25193</id>
		<title>Animation im Web</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Animation_im_Web&amp;diff=25193"/>
		<updated>2021-01-17T10:13:52Z</updated>

		<summary type="html">&lt;p&gt;84.157.18.194: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quickstart ==&lt;br /&gt;
In früheren Zeiten war die Standardantwort für &amp;quot;bewegte&amp;quot; Webseiten ganz einfach Flash. Heutzutage gibt es viele Lösungen um Animationen auf eine Webseite zu bringen. Dieser Artikel soll eine kleine Übersicht bringen.&lt;br /&gt;
&lt;br /&gt;
Stichworte: Anime.js, Gsap, CSS Transform, CSS Keyframes, Snap&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 Siehe auch in den Sections&lt;br /&gt;
 [[Scroll-Snap]]&lt;br /&gt;
 [[Anime.js]]&lt;br /&gt;
&lt;br /&gt;
== Überblick ==&lt;br /&gt;
=== GSAP &amp;amp; ScrollMagic ===&lt;br /&gt;
 [[GSAP]]&lt;br /&gt;
Gehört zu den Standardlösungen. GSAP - Greensock Animation Plattform bietet JavaScript Tools für Timeline-basierte Animationen. Ergänzend kann ScrollMagic die Steuerung der Timelines basierend auf der Skrollposition der Webseite steuern.&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* Alle DOM Elemente können animiert werden. Nicht nur in der Bewegung sondern auch in der Farbe, Sichtbarkeit...&lt;br /&gt;
* Gute Performance&lt;br /&gt;
* Mit ScrollMagic einfaches Steuern beim Scrolling inklusive einfaches Pinning (fixieren während der Animation)&lt;br /&gt;
Nachteil: &lt;br /&gt;
* Skriptlastig, wobei es nicht so komplex ist wie bei anderen Lösungen.&lt;br /&gt;
&lt;br /&gt;
=== Vector + AfterFX + Bodymovin + Lottie ===&lt;br /&gt;
 https://www.youtube.com/watch?v=i6qfQ8QDOfs&amp;amp;feature=emb_rel_end&lt;br /&gt;
Ein weiterer vielversprechender Workflow. &lt;br /&gt;
* Vektordateien erstellen &lt;br /&gt;
* In AfterFX importieren. Hier gibt es mehrere Möglichkeiten. Illustrator Dateine kann man direkt importieren, für Sketch gibt es ein Importtool, das auch die Layer mitnimmt. More to check out...&lt;br /&gt;
* Animation in AfterFX erstellen&lt;br /&gt;
* Mit dem AfterFX Bodymovin Plugin exportierst du die Animation als JSON File.&lt;br /&gt;
* Lottie kann die erstellt Datei rendern. Die Lottie Library gibt es für den Browser, aber auch für iOS und Android - dort werden die Dateien Nativ gerendert.&lt;br /&gt;
* Lottie Animationen können auch mit GSAP gesteuert werden.&lt;br /&gt;
 https://greensock.com/forums/topic/18343-timelinemax-scrollmagic-lottie-web-bodymoving-is-it-possible-is-it-necessary/&lt;br /&gt;
 https://www.youtube.com/watch?time_continue=308&amp;amp;v=HeY9qGUT3zQ&amp;amp;feature=emb_logo&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* Einfache Erstellung mit AfterFX&lt;br /&gt;
* Natives Rendern in Apps möglich -&amp;gt; gute Performance&lt;br /&gt;
Nachteil:&lt;br /&gt;
* Keine DOM Elemente&lt;br /&gt;
* Player nicht so frei positionierbar.&lt;br /&gt;
&lt;br /&gt;
=== Only CSS ===&lt;br /&gt;
 [[CSS Transitions]]&lt;br /&gt;
 [[CSS Animation]]&lt;br /&gt;
CSS3 stellt einfache Möglichkeiten zur Verfügung Elemente (auch SVG Pfade) zu animieren.&lt;br /&gt;
Vorteil:&lt;br /&gt;
* Ohne JavaScript&lt;br /&gt;
* Für einfache Animationen einfach zu realisieren&lt;br /&gt;
* Performant wenn Properties verwendet werden, die der Browser nativ rechnen kann (z.B. alle transform Eigenschaften)&lt;br /&gt;
Nachteil:&lt;br /&gt;
* Komplexe Animationen umständlich&lt;br /&gt;
&lt;br /&gt;
[[JQuery - Animation]] &lt;br /&gt;
&lt;br /&gt;
== Animation mit CSS only ==&lt;br /&gt;
 [[CSS Transitions]]&lt;br /&gt;
 [[CSS Animation]]&lt;br /&gt;
&lt;br /&gt;
== Animation mit JavaScript,CSS SVG und Canvas ==&lt;br /&gt;
=== Cooler Triangles Tiles Effekt ===&lt;br /&gt;
http://codepen.io/mistic100/pen/JobPLK (2016-12)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;tiles&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Enhancement of my original &amp;lt;a href=&amp;quot;http://codepen.io/mistic100/pen/GFHkm&amp;quot;&amp;gt;Colorful Tiles&amp;lt;/a&amp;gt; with truly random animation.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;At the end of each cycle (49 steps) a new Perlin noise map is generated.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
body { background:#111; }&lt;br /&gt;
#tiles { margin:0 auto; }&lt;br /&gt;
p { max-width:680px; margin:10px auto; color:white; font:16px &amp;quot;Calibri&amp;quot;, sans-serif; }&lt;br /&gt;
a { color:#3E7289; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
(function(){&lt;br /&gt;
    if (!SVG.supported) {&lt;br /&gt;
        alert(&amp;#039;SVG not supported !&amp;#039;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // parameters&lt;br /&gt;
    var size = { x: 680, y: 400, tile: 40 },&lt;br /&gt;
        speed = 50,&lt;br /&gt;
        tile_nb = { x: Math.ceil(size.x/size.tile)+1, y: Math.ceil(size.y/size.tile)+1 },&lt;br /&gt;
        colors = [&amp;quot;#ED1156&amp;quot;, &amp;quot;#ED194E&amp;quot;, &amp;quot;#ED2247&amp;quot;, &amp;quot;#ED2B3F&amp;quot;, &amp;quot;#EE3438&amp;quot;, &amp;quot;#EE3D31&amp;quot;, &amp;quot;#EE4529&amp;quot;, &amp;quot;#EF4E22&amp;quot;, &amp;quot;#EF571A&amp;quot;, &amp;quot;#EF6013&amp;quot;, &amp;quot;#F0690C&amp;quot;, &amp;quot;#E8720E&amp;quot;, &amp;quot;#E17B10&amp;quot;, &amp;quot;#D98512&amp;quot;, &amp;quot;#D28E14&amp;quot;, &amp;quot;#CB9816&amp;quot;, &amp;quot;#C3A118&amp;quot;, &amp;quot;#BCAA1A&amp;quot;, &amp;quot;#B4B41C&amp;quot;, &amp;quot;#ADBD1E&amp;quot;, &amp;quot;#A6C721&amp;quot;, &amp;quot;#96C62F&amp;quot;, &amp;quot;#87C53E&amp;quot;, &amp;quot;#78C44D&amp;quot;, &amp;quot;#69C35C&amp;quot;, &amp;quot;#5AC26B&amp;quot;, &amp;quot;#4AC17A&amp;quot;, &amp;quot;#3BC089&amp;quot;, &amp;quot;#2CBF98&amp;quot;, &amp;quot;#1DBEA7&amp;quot;, &amp;quot;#0EBDB6&amp;quot;, &amp;quot;#0EBAB0&amp;quot;, &amp;quot;#0EB8AA&amp;quot;, &amp;quot;#0EB5A4&amp;quot;, &amp;quot;#0EB39E&amp;quot;, &amp;quot;#0EB098&amp;quot;, &amp;quot;#0EAE92&amp;quot;, &amp;quot;#0EAB8C&amp;quot;, &amp;quot;#0EA986&amp;quot;, &amp;quot;#0EA680&amp;quot;, &amp;quot;#0EA47B&amp;quot;, &amp;quot;#269376&amp;quot;, &amp;quot;#3F8372&amp;quot;, &amp;quot;#58736E&amp;quot;, &amp;quot;#71626A&amp;quot;, &amp;quot;#895266&amp;quot;, &amp;quot;#A24262&amp;quot;, &amp;quot;#BB315E&amp;quot;, &amp;quot;#D4215A&amp;quot;],&lt;br /&gt;
        objects = [],&lt;br /&gt;
        values = [],&lt;br /&gt;
        nb_colors = colors.length;&lt;br /&gt;
    &lt;br /&gt;
    // function to generate simplex noise map&lt;br /&gt;
    function generateValues(add) {&lt;br /&gt;
        var values = [], foo,&lt;br /&gt;
            simplex = new SimplexNoise();&lt;br /&gt;
        &lt;br /&gt;
        for (var l=0; l&amp;lt;tile_nb.y; l++) {&lt;br /&gt;
            for (var c=0; c&amp;lt;tile_nb.x; c++) {&lt;br /&gt;
                foo = Math.round((simplex.noise(c/10, l/10)+1) / 2 * nb_colors) + add;&lt;br /&gt;
                values.push(foo, foo+1, foo+2, foo+3);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        return values;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // init canvas&lt;br /&gt;
    var container = document.getElementById(&amp;#039;tiles&amp;#039;);&lt;br /&gt;
    container.style.width = size.x+&amp;#039;px&amp;#039;;&lt;br /&gt;
    container.style.height = size.y+&amp;#039;px&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    var paper = SVG(container).size(size.x, size.y),&lt;br /&gt;
        pos, cmd,&lt;br /&gt;
        counter = 0;&lt;br /&gt;
&lt;br /&gt;
    // draw tiles&lt;br /&gt;
    for (var l=0; l&amp;lt;tile_nb.y; l++) {&lt;br /&gt;
        for (var c=0; c&amp;lt;tile_nb.x; c++) {&lt;br /&gt;
            pos = { x: c*size.tile, y: l*size.tile };&lt;br /&gt;
            &lt;br /&gt;
            // tile 1&lt;br /&gt;
            cmd = pos.x +&amp;#039;,&amp;#039;+ pos.y +&amp;#039; &amp;#039;+ (pos.x+size.tile) +&amp;#039;,&amp;#039;+ pos.y +&amp;#039; &amp;#039;+ (pos.x+size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2);&lt;br /&gt;
            objects.push(paper.polygon(cmd, true));&lt;br /&gt;
            // tile 2&lt;br /&gt;
            cmd = (pos.x+size.tile) +&amp;#039;,&amp;#039;+ (pos.y+size.tile) +&amp;#039; &amp;#039;+ pos.x +&amp;#039;,&amp;#039;+ (pos.y+size.tile) +&amp;#039; &amp;#039;+ (pos.x+size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2);&lt;br /&gt;
            objects.push(paper.polygon(cmd, true));&lt;br /&gt;
            // tile 3&lt;br /&gt;
            cmd = pos.x +&amp;#039;,&amp;#039;+ pos.y +&amp;#039; &amp;#039;+ (pos.x+size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2) +&amp;#039; &amp;#039;+ (pos.x-size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2);&lt;br /&gt;
            objects.push(paper.polygon(cmd, true));&lt;br /&gt;
            // tile 4&lt;br /&gt;
            cmd = pos.x +&amp;#039;,&amp;#039;+ (pos.y+size.tile) +&amp;#039; &amp;#039;+ (pos.x+size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2) +&amp;#039; &amp;#039;+ (pos.x-size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2);&lt;br /&gt;
            objects.push(paper.polygon(cmd, true));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // cycle colors&lt;br /&gt;
    values[0] = generateValues(0);&lt;br /&gt;
    values[1] = generateValues(nb_colors);&lt;br /&gt;
    &lt;br /&gt;
    setInterval(function() {&lt;br /&gt;
        var idx;&lt;br /&gt;
        for (var i=0, l=objects.length; i&amp;lt;l; i++) {&lt;br /&gt;
            idx = Math.round((values[1][i]-values[0][i]) * counter/(nb_colors-1) + values[0][i]);&lt;br /&gt;
            if (idx &amp;gt;= nb_colors) idx = idx%nb_colors;&lt;br /&gt;
            objects[i].fill(colors[idx]);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        counter++;&lt;br /&gt;
        if (counter == nb_colors) {&lt;br /&gt;
            counter = 1;&lt;br /&gt;
            values[0] = values[1].map(function(v) { return v-nb_colors; });&lt;br /&gt;
            values[1] = generateValues(nb_colors);&lt;br /&gt;
        }&lt;br /&gt;
    }, speed);&lt;br /&gt;
&lt;br /&gt;
    // bug in svg.js&lt;br /&gt;
    var temp = document.getElementById(&amp;#039;SvgjsSvg1002&amp;#039;);&lt;br /&gt;
    temp.parentNode.removeChild(temp);&lt;br /&gt;
}());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.157.18.194</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Animation_im_Web&amp;diff=25192</id>
		<title>Animation im Web</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Animation_im_Web&amp;diff=25192"/>
		<updated>2021-01-17T10:12:07Z</updated>

		<summary type="html">&lt;p&gt;84.157.18.194: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quickstart ==&lt;br /&gt;
In früheren Zeiten war die Standardantwort für &amp;quot;bewegte&amp;quot; Webseiten ganz einfach Flash. Heutzutage gibt es viele Lösungen um Animationen auf eine Webseite zu bringen. Dieser Artikel soll eine kleine Übersicht bringen.&lt;br /&gt;
== Links ==&lt;br /&gt;
 Siehe auch in den Sections&lt;br /&gt;
 [[Scroll-Snap]]&lt;br /&gt;
 [[Anime.js]]&lt;br /&gt;
&lt;br /&gt;
== Überblick ==&lt;br /&gt;
=== GSAP &amp;amp; ScrollMagic ===&lt;br /&gt;
 [[GSAP]]&lt;br /&gt;
Gehört zu den Standardlösungen. GSAP - Greensock Animation Plattform bietet JavaScript Tools für Timeline-basierte Animationen. Ergänzend kann ScrollMagic die Steuerung der Timelines basierend auf der Skrollposition der Webseite steuern.&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* Alle DOM Elemente können animiert werden. Nicht nur in der Bewegung sondern auch in der Farbe, Sichtbarkeit...&lt;br /&gt;
* Gute Performance&lt;br /&gt;
* Mit ScrollMagic einfaches Steuern beim Scrolling inklusive einfaches Pinning (fixieren während der Animation)&lt;br /&gt;
Nachteil: &lt;br /&gt;
* Skriptlastig, wobei es nicht so komplex ist wie bei anderen Lösungen.&lt;br /&gt;
&lt;br /&gt;
=== Vector + AfterFX + Bodymovin + Lottie ===&lt;br /&gt;
 https://www.youtube.com/watch?v=i6qfQ8QDOfs&amp;amp;feature=emb_rel_end&lt;br /&gt;
Ein weiterer vielversprechender Workflow. &lt;br /&gt;
* Vektordateien erstellen &lt;br /&gt;
* In AfterFX importieren. Hier gibt es mehrere Möglichkeiten. Illustrator Dateine kann man direkt importieren, für Sketch gibt es ein Importtool, das auch die Layer mitnimmt. More to check out...&lt;br /&gt;
* Animation in AfterFX erstellen&lt;br /&gt;
* Mit dem AfterFX Bodymovin Plugin exportierst du die Animation als JSON File.&lt;br /&gt;
* Lottie kann die erstellt Datei rendern. Die Lottie Library gibt es für den Browser, aber auch für iOS und Android - dort werden die Dateien Nativ gerendert.&lt;br /&gt;
* Lottie Animationen können auch mit GSAP gesteuert werden.&lt;br /&gt;
 https://greensock.com/forums/topic/18343-timelinemax-scrollmagic-lottie-web-bodymoving-is-it-possible-is-it-necessary/&lt;br /&gt;
 https://www.youtube.com/watch?time_continue=308&amp;amp;v=HeY9qGUT3zQ&amp;amp;feature=emb_logo&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* Einfache Erstellung mit AfterFX&lt;br /&gt;
* Natives Rendern in Apps möglich -&amp;gt; gute Performance&lt;br /&gt;
Nachteil:&lt;br /&gt;
* Keine DOM Elemente&lt;br /&gt;
* Player nicht so frei positionierbar.&lt;br /&gt;
&lt;br /&gt;
=== Only CSS ===&lt;br /&gt;
 [[CSS Transitions]]&lt;br /&gt;
 [[CSS Animation]]&lt;br /&gt;
CSS3 stellt einfache Möglichkeiten zur Verfügung Elemente (auch SVG Pfade) zu animieren.&lt;br /&gt;
Vorteil:&lt;br /&gt;
* Ohne JavaScript&lt;br /&gt;
* Für einfache Animationen einfach zu realisieren&lt;br /&gt;
* Performant wenn Properties verwendet werden, die der Browser nativ rechnen kann (z.B. alle transform Eigenschaften)&lt;br /&gt;
Nachteil:&lt;br /&gt;
* Komplexe Animationen umständlich&lt;br /&gt;
&lt;br /&gt;
[[JQuery - Animation]] &lt;br /&gt;
&lt;br /&gt;
== Animation mit CSS only ==&lt;br /&gt;
 [[CSS Transitions]]&lt;br /&gt;
 [[CSS Animation]]&lt;br /&gt;
&lt;br /&gt;
== Animation mit JavaScript,CSS SVG und Canvas ==&lt;br /&gt;
=== Cooler Triangles Tiles Effekt ===&lt;br /&gt;
http://codepen.io/mistic100/pen/JobPLK (2016-12)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;tiles&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Enhancement of my original &amp;lt;a href=&amp;quot;http://codepen.io/mistic100/pen/GFHkm&amp;quot;&amp;gt;Colorful Tiles&amp;lt;/a&amp;gt; with truly random animation.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;At the end of each cycle (49 steps) a new Perlin noise map is generated.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
body { background:#111; }&lt;br /&gt;
#tiles { margin:0 auto; }&lt;br /&gt;
p { max-width:680px; margin:10px auto; color:white; font:16px &amp;quot;Calibri&amp;quot;, sans-serif; }&lt;br /&gt;
a { color:#3E7289; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
(function(){&lt;br /&gt;
    if (!SVG.supported) {&lt;br /&gt;
        alert(&amp;#039;SVG not supported !&amp;#039;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // parameters&lt;br /&gt;
    var size = { x: 680, y: 400, tile: 40 },&lt;br /&gt;
        speed = 50,&lt;br /&gt;
        tile_nb = { x: Math.ceil(size.x/size.tile)+1, y: Math.ceil(size.y/size.tile)+1 },&lt;br /&gt;
        colors = [&amp;quot;#ED1156&amp;quot;, &amp;quot;#ED194E&amp;quot;, &amp;quot;#ED2247&amp;quot;, &amp;quot;#ED2B3F&amp;quot;, &amp;quot;#EE3438&amp;quot;, &amp;quot;#EE3D31&amp;quot;, &amp;quot;#EE4529&amp;quot;, &amp;quot;#EF4E22&amp;quot;, &amp;quot;#EF571A&amp;quot;, &amp;quot;#EF6013&amp;quot;, &amp;quot;#F0690C&amp;quot;, &amp;quot;#E8720E&amp;quot;, &amp;quot;#E17B10&amp;quot;, &amp;quot;#D98512&amp;quot;, &amp;quot;#D28E14&amp;quot;, &amp;quot;#CB9816&amp;quot;, &amp;quot;#C3A118&amp;quot;, &amp;quot;#BCAA1A&amp;quot;, &amp;quot;#B4B41C&amp;quot;, &amp;quot;#ADBD1E&amp;quot;, &amp;quot;#A6C721&amp;quot;, &amp;quot;#96C62F&amp;quot;, &amp;quot;#87C53E&amp;quot;, &amp;quot;#78C44D&amp;quot;, &amp;quot;#69C35C&amp;quot;, &amp;quot;#5AC26B&amp;quot;, &amp;quot;#4AC17A&amp;quot;, &amp;quot;#3BC089&amp;quot;, &amp;quot;#2CBF98&amp;quot;, &amp;quot;#1DBEA7&amp;quot;, &amp;quot;#0EBDB6&amp;quot;, &amp;quot;#0EBAB0&amp;quot;, &amp;quot;#0EB8AA&amp;quot;, &amp;quot;#0EB5A4&amp;quot;, &amp;quot;#0EB39E&amp;quot;, &amp;quot;#0EB098&amp;quot;, &amp;quot;#0EAE92&amp;quot;, &amp;quot;#0EAB8C&amp;quot;, &amp;quot;#0EA986&amp;quot;, &amp;quot;#0EA680&amp;quot;, &amp;quot;#0EA47B&amp;quot;, &amp;quot;#269376&amp;quot;, &amp;quot;#3F8372&amp;quot;, &amp;quot;#58736E&amp;quot;, &amp;quot;#71626A&amp;quot;, &amp;quot;#895266&amp;quot;, &amp;quot;#A24262&amp;quot;, &amp;quot;#BB315E&amp;quot;, &amp;quot;#D4215A&amp;quot;],&lt;br /&gt;
        objects = [],&lt;br /&gt;
        values = [],&lt;br /&gt;
        nb_colors = colors.length;&lt;br /&gt;
    &lt;br /&gt;
    // function to generate simplex noise map&lt;br /&gt;
    function generateValues(add) {&lt;br /&gt;
        var values = [], foo,&lt;br /&gt;
            simplex = new SimplexNoise();&lt;br /&gt;
        &lt;br /&gt;
        for (var l=0; l&amp;lt;tile_nb.y; l++) {&lt;br /&gt;
            for (var c=0; c&amp;lt;tile_nb.x; c++) {&lt;br /&gt;
                foo = Math.round((simplex.noise(c/10, l/10)+1) / 2 * nb_colors) + add;&lt;br /&gt;
                values.push(foo, foo+1, foo+2, foo+3);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        return values;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // init canvas&lt;br /&gt;
    var container = document.getElementById(&amp;#039;tiles&amp;#039;);&lt;br /&gt;
    container.style.width = size.x+&amp;#039;px&amp;#039;;&lt;br /&gt;
    container.style.height = size.y+&amp;#039;px&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    var paper = SVG(container).size(size.x, size.y),&lt;br /&gt;
        pos, cmd,&lt;br /&gt;
        counter = 0;&lt;br /&gt;
&lt;br /&gt;
    // draw tiles&lt;br /&gt;
    for (var l=0; l&amp;lt;tile_nb.y; l++) {&lt;br /&gt;
        for (var c=0; c&amp;lt;tile_nb.x; c++) {&lt;br /&gt;
            pos = { x: c*size.tile, y: l*size.tile };&lt;br /&gt;
            &lt;br /&gt;
            // tile 1&lt;br /&gt;
            cmd = pos.x +&amp;#039;,&amp;#039;+ pos.y +&amp;#039; &amp;#039;+ (pos.x+size.tile) +&amp;#039;,&amp;#039;+ pos.y +&amp;#039; &amp;#039;+ (pos.x+size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2);&lt;br /&gt;
            objects.push(paper.polygon(cmd, true));&lt;br /&gt;
            // tile 2&lt;br /&gt;
            cmd = (pos.x+size.tile) +&amp;#039;,&amp;#039;+ (pos.y+size.tile) +&amp;#039; &amp;#039;+ pos.x +&amp;#039;,&amp;#039;+ (pos.y+size.tile) +&amp;#039; &amp;#039;+ (pos.x+size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2);&lt;br /&gt;
            objects.push(paper.polygon(cmd, true));&lt;br /&gt;
            // tile 3&lt;br /&gt;
            cmd = pos.x +&amp;#039;,&amp;#039;+ pos.y +&amp;#039; &amp;#039;+ (pos.x+size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2) +&amp;#039; &amp;#039;+ (pos.x-size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2);&lt;br /&gt;
            objects.push(paper.polygon(cmd, true));&lt;br /&gt;
            // tile 4&lt;br /&gt;
            cmd = pos.x +&amp;#039;,&amp;#039;+ (pos.y+size.tile) +&amp;#039; &amp;#039;+ (pos.x+size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2) +&amp;#039; &amp;#039;+ (pos.x-size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2);&lt;br /&gt;
            objects.push(paper.polygon(cmd, true));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // cycle colors&lt;br /&gt;
    values[0] = generateValues(0);&lt;br /&gt;
    values[1] = generateValues(nb_colors);&lt;br /&gt;
    &lt;br /&gt;
    setInterval(function() {&lt;br /&gt;
        var idx;&lt;br /&gt;
        for (var i=0, l=objects.length; i&amp;lt;l; i++) {&lt;br /&gt;
            idx = Math.round((values[1][i]-values[0][i]) * counter/(nb_colors-1) + values[0][i]);&lt;br /&gt;
            if (idx &amp;gt;= nb_colors) idx = idx%nb_colors;&lt;br /&gt;
            objects[i].fill(colors[idx]);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        counter++;&lt;br /&gt;
        if (counter == nb_colors) {&lt;br /&gt;
            counter = 1;&lt;br /&gt;
            values[0] = values[1].map(function(v) { return v-nb_colors; });&lt;br /&gt;
            values[1] = generateValues(nb_colors);&lt;br /&gt;
        }&lt;br /&gt;
    }, speed);&lt;br /&gt;
&lt;br /&gt;
    // bug in svg.js&lt;br /&gt;
    var temp = document.getElementById(&amp;#039;SvgjsSvg1002&amp;#039;);&lt;br /&gt;
    temp.parentNode.removeChild(temp);&lt;br /&gt;
}());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.157.18.194</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Anime.js&amp;diff=25191</id>
		<title>Anime.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Anime.js&amp;diff=25191"/>
		<updated>2021-01-17T07:38:25Z</updated>

		<summary type="html">&lt;p&gt;84.157.18.194: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anime.js ist ein Animation Framework.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 &lt;br /&gt;
 https://animejs.com/&lt;br /&gt;
 https://www.youtube.com/watch?v=uRDLFXxihgc - guter Einstieg&lt;br /&gt;
 https://codepen.io/rexjbull/pen/RwRRezq Beispiel mit Scrollmagic&lt;br /&gt;
 http://snapsvg.io/ SVG Tools&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
&lt;br /&gt;
* create anime object &lt;br /&gt;
anime({});&lt;br /&gt;
* pass configuration object&lt;br /&gt;
** target (CSS selector)&lt;br /&gt;
** css properties die animiert werden sollen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
anime({&lt;br /&gt;
  targets: &amp;#039;.square&amp;#039;,&lt;br /&gt;
  translateX: &amp;#039;250px&amp;#039;,&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mehr Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
anime({&lt;br /&gt;
  targets: &amp;#039;.square&amp;#039;,&lt;br /&gt;
  translateX: &amp;#039;250px&amp;#039;,&lt;br /&gt;
  rotateZ: 360,&lt;br /&gt;
  scale: 2,&lt;br /&gt;
  loop: true,&lt;br /&gt;
  duration: 5000,&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Besonderheiten ===&lt;br /&gt;
Anime.js kann einige besondere Dinge:&lt;br /&gt;
* Animieren von &amp;#039;&amp;#039;&amp;#039;JavaScript Objekten&amp;#039;&amp;#039;&amp;#039; (mit mindestens einem Zahlenwert)&lt;br /&gt;
* Animieren von &amp;#039;&amp;#039;&amp;#039;DOM Attributen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Staggering ==&lt;br /&gt;
 https://animejs.com/documentation/#staggeringBasics&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Morphing SVG ==&lt;br /&gt;
 https://codepen.io/kholja/pen/KKgbBQe&lt;br /&gt;
Anime.js kann im Prinzip alle Werte in Bereichen verändern. Das funktioniert auch mit dem d Attribut in SVG Path Elementen oder Polygonen etc. Dabei sind ein paar Vorarbeiten notwendig:&lt;br /&gt;
* Punktanzahl der Pfade sollte gleich sein.&lt;br /&gt;
* Bei Pfaden kann es bei relativen Pfadangaben Probleme geben&lt;br /&gt;
* Bei Punkten die mit H oder V (Horizontal, Vertikal) angegeben sind gibt es nur eine statt zwei Koordinaten. Das kann dazu führen dass unterschiedliche viele Werte entstehen.&lt;br /&gt;
&lt;br /&gt;
Im Vergleich zum GSAP Morph Plugin ist Anime.js deutlich unflexibler. Performance ist aber OK und es ist kostenfrei. Für kleine Morphs durchaus geeignet.&lt;br /&gt;
&amp;#039;&amp;#039;Beispiel&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;button id=&amp;quot;b1&amp;quot;&amp;gt;Play&amp;lt;/button&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;ani1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;svg xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill-rule=&amp;quot;evenodd&amp;quot; stroke-miterlimit=&amp;quot;5&amp;quot; clip-rule=&amp;quot;evenodd&amp;quot; viewBox=&amp;quot;0 0 282 181&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;path fill=&amp;quot;none&amp;quot; stroke=&amp;quot;#000&amp;quot; stroke-width=&amp;quot;2&amp;quot; d=&amp;quot;M2 178L70 61l21 37 7-12 19 32 9 15 20-33 13 23 54-93 22 37 8-14 36 64&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/svg&amp;gt;&lt;br /&gt;
 &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ani1 = anime({&lt;br /&gt;
  targets: document.querySelector(&amp;quot;#ani1 path&amp;quot;),&lt;br /&gt;
  // using range [] on 2 paths here, coordinates are converted to absolute values.&lt;br /&gt;
  d: [&lt;br /&gt;
    &amp;quot;M 0,178 L 70,61 L 91,98 L 98,86 L 117,118 L 126,133 L 146,100 L 159,123 L 213,30 L 235,67 L 243,53 L 279,117&amp;quot;,&lt;br /&gt;
    &amp;quot;M 0,178 L 73,99 L 92,120 L 98,120 L 106,133 L 134,2 L 164,178L180,120 L197,120L212,102 L224,116 L279,116&amp;quot;], &lt;br /&gt;
  easing: &amp;#039;easeInOutCubic&amp;#039;,&lt;br /&gt;
  duration: 1000,&lt;br /&gt;
  autoplay: false,&lt;br /&gt;
  loop: true,&lt;br /&gt;
  direction: &amp;#039;alternate&amp;#039;,&lt;br /&gt;
  delay: 1000,&lt;br /&gt;
  endDelay:500,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.querySelector(&amp;#039;#b1&amp;#039;).onclick = ani1.play;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Helpüers==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// import anime from &amp;#039;../../../src/index.js&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
/* Ontersection observer */&lt;br /&gt;
&lt;br /&gt;
!function(t,e){&amp;quot;use strict&amp;quot;;function n(t){this.time=t.time,this.target=t.target,this.rootBounds=t.rootBounds,this.boundingClientRect=t.boundingClientRect,this.intersectionRect=t.intersectionRect||a(),this.isIntersecting=!!t.intersectionRect;var e=this.boundingClientRect,n=e.width*e.height,i=this.intersectionRect,o=i.width*i.height;n?this.intersectionRatio=o/n:this.intersectionRatio=this.isIntersecting?1:0}function i(t,e){var n=e||{};if(&amp;quot;function&amp;quot;!=typeof t)throw new Error(&amp;quot;callback must be a function&amp;quot;);if(n.root&amp;amp;&amp;amp;1!=n.root.nodeType)throw new Error(&amp;quot;root must be an Element&amp;quot;);this._checkForIntersections=r(this._checkForIntersections.bind(this),this.THROTTLE_TIMEOUT),this._callback=t,this._observationTargets=[],this._queuedEntries=[],this._rootMarginValues=this._parseRootMargin(n.rootMargin),this.thresholds=this._initThresholds(n.threshold),this.root=n.root||null,this.rootMargin=this._rootMarginValues.map(function(t){return t.value+t.unit}).join(&amp;quot; &amp;quot;)}function o(){return t.performance&amp;amp;&amp;amp;performance.now&amp;amp;&amp;amp;performance.now()}function r(t,e){var n=null;return function(){n||(n=setTimeout(function(){t(),n=null},e))}}function s(t,e,n,i){&amp;quot;function&amp;quot;==typeof t.addEventListener?t.addEventListener(e,n,i||!1):&amp;quot;function&amp;quot;==typeof t.attachEvent&amp;amp;&amp;amp;t.attachEvent(&amp;quot;on&amp;quot;+e,n)}function h(t,e,n,i){&amp;quot;function&amp;quot;==typeof t.removeEventListener?t.removeEventListener(e,n,i||!1):&amp;quot;function&amp;quot;==typeof t.detatchEvent&amp;amp;&amp;amp;t.detatchEvent(&amp;quot;on&amp;quot;+e,n)}function c(t,e){var n=Math.max(t.top,e.top),i=Math.min(t.bottom,e.bottom),o=Math.max(t.left,e.left),r=Math.min(t.right,e.right),s=r-o,h=i-n;return s&amp;gt;=0&amp;amp;&amp;amp;h&amp;gt;=0&amp;amp;&amp;amp;{top:n,bottom:i,left:o,right:r,width:s,height:h}}function u(t){var e;try{e=t.getBoundingClientRect()}catch(n){}return e?(e.width&amp;amp;&amp;amp;e.height||(e={top:e.top,right:e.right,bottom:e.bottom,left:e.left,width:e.right-e.left,height:e.bottom-e.top}),e):a()}function a(){return{top:0,bottom:0,left:0,right:0,width:0,height:0}}function l(t,e){for(var n=e;n;){if(n==t)return!0;n=p(n)}return!1}function p(t){var e=t.parentNode;return e&amp;amp;&amp;amp;11==e.nodeType&amp;amp;&amp;amp;e.host?e.host:e}if(&amp;quot;IntersectionObserver&amp;quot;in t&amp;amp;&amp;amp;&amp;quot;IntersectionObserverEntry&amp;quot;in t&amp;amp;&amp;amp;&amp;quot;intersectionRatio&amp;quot;in t.IntersectionObserverEntry.prototype)return void(&amp;quot;isIntersecting&amp;quot;in t.IntersectionObserverEntry.prototype||Object.defineProperty(t.IntersectionObserverEntry.prototype,&amp;quot;isIntersecting&amp;quot;,{get:function(){return this.intersectionRatio&amp;gt;0}}));var f=[];i.prototype.THROTTLE_TIMEOUT=100,i.prototype.POLL_INTERVAL=null,i.prototype.observe=function(t){var e=this._observationTargets.some(function(e){return e.element==t});if(!e){if(!t||1!=t.nodeType)throw new Error(&amp;quot;target must be an Element&amp;quot;);this._registerInstance(),this._observationTargets.push({element:t,entry:null}),this._monitorIntersections(),this._checkForIntersections()}},i.prototype.unobserve=function(t){this._observationTargets=this._observationTargets.filter(function(e){return e.element!=t}),this._observationTargets.length||(this._unmonitorIntersections(),this._unregisterInstance())},i.prototype.disconnect=function(){this._observationTargets=[],this._unmonitorIntersections(),this._unregisterInstance()},i.prototype.takeRecords=function(){var t=this._queuedEntries.slice();return this._queuedEntries=[],t},i.prototype._initThresholds=function(t){var e=t||[0];return Array.isArray(e)||(e=[e]),e.sort().filter(function(t,e,n){if(&amp;quot;number&amp;quot;!=typeof t||isNaN(t)||0&amp;gt;t||t&amp;gt;1)throw new Error(&amp;quot;threshold must be a number between 0 and 1 inclusively&amp;quot;);return t!==n[e-1]})},i.prototype._parseRootMargin=function(t){var e=t||&amp;quot;0px&amp;quot;,n=e.split(/\s+/).map(function(t){var e=/^(-?\d*\.?\d+)(px|%)$/.exec(t);if(!e)throw new Error(&amp;quot;rootMargin must be specified in pixels or percent&amp;quot;);return{value:parseFloat(e[1]),unit:e[2]}});return n[1]=n[1]||n[0],n[2]=n[2]||n[0],n[3]=n[3]||n[1],n},i.prototype._monitorIntersections=function(){this._monitoringIntersections||(this._monitoringIntersections=!0,this.POLL_INTERVAL?this._monitoringInterval=setInterval(this._checkForIntersections,this.POLL_INTERVAL):(s(t,&amp;quot;resize&amp;quot;,this._checkForIntersections,!0),s(e,&amp;quot;scroll&amp;quot;,this._checkForIntersections,!0),&amp;quot;MutationObserver&amp;quot;in t&amp;amp;&amp;amp;(this._domObserver=new MutationObserver(this._checkForIntersections),this._domObserver.observe(e,{attributes:!0,childList:!0,characterData:!0,subtree:!0}))))},i.prototype._unmonitorIntersections=function(){this._monitoringIntersections&amp;amp;&amp;amp;(this._monitoringIntersections=!1,clearInterval(this._monitoringInterval),this._monitoringInterval=null,h(t,&amp;quot;resize&amp;quot;,this._checkForIntersections,!0),h(e,&amp;quot;scroll&amp;quot;,this._checkForIntersections,!0),this._domObserver&amp;amp;&amp;amp;(this._domObserver.disconnect(),this._domObserver=null))},i.prototype._checkForIntersections=function(){var t=this._rootIsInDom(),e=t?this._getRootRect():a();this._observationTargets.forEach(function(i){var r=i.element,s=u(r),h=this._rootContainsTarget(r),c=i.entry,a=t&amp;amp;&amp;amp;h&amp;amp;&amp;amp;this._computeTargetAndRootIntersection(r,e),l=i.entry=new n({time:o(),target:r,boundingClientRect:s,rootBounds:e,intersectionRect:a});c?t&amp;amp;&amp;amp;h?this._hasCrossedThreshold(c,l)&amp;amp;&amp;amp;this._queuedEntries.push(l):c&amp;amp;&amp;amp;c.isIntersecting&amp;amp;&amp;amp;this._queuedEntries.push(l):this._queuedEntries.push(l)},this),this._queuedEntries.length&amp;amp;&amp;amp;this._callback(this.takeRecords(),this)},i.prototype._computeTargetAndRootIntersection=function(n,i){if(&amp;quot;none&amp;quot;!=t.getComputedStyle(n).display){for(var o=u(n),r=o,s=p(n),h=!1;!h;){var a=null,l=1==s.nodeType?t.getComputedStyle(s):{};if(&amp;quot;none&amp;quot;==l.display)return;if(s==this.root||s==e?(h=!0,a=i):s!=e.body&amp;amp;&amp;amp;s!=e.documentElement&amp;amp;&amp;amp;&amp;quot;visible&amp;quot;!=l.overflow&amp;amp;&amp;amp;(a=u(s)),a&amp;amp;&amp;amp;(r=c(a,r),!r))break;s=p(s)}return r}},i.prototype._getRootRect=function(){var t;if(this.root)t=u(this.root);else{var n=e.documentElement,i=e.body;t={top:0,left:0,right:n.clientWidth||i.clientWidth,width:n.clientWidth||i.clientWidth,bottom:n.clientHeight||i.clientHeight,height:n.clientHeight||i.clientHeight}}return this._expandRectByRootMargin(t)},i.prototype._expandRectByRootMargin=function(t){var e=this._rootMarginValues.map(function(e,n){return&amp;quot;px&amp;quot;==e.unit?e.value:e.value*(n%2?t.width:t.height)/100}),n={top:t.top-e[0],right:t.right+e[1],bottom:t.bottom+e[2],left:t.left-e[3]};return n.width=n.right-n.left,n.height=n.bottom-n.top,n},i.prototype._hasCrossedThreshold=function(t,e){var n=t&amp;amp;&amp;amp;t.isIntersecting?t.intersectionRatio||0:-1,i=e.isIntersecting?e.intersectionRatio||0:-1;if(n!==i)for(var o=0;o&amp;lt;this.thresholds.length;o++){var r=this.thresholds[o];if(r==n||r==i||n&amp;gt;r!=i&amp;gt;r)return!0}},i.prototype._rootIsInDom=function(){return!this.root||l(e,this.root)},i.prototype._rootContainsTarget=function(t){return l(this.root||e,t)},i.prototype._registerInstance=function(){f.indexOf(this)&amp;lt;0&amp;amp;&amp;amp;f.push(this)},i.prototype._unregisterInstance=function(){var t=f.indexOf(this);-1!=t&amp;amp;&amp;amp;f.splice(t,1)},t.IntersectionObserver=i,t.IntersectionObserverEntry=n}(window,document);&lt;br /&gt;
&lt;br /&gt;
/* Helpers */&lt;br /&gt;
&lt;br /&gt;
function dragElement(el, events) {&lt;br /&gt;
&lt;br /&gt;
  function getPointer(e) {&lt;br /&gt;
    var x = &amp;#039;clientX&amp;#039;;&lt;br /&gt;
    var y = &amp;#039;clientY&amp;#039;;&lt;br /&gt;
    var evt = e.touches ? e.touches[0] : e;&lt;br /&gt;
    return { x: evt[x], y: evt[y] };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var drag = { x: 0, y: 0, deltaX: 0, deltaY: 0, active: true, events: events || {} };&lt;br /&gt;
  var originalX = 0;&lt;br /&gt;
  var originalY = 0;&lt;br /&gt;
  var pointerX = 0;&lt;br /&gt;
  var pointerY = 0;&lt;br /&gt;
&lt;br /&gt;
  function move(e) {&lt;br /&gt;
    if (drag.active) return;&lt;br /&gt;
    drag.deltaX = pointerX - getPointer(e).x;&lt;br /&gt;
    drag.deltaY = pointerY - getPointer(e).y;&lt;br /&gt;
    drag.x = originalX - drag.deltaX;&lt;br /&gt;
    drag.y = originalY - drag.deltaY;&lt;br /&gt;
    if (drag.events.move) drag.events.move(drag);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function release(e) {&lt;br /&gt;
    drag.active = true;&lt;br /&gt;
    if (drag.events.release) drag.events.release(drag);&lt;br /&gt;
    document.removeEventListener(&amp;#039;mousemove&amp;#039;, move, false);&lt;br /&gt;
    document.removeEventListener(&amp;#039;mouseup&amp;#039;, release, false);&lt;br /&gt;
    document.removeEventListener(&amp;#039;touchmove&amp;#039;, move, false);&lt;br /&gt;
    document.removeEventListener(&amp;#039;touchend&amp;#039;, release, false);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function start(e) {&lt;br /&gt;
    if (!drag.active) return;&lt;br /&gt;
    e.preventDefault();&lt;br /&gt;
    drag.active = false;&lt;br /&gt;
    pointerX = getPointer(e).x;&lt;br /&gt;
    pointerY = getPointer(e).y;&lt;br /&gt;
    originalX = drag.x;&lt;br /&gt;
    originalY = drag.y;&lt;br /&gt;
    if (drag.events.begin) drag.events.begin(drag);&lt;br /&gt;
    document.addEventListener(&amp;#039;mousemove&amp;#039;, move, false);&lt;br /&gt;
    document.addEventListener(&amp;#039;mouseup&amp;#039;, release, false);&lt;br /&gt;
    document.addEventListener(&amp;#039;touchmove&amp;#039;, move, false);&lt;br /&gt;
    document.addEventListener(&amp;#039;touchend&amp;#039;, release, false);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&amp;#039;mousedown&amp;#039;, start, false);&lt;br /&gt;
  el.addEventListener(&amp;#039;touchstart&amp;#039;, start, false);&lt;br /&gt;
&lt;br /&gt;
  return drag;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Better scroll events&lt;br /&gt;
&lt;br /&gt;
function onScroll(cb) {&lt;br /&gt;
  var isTicking = false;&lt;br /&gt;
  var scrollY = 0;&lt;br /&gt;
  var body = document.body;&lt;br /&gt;
  var html = document.documentElement;&lt;br /&gt;
  var scrollHeight = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);&lt;br /&gt;
  function scroll() {&lt;br /&gt;
    scrollY = window.scrollY;&lt;br /&gt;
    if (cb) cb(scrollY, scrollHeight);&lt;br /&gt;
    requestTick();&lt;br /&gt;
  }&lt;br /&gt;
  function requestTick() {&lt;br /&gt;
    if (!isTicking) requestAnimationFrame(updateScroll);&lt;br /&gt;
    isTicking = true;&lt;br /&gt;
  }&lt;br /&gt;
  function updateScroll() {&lt;br /&gt;
    isTicking = false;&lt;br /&gt;
    var currentScrollY = scrollY;&lt;br /&gt;
  }&lt;br /&gt;
  scroll();&lt;br /&gt;
  window.onscroll = scroll;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Scroll to element&lt;br /&gt;
&lt;br /&gt;
function scrollToElement(el, offset) {&lt;br /&gt;
  var off = offset || 0;&lt;br /&gt;
  var rect = el.getBoundingClientRect();&lt;br /&gt;
  var top = rect.top + off;&lt;br /&gt;
  var animation = anime({&lt;br /&gt;
    targets: [document.body, document.documentElement],&lt;br /&gt;
    scrollTop: &amp;#039;+=&amp;#039;+top,&lt;br /&gt;
    easing: &amp;#039;easeInOutSine&amp;#039;,&lt;br /&gt;
    duration: 1500&lt;br /&gt;
  });&lt;br /&gt;
  // onScroll(animation.pause);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Check if element is in viewport&lt;br /&gt;
&lt;br /&gt;
function isElementInViewport(el, inCB, outCB, rootMargin) {&lt;br /&gt;
  var margin = rootMargin || &amp;#039;-10%&amp;#039;;&lt;br /&gt;
  function handleIntersect(entries, observer) {&lt;br /&gt;
    var entry = entries[0];&lt;br /&gt;
    if (entry.isIntersecting) {&lt;br /&gt;
      if (inCB &amp;amp;&amp;amp; typeof inCB === &amp;#039;function&amp;#039;) inCB(el, entry);&lt;br /&gt;
    } else {&lt;br /&gt;
      if (outCB &amp;amp;&amp;amp; typeof outCB === &amp;#039;function&amp;#039;) outCB(el, entry);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  var observer = new IntersectionObserver(handleIntersect, {rootMargin: margin});&lt;br /&gt;
  observer.observe(el);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function fitElementToParent(el, padding, exception) {&lt;br /&gt;
  let windowWidth = 0;&lt;br /&gt;
  let timeout = 0;&lt;br /&gt;
  function resize() {&lt;br /&gt;
    anime.set(el, {scale: 1});&lt;br /&gt;
    if (exception) anime.set(exception, {scale: 1});&lt;br /&gt;
    var pad = padding || 0;&lt;br /&gt;
    var parentEl = el.parentNode;&lt;br /&gt;
    var elOffsetWidth = el.offsetWidth - pad;&lt;br /&gt;
    var parentOffsetWidth = parentEl.offsetWidth;&lt;br /&gt;
    var ratio = parentOffsetWidth / elOffsetWidth;&lt;br /&gt;
    var invertedRatio = elOffsetWidth / parentOffsetWidth;&lt;br /&gt;
    anime.set(el, {scale: ratio});&lt;br /&gt;
    if (exception) anime.set(exception, {scale: invertedRatio});&lt;br /&gt;
  }&lt;br /&gt;
  resize();&lt;br /&gt;
  window.addEventListener(&amp;#039;resize&amp;#039;, function() {&lt;br /&gt;
    if (window.innerWidth === windowWidth) return;&lt;br /&gt;
    clearTimeout(timeout);&lt;br /&gt;
    timeout = setTimeout(function() {&lt;br /&gt;
      windowWidth = window.innerWidth;&lt;br /&gt;
      resize();&lt;br /&gt;
    }, 15);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.157.18.194</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Anime.js&amp;diff=25190</id>
		<title>Anime.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Anime.js&amp;diff=25190"/>
		<updated>2021-01-17T07:33:33Z</updated>

		<summary type="html">&lt;p&gt;84.157.18.194: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anime.js ist ein Animation Framework.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 &lt;br /&gt;
 https://animejs.com/&lt;br /&gt;
 https://www.youtube.com/watch?v=uRDLFXxihgc - guter Einstieg&lt;br /&gt;
 https://codepen.io/rexjbull/pen/RwRRezq Beispiel mit Scrollmagic&lt;br /&gt;
 http://snapsvg.io/ SVG Tools&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
&lt;br /&gt;
* create anime object &lt;br /&gt;
anime({});&lt;br /&gt;
* pass configuration object&lt;br /&gt;
** target (CSS selector)&lt;br /&gt;
** css properties die animiert werden sollen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
anime({&lt;br /&gt;
  targets: &amp;#039;.square&amp;#039;,&lt;br /&gt;
  translateX: &amp;#039;250px&amp;#039;,&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mehr Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
anime({&lt;br /&gt;
  targets: &amp;#039;.square&amp;#039;,&lt;br /&gt;
  translateX: &amp;#039;250px&amp;#039;,&lt;br /&gt;
  rotateZ: 360,&lt;br /&gt;
  scale: 2,&lt;br /&gt;
  loop: true,&lt;br /&gt;
  duration: 5000,&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Besonderheiten ===&lt;br /&gt;
Anime.js kann einige besondere Dinge:&lt;br /&gt;
* Animieren von &amp;#039;&amp;#039;&amp;#039;JavaScript Objekten&amp;#039;&amp;#039;&amp;#039; (mit mindestens einem Zahlenwert)&lt;br /&gt;
* Animieren von &amp;#039;&amp;#039;&amp;#039;DOM Attributen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Staggering ==&lt;br /&gt;
 https://animejs.com/documentation/#staggeringBasics&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Morphing SVG ==&lt;br /&gt;
 https://codepen.io/kholja/pen/KKgbBQe&lt;br /&gt;
Anime.js kann im Prinzip alle Werte in Bereichen verändern. Das funktioniert auch mit dem d Attribut in SVG Path Elementen oder Polygonen etc. Dabei sind ein paar Vorarbeiten notwendig:&lt;br /&gt;
* Punktanzahl der Pfade sollte gleich sein.&lt;br /&gt;
* Bei Pfaden kann es bei relativen Pfadangaben Probleme geben&lt;br /&gt;
* Bei Punkten die mit H oder V (Horizontal, Vertikal) angegeben sind gibt es nur eine statt zwei Koordinaten. Das kann dazu führen dass unterschiedliche viele Werte entstehen.&lt;br /&gt;
&lt;br /&gt;
Im Vergleich zum GSAP Morph Plugin ist Anime.js deutlich unflexibler. Performance ist aber OK und es ist kostenfrei. Für kleine Morphs durchaus geeignet.&lt;br /&gt;
&amp;#039;&amp;#039;Beispiel&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;button id=&amp;quot;b1&amp;quot;&amp;gt;Play&amp;lt;/button&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;ani1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;svg xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill-rule=&amp;quot;evenodd&amp;quot; stroke-miterlimit=&amp;quot;5&amp;quot; clip-rule=&amp;quot;evenodd&amp;quot; viewBox=&amp;quot;0 0 282 181&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;path fill=&amp;quot;none&amp;quot; stroke=&amp;quot;#000&amp;quot; stroke-width=&amp;quot;2&amp;quot; d=&amp;quot;M2 178L70 61l21 37 7-12 19 32 9 15 20-33 13 23 54-93 22 37 8-14 36 64&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/svg&amp;gt;&lt;br /&gt;
 &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ani1 = anime({&lt;br /&gt;
  targets: document.querySelector(&amp;quot;#ani1 path&amp;quot;),&lt;br /&gt;
  // using range [] on 2 paths here, coordinates are converted to absolute values.&lt;br /&gt;
  d: [&lt;br /&gt;
    &amp;quot;M 0,178 L 70,61 L 91,98 L 98,86 L 117,118 L 126,133 L 146,100 L 159,123 L 213,30 L 235,67 L 243,53 L 279,117&amp;quot;,&lt;br /&gt;
    &amp;quot;M 0,178 L 73,99 L 92,120 L 98,120 L 106,133 L 134,2 L 164,178L180,120 L197,120L212,102 L224,116 L279,116&amp;quot;], &lt;br /&gt;
  easing: &amp;#039;easeInOutCubic&amp;#039;,&lt;br /&gt;
  duration: 1000,&lt;br /&gt;
  autoplay: false,&lt;br /&gt;
  loop: true,&lt;br /&gt;
  direction: &amp;#039;alternate&amp;#039;,&lt;br /&gt;
  delay: 1000,&lt;br /&gt;
  endDelay:500,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.querySelector(&amp;#039;#b1&amp;#039;).onclick = ani1.play;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.157.18.194</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Anime.js&amp;diff=25189</id>
		<title>Anime.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Anime.js&amp;diff=25189"/>
		<updated>2021-01-17T07:08:50Z</updated>

		<summary type="html">&lt;p&gt;84.157.18.194: /* Morphing SVG */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anime.js ist ein Animation Framework.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 &lt;br /&gt;
 https://animejs.com/&lt;br /&gt;
 https://www.youtube.com/watch?v=uRDLFXxihgc - guter Einstieg&lt;br /&gt;
 https://codepen.io/rexjbull/pen/RwRRezq Beispiel mit Scrollmagic&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
&lt;br /&gt;
* create anime object &lt;br /&gt;
anime({});&lt;br /&gt;
* pass configuration object&lt;br /&gt;
** target (CSS selector)&lt;br /&gt;
** css properties die animiert werden sollen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
anime({&lt;br /&gt;
  targets: &amp;#039;.square&amp;#039;,&lt;br /&gt;
  translateX: &amp;#039;250px&amp;#039;,&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mehr Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
anime({&lt;br /&gt;
  targets: &amp;#039;.square&amp;#039;,&lt;br /&gt;
  translateX: &amp;#039;250px&amp;#039;,&lt;br /&gt;
  rotateZ: 360,&lt;br /&gt;
  scale: 2,&lt;br /&gt;
  loop: true,&lt;br /&gt;
  duration: 5000,&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Besonderheiten ===&lt;br /&gt;
Anime.js kann einige besondere Dinge:&lt;br /&gt;
* Animieren von &amp;#039;&amp;#039;&amp;#039;JavaScript Objekten&amp;#039;&amp;#039;&amp;#039; (mit mindestens einem Zahlenwert)&lt;br /&gt;
* Animieren von &amp;#039;&amp;#039;&amp;#039;DOM Attributen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Staggering ==&lt;br /&gt;
 https://animejs.com/documentation/#staggeringBasics&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Morphing SVG ==&lt;br /&gt;
 https://codepen.io/kholja/pen/KKgbBQe&lt;br /&gt;
Anime.js kann im Prinzip alle Werte in Bereichen verändern. Das funktioniert auch mit dem d Attribut in SVG Path Elementen oder Polygonen etc. Dabei sind ein paar Vorarbeiten notwendig:&lt;br /&gt;
* Punktanzahl der Pfade sollte gleich sein.&lt;br /&gt;
* Bei Pfaden kann es bei relativen Pfadangaben Probleme geben&lt;br /&gt;
* Bei Punkten die mit H oder V (Horizontal, Vertikal) angegeben sind gibt es nur eine statt zwei Koordinaten. Das kann dazu führen dass unterschiedliche viele Werte entstehen.&lt;br /&gt;
&lt;br /&gt;
Im Vergleich zum GSAP Morph Plugin ist Anime.js deutlich unflexibler. Performance ist aber OK und es ist kostenfrei. Für kleine Morphs durchaus geeignet.&lt;br /&gt;
&amp;#039;&amp;#039;Beispiel&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;button id=&amp;quot;b1&amp;quot;&amp;gt;Play&amp;lt;/button&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;ani1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;svg xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill-rule=&amp;quot;evenodd&amp;quot; stroke-miterlimit=&amp;quot;5&amp;quot; clip-rule=&amp;quot;evenodd&amp;quot; viewBox=&amp;quot;0 0 282 181&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;path fill=&amp;quot;none&amp;quot; stroke=&amp;quot;#000&amp;quot; stroke-width=&amp;quot;2&amp;quot; d=&amp;quot;M2 178L70 61l21 37 7-12 19 32 9 15 20-33 13 23 54-93 22 37 8-14 36 64&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/svg&amp;gt;&lt;br /&gt;
 &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ani1 = anime({&lt;br /&gt;
  targets: document.querySelector(&amp;quot;#ani1 path&amp;quot;),&lt;br /&gt;
  // using range [] on 2 paths here, coordinates are converted to absolute values.&lt;br /&gt;
  d: [&lt;br /&gt;
    &amp;quot;M 0,178 L 70,61 L 91,98 L 98,86 L 117,118 L 126,133 L 146,100 L 159,123 L 213,30 L 235,67 L 243,53 L 279,117&amp;quot;,&lt;br /&gt;
    &amp;quot;M 0,178 L 73,99 L 92,120 L 98,120 L 106,133 L 134,2 L 164,178L180,120 L197,120L212,102 L224,116 L279,116&amp;quot;], &lt;br /&gt;
  easing: &amp;#039;easeInOutCubic&amp;#039;,&lt;br /&gt;
  duration: 1000,&lt;br /&gt;
  autoplay: false,&lt;br /&gt;
  loop: true,&lt;br /&gt;
  direction: &amp;#039;alternate&amp;#039;,&lt;br /&gt;
  delay: 1000,&lt;br /&gt;
  endDelay:500,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.querySelector(&amp;#039;#b1&amp;#039;).onclick = ani1.play;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.157.18.194</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Anime.js&amp;diff=25188</id>
		<title>Anime.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Anime.js&amp;diff=25188"/>
		<updated>2021-01-17T07:07:23Z</updated>

		<summary type="html">&lt;p&gt;84.157.18.194: /* Morphing SVG */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anime.js ist ein Animation Framework.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 &lt;br /&gt;
 https://animejs.com/&lt;br /&gt;
 https://www.youtube.com/watch?v=uRDLFXxihgc - guter Einstieg&lt;br /&gt;
 https://codepen.io/rexjbull/pen/RwRRezq Beispiel mit Scrollmagic&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
&lt;br /&gt;
* create anime object &lt;br /&gt;
anime({});&lt;br /&gt;
* pass configuration object&lt;br /&gt;
** target (CSS selector)&lt;br /&gt;
** css properties die animiert werden sollen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
anime({&lt;br /&gt;
  targets: &amp;#039;.square&amp;#039;,&lt;br /&gt;
  translateX: &amp;#039;250px&amp;#039;,&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mehr Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
anime({&lt;br /&gt;
  targets: &amp;#039;.square&amp;#039;,&lt;br /&gt;
  translateX: &amp;#039;250px&amp;#039;,&lt;br /&gt;
  rotateZ: 360,&lt;br /&gt;
  scale: 2,&lt;br /&gt;
  loop: true,&lt;br /&gt;
  duration: 5000,&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Besonderheiten ===&lt;br /&gt;
Anime.js kann einige besondere Dinge:&lt;br /&gt;
* Animieren von &amp;#039;&amp;#039;&amp;#039;JavaScript Objekten&amp;#039;&amp;#039;&amp;#039; (mit mindestens einem Zahlenwert)&lt;br /&gt;
* Animieren von &amp;#039;&amp;#039;&amp;#039;DOM Attributen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Staggering ==&lt;br /&gt;
 https://animejs.com/documentation/#staggeringBasics&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Morphing SVG ==&lt;br /&gt;
 https://codepen.io/kholja/pen/KKgbBQe&lt;br /&gt;
Anime.js kann im Prinzip alle Werte in Bereichen verändern. Das funktioniert auch mit dem d Attribut in SVG Path Elementen oder Polygonen etc. Dabei sind ein paar Vorarbeiten notwendig:&lt;br /&gt;
* Punktanzahl der Pfade sollte gleich sein.&lt;br /&gt;
* Bei Pfaden kann es bei relativen Pfadangaben Probleme geben&lt;br /&gt;
* Bei Punkten die mit H oder V (Horizontal, Vertikal) angegeben sind gibt es nur eine statt zwei Koordinaten. Das kann dazu führen dass unterschiedliche viele Werte entstehen.&lt;br /&gt;
&lt;br /&gt;
Im Vergleich zum GSAP Morph Plugin ist Anime.js deutlich unflexibler. Performance ist aber OK und es ist kostenfrei. Für kleine Morphs durchaus geeignet.&lt;br /&gt;
&amp;#039;&amp;#039;Beispiel&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;button id=&amp;quot;b1&amp;quot;&amp;gt;Play&amp;lt;/button&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;ani1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;svg xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill-rule=&amp;quot;evenodd&amp;quot; stroke-miterlimit=&amp;quot;5&amp;quot; clip-rule=&amp;quot;evenodd&amp;quot; viewBox=&amp;quot;0 0 282 181&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;path fill=&amp;quot;none&amp;quot; stroke=&amp;quot;#000&amp;quot; stroke-width=&amp;quot;2&amp;quot; d=&amp;quot;M2 178L70 61l21 37 7-12 19 32 9 15 20-33 13 23 54-93 22 37 8-14 36 64&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/svg&amp;gt;&lt;br /&gt;
 &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ani1 = anime({&lt;br /&gt;
  targets: document.querySelector(&amp;quot;#ani1 path&amp;quot;),&lt;br /&gt;
  d: [&lt;br /&gt;
    &amp;quot;M 0,178 L 70,61 L 91,98 L 98,86 L 117,118 L 126,133 L 146,100 L 159,123 L 213,30 L 235,67 L 243,53 L 279,117&amp;quot;,&lt;br /&gt;
    &amp;quot;M 0,178 L 73,99 L 92,120 L 98,120 L 106,133 L 134,2 L 164,178L180,120 L197,120L212,102 L224,116 L279,116&amp;quot;],&lt;br /&gt;
  easing: &amp;#039;easeInOutCubic&amp;#039;,&lt;br /&gt;
  duration: 1000,&lt;br /&gt;
  autoplay: false,&lt;br /&gt;
  loop: true,&lt;br /&gt;
  direction: &amp;#039;alternate&amp;#039;,&lt;br /&gt;
  delay: 1000,&lt;br /&gt;
  endDelay:500,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.querySelector(&amp;#039;#b1&amp;#039;).onclick = ani1.play;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.157.18.194</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Anime.js&amp;diff=25187</id>
		<title>Anime.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Anime.js&amp;diff=25187"/>
		<updated>2021-01-17T07:06:49Z</updated>

		<summary type="html">&lt;p&gt;84.157.18.194: /* Morphing SVG */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anime.js ist ein Animation Framework.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 &lt;br /&gt;
 https://animejs.com/&lt;br /&gt;
 https://www.youtube.com/watch?v=uRDLFXxihgc - guter Einstieg&lt;br /&gt;
 https://codepen.io/rexjbull/pen/RwRRezq Beispiel mit Scrollmagic&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
&lt;br /&gt;
* create anime object &lt;br /&gt;
anime({});&lt;br /&gt;
* pass configuration object&lt;br /&gt;
** target (CSS selector)&lt;br /&gt;
** css properties die animiert werden sollen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
anime({&lt;br /&gt;
  targets: &amp;#039;.square&amp;#039;,&lt;br /&gt;
  translateX: &amp;#039;250px&amp;#039;,&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mehr Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
anime({&lt;br /&gt;
  targets: &amp;#039;.square&amp;#039;,&lt;br /&gt;
  translateX: &amp;#039;250px&amp;#039;,&lt;br /&gt;
  rotateZ: 360,&lt;br /&gt;
  scale: 2,&lt;br /&gt;
  loop: true,&lt;br /&gt;
  duration: 5000,&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Besonderheiten ===&lt;br /&gt;
Anime.js kann einige besondere Dinge:&lt;br /&gt;
* Animieren von &amp;#039;&amp;#039;&amp;#039;JavaScript Objekten&amp;#039;&amp;#039;&amp;#039; (mit mindestens einem Zahlenwert)&lt;br /&gt;
* Animieren von &amp;#039;&amp;#039;&amp;#039;DOM Attributen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Staggering ==&lt;br /&gt;
 https://animejs.com/documentation/#staggeringBasics&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Morphing SVG ==&lt;br /&gt;
 https://codepen.io/kholja/pen/KKgbBQe&lt;br /&gt;
Anime.js kann im Prinzip alle Werte in Bereichen verändern. Das funktioniert auch mit dem d Attribut in SVG Path Elementen oder Polygonen etc. Dabei sind ein paar Vorarbeiten notwendig:&lt;br /&gt;
* Punktanzahl der Pfade sollte gleich sein.&lt;br /&gt;
* Bei Pfaden kann es bei relativen Pfadangaben Probleme geben&lt;br /&gt;
* Bei Punkten die mit H oder V (Horizontal, Vertikal) angegeben sind gibt es nur eine statt zwei Koordinaten. Das kann dazu führen dass unterschiedliche viele Werte entstehen.&lt;br /&gt;
&lt;br /&gt;
Im Vergleich zum GSAP Morph Plugin ist Anime.js deutlich unflexibler. Performance ist aber OK und es ist kostenfrei. Für kleine Morphs durchaus geeignet.&lt;br /&gt;
&amp;#039;&amp;#039;Beispiel&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;button id=&amp;quot;b1&amp;quot;&amp;gt;Play&amp;lt;/button&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;ani1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;svg xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill-rule=&amp;quot;evenodd&amp;quot; stroke-miterlimit=&amp;quot;5&amp;quot; clip-rule=&amp;quot;evenodd&amp;quot; viewBox=&amp;quot;0 0 282 181&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;path fill=&amp;quot;none&amp;quot; stroke=&amp;quot;#000&amp;quot; stroke-width=&amp;quot;2&amp;quot; d=&amp;quot;M2 178L70 61l21 37 7-12 19 32 9 15 20-33 13 23 54-93 22 37 8-14 36 64&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/svg&amp;gt;&lt;br /&gt;
 &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntahighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ani1 = anime({&lt;br /&gt;
  targets: document.querySelector(&amp;quot;#ani1 path&amp;quot;),&lt;br /&gt;
  d: [&lt;br /&gt;
    &amp;quot;M 0,178 L 70,61 L 91,98 L 98,86 L 117,118 L 126,133 L 146,100 L 159,123 L 213,30 L 235,67 L 243,53 L 279,117&amp;quot;,&lt;br /&gt;
    &amp;quot;M 0,178 L 73,99 L 92,120 L 98,120 L 106,133 L 134,2 L 164,178L180,120 L197,120L212,102 L224,116 L279,116&amp;quot;],&lt;br /&gt;
  easing: &amp;#039;easeInOutCubic&amp;#039;,&lt;br /&gt;
  duration: 1000,&lt;br /&gt;
  autoplay: false,&lt;br /&gt;
  loop: true,&lt;br /&gt;
  direction: &amp;#039;alternate&amp;#039;,&lt;br /&gt;
  delay: 1000,&lt;br /&gt;
  endDelay:500,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.querySelector(&amp;#039;#b1&amp;#039;).onclick = ani1.play;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.157.18.194</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Anime.js&amp;diff=25186</id>
		<title>Anime.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Anime.js&amp;diff=25186"/>
		<updated>2021-01-17T07:05:01Z</updated>

		<summary type="html">&lt;p&gt;84.157.18.194: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anime.js ist ein Animation Framework.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 &lt;br /&gt;
 https://animejs.com/&lt;br /&gt;
 https://www.youtube.com/watch?v=uRDLFXxihgc - guter Einstieg&lt;br /&gt;
 https://codepen.io/rexjbull/pen/RwRRezq Beispiel mit Scrollmagic&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
&lt;br /&gt;
* create anime object &lt;br /&gt;
anime({});&lt;br /&gt;
* pass configuration object&lt;br /&gt;
** target (CSS selector)&lt;br /&gt;
** css properties die animiert werden sollen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
anime({&lt;br /&gt;
  targets: &amp;#039;.square&amp;#039;,&lt;br /&gt;
  translateX: &amp;#039;250px&amp;#039;,&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mehr Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
anime({&lt;br /&gt;
  targets: &amp;#039;.square&amp;#039;,&lt;br /&gt;
  translateX: &amp;#039;250px&amp;#039;,&lt;br /&gt;
  rotateZ: 360,&lt;br /&gt;
  scale: 2,&lt;br /&gt;
  loop: true,&lt;br /&gt;
  duration: 5000,&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Besonderheiten ===&lt;br /&gt;
Anime.js kann einige besondere Dinge:&lt;br /&gt;
* Animieren von &amp;#039;&amp;#039;&amp;#039;JavaScript Objekten&amp;#039;&amp;#039;&amp;#039; (mit mindestens einem Zahlenwert)&lt;br /&gt;
* Animieren von &amp;#039;&amp;#039;&amp;#039;DOM Attributen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Staggering ==&lt;br /&gt;
 https://animejs.com/documentation/#staggeringBasics&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Morphing SVG ==&lt;br /&gt;
 https://codepen.io/kholja/pen/KKgbBQe&lt;br /&gt;
Anime.js kann im Prinzip alle Werte in Bereichen verändern. Das funktioniert auch mit dem d Attribut in SVG Path Elementen oder Polygonen etc. Dabei sind ein paar Vorarbeiten notwendig:&lt;br /&gt;
* Punktanzahl der Pfade sollte gleich sein.&lt;br /&gt;
* Bei Pfaden kann es bei relativen Pfadangaben Probleme geben&lt;br /&gt;
* Bei Punkten die mit H oder V (Horizontal, Vertikal) angegeben sind gibt es nur eine statt zwei Koordinaten. Das kann dazu führen dass unterschiedliche viele Werte entstehen.&lt;br /&gt;
&lt;br /&gt;
Im Vergleich zum GSAP Morph Plugin ist Anime.js deutlich unflexibler. Performance ist aber OK und es ist kostenfrei. Für kleine Morphs durchaus geeignet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ani1 = anime({&lt;br /&gt;
  targets: document.querySelector(&amp;quot;#ani1 path&amp;quot;),&lt;br /&gt;
  d: [&lt;br /&gt;
    &amp;quot;M 0,178 L 70,61 L 91,98 L 98,86 L 117,118 L 126,133 L 146,100 L 159,123 L 213,30 L 235,67 L 243,53 L 279,117&amp;quot;,&lt;br /&gt;
    &amp;quot;M 0,178 L 73,99 L 92,120 L 98,120 L 106,133 L 134,2 L 164,178L180,120 L197,120L212,102 L224,116 L279,116&amp;quot;],&lt;br /&gt;
  easing: &amp;#039;easeInOutCubic&amp;#039;,&lt;br /&gt;
  duration: 1000,&lt;br /&gt;
  autoplay: false,&lt;br /&gt;
  loop: true,&lt;br /&gt;
  direction: &amp;#039;alternate&amp;#039;,&lt;br /&gt;
  delay: 1000,&lt;br /&gt;
  endDelay:500,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.querySelector(&amp;#039;#b1&amp;#039;).onclick = ani1.play;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.157.18.194</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=PrivacyWire_-_ProcessWire_Modul&amp;diff=25179</id>
		<title>PrivacyWire - ProcessWire Modul</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=PrivacyWire_-_ProcessWire_Modul&amp;diff=25179"/>
		<updated>2021-01-12T19:45:26Z</updated>

		<summary type="html">&lt;p&gt;84.157.18.194: /* CSS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Modul zum Anzeigen eines Cookie Banners und zum Blockieren von Skripten, Externen Medien etc. Das Modul passt das HTML an&lt;br /&gt;
== Links ==&lt;br /&gt;
 https://processwire.com/modules/privacy-wire/&lt;br /&gt;
 https://processwire.com/talk/topic/23118-privacywire-cookie-management-async-external-asset-loading/&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
* Modul installieren&lt;br /&gt;
* Labels übersetzen&lt;br /&gt;
* Benötigte Ketegorien auswählen&lt;br /&gt;
** Zuordnung der Kategorien funktioniert über data-category Attribut.&lt;br /&gt;
* Skripte anpassen z.B.&lt;br /&gt;
** Normale Skripte: type=&amp;quot;text/plain&amp;quot; data-type=&amp;quot;text/javascript&amp;quot; data-category=&amp;quot;marketing&amp;quot;&lt;br /&gt;
** Externe Skripte: data-src=&amp;quot;...&amp;quot;&lt;br /&gt;
Beispiele:&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/plain&amp;quot; data-type=&amp;quot;text/javascript&amp;quot; data-category=&amp;quot;statistics&amp;quot; data-src=&amp;quot;/path/to/your/statistic/script.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/plain&amp;quot; data-type=&amp;quot;text/javascript&amp;quot; data-category=&amp;quot;marketing&amp;quot; data-src=&amp;quot;/path/to/your/mareketing/script.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/plain&amp;quot; data-type=&amp;quot;text/javascript&amp;quot; data-category=&amp;quot;external_media&amp;quot; data-src=&amp;quot;/path/to/your/external-media/script.js&amp;quot;&amp;gt;  &amp;lt;/script&amp;gt;&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/plain&amp;quot; data-type=&amp;quot;text/javascript&amp;quot; data-category=&amp;quot;marketing&amp;quot;&amp;gt;console.log(&amp;quot;Inline scripts are also working!&amp;quot;);&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cookie Options anzeigen ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[privacywire-choose-cookies]] - Mit Textformatter&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;privacywire-show-options&amp;quot;&amp;gt;Show Cookie Options&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;button class=&amp;quot;privacywire-show-options&amp;quot;&amp;gt;Show Cookie Options&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CSS ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
.pricacywire,&lt;br /&gt;
.privacywire-banner,&lt;br /&gt;
.privacywire-options,&lt;br /&gt;
.privacywire-message{&lt;br /&gt;
	background-color: #009999 !important;&lt;br /&gt;
}&lt;br /&gt;
.pricacywire a,&lt;br /&gt;
.privacywire-banner a,&lt;br /&gt;
.privacywire-options a{&lt;br /&gt;
	color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Video Embed Opt-In==&lt;br /&gt;
Im VideoEmbed Plugin kann man die Kategorie auswählen (z.B. external Media)&lt;/div&gt;</summary>
		<author><name>84.157.18.194</name></author>
	</entry>
</feed>