Kategorie: Developer

  • LESS installieren und anwenden

    LESS installieren und anwenden

    LESS ist ein Präprozessor der CSS mit Variablen , Funktionen und Vererbung erweitert. Dadurch kann eine saubere und schnellere Entwicklung von CSS gewährleistet werden. Dieser Beitrag zeigt wie ihr LESS auf dem Computer installiert und LESS compiliert.

    Node.js installieren

    Node.js ist ein Javascript Server, mit dem lassen sich Javascripte im Backend ausführen. Einfach runterladen und installieren: Downloadseite.

    Git installieren

    Es ist ratsam noch die Git Konsole zu installieren. Git CLI Downloadseite.

    LESS Modul installieren

    Öffnet die Konsole, bei Windows einfach in das Suchfeld CMS eintippen und Enter drücken. Danach fügt ihr folgenden Befehl in die Konsole ein:

    npm install -g less

    LESS compilieren

    Zuerst erstellt ihr eine style.less Datei in eurem Projekt-Verzeichnis. In diese Datei schreibt ihr folgenden LESS Code:

    @colorred: #dd0005;
    @colorgreen: #00dd00;
    
    .redtext {
      color: @colorred;
      a{
        color: @colorred;
      }
    }
    
    .greentext {
      color: @colorgreen;
      a{
        color: @colorgreen;
      }
    }

    Mit dem less comman könnt ihr nun die LESS Datei in CSS compilieren.

    lessc style.less style.css

    Aus diesem Code wird dann folgende CSS generiert:

    .redtext {
      color: #dd0005;
    }
    .redtext a {
      color: #dd0005;
    }
    .greentext {
      color: #00dd00;
    }
    .greentext a {
      color: #00dd00;
    }

    LESS minify CSS Datei

    Um deine LESS Dateien minimiert (minify, minimize), also so klein wie nur möglich, auszugeben ist folgender Befehl zuständig:

    minify installieren

    npm install less-plugin-clean-css -g

    minify anwenden

    lessc -clean-css style.less style.css

    Jetzt wird deine CSS Datei, ohne Zeilenumbrüche und so wenig wie möglich an Leerzeichen, compiliert. Das hat den Vorteil, dass deine Seite später schneller lädt.

    Beispiel

    @colorred: #dd0005;
    @colorgreen: #00dd00;
    
    .redtext {
      color: @colorred;
      a{
        color: @colorred;
      }
    }
    
    .greentext {
      color: @colorgreen;
      a{
        color: @colorgreen;
      }
    }

    Der LESS Code wird zu folgenden minimierten CSS:

    .redtext{color:#dd0005}.redtext a{color:#dd0005}.greentext{color:#0d0}.greentext a{color:#0d0}

    Zum nächsten Teil: LESS Dateien importieren
    Zur Tutorialübersicht: LESS Tutorial

  • CSS Styles definieren

    CSS Styles definieren

    Übersicht von Styleanwendungen auf verschiedene Objekte.  Es wird erklärt wie auf Class , ID , HTML Tag Styles übertragen werden. Des weiteren wird noch das :hover genauer erklärt.

    Class – .class

    Eine class erstellen: freestyle

    .freestyle{font-size:30px;}
    <span class="freestyle">Hello World</span>
    <span class="freestyle">Hello World</span>

    Klassen sind mehrfach auf Objekte anwendbar.

    ID – #ID

    ID: freestyle

    #freestyle{font-size:30px;}
    <span id="freestyle">Hello World</span>

    Es darf nur ein Element mit der selben ID existieren.

    HTML-Tag – TAG

    HTML-Tag: h2

    h2{font-size:30px;}
    <h2>Hello World</h2>

    Dieser Style wird auf jedes h2 Element auf der Seite übertragen.

    hover – STATE

    a{text-decoration:none;}
    a:hover{text-decoration:underline;}
    <a href="#">dies ist ein Link</a>

    dies ist ein Link

    :nth-child(an+b)

    Mit :nth-child kann auf jedes xte Sub-Element zugegriffen werden, dies bedeutet es kann z.B. jedes 2te Element angesprochen werden.

    .freestyle a:nth-child(2n+0) {
      background-color: red;
    }
    <div class="freestyle">
      <a href="#">Link 1</a>
      <a href="#">Link 2</a>
      <a href="#">Link 3</a>
      <a href="#">Link 4</a>
      <a href="#">Link 5</a>
    </div>
    .freestyle a:nth-child(2n+1) {
      background-color: red;
    }
    <div class="freestyle">
      <a href="#">Link 1</a>
      <a href="#">Link 2</a>
      <a href="#">Link 3</a>
      <a href="#">Link 4</a>
      <a href="#">Link 5</a>
    </div>

    :nth-of-type(an+b)

    Bei nth-of-type wird nach einem bestimmten Objekt gefiltert, dies bedeutet es muss nicht unbedingt ein direktes Sub-Elment von der Klasse sein.

    .freestyle p:nth-of-type(2n+0) {
      color: red;
    }
    <div class="freestyle">
      <p>P-Tag 1</p>
      <p>P-Tag 2</p>
      <p>P-Tag 3</p>
      <p>P-Tag 4</p>
    </div>

    P-Tag 1

    P-Tag 2

    P-Tag 3

    P-Tag 4

    CSS Tutorial

    Zur Turtorial-Reihe: CSS Tutorial

    Nächster Schritt: CSS Klassen kombinieren

  • JavaScript – Was ist continue?

    JavaScript – Was ist continue?

    In Schleifen können Labels gesetzt werden, dies sind Markierungen vor einer Schleife. Mit continue springt man zu diesem Label vor einer Schleife. Sprich eine art „goto“ in JavaScript, das nur in Schleifen verwendet werden kann.

    repeat:
    for(var i = 10; i >= 0; i--){
      console.log("i = " + i );
      for (var i2 = 10; i2 >= 0 ; i2--) {
        console.log("i2 = " + i2 );
        if(i2 === Math.floor((Math.random() * 10) + 1) )
          continue repeat;
      }
    }

    Bei diesem Beispiel wird die erste Schleife 10 Mal komplett ausgeführt, aber die Zweite Schleife wird abgebrochen sobald die Zufallszahl genau dem Index entspricht.
    Konsolenausgabe:

    i = 10
    i2 = 10
    i2 = 9
    i2 = 8
    i2 = 7
    i2 = 6
    i2 = 5
    i2 = 4
    i2 = 3
    i2 = 2
    i2 = 1
    i2 = 0
    i = 9
    i2 = 10
    i2 = 9
    i2 = 8
    i = 8
    i2 = 10
    i2 = 9
    i2 = 8
    i2 = 7
    i2 = 6
    i2 = 5
    i2 = 4
    i2 = 3
    i = 7
    i2 = 10
    i2 = 9
    i2 = 8
    i2 = 7
    i = 6
    i2 = 10
    i2 = 9
    i2 = 8
    i2 = 7
    i2 = 6
    i2 = 5
    i = 5
    i2 = 10
    i2 = 9
    i2 = 8
    i2 = 7
    i = 4
    i2 = 10
    i2 = 9
    i2 = 8
    i2 = 7
    i2 = 6
    i2 = 5
    i = 3
    i2 = 10
    i2 = 9
    i = 2
    i2 = 10
    i2 = 9
    i2 = 8
    i2 = 7
    i2 = 6
    i2 = 5
    i2 = 4
    i2 = 3
    i2 = 2
    i = 1
    i2 = 10
    i2 = 9
    i = 0
    i2 = 10
    i2 = 9
    i2 = 8
    i2 = 7
    i2 = 6
    i2 = 5
    undefined
  • Was ist rekursives Programmieren?

    Was ist rekursives Programmieren?

    Kurz gesagt rekursives Programmieren bedeutet, dass eine Funktion oder Methode sich selbst aufruft. Dies hat den Vorteil das der Code eleganter wirkt, sowie Wartbarer und effizienter ist. Ich werde anhand eines Beispiels erläutern, wie diese Programmierart eingesetzt werden kann.

    Wikipedia definiert rekursive wie folgt:

    Als Rekursion (lateinisch recurrere ‚zurücklaufen‘) bezeichnet man den abstrakten Vorgang, dass Regeln auf ein Produkt, das sie hervorgebracht haben, von neuem angewandt werden. Hierdurch entstehen potenziell unendliche Schleifen. Regeln bzw. Regelsysteme heißen rekursiv, wenn sie die Eigenschaft haben, Rekursion im Prinzip zuzulassen.

    Palindrom Beispiel

    Das Beispiel wird ein Palindrom-Tester sein, ein Palindrom ist ein Wort das Vorwärts sowie Rückwärts gleich geschrieben wird z.B. Regallager oder Rentner. Um dies zu prüfen habe ich folgende Funktion entworfen:

    function isPalindrome(myString) {
        if (myString.length <= 1) return true;
        if (myString.charAt(0) != myString.charAt(myString.length - 1)) return false;
        return isPalindrome(myString.substr(1, myString.length - 2)); 
    }

    Wie man sehen kann wird in Zeile 3 die Funktion selbst aufgerufen, daran erkennt man das es sich um eine rekursive Funktion handelt.

    Jetzt aber von Anfang an, Zeile 1:

    if (myString.length <= 1) return true;

    Hier wird geprüft ob der String 1 Zeichen lang ist, da ein Zeichen Vorwärts und Rückwärts gleich ist muss es ein Palindrom sein.

    Zeile 2:

    if (myString.charAt(0) != myString.charAt(myString.length - 1)) return false;

    Jetzt prüft die Funktion ob das erste Zeichen und das letzte Zeichen identisch ist, wenn nein soll die Funktion false zurückgeben.

    Zeile 3:

    return isPalindrome(myString.substr(1, myString.length -2));

    Jetzt geht es los, hier wird die Funktion zu einer rekursiven Funktion, da die Funktion sich selbst aufrufen tut. Als Parameter wird der String übergeben, aber vorher wird der String noch beschnitten. Es wird das erste und das letzte Zeichen entfernt. So wird der String von außen nach innen durchgearbeitet.

    Debug Beispiel

    function isPalindrome(myString) {
        if (myString.length <= 1) return true;
        console.log("(length > 1) = false");
        if (myString.charAt(0) != myString.charAt(myString.length - 1)) return false;
        console.log("(char 1 == char last) = true");
        return isPalindrome(myString.substr(1, myString.length - 2)); 
    }
    console.log(isPalindrome("Rentner".toUpperCase()));

    Gibt folgendes Aus:

    (length > 1) = false
    (char 1 == char last) = true
    (length > 1) = false
    (char 1 == char last) = true
    (length > 1) = false
    (char 1 == char last) = true
    -> true

    Es muss vorher toUpperCase angewandt werden, da sonst false ausgegebn wird, da R != r.

    console.log(isPalindrome("Palindrome".toUpperCase()));
    (length > 1) = false
    -> false

    verschachteltes Objekt analysieren

    In diesem Beispiel erläutere ich, wie man ein Objekt, mit einer Baumstruktur, mit einer rekursiven Funktion analysiert. Zum Beispiel, du hast ein Object in dem ein Array ist, in diesem wiederum mehrere Objekte mit jeweils einem Array ist und diesen Array ist wieder ein Objekt mit einem Array usw.. Praktisches Beispiel: ein Umfragetool mit N Unterkategorien hat Fragen die Pflichtfelder sind und neben diesen Fragen kann es wieder eine Unterkategorie geben mit nicht Pflichtfeldern geben. Jetzt ist die Aufgabe, eine Anzeige zu entwickeln die anzeigt wie viele Pflichtfelder es gibt.

    Beispielobjekt

    In diesem Beispiel gibt „state“ an, ob es sich um Pflichtfelder handelt.

    let myObj = {
      nestedObj: [
        {
          questions: [{},{}],
          state: true,
          nestedObj: [
           {
            questions: [{},{}],
            state: false
           },
           {
            questions: [{}],
            state: true,
            nestedObj: [
             {
               questions: [{},{}],
               state: true
             },
             {
               questions: [{}],
               state: false
             }
            ]
           }
         ]
        }
      ],
      questions: [{},{},{}],
      state: true
    }

    Jetzt willst du herausfinden, wie viele „questions“, mit dem „state“ true, existieren. Das Problem ist dabei, das es sich um eine Baumstruktur handelt. Deswegen kann es passieren, dass die rekursive Funktion sich mehrfach selbst aufruft. Deswegen muss der Ausgangswert mal X Objekte im Array subtrahiert werden.

    const reducer = (accumulator, currentValue) => accumulator + currentValue;
    function countQuestions(obj, count = 0) {
      if(obj.state)
        count += obj.questions.length;
      
      if(typeof obj.nestedObj != 'undefined' && obj.nestedObj.length != 0){
        return obj.nestedObj.map(nestedObj => countQuestions(nestedObj, count)).reduce(reducer) - (count * (obj.nestedObj.length-1));   
      }
      else
        return count;
    }

    Code Analyse

    const reducer = (accumulator, currentValue) => accumulator + currentValue;

    Das ist eine Helferfunktion für reduce, hierdrauf werde ich nicht weiter eingehen, einfach auf MDN web docs nachlesen was da passiert. Hinsweis: es handelt sich um eine ES6 Arrow Funktion.

    if(obj.state)
        count += obj.questions.length;

    In dieser If Abfrage, wird geprüft ob „state“ true ist und somit als Pflichtfeld gilt. Falls die Bedinung true, also Wahr, ist, sollen die Artikelanzahl summiert werden.

    if(typeof obj.nestedObj != 'undefined' && obj.nestedObj.length != 0){
        return obj.nestedObj.map(nestedObj => countQuestions(nestedObj, count)).reduce(reducer) - (count * (obj.nestedObj.length-1));   
    }

    Jetzt geht es ans eingemachte, zuerst wird geprüft ob das Objekt überhaupt ein Array hat und ob dieses auch Elemente beinhaltet.

    obj.nestedObj.map(nestedObj => countQuestions(nestedObj, count))

    Die Map Funktion in Kombination mit der Arrow Funktion, ruft die rekursive Funktion mehrfach auf. Sprich die Map Funktion würde ein Array mit der Anzahl der Pflichtfelder + der bisherigen gezählten Pflichtfelder zurückgeben. Beispiel: aktuell 3 Pflichtfelder und es gibt 2 Sub-Elemente mit jeweils 2 Pflichtfeldern, würde Map [5,5] zurückgeben.

    .reduce(reducer)

    Addiert alle Zahlenwerte im Array, bleiben wir bei dem Beispiel mit [5,5], würde reduce 10 zurückgeben.

    - (count * (obj.nestedObj.length-1)

    Da wir Ja nicht 10 Pflichtfelder haben, sondern 3 + 2 + 2 = 7, müssen wir den Basiswert (3) N-1 mal von dem Ergebnis abziehen, in diesem Fall: 2 Objekte – 1 = 1. Spricht unsere Rechnung: (3 + 2) + (3 + 2) – (3 * 1).

    in JSBin öffnen

  • CSS mehrere Transition versetzt starten

    CSS mehrere Transition versetzt starten

    Bei diesem Beispiel wird ein blaues Rechteck über das hover-Event zuerst transparent, danach ändert es die Höhe.

    div {
        width: 100px;
        height: 100px;
        background: #009ee0;
        opacity: 1;
        transition: 1s 1s height ease, 1s 0s opacity ease;
        display: block;
    }
    div:hover {
        opacity: 0.5;
        height: 150px;
    }

    Code-Erklärung um dies zu verstehen

    div {
        transition:   1s       1s      height  ease, 1s 0s opacity ease;
        //          dauer verzögerung   Was    type, -||-
    }

    Anfangseffekt auch als Endeffekt

    Da das hover-Event die Ausgangswerte von „transition“ überschreibt, muss der Startwert auf das hover-Event gesetzt werden und der invertierte Wert auf den Normalzustand.

    div {
        width: 100px;
        height: 100px;
        background: #009ee0;
        opacity: 1;
        transition: 1s 0s height ease, 1s 1s opacity ease;
        display: block;
    }
    div:hover {
        opacity: 0.5;
        height: 150px;
        transition: 1s 1s height ease, 1s 0s opacity ease;
    }

    CSS Tutorial

    Voriger Schritt: CSS Flexbox Tutorial

    Zur Turtorial-Reihe: CSS Tutorial

    Nächster Schritt: CSS: Checkbox styling