Mittwoch, 30. April 2014

Kurs Tag 17 - HTML & CSS - CSS: Listenstrukturierung, Childselektoren, attributabhängigen Selektoren, eigene Attribute

Mitschrift 30.04.2014

TAG 17

Besprechung und Fehlersuche meiner Arbeit von gestern:


Ausgabeergebnis

Quelltext:
<!doctype html>
<html>
    <head>
        <title>Bild nachgebaut</title>
       
        <style type="text/css">
        body {
            background-color: #000;
            font-family: verdana;
            font-weight: bold;
        }
               
        div {
            width: 245px;
            margin-bottom: 5px;
            background-color: #fff;
            text-align: center;
            vertical-align: 50%;
        }
       
        img {
            margin: 10px;
            vertical-align: middle;
        }
               
       
        ul {
            list-style-type: none;
            padding-left: 0px;
        }
       
        li {
            float: left;
            background-color: white;
            width: 245px;
            margin: 10px;
        }
       
        li#4 {
            clear: left;
        }
       
        <!--li:nth-child(4) {
            clear: left;
        }-->
           
        </style>
       
    </head>
   
    <body>
        <ul>
            <li id="1">
                <div>
                    <img src="001.png" />
                    <br />
                        <label>Bild 1</label>
                </div>
            </li>
           
            <li id="2">
                <div>
                    <img src="002.png" />
                    <br />
                        <label>Bild 2</label>
                </div>
            </li>
           
            <li id="3">
                <div>
                    <img src="003.png" />
                    <br />
                        <label>Bild 3</label>
                </div>
            </li>
           
            <li id="4">
                <div>
                    <img src="004.png" />
                    <br />
                        <label>Bild 4</label>
                </div>
            </li>
           
            <li id="5">
                <div>
                    <img src="005.png" />
                    <br />
                        <label>Bild 5</label>
                </div>
            </li>
           
            <li id="6">
                <div>
                    <img src="006.png" />
                    <br />
                        <label>Bild 6</label>
                </div>
            </li>
                   
        </ul>
   
   
    </body>
   
</html>

Tipps:
-> damit sich der Labeltext nicht neben das Bild stellt:

label {
 display: block
}


-> li:nth-child(4) {
            clear: left;
        }
Das li:nth-child(Nr.) ist ein Pseudo-Klassenselektor
Das vierte Listenelement wird im obigen Beispiel angesprochen!

&lt;p&gt;Ihr Browser kann leider keine eingebetteten Frames anzeigen: Sie können die eingebettete Seite über den folgenden Verweis aufrufen: &lt;a href="http://wiki.selfhtml.org/wiki/CSS/Selektoren/Pseudoklasse"&gt;SELFHTML&lt;/a&gt;&lt;/p&gt;
Exkurs: Hier habe ich mal spaßeshalber ein iframe (Seite in der Seite durch Verlinkung) eingesetzt über:
<iframe src="http://wiki.selfhtml.org/wiki/CSS/Selektoren/Pseudoklasse" width="100%" height="400" name="SELFHTML_in_a_box">
  <p>Ihr Browser kann leider keine eingebetteten Frames anzeigen:
  Sie k&ouml;nnen die eingebettete Seite &uuml;ber den folgenden Verweis
  aufrufen: <a href="http://wiki.selfhtml.org/wiki/CSS/Selektoren/Pseudoklasse">SELFHTML</a></p>
</iframe>
Ist nicht die eleganteste Lösung: 
  • Wenig Nutzerfreundlich
  • kein Content auf der eigenen Seite (schlecht für SEO, da Content King ist)
  • ich verlier die Leute nicht durch Links auf andere Seiten
besser: auswertbarer Inhalt
Barrierefreiheit, Usability und SEO gehören untrennbar zusammen :) "Habe ich Erfolg in dem einen Bereich, hab ich es auch in den anderen beiden"

=> Da man das so schlecht lesen kann, hier nochmal, as usual, als Link mit Textkopie:

Aus selfhtml.wiki: Bei Pseudoklassen handelt es sich um einfache Selektoren, die ein Element dann ansprechen, wenn es eine bestimmte Eigenschaft besitzt. So lassen sich zum Beispiel Elemente auswählen, über denen sich gerade der Mauszeiger (:hover) befindet oder Elemente, die das erste Kindelement (:nth-child() ) eines anderen Elementes sind. CSS unterscheidet:




für das nth-child gibt es folgende Steuerungsmöglichkeiten:
  • :nth-child(an+b) selektiert all diejenigen Kindelemente deren „Platznummer“ bei Division durch a den Rest b lässt.
  • :nth-child(odd) ist identisch zu :nth-child(2n+1) und :nth-child(2n-1) (ungerade Platznummer).
  • :nth-child(even) ist identisch zu :nth-child(2n) (gerade Platznummer).
  • :nth-child(b) selektiert nur das b-te Kindelement.
  • :nth-child(n) selektiert alle Kindelemente.


weitere Linktipps zu Pseudoklassen:

 

Vertiefung der Listenstrukturierung

Schrittweise von außen nach innen
  • Wir beginnen mit einer UL - diese können wir horizontal & vertikal strukturieren 
  • Dann bauen wir Listenelemente (li) ein
  • In die li setzen wir je ein Image (img) ein
  • !!! Bitte immer darauf achten, eine eingerückte hierarchische Struktur zu verwenden!!!
    -> Jetzt haben wir das Bild
  • Nun wollen wir einen Polaroideffekt um das Bild haben!
    • Lösung: Ich setze einen Div-Container um mein Bild und Label!
  • Damit ich sehen kann, wie mein Div-Container aussieht, setze ich einen Rahmen um den Div-Container
  • Ich stelle fest, dass der div-container über die gesamte Breite geht
    • Warum? Weil mein Li auch über die gesamte Breite geht
    • Das führende Strukturelement ist das li - deshalb geb ich dem li eine Breite mit width:
  • Dann gebe ich dem li eine Background-color
    (wenn ich möchte - muss nicht sein, so sieht man nur die Auswirkungen von li - muss man später eh wieder rauslöschen)
  • Dann sag ich dem div, er soll einen Außenabstand haben mit margin
  • wenn ich das li groß mache, stellt sich das Label neben das Bild:
    • Lösung:
      • ich mache das Bild oder das label zu einem Blockelement - Transformation über: label {display: block;}
  • Dann trage ich bei label noch ein: text-align: center;
  • Hintergundfarbe des Bodys machen wir schwarz:
    • body {background-color: black;}
  • jetzt färben wir den border in ein dunkles Grau
  • Als nächstes nehme ich die Aufzählungspunkte raus:
    • ul {list-style-type: none;}
  • Jetzt wollen wir die Bilder zu dritt nebeneinadner stellen:
    • wir floaten die li: li {float: left;} - jetzt sind alle nebeneinander:
  • Das float soll beim vierten Bild unterbrochen werden:
    • Pseudoklassen-Selektor: li:nth-child(4) {clear: left;} oder
    • Klassenselektor: 
      • HTML: class="bild4"
      • CSS: li.bild4: {clear: left}
Ergebnis siehe [oben] (dieser Link ist ein Test - seid mir nicht, böse, wenn er nicht funktioniert - scrolled einfach wieder nach oben zum Anfang der Tagesmitschrift ;) - Danke!)

Childselektoren

schreibweise Childselektoren
ul > li > div > label
Die Childselektoren gehören zu den Pseudoklassen - der childselektor arbeitet, indem er die Elemente in Eltern-Kind-Beziehung zueinander stellt:
nur, wenn diese Reihenfolge der "Kinder" (Kind von, Kind von, Kind von...) eingehalten wird, dann soll der Selektor angewendet werden!



Hierarchie / Spezifität:
-> div > p: Ich formatieren das p, das in direkter Reihenfolge mit dem div steht
  • ich kann rein auf der Elementebene Basisformatierungen durchführen
  • also ohne im HTML Verweise schreiben, genau beschreiben, welches Element zur Formatierung angesprochen werden soll. 
  • wir verknüpfen Elementselekjtoren miteinander!
  • Der ID-Selektor, bspw: p#irgendwas ist weiterhin dominanter/ besitzt eine höhere Spezifität
  • sollte ich einen Childselektor mit einem ID-Selektorr verknüpfen: div > p#irgendwas - ändert es sich - und der Child-ID-Selektor besiztt eine höhere Spezifität! - er ist genauer!
  • Die Regeln der Spezifität sind hier wieder anwendbar.
VORTEIL: So sind wir in der Lage, Formatierungen auch nachträglich durchzuführen!


Der Pfad des Childselektors werden vom Firebug angezeigt - der firebug unterstützt uns - allerdings zeigt er den PÜfad andersherum an!
Der firebug unterstütz uns, indem er uns den Pfad des Childelements zeigt (allerdings in umgekehrter Reihenfolge)


Beispiel:
Ich möchte jetzt ein bestimmtes Bild anders formatieren:
  • gehe in firebug auf das Bild im Quelltext, 
  • dann mit rechter Maustaste auf das img-Tag, 
  • dann "CSS-Pfad kopieren" und 
  • dann können wir es in unseren Quelltext als Pfad kopieren:
    • html body ul li div img = copy and paste - Ausgabe
    • wir können auch ohne die Größerzeichen (>) formatieren:

      • ul li:nth-child(5) div img {border: 4px solid red;
 oder
      • ul > li:nth-child(5) > div > img {
       
                              border: 4px dotted red

                      } 

ERGO: Wir geben also den Weg zum Element über die Elternbeziehung an! 

Selektoren-KOMBINATION:
Frage: Ist es möglich, dass Elternangaben nicht aus reinen Elementselektoren bestehen? Können wir es kombinieren mit ID- und Klassenselektoren?
Antwort: Ja - bspw: div > p#irgendwas > span


Attributsabhängige Selektoren
Datei: Attrib-selektoren.html

Bisher kannten wir Formatierungen anhand von Element-, klassen- und ID-Selektoren - heute kamen noch die Seudoklassenselektoren als Kombinationsmöglichkeit hinzu .

Jetzt können wir sogar die Attribute nachfragen:
img[title] {} 
ACHTUNG: kein Leerzeichen zwischen img & der [] Klammer!!! 

Was bedeutet eigentlich der Attributsabhängige Selektor: image[title]?
Er bedeutet: formatiere jedes img-Tag, welches ein title-Attribut eingetragen hat! 

Attributabhängigen Selektoren

Ich kann auch die attributabhängigen Selektoren noch weiter spezifizieren:
  • Allgemein: alle Bilder mit Titel:
    • img[title] {
              border-color: green;
          }
  • Spezifischer für das mit Bild mit dem bestimmten Titel:
    • img[title="Bildbeschreibung"] {
              border-color: yellow;
          }  
 -> diese Spezifikation bedeutet: formatiere mir alle image-Tags mit diesem Titel (und wenn es nur das eine ist ;) )= Bildbeschreibung wie folgt!


Das kann man auch für andere Tags, wie das input-Tag anwenden:
Ich kann die attributsabhängigen Selektoren auch durch Komma getrennt hintereinanderschreiben!
->So kann ich mit einem Selektor sämtliche Elemente treffen!

Anwednung findet dies gerne bei Formularen, da wir so sämtliche Eingabe-Felder über die Attribuierung steuern können!


Ich kann dann sogar size-Vorgaben überschreiben :)
input[type="text"] {
        padding: 10px;
        color: red;
    }
so kann ich mir ne Bibliothek aufbauen:

Bibliothek in Kombination mit einer Form :)





 
Wiederholung: mit dem alt-Attribut kann man den Browser dazu anweisen, diesen alternativen Text anzuzeigen, wenn das Bild nicht angezeigt werden kann!
bsp: <img alt="Bild: hier würde sonst ein Bild mit einer Maus angezeigt" /> 
- Dieser Text würde auch vorgelesen werden in Geräten mit Sprachwiedergabe (Screenreader)
-> Daher sind text und title und alt wichtige Dinge für die Barrierefreiheit!

Wir können unsere Eigenen Attribute setzen!


Ausgabe



Quelltext



über kapitel (oder sonst ein erfundenes Attribut)="einleitung" inhalt="Beschreibung"

h1[kapitel]

Warum das Ganze? Wir können eine Transparenz schaffen, in der auch inhaltlich geklärt wird, worum es geht.
Erst seit dem XHTML.0 möglich.

Allerdings haben diese selbstdefinierten Attribute keinerlei Funktion! 

Klausur: 90 min erhalten Probeklausur und wichtige Kapitel im vorhinein.


Vorschau auf Freitag: Positioning (absolutes Positionieren)

Dienstag, 29. April 2014

Kurs Tag 16 - HTML & CSS - CSS: Navigationen bauen mit Listen und float

Mitschrift 29.04.2014

TAG 16


Strukturierung von Navigationen
mit Hilfe von Float

Dokument des Dozenten: navigation-1.html


In dieser Datei wurde eine Navigation mit Hilfe von Listen gebaut:

<!doctype html>
<html>
<head>

    <title>Navigation</title>
    <meta name="author" content="Michael Sewelies">

    <style type="text/css">
   
    </style>

</head>

<body>

    <ul>
        <li><a href="#">Home</a></li>
        <li><a href="#">Produkte</a></li>
        <li><a href="#">Katalog</a></li>
        <li><a href="#">Team</a></li>
        <li><a href="#">Impressum</a></li>
    </ul>

</body>

</html>
So sieht die hochgestellte Datei aus

Schritt für Schritt- Bearbeitung der CSS-Angaben, um eine Navigation aufzubauen.


1. Schritt: 
zunächst die Aufzählungszeichen wegmachen: 
css3you>listen>Aufzählungszeichen (list-style-type=none)


<style type="text/css">
        ul {
            list-style-type: none;
        }

       
    </style>

wir haben listenelemente / Blockelemente und wollen nun eine Navigation bauen

2. Schritt:
Listenelemente floaten, damit die Listenelemente nebeneinander aufgereiht sind:
<style type="text/css">
        ul {
            list-style-type: none;
        }
       
        li {
            float: left;
        }
       
    </style>


gefloatete Listenelemente
die Elemente stehen jetzt direkt nebeneinander, haben aber keinen Abstand dazwischen. Wie bekommen wir einen gleichmäßigen Abstand / gleichmäßige Breite zwischen den Elementen hin?

3. Schritt:
das Listenelement (Blockelemen) erhält eine feste Breitenangabe:
<style type="text/css">
        ul {
            list-style-type: none;
        }
       
        li {
            float: left;
            width: 75px;
        }
       
    </style>


gefloatete Listenelemente mit definierter Breite
4. Schritt:
den Text mittig ausrichten, damit die Abstände gleichmäßiger werden:

Vorschlag eines Teilnehmers: 
wir können das a-Tag zentrieren 
ABER: -> a ist ein Inlineelement und nimmt sich nur den Platz, den der Text benötigt...also müssen wir aus a erst ein Blockelement machen:

Css4you>text>horizontale Ausrichtung (text-align: left, center, justify, right)


<style type="text/css">
        ul {
            list-style-type: none;
        }
       
        li {
            float: left;
            width: 75px;
        }
       
        a {
            display: block;
            text-align: center;
        }

       
    </style>

Das Display transformiert die Elemente. 
Kurze Erklärung der Wahl von block:
Wir benötigen ein reines Blockelement: also display = block und nicht inline-block, da es dann eine Mischform wäre, die immernoch Eigenschaften eines Inlineelementes aufweist.
Css4you>a-z>d>display

Wiederholung: 
Das Display-Element ist dafür da, ein Inline-Element (display=block) zu einem Blockelement oder ein Blockelement (display=inline) zu einem Displayelement zu machen bzw auch Mischformen (display=inline-block) zu erstellen.

Wenn ich Navigationen baue, muss ich sehen, was ich baue - da hilft die background-color! - also bei li die background-color einstellen:
li {
            float: left;
            width: 75px;
            background-color: #efefef;
        }
So sieht man auch, warum wir die width eingestellt haben und es nicht über die margin gelöst haben:
  • Die Margin (Außenabstand würde als weiße Zwischenabstände angezeigt werden) 
  • die width bildet eine Art Balken hinter allen Listen-Elementen

gefloatete Listenelemente mit definierter Breite und Hintergrundfarbe

So, jetzt haben wir aus dem a-Tag ein Blockelememnt gemacht. Unser Ziel ist aber eine solche Navigation:

Ich muss das aTag zu einem Blockelement machen, da ich sonst nur den Link dort habe, wo die Schrift des a-Tags ist (Eigenschaft von Inlineelementen - sie erstrecken sich nur über die Breite des Inhaltes -. dier der Text "Team")
a-Tag als Inline-Element
(blau ist der auszulösende Bereich des Links - hie rnur über die Breite des Textes)

- als Blockelement (Eigenschaft - ich kann die Breite durch width einstellen und somit erstreckt sich das Element über die gesamte definierte Breite) ist der gesamte Bereich der Blockelements ein Link!!! 
a-Tag alsBlock-Element
(blau ist der auszulösende Bereich des Links - hier über das gesamte Element)

Klarer Vorteil für eine gute Usability.
 

5 Schritt: 
Rahmen um die Listenelemente:
<style type="text/css">
        ul {
            list-style-type: none;
        }
       
        li {
            float: left;
            width: 75px;
            background-color: #efefef;
            margin-right: 3px;
        }
       
        a {
            display: block;
            text-align: center;
            border: 1px solid #333333;
        }
       
    </style>
gefloatete Listenelemente mit definierter Breite und Hintergrundfarbe, Außenabstand & Rahmen
Schritt 6:
Farbwechsel , wenn ich mit der Maus über die Kästen fahren
Dazu benötigen wir Pseudo-Klassen - insbesondere den hover (Ein Event, der Sachen verändern kann, wenn ich mit der Maus drüberfahren! = Mouseover-Effekt!)
css4you>(hover)

<style type="text/css">
        ul {
            list-style-type: none;
        }
       
        li {
            float: left;
            width: 75px;
            background-color: #efefef;
            margin-right: 3px;
        }
       
        a {
            display: block;
            text-align: center;
            border: 1px solid #333333;
        }
       
        a:hover {
            color: orange;
        }

       
    </style>

gefloatete Listenelemente mit definierter Breite und Hintergrundfarbe, Außenabstand & Rahmen und hover (Mouseover-Effekt) :)

Pseudo Klassen / Elemente -> Hover:
Die Pseudoelemente benötigen einen Doppelpunkt ":" - dieser stellt eine Instanz zu den Interaktionen her = Pseudo-Klassen!

Das heißt: dieser Stylesheet "a:hover wird nur dann aufgerufen, wenn wir mit der Maus hovern = darüberfahren und zwar über den mit a referenzierten Link! Sonst ist er nicht aktiv!
So haben wir eine Möglichkeit als User mit dem Browser zu interagieren 
-> User fährt mit der Muas darüber und 
-> der Browser wendet den hover an!

Pseudoklasse a:hover (mit Mouseover-Effekt) "an" bzw aktiv - bezieht sich nur auf das a-Tag! Sobald ich mit der Maus drüberfahre, soll er die Farbe wechseln

Pseudoklasse a:hover (mit Mouseover-Effekt) "aus" bzw inaktiv - bezieht sich nur auf das a-Tag! Sobald ich mit der Maus drüberfahre, soll er die Farbe wechseln, sonst nicht!

Was können wir noch tun, wenn der User mit der Maus über den link fährt?
  • Linkfarbe ändern
  • Schriftart könnte sich ändern
  • Schriftgröße
  • Background-color, 
  • Border-Einstellungen, 
  • bold, italic...
Wir können alle Attribute verändern, die im Einzugsgebiet des zugehörigen Tags sind!
=> Wir haben viele Möglichkeiten, es ist halt die Frage, was sinnig ist ;)

Beispiel:
a:hover {
            color: orange;
            font-family:arial;
            font-style: italic;
            border: 2px dashed red;
            background-color: white;
        }
Spielerei: Hover verändert :)

über text-decoration: none können wir den Unterstrich unter dem Link entfernen! :)
 
 <style type="text/css">
        ul {
            list-style-type: none;
        }
       
        li {
            float: left;
            width: 75px;
            background-color: #efefef;
            margin-right: 3px;
        }
       
        li:hover {
            background-color: #222;
            border-bottom: 10px solid red;
        }
       
        a {
            display: block;
            text-align: center;
            border: 1px solid #333333;
        }
       
        a:hover {
            color: orange;
            font-family:arial;
            font-style: italic;
            border: 2px dashed red;
            background-color: white;
            text-decoration: none;
        }
       
    </style>

wir können auch das Listenelement hovern

li:hover {
            background-color: #222;
            border-bottom: 10px solid red;
        }


text-decoration sorgt dafür, dass der Linktext nicht mehr unterstrichen ist


Frage: Wie kann ich die ganze Navigation zentrieren?
Also einen div um die UL bauen und eine Id geben: wrapper:

<div id="wrapper">

<!doctype html>
<html>
<head>

    <title>Navigation</title>
    <meta name="author" content="fraukalke">

    <style type="text/css">
       
        div#wrapper {
            margin-left: auto;
            margin-right: auto;
        }
       

        ul {
            list-style-type: none;
        }
               
        li {
            float: left;
            width: 75px;
            background-color: #efefef;
            margin-right: 3px;
        }
       
        li:hover {
            background-color: #222;
            border-bottom: 10px solid red;
        }
       
        a {
            display: block;
            text-align: center;
            border: 1px solid #333333;
            text-decoration: none;
        }
       
        a:hover {
            color: orange;
            font-family: arial;
            font-style: italic;
            border: 2px dashed red;
            background-color: white;
            text-decoration: none;
        }
       
    </style>





</head>






<body>

    <div id="wrapper">
    <ul>
        <li><a href="#">Home</a></li>
        <li><a href="#">Produkte</a></li>
        <li><a href="#">Katalog</a></li>
        <li><a href="#">Team</a></li>
        <li><a href="#">Impressum</a></li>
    </ul>
    </div>
</body>

</html>


Mmh - klappt irgendwie nicht sonderlich gut.

ABER - der Dozent leitet uns eine Datei weiter, in der er es anders gelöst hat:
zentrieren-1.html:
Die klassische Art des zentrieren geht über margin: 0 auto;
div#inner {margin: 0 auto;} = 2 Werte: 0 für untern und oben und auto für links und rechts

Margin ist für die Zentrierung ausschlaggebend. Es macht aber nur Sinn, wenn das innere8das zu zentriuerende Element) kleiner ist, als der äußere Rahmen (Elternelement)!

Ausgabe des oberen Quelltextes (zentrieren-1.html)
Und jetzt nochmal zu unserem Fall:
die UL hat default-mäßig ein padding-left von 40px - also zunöchst in die ul {padding-left: 0px;} eintragen.
Jetzt wollen wir die UL mittig stellen.
also margin einstellen - dafür geben wir es unserem wrapper mit:


Vorschau auf morgen: Positioning (absolutes Positionieren)
Navigationslinks nebeneinander - mit float

Navigationslinks untereinander - ohne float
ich kann es aber auch dazu nutzen Bilder, wie folgt, anzuordnen:
Bilder mit float und clear nebeneinander und untereinander anordnen
Warum nutzen wir für Navigationen und Bilder Listen???
!!!Das li gehölrt zu einem Ul-Verbund und ist damit zählbar. Ich kann nth-child zuweisen!
Ich kann es auch berechnen und sagen: jedes dritte, jedes vierte...!!!

Der div-Container ist nur zum Strukturieren da - mit der UL kann ich dann berechnen :)

So könnte ich auch sagen:" Wenn das Device/Ausgabegerät kleiner wird, kann ich die einzelnen Elemente genau ansprechen und bspw sagen, dass sie kleiner werden sollen, wenn das Ausgabegerät kleiner wird und umgekehrt.
Aufgabe für heute nachmittag:
Dieses Bild nacharbeiten
Bitte das Bild oben nacharbeiten! Achting mit Polaroid-Effekt und Bildnamen!
Tipp:

Bootstrap - CSS-Hilfe gerade toll für Responsive-Design :)