<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>maddesigns</title>
	<atom:link href="http://maddesigns.de/feed" rel="self" type="application/rss+xml" />
	<link>http://maddesigns.de</link>
	<description>Moderne Webentwicklung mit HTML5 &#38; CSS3 / Responsive Webdesign</description>
	<lastBuildDate>Mon, 16 Nov 2020 15:20:53 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.26</generator>
	<item>
		<title>Native CSS Grid Layouts ohne Framework – ein einfaches Beispiel</title>
		<link>http://maddesigns.de/css-grid-layout-2764.html</link>
		<comments>http://maddesigns.de/css-grid-layout-2764.html#comments</comments>
		<pubDate>Tue, 14 Mar 2017 11:59:07 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[Grids]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2764</guid>
		<description><![CDATA[<p>Für die nächste Ausgabe des t3n Magazin (Nr. 48) schreibe ich einen Artikel über CSS Grids… hier vorab ein kleiner Ausschnitt daraus. Eine neue CSS Grid Layout Spezifikation gibt Webworkern nun die Möglichkeit eigene Grids nach den jeweiligen Anforderungen selbst zu definieren. Das ist nicht nur für Seitenlayouts, sondern auch für Modul-Layouts sehr nützlich. Aber &#8230; <a href="http://maddesigns.de/css-grid-layout-2764.html" class="more-link"><span class="screen-reader-text">Native CSS Grid Layouts ohne Framework – ein einfaches Beispiel</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/css-grid-layout-2764.html/" target="_blank">Native CSS Grid Layouts ohne Framework – ein einfaches Beispiel</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p><strong>Für die nächste Ausgabe des <a href="http://t3n.de/magazin/">t3n Magazin</a> (Nr. 48) schreibe ich einen Artikel über CSS Grids… hier vorab ein kleiner Ausschnitt daraus.</strong></p>
<p>Eine neue <a href="https://www.w3.org/TR/css-grid-1/">CSS Grid Layout Spezifikation</a> gibt Webworkern nun die Möglichkeit eigene Grids nach den jeweiligen Anforderungen selbst zu definieren. Das ist nicht nur für Seitenlayouts, sondern auch für Modul-Layouts sehr nützlich. Aber zugegeben sind auch sehr viele neue Eigenschaften zu lernen, 17 neue Eigenschaften in Summe.</p>
<p><span id="more-2764"></span></p>
<p>Nun wird sich der ein oder andere Entwickler fragen: „ok, aber was ist jetzt der Unterschied zu Flexbox“? Einige Entwickler nutzen bereits Flexbox anstatt „Floats“ als CSS-Technik für Grid-Layouts.</p>
<p>Wenn man Layouts wie gewohnt in 12 Spalten aufbaut und diesen Aufbau nicht verändert, sondern nur die unterliegende CSS-Technik, dann klingt das auch erstmal logisch und einfach Flexbox zu verwenden. Deshalb nutzt <a href="https://v4-alpha.getbootstrap.com/layout/grid/">Bootstrap ab Version 4 auch Flexbox-Grids</a>. </p>
<p><strong>Was ist nun der Unterschied zwischen Flexbox und CSS Grids?</strong></p>
<p>CSS Grids sind zweidimensional, Flexbox ist eindimensional. Flexbox-Grids sind bildlich gesprochen nur 1-zeilig (<code>flex-wrap: wrap</code> mal ignoriert), also Zelle für Zelle auf einer Zeile ohne Umbruch. Ein CSS Grid-Layout kann man über mehrere „Zeilen“ aufbauen. Man stelle sich vor, dass man ein einfaches Seitenlayout hat. Dort ist eine Spaltigkeit für header und footer festgelegt &#8211; dies kann man natürlich auch mit Flexbox abbilden, aber die Zellen haben untereinander keine Verbindung. Mit einem CSS Grid-Layout ist das anders, dort gibt es ein sogenanntes Grid-Template, das für den Bereich gilt. </p>
<figure><img src="http://maddesigns.de/wp-content/uploads/2017/03/grid-vs-flexbox.svg" alt="" /></figure>
<p><strong>Aber vielleicht mal ein einfaches Beispiel als Einstieg: ein 3-spaltiges „Komponenten-Layout“. Hier das visuelle Ergebnis, was wir mit CSS Grids aufbauen möchten:</strong></p>
<figure style="margin-bottom: -15%">
<img src="http://maddesigns.de/wp-content/uploads/2017/03/grid-example-e-640x225.png" alt="Komponenten-Layout, 3-spaltiges Grid" width="640" height="225" class="alignnone size-large wp-image-2774" srcset="http://maddesigns.de/wp-content/uploads/2017/03/grid-example-e-640x225.png 640w, http://maddesigns.de/wp-content/uploads/2017/03/grid-example-e-360x127.png 360w, http://maddesigns.de/wp-content/uploads/2017/03/grid-example-e-768x270.png 768w" sizes="(max-width: 640px) 100vw, 640px" /><br />
</figure>
<p><strong>Ein Komponentencontainer (.wrapper) und 4 Inhaltscontainer (.box)</strong></p>
<pre class="language-markup"><code>&lt;div class=&quot;wrapper&quot;&gt;
  &lt;div class=&quot;box a&quot;&gt;.a&lt;/div&gt;
  &lt;div class=&quot;box b&quot;&gt;.b&lt;/div&gt;
  &lt;div class=&quot;box c&quot;&gt;.c&lt;/div&gt;
  &lt;div class=&quot;box d&quot;&gt;.d&lt;/div&gt;
&lt;/div&gt;
</code></pre>
<p>Für diese Komponente fügen wir nun ein Grid-Layout hinzu.</p>
<p><strong>Ein neuer Wert für die CSS-Display-Eigenschaft: `grid`:</strong></p>
<pre class="language-css"><code>/* grid layout, 3 columns */
.wrapper {
  display: grid; /* display: inline-grid;*/
  grid-template-columns: 1fr 1fr 1fr; /* 3 x 1 fraction */    
}
</code></pre>
<p><code>display: grid</code> ist wie <code>display: flex</code> ein neuer Wert für die Display-Eigenschaft des Container-Elements. Alle direkten Kinder werden dann zu Grid-Elementen. Zu den neuen Layout-Eigenschaften bringt CSS Grids auch eine neue Maßeinheit mit. Gridgrößen können natürlich auch weiterhin mit allen vorhanden Maßeinheiten erstellt werden. Sowohl Prozent-, als auch Pixelwerte, als auch weitere Breiteneinheiten sind möglich. Grid-Zellengrößen können nun in &#8218;fr&#8216; (fraction) angegeben werden. Als Beispiel können drei gleich breite Spalten mit <code>grid-template-columns: 1fr 1fr 1fr;</code> erstellt werden. Ein 2-spaltiges Grid mit einer großen Haupt- und einer Marginalspalte im Verhältnis 2:1 erstellt man wie folgt: <code>grid-template-columns: 2fr 1fr;</code> – <code>1fr</code> bedeutet 1 Teil, <code>2fr</code> bedeutet 2 Teile der Gesamtbreite. Je Spalte wird je ein Wert getrennt mit Leerzeichen geschrieben. Für das letzte Beispiel könnte man auch <code>grid-template-columns: 66.667% 33.334%;</code> schreiben. </p>
<p><strong>12 gleich breite Spalten, das klassische 12-spaltiges Layout?</strong></p>
<p>Der Aufbau geht natürlich auch mit 12 gleichen Werten, aber der Einfachheit halber gibt es die <code>repeat()</code>-Funktion: <code>grid-template-columns: repeat(12, 1fr);</code> – 12 gleiche Spalten, quasi je 1/12 Spaltenbreite. Für zeilenweise Grids gibt es das Pendant <code>grid-template-rows</code>. Möchte man z.B., dass der Seitenheader und der -footer eine bestimmte Höhe haben, der Inhalt dazwischen aber flexibel ist, kann man <code>auto</code> als Höhe für den Hauptinhalt angeben, Beispiel: <code>grid-template-rows: 10em auto 10em;</code>, Seitenheader und -footer sind hier genau <code>10em</code> hoch. Für unser Beispiel von oben machen wir für die Grid-Zeilen keine Größenvorgaben, dann sind die Gridzellen, wie bei Flexbox, alle gleich hoch und zwar so groß wie die größte Zelle der gesamten Zeile.</p>
<h3>Positionierung im CSS-Grid</h3>
<p>Historisch bedingt gibt es ähnlich wie bei Flexbox unterschiedliche Schreibweisen um Position und Größe einer Grid-Zelle festzulegen. Die unterschiedlichen Schreibweisen können aber in allen Browsern verwendet werden. Folgende Schreibweisen ergeben alle die gleiche Positionierung:</p>
<pre class="language-css"><code>.a {
  /* starts at col pos 1, spans 2 cols */
  grid-column: 1 / span 2;
  /* starts at row pos 1, spans 1 row */
  grid-row: 1 / span 1;
}

.a {
  grid-column-start: 1;
  grid-column-end: 3;
  grid-row-start: 1;
  grid-row-end: 2;
}

.a {
  /* grid-column-start: 1 / grid-column-end: 3 */
  grid-column: 1 / 3;
  /* grid-row-start: 1 / grid-row-end: 2 */
  grid-row:    1 / 2;
}
</code></pre>
<figure>
<img src="http://maddesigns.de/wp-content/uploads/2017/03/grid-example-c1-640x366.png" alt="Grid-Layout mit Positionierungslinien (Tracks)" width="640" height="366" class="alignnone size-large wp-image-2773" srcset="http://maddesigns.de/wp-content/uploads/2017/03/grid-example-c1-640x366.png 640w, http://maddesigns.de/wp-content/uploads/2017/03/grid-example-c1-360x206.png 360w, http://maddesigns.de/wp-content/uploads/2017/03/grid-example-c1-768x439.png 768w" sizes="(max-width: 640px) 100vw, 640px" /><figcaption>Zwischenstand: Bereich <code>.a</code> ist zwei Spalten groß, Bereich <code>.b</code> rutscht automatisch in die nächste Spalte, <code>.c</code> auf die nächste Zeile</figcaption></figure>
<p>Die Eigenschaften <code>grid-column/-row</code> sind für die Positionierung der Zellen im Grid zuständig, wobei <code>grid-column/-row</code> die Kurzschreibweise für <code>grid-column-start/-end (grid-row-start/-end)</code> ist. Bei dieser Schreibweise gibt man die Startposition und die Endposition der Zelle an. Die alternative Schreibweise ist, dass man die Startposition angibt und nicht die Endposition, sondern über wie viele Spalten sich die Grid-Zelle aufspannen soll. Die Angabe lautet dabei <code>span anzahl</code>, also hier im Beispiel <code>span 2</code>, zwei Spalten vom Grid-Layout nimmt die Gridzelle ein. </p>
<pre class="language-css"><code>.a {
  grid-column: 1 / span 2;
  grid-row: 1 / span 1;
}
.b {
  grid-column: 3 / span 1;
  grid-row: 1 / span 2;
}
</code></pre>
<p>Dies ist ebenso für das Überspannen von Zeilen möglich – <code>grid-row: 1 / span 2;</code> – überspannt zwei Zeilen beginnend ab Zeile 1. Der Default-Fall ist, dass eine Zelle automatisch platziert wird und 1 Spalte breit ist, also in CSS-Code gesprochen: <code>grid-column: auto / span 1;</code>.</p>
<figure>
<img src="http://maddesigns.de/wp-content/uploads/2017/03/grid-example-h-640x225.png" alt="Fertiges Layout, flexible in der Höhe, je nach Inhalt gleich hohe Spalten" width="640" height="225" class="alignnone size-large wp-image-2776" srcset="http://maddesigns.de/wp-content/uploads/2017/03/grid-example-h-640x225.png 640w, http://maddesigns.de/wp-content/uploads/2017/03/grid-example-h-360x127.png 360w, http://maddesigns.de/wp-content/uploads/2017/03/grid-example-h-768x270.png 768w" sizes="(max-width: 640px) 100vw, 640px" /><br />
</figure>
<p><em>Die Postionen im Grid sind in den aktuellen Firefox Dev-Tools schön visualisiert. Die Endposition ist manchmal nicht so klar, manchmal hilft es, wenn man die Hand zur Hilfe nimmt, die Grid-Spalten sind immer die Zwischenräume zwischen den Finger. So beginnt das Grid dann immer mit dem ersten Finger (Pos. 1) und endet mit der letzten Position, bei einem 3-spaltigen Grid ist das die Position 4.</em></p>
<p><strong>Für unser Layout brauchen wir im Grunde nur 5 Zeilen CSS:</strong></p>
<pre class="language-css"><code>.wrapper {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-gap: 12px;
}

.a {
  grid-column: auto / span 2;
}

.b {
  grid-row: auto / span 2;
}</code></pre>
<p><strong>Codepen-Beispiel (für Browser die Grids unterstützen ohne Fallback):</strong></p>
<p data-height="313" data-theme-id="0" data-slug-hash="vxJLYa" data-default-tab="css,result" data-user="maddesigns" data-embed-version="2" data-pen-title="CSS Grid by example, simple 3 column grid component layout" class="codepen">See the Pen <a href="http://codepen.io/maddesigns/pen/vxJLYa/">CSS Grid by example, simple 3 column grid component layout</a> by Sven Wolfermann (<a href="http://codepen.io/maddesigns">@maddesigns</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<p><script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script></p>
<h3>Definierte Gridlinien-Benennung</h3>
<p>Zudem gibt es die Möglichkeit Gridlinien-Benennung in der Gridvorlage zu vergeben. Dies passiert im <code>grid-template-*</code>, Liniennamen werden umschlossen mit einer eckigen Klammer deklariert. Unser Beispiel mit benannten Gridlinien:</p>
<pre class="language-css"><code>.wrapper {
  display: grid;
  grid-template-columns: [grid-line1] 1fr [grid-line2] 1fr [grid-line3] 1fr [grid-line4];
}
.a {
  grid-column: grid-line1 / grid-line3;
}
</code></pre>
<p>Bei der Benennung kann man natürlich kreativer sein. Mit den Liniennamen können dann auch Positionen im Grid vergeben werden.</p>
<p>Der Vollständigkeit halber hier der Code für die Zellen <code>.c</code> und <code>.d</code>, wenn man die Positionen fixieren möchte. Da sich Gridzellen grundsätzlich im <code>autoflow</code> verteilen, wäre der Code aber für das erwartete Ergebnis unnötig.</p>
<pre class="language-css"><code>.a {
  grid-column: 1 / span 2;
}
.b {
  grid-column: 3;
  grid-row: 1 / span 2;
}
.c {
  grid-column: 1;
  grid-row: 2;
}
.d {
  grid-column: 2;
  grid-row: 2;
}</code></pre>
<p>An dieser Stelle auch der Hinweis, dass sich durch Grid super einfach die visuelle Reihenfolge der Elemente mit CSS manipulieren lässt. Bei Flexbox ist dies mit <code>order</code> möglich. Bei Grids greift hier die Positionierungslogik, so kann man ganz simpel eine Navigation vom „Header“ in den „Footer“ verschieben, wenn man das möchte. Die Source-Order im HTML bleibt davon unberührt. Hier muss man prüfen, ob das nicht die Barrierefreiheit beeinträchtigt, wenn man es anwendet.</p>
<h2>Browser Support</h2>
<p>Der Browser-Support bei neuen CSS-Eigenschaften ist immer etwas spezielles, teilweise muss man Jahre warten bis alle Browser die Eigenschaften unterstützen, damit man den Code produktiv einsetzen kann. Bei CSS Grids gibt es eine Besonderheit, alle modernen Browser unterstützen nahezu zeitgleich die Eigenschaft und wer den Internet Explorer oder MS Edge unterstützt, hat Glück, da bereits der IE10 CSS Grids der ersten Spezifikation unterstützt. Microsoft hat die Eigenschaften entwickelt und in den IE10 integriert. Seither haben die anderen Browserhersteller zusammen mit Microsoft an einem W3C-Standard gearbeitet und die überarbeitete Fassung in die Browser implementiert. So ist es mit Autoprefixer möglich einige Eigenschaften automatisch für die alten Internet Explorer zu generieren, allerdings nur für die Eigenschaften, die der IE unterstützt. Eine gute Übersicht hat <a href="https://rachelandrew.co.uk/archives/2016/11/26/should-i-try-to-use-the-ie-implementation-of-css-grid-layout/">Rachel Andrew</a> zusammengestellt. Zu Bedenken ist aber, dass alte Android-Versionen CSS Grids nicht unterstützen. Zudem ist zu empfehlen, dass der Browser-Support mit <code>@support</code> im CSS zu überprüfen ist und die Grid-Eigenschaften in die At-Rule gekapselt werden. Polyfills gibt es in der Form nicht, da es eine vollkommen neue Layout-Technik ist, die zudem die ganze Seite betreffen kann, was, wenn man mit Javascript das Layout beeinflusst, sehr performance-intensiv sein kann.</p>
<p>Aktuell unterstützen Firefox 52, Chrome 57 und Safari 10.1 sowie iOS 10.3, Android Chrome sowie Android Firefox die aktuelle Spec. Internet Explorer ab Version 10 (auch mobile) und Microsoft Edge unterstützen grundlegenden Grid-Eigenschaften mit Vendor-Präfix. Damit Microsoft auf die aktuelle Spec updated, müssen noch mehr Entwickler das <a href="https://wpdev.uservoice.com/forums/257854-microsoft-edge-developer/suggestions/6514853-update-css-grid">Backlog-Ticket hoch voten</a>.</p>
<p><iframe src="http://caniuse.bitsofco.de/embed/index.html?feat=css-grid&amp;periods=future_1,current,past_1,past_2" height="550" frameborder="0" width="100%"><br />
![Data on support for the css-grid feature across the major browsers from caniuse.com.](./images/caniuse-grids.png)<br />
</iframe></p>
<p><a href="http://caniuse.com/#feat=css-grid">http://caniuse.com/#feat=css-grid</a></p>
<h3>Fazit:</h3>
<p>Die neuen Möglichkeiten von CSS Grid Layout sind fantastisch. Endlich ist es möglich sehr viel einfacher eigene Grid-Layouts ohne spezielle Frameworks umzusetzen. Entwickler und Designer werden in Zukunft viel Freude mit den neuen Eigenschaften haben und endlich komplexe Layout-Anforderungen umsetzen können, die bislang nicht, bzw. sehr schwer möglich waren. Ich empfehle jedem Webentwickler mit Grids zu spielen und die Möglichkeiten auszuloten. Auch wenn man Grids aktuell noch nicht in vielen Projekten produktiv einsetzen kann, so ist zumindest der Internet Explorer diesmal nicht der Spielverderber. Dennoch denke ich, das spätestens in einem Jahr mehr und mehr Projekte mit CSS Grid Layouts umgesetzt werden. </p>
<p>Ich möchte zudem nochmals deutlich machen, dass CSS Grids kein Ersatz für irgendeine bisherige Layout-Technik ist, sondern eine tolle neue Ergänzung zu Flexbox, Float &amp; Co darstellt. Ich bin gespannt welche schönen Ideen Designer haben, jetzt wo sie wissen, dass in modernen Browsern nun technisch viel mehr möglich ist.</p>
<p><strong>Wer noch mehr Beispiele sehen möchte, wie man vom Bootstrap-Grid zum eigenen Grid gelangt, findet in meiner Präsentation „<a href="http://maddesigns.de/css-grids">Grids &amp; Glory</a>“ weitere Beispiele. Zudem hab ich auf Codepen eine <a href="http://codepen.io/collection/nrkvQx/">CSS Grid Collectio</a>n meiner Tests zusammen gestellt.</strong></p><p>Der Beitrag <a href="http://maddesigns.de/css-grid-layout-2764.html/" target="_blank">Native CSS Grid Layouts ohne Framework – ein einfaches Beispiel</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/css-grid-layout-2764.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Sass Parent Selector &#8211; &#8218;&#038;&#8216; (ampersand)</title>
		<link>http://maddesigns.de/sass-parent-selector-2741.html</link>
		<comments>http://maddesigns.de/sass-parent-selector-2741.html#comments</comments>
		<pubDate>Mon, 09 Jan 2017 08:46:01 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Sass]]></category>
		<category><![CDATA[&]]></category>
		<category><![CDATA[ampersand]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[sass]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2741</guid>
		<description><![CDATA[<p>Für eine Schulung zum Thema „Sass“ habe ich einige Möglichkeiten zum Einsatz des so genannten „Parent Selector“ zusammen gestellt. Kurz notiert – was macht der „Parent Selector“? Der „Parent Selector“ referenziert in einer verschachtelten Regel den Eltern-Selektor und verbindet beim Kompilieren die Knoten zum endgültigen Selektor. Das &#8218;&#38;&#8216; Ampersand dient als Platzhalter. Hier ein einfaches &#8230; <a href="http://maddesigns.de/sass-parent-selector-2741.html" class="more-link"><span class="screen-reader-text">Sass Parent Selector &#8211; &#8218;&#038;&#8216; (ampersand)</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/sass-parent-selector-2741.html/" target="_blank">Sass Parent Selector - '&' (ampersand)</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Für eine Schulung zum Thema „Sass“ habe ich einige Möglichkeiten zum Einsatz des so genannten „Parent Selector“ zusammen gestellt. </p>
<p><em>Kurz notiert – was macht der „Parent Selector“?</em><br />
Der „Parent Selector“ referenziert in einer verschachtelten Regel den Eltern-Selektor und verbindet beim Kompilieren die Knoten zum endgültigen Selektor. Das &#8218;&amp;&#8216; Ampersand dient als Platzhalter. Hier ein einfaches Beispiel:</p>
<p><span id="more-2741"></span></p>
<pre class="language-scss"><code>a {
    color: blue;
    
    &amp;:focus,
    &amp;:hover { color: red; }
}
</code></pre>
<pre class="language-css"><code>a {
  color: blue;
}

a:focus, a:hover {
  color: red;
}
</code></pre>
<p>Weitere Infos in der <a href="http://sass-lang.com/documentation/file.SASS_REFERENCE.html#parent-selector">Sass Dokumentation</a>.</p>
<p>Da seit der Sass-Version 3.3 das &#8218;&amp;&#8216; (Ampersand) auch am Anfang von Selektoren verwendet werden kann und ich dahingehend meine Schulungsunterlagen anpassen wollte, habe ich ein paar Tests gemacht. Hier mal eine Zusammenstellung von ein paar Möglichkeiten: </p>
<pre class="language-scss"><code class="scss">$componentname: 'block';

.#{$componentname} {
  $parent: &amp;;

  // .block.block
  &amp;#{&amp;} { color: red; }
  
  // .block + .block
  &amp; + &amp; { color: purple; }

  // .block__element
  &amp;__element { color: green; }

  // .block .block__element
  #{&}__element { color: maroon; }
  
  // .block--modifier
  &amp;--modifier {
    color: yellow;
    
    // .block--modifier__element
    &amp;__element { 
      color: lime;
    }
    
    // .block--modifier .block__element
    #{$parent}__element { 
      color: blue; 
      
      // .block--modifier .block__element &gt; .block__more
      &gt; #{$parent}__more { color: white; }   
    }
  }
  
  // .block.block--no-img
  &amp;#{&amp;}--no-img { color: teal; }
  
  // div .block 
  div &amp; { color: aqua; }
  
  // div.block .block
  div#{&amp;} &amp; { color: fuchsia; }
  
  // div.block 
  @at-root {
    div#{&amp;} { color: gray; }
  }
}
</code></pre>
<h3>Sassmeister „Codepen“:</h3>
<p class="sassmeister" data-gist-id="7303691216ff25b0734201e7df9561a1" data-height="480" data-theme="tomorrow"><a href="https://www.sassmeister.com/gist/7303691216ff25b0734201e7df9561a1">Play with this gist on SassMeister.</a></p>
<p><script src="https://cdn.sassmeister.com/js/embed.js" async></script></p>
<p>Die Möglichkeiten für BEM-Klassen-Strukturen sind interessant. Ich möchte auch hier dazu keine Diskussion entfachen, darum geht es hierbei nicht. <em>Ich weiß, dass einige Entwickler es nicht mögen, wenn BEM-Klassen mit &#8218;&amp;&#8216;, (z.B. <code>&amp;__element</code>) zusammengesetzt in Sass verwendet werden, da es schwieriger ist bei der Suche im Projekt.</em> Dennoch sehe ich dabei schon einige Vorteile und Sass wurde genau für das „<a href="https://de.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself">DRY-Prinzip</a>“ entwickelt. </p>
<p>Der Clou ist dabei ist, den Parent-Selektor in eine Sass-Variable innerhalb des Block zu referenzieren, also den Scope mitzuschleifen.</p>
<pre class="language-scss"><code>.block {
  $parent: &amp;;
  
  &amp;--modifier {
    color: yellow;
    
    #{$parent}__element {
      color: green;
    }
  }
}
</code></pre>
<p>Das ergibt folgenden Selektor:<br />
<code class="language-css"><br />
.block--modifier .block__element {}<br />
</code></p>
<p>Kennt ihr noch mehr Tricks?</p><p>Der Beitrag <a href="http://maddesigns.de/sass-parent-selector-2741.html/" target="_blank">Sass Parent Selector - '&' (ampersand)</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/sass-parent-selector-2741.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Nützliche PostCSS-Module</title>
		<link>http://maddesigns.de/postcss-plugins-2692.html</link>
		<comments>http://maddesigns.de/postcss-plugins-2692.html#comments</comments>
		<pubDate>Sun, 14 Feb 2016 16:04:56 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[postcss]]></category>
		<category><![CDATA[sass]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2692</guid>
		<description><![CDATA[<p>Gibt es die überhaupt, wird sich so mancher denken… und die Antwort ist wie immer – it depends™. Natürlich gibt es nützliche PostCSS-Module, die Entwicklern beim Schreiben von CSS unterstützen, für andere passt es eher nicht in den Workflow. Nur weil es das jetzt gibt, heißt es nicht, dass jeder Webworker es gleich einsetzen muss. &#8230; <a href="http://maddesigns.de/postcss-plugins-2692.html" class="more-link"><span class="screen-reader-text">Nützliche PostCSS-Module</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/postcss-plugins-2692.html/" target="_blank">Nützliche PostCSS-Module</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Gibt es die überhaupt, wird sich so mancher denken… und die Antwort ist wie immer – it depends<img src="https://s.w.org/images/core/emoji/11/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />. Natürlich gibt es nützliche PostCSS-Module, die Entwicklern beim Schreiben von CSS unterstützen, für andere passt es eher nicht in den Workflow. Nur weil es das jetzt gibt, heißt es nicht, dass jeder Webworker es gleich einsetzen muss. Dennoch denke ich, dass bei vielen mindestens ein PostCSS-Modul Einzug in den Build-Prozess gefunden hat, nämlich Autoprefixer. </p>
<p><span id="more-2692"></span></p>
<p>Aber mal kurz ein Schritt zurück &#8211; was macht eigentlich dieses PostCSS? PostCSS-Module verändern das geschriebene CSS, dabei kann das CSS auch vorher durch einen Präprozessor erstellt worden sein, muss es aber auch nicht. PostCSS kann auch SCSS-Dateien verarbeiten bevor es mit Sass kompiliert wird. Wenn man Sass verwendet, ist man ein großes Featureset gewohnt, das bereits enthalten ist. PostCSS ist erstmal nur das Gerüst und kann mit individuellen Plugins bestückt werden. Quasi ein LEGO für CSS-Entwicklung, man kann es nach den eigenen Wünschen zusammenstecken. &lt;meinung&gt;Es gibt Puristen, die Präprozessoren den Rücken gekehrt haben, jetzt aber zig PostCSS-Module einsetzen, die das CSS verwursteln – das soll jetzt besser sein? Na ich weiß nicht. &lt;/meinung&gt; </p>
<p>Nichtsdestotrotz gibt es Module, die mir persönlich die Arbeit erleichtern. Und was mir die Arbeit leichter macht, ohne dass ich meinen kompletten Workflow umstellen muss (reicht, wenn man das alle 2&#8211;3 Jahre macht), finde ich gut. Ich verwende PostCSS zusätzlich zu Sass, für die Aufgaben, die Sass nicht oder nicht so komfortabel beherrscht. Letztlich soll PostCSS bei der Erstellung von CSS unterstützen. Jeder sollte sich sein eigenes Bild davon machen, ob es für ihn/das Team nützlich ist.</p>
<p><strong>Hinweis:</strong></p>
<p><em>Ich habe in den Code-Beispielen die Verwendung mit Grunt-PostCSS genutzt (quasi aus dem Gruntfile.js kopiert). Wer andere Build-Tools nutzt muss u.U. andere Konfigurationen angeben. Wie die PostCSS-Plugins eingebunden werden, findet ihr immer in der Plugin-Readme.</em></p>
<h2>Autoprefixer</h2>
<p>Das bekannteste PostCSS-Plugin und in den letzten Jahren auch das nützlichste ist <a href="https://github.com/postcss/autoprefixer" title="PostCSS Autoprefixer">Autoprefixer</a>. Ihr kennt das – viele neue CSS3-Eigenschaften wurden mit Vendorpräfixe in die Browser gebracht und jeder Hersteller hat fleißig mitgemacht und seine eigenen Präfixe eingeführt. Beliebtes Beispiel war <code>border-radius</code>. So las man dann oft folgendes Beispiel im Netz:</p>
<pre class="language-css"><code>.rounded-corner {
  -webkit-border-radius: 1em;
     -moz-border-radius: 1em;
          border-radius: 1em;
}</code></pre>
<p>Wir wissen, dass <code>border-radius</code> schon ewig keine Vendorpräfixe braucht, aber andere Eigenschaften haben heute immer noch welche. Jede neue Eigenschaft doppelt und dreifach schreiben ist bescheuert, war aber nötig.&lt;/history&gt; Für Sass gab es Compass, das eine Vielzahl an CSS3-Mixins lieferte, die einem diese Aufgabe abnahm. Man inkludierte 1x das Mixin und Compass schrieb die Vendorpräfixe. Deshalb war Compass sehr beliebt. Das Problem war, dass Compass die Vendorpräfixe immer eingesetzt hat, unabhängig davon, ob die Präfixe noch gebraucht wurden oder nicht. </p>
<p>Das macht Autoprefixer anders. Hier kann ich einen Browser-Support angeben. Autoprefixer prüft anhand caniuse.com-Daten, ob ein Präfix für die definierten Browser noch notwendig ist.</p>
<p><strong>Grunt-PostCSS Config für Autoprefixer</strong></p>
<pre class="language-javascript"><code>require('autoprefixer')({
    browsers: ['last 2 version', 'ie &gt;= 9', 'Android &gt;= 2.3', 'Firefox ESR']
})</code></pre>
<p>Als Webworker schreibe ich dann standardkonformes CSS und Autoprefixer wandelt das anschließend in CSS um, das alle meine Browser verstehen, die ich unterstützen möchte. Mittlerweile auch so intelligent, dass es die unterschiedlichen Flexbox-Syntaxen und die verschiedenen linear-gradient Schreibweisen einfügt. Also tatsächlich richtig mächtig. </p>
<p><em>Kleiner Zusatzhinweis:</em><br />
Anstatt der Caniuse-Daten Browser-Daten kann ich mittlerweile auch eigene Analyse-Daten als Grundlage verwenden. Ich kann angeben, dass ich alle Browser unterstütze, die mehr als 5% Zugriffe auf meine Webseite ausmachen.</p>
<p><strong>Beispiel:</strong></p>
<pre class="language-javascript"><code>require('autoprefixer')({
    browsers: ['&gt; 5% in my stats', { stats: 'path/to/the/stats.json' }]
})</code></pre>
<h3>doiuse</h3>
<p><a href="https://github.com/anandthakker/doiuse" title="Doiuse PostCSS Plugin">Doiuse</a> checkt, ob ich CSS-Eigenschaften einsetze, die Browser in meinem angegebenen Browser-Support nicht verstehen. </p>
<pre class="language-javascript"><code>require('doiuse')({
  browsers: ['last 2 version', 'ie &gt;=9', 'Android &gt;= 4'],
  ignore: ['rem', 'css-boxshadow', 'css-transitions']
})</code></pre>
<p>Zum Beispiel supporte ich in der oberen Config alle IEs ab Version 9. Verwende ich Flexbox-Styles in meinem CSS, würde das Plugin Alarm schlagen, da der IE9 Flexbox nicht versteht. </p>
<p>Aktuell prüft es das meiner Meinung nach zu gut. ;) Es prüft dabei, ob die Angabe bei Caniuse dunkelgrün ist, also voll unterstützt wird. Ein teilweiser/buggy Support wird als fehlerhaft angezeigt, überprüft aber nicht, ob ich den „buggy“ Fall im CSS überhaupt nutze. Das kann leicht verwirren. Dieses Verhalten soll sich aber in Zukunft ändern, so der Plugin-Autor. Das Plugin soll dann besser kennzeichnen welche Eigenschaft buggy/partial Support hat und welcher Browser die Eigenschaft überhaupt nicht versteht.</p>
<p>Rundum finde ich das aber ein nützliches Plugin, das zur Codequalität beiträgt. </p>
<h2>CSS Next</h2>
<p><a href="http://cssnext.io/">CSS Next</a> ist ein Sammelsurium an Plugins, welche mehrere Sachen machen. Man kann mit CSS Next bereits jetzt schon CSS der Zukunft schreiben. Es ermöglicht unter anderem die Benutzung von nativen Variablen (Custom Properties), Custom Media Queries oder wandelt Pixel-Angaben und rem-Werte um. Zudem hat CSS Next Autoprefixer und „Sass-Features“ wie Nesting schon an Board. Es ist quasi das <a href="https://babeljs.io/">Babel</a> des CSS.</p>
<p><strong>Ein Beispiel für Custom Properties</strong></p>
<pre class="language-css"><code>/* custom properties */
:root {
  --heading-color: #ff0000;
}

/* custom selectors */
@custom-selector :--headings h1, h2, h3, h4;

/* usage */
:--headings {
  color: var(--heading-color);
}</code></pre>
<p><strong>CSSNext kompiliert das zu:</strong></p>
<pre class="language-css"><code>h1, h2, h3, h4 {
  color: #ff0000;
}</code></pre>
<p>Ich denke, dass es nicht viele Entwickler geben wird, die die allerneuesten Features für CSS schon heute verwenden werden. Viele Webworker schrecken ja schon davor zurück Flexbox einzusetzen, weil sie es noch nicht allumfänglich verstehen bzw. Browser-Bugs fürchten oder noch uralte Browser unterstützen müssen. Dennoch spannend zu beobachten, ob es dazu führt, dass mehr Entwickler zukunftsweisendes CSS schreiben. </p>
<h2>postcss-assets</h2>
<p>Ich muss sagen, dass ich es praktisch fand, dass Compass Funktionen bereit stellt, die mir die Breite und Höhe einer Datei auslesen können. In einigen Projekten brauchte ich das. Die Funktionalität bietet „<a href="https://github.com/assetsjs/postcss-assets">postcss-assets</a>“ genau so. </p>
<p><strong>Beispiel: Breite eines Logo auslesen:</strong></p>
<pre class="language-css"><code>.logo {
  width: width(&quot;logo.svg&quot;);
  height: height(&quot;logo.svg&quot;);
}</code></pre>
<p><strong>Das kompilierte CSS:</strong></p>
<pre class="language-css"><code>.logo {
  width: 100px;
  height: 40px;
}</code></pre>
<p>Zudem kann man auch Grafiken enkodiert (als background-image), also inline ins CSS ausgeben lassen. Aber dazu im nächsten Kapitel noch ein Plugin, dass das noch umfänglicher macht.</p>
<p><strong>Beispiel inline SVG als background-iamge:</strong></p>
<pre class="language-css"><code>.logo {
  background-image: inline(&quot;logo.svg&quot;);
}</code></pre>
<p><strong>Das kompilierte CSS:</strong></p>
<pre class="language-css"><code>background-image: url(&quot;data:image/svg+xml,%3Csvg…&quot;)</code></pre>
<p>Des Weiteren kann ein Cache-Buster aktiviert werden, praktisch besonders bei statischen Seiten.</p>
<h2>postcss-svg</h2>
<p><a href="http://pavliko.github.io/postcss-svg/">PostCSS-SVG</a> stellt kleine Helferlein für die Arbeit mit SVG bereit. Icon-System hin oder her, <a href="/svg-sprites-icon-fonts-2309.html">Iconfont vs. SVG</a>, ihr kennt das. Das Thema ignorieren wir hier mal. Es gibt Anforderungen, die außerhalb von Icons liegen. Ich hatte ein Projekt, da ist es erforderlich gewesen, dass eine Box einen unförmigen Hintergrund hat (Sprechblase) &#8211; ein Paradebeispiel für SVG als background-image. Nun ist es allerdings so, dass dieser Hintergrund mehrere Farbvarianten hatte, was auf den ersten Blick mehrere Assets mit den jeweiligen Farben bedeuten würde. </p>
<p>Oder man fügt den SVG-Code als enkodierten String ins CSS ein und tauscht dabei die Füllfarbe aus. Das PostCSS-Plugin postcss-svg macht das für uns.</p>
<p><strong>Beispiel Sass</strong></p>
<pre class="language-scss"><code>.svg-bg1 {
  background-image: svg('path/to/bg-svg', 
  '[fill]: #{$color-text}');
}

.svg-bg2 {
  background-image: svg('path/to/bg-svg', 
  '[fill]: #{$color-main}');
}</code></pre>
<p>Wenn man Assets enkodiert ins CSS einbindet, muss man unbedingt vorher die Datei so klein schrumpfen wie es nur geht. </p>
<hr />
<p>Dateien enkodiert ins CSS aufzunehmen ist immer ein Drahtseilakt… einerseits möchte man das CSS so schlank wie möglich halten, andererseits Requests sparen. Lohnt es sich für 2&#8211;3 Dateien ein Sprite zu erstellen oder ist der Request für das Sprite „teurer“? Muss/kann das einzelne Sprite-Element visuell verändert werden? Ist es wartbar? Wenn beim Build-Prozess generiert, sollte das kein Problem sein. Diese Fragen sollten sich Entwickler stellen, wenn sie grafische Elemente einbinden.</p>
<hr />
<p>In dem besagten Projekt fand ich es die beste Lösung die SVG-Formen als <code>background-image</code> zu verwenden. Über die PostCSS-Funktion verknüpft und die Füllfarbe zugewiesen, fertig. </p>
<p><em>Ideal wäre für mich, wenn man diese Teile in ein separates Stylesheet auslagern und async nachladen könnte. Aber soweit hab ich den Bauprozess nicht gebracht.</em></p>
<h2>CSSnano</h2>
<p><a href="http://cssnano.co/">CSSnano</a> ist ebenfalls eine Ansammlung kleiner Scripte, die das CSS möglichst klein schrumpfen wollen. Dabei versuchen sie weiter zu gehen, als Minifizierer von Sass &amp; Co. Neben den üblichen „ich entferne alle Whitespaces“, werden auch CSS-Regeln zusammen gezogen, die den gleichen Selektor haben. Da muss man vorsichtig sein, da dabei die Kaskade verändert werden könnte und das Ergebnis nicht mehr das Selbe ist. Auch versucht es z-Indizes zu simplifizieren. Auch das führt manchmal dazu, dass das gewünschte Aussehen im Anschluss nicht mehr passt. Ich empfehle, dass man das ausführlich gegenüber den bisherigen CSS-Minifier testet und vergleicht, ob es einen Vorteil bringt. Dennoch leistet es grundsätzlich eine gute Arbeit beim Minifizieren von CSS-Dateien. </p>
<p>Natürlich ist die Liste an Plugins lang und es gibt sicherlich für jeden nützliche und unnütze Plugins. Wer einen Präprozessor ersetzen möchte, kann CSSNext oder <a href="https://github.com/jonathantneal/precss">PreCSS</a> verwenden. Wer nicht in die Probleme mit <a href="https://github.com/philipwalton/flexbugs">Flexbugs</a> rennen möchte, kann mit <a href="https://github.com/luisrudge/postcss-flexbugs-fixes">postcss-flexbugs-fixes</a> viele Bugs im Buildtasks elimieren &#8211; durchaus praktisch. Auf der Seite <a href="http://postcss.parts/">postcss.parts</a> sind viele PostCSS-Plugins in unterschiedlichen Kategorien aufgeführt.</p>
<p>Welche nützlichen PostCSS-Plugins habt ihr noch im Einsatz?</p><p>Der Beitrag <a href="http://maddesigns.de/postcss-plugins-2692.html/" target="_blank">Nützliche PostCSS-Module</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/postcss-plugins-2692.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Flexbox Fallbacks</title>
		<link>http://maddesigns.de/flexbox-fallbacks-2670.html</link>
		<comments>http://maddesigns.de/flexbox-fallbacks-2670.html#comments</comments>
		<pubDate>Mon, 11 Jan 2016 20:02:28 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[RWD]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[fallback]]></category>
		<category><![CDATA[flexbox]]></category>
		<category><![CDATA[ie8]]></category>
		<category><![CDATA[ie9]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2670</guid>
		<description><![CDATA[<p>Aktuell bekomme ich des Öfteren eine Diskussion über den Einsatz von Flexbox in aktuellen Webprojekten mit. Häufiges Thema ist dabei, dass der IE9 Flexbox nicht unterstützt und aus diesem Grund lieber auf Flexbox verzichtet wird. Ich muss zugeben, dass ich seit mehreren Jahren in Mobile- oder Responsive-Projekten arbeite und dort nur äußerst selten noch IE9- &#8230; <a href="http://maddesigns.de/flexbox-fallbacks-2670.html" class="more-link"><span class="screen-reader-text">Flexbox Fallbacks</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/flexbox-fallbacks-2670.html/" target="_blank">Flexbox Fallbacks</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Aktuell bekomme ich des Öfteren eine Diskussion über den Einsatz von Flexbox in aktuellen Webprojekten mit. Häufiges Thema ist dabei, dass der IE9 Flexbox nicht unterstützt und aus diesem Grund lieber auf Flexbox verzichtet wird. Ich muss zugeben, dass ich seit mehreren Jahren in Mobile- oder Responsive-Projekten arbeite und dort nur äußerst selten noch IE9- oder IE8-Support benötigt wird. Somit kann ich schon länger fast ausschließlich Flexbox verwenden ohne einen Fallback inkludieren zu müssen. Deswegen kann ich die Diskussion vielleicht nicht so nachvollziehen, da Flexbox mittlerweile zu meinen täglichen Tools zählt. In diesem Blog-Post möchte ich mal ein paar typische Flexbox-Fallback-Möglichkeiten skizzieren.</p>
<p><span id="more-2670"></span></p>
<p>Klar ist &#8211; mit CSS Flexbox sind uns Entwicklern neue Möglichkeiten gegeben worden, die bisher nur mit Hacks in CSS zu realisieren waren. Nun können wir verlässlich Inhalte vertikal zentrieren, zueinander ins Verhältnis setzen, visuelle Reihenfolge der Elemente verändern und endlich Boxen mit gleicher Höhe darstellen. Selbst der Browser-Support ist mittlerweile hervorragend (auch Opera-Mini unterstützt nun Flexbox), also kein Grund mehr auf die Vorteile zu verzichten.</p>
<p>Ein klassisches Beispiel für Flexbox ist eine horizontale Navigation. Die Anforderung: egal wie viele Menüpunkte, sie sollen sich optimal den verfügbaren Platz aufteilen.</p>
<p><strong>Beispiel HTML</strong></p>
<pre class="language-markup"><code class="HTML">&lt;nav role=&quot;navigation&quot;&gt;
    &lt;ul class=&quot;the-flextable&quot;&gt;
        &lt;li&gt;&lt;a href=&quot;&quot;&gt;Item 1&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;&quot;&gt;Item 2&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;&quot;&gt;Item 3&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;&quot;&gt;Item 4&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;&quot;&gt;Item 5&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
&lt;/nav&gt;</code></pre>
<p><strong>Beispiel CSS</strong></p>
<pre class="language-css"><code class="CSS">.the-flextable {
    display: table; /* Fallback IE&lt;9 */
    display: flex;
    width: 100%;
}

.the-flextable &gt; li {
    display: table-cell; /* Fallback IE&lt;9 */
    flex: 1 1 auto;
    min-width: 1%; /* Fix for Firefox */
}</code></pre>
<p>Codepen-Link: <a href="http://codepen.io/maddesigns/pen/NGZJxG">http://codepen.io/maddesigns/pen/NGZJxG</a> </p>
<p>Mit <code>display: table/table-cell;</code> hat man für diese simple Aufgabe einen guten Fallback für Browser die Flexbox nicht verstehen. Selbst vertikal zentrieren des Textes ist mit <code>table-cell</code> möglich. </p>
<p><strong>Vorteile: &#8218;display: table&#8216;</strong></p>
<ul>
<li>vertikales zentrieren und gleiche Höhen</li>
</ul>
<p><strong>Nachteil: &#8218;display: table&#8216;</strong></p>
<ul>
<li>Zwischenräume (margins) können auf table-cell nicht angewendet werden, <code>border-collapse: separate</code> und <code>border-spacing</code> als Ersatz ist nicht optimal</li>
</ul>
<p>Selbst für Fälle wo <code>flex-wrap</code> zum Einsatz kommt, kann man mit <code>display: inline-block</code> oder <code>float</code> gute Fallbacks erreichen. Nachteil bei <code>inline-block/float</code> ist leider, dass die Höhe der „Flex-Items“ nicht automatisch gleich hoch ist, hier müsste man sich über <code>min-height</code> an das gewünschte Aussehen annähern. Für den Fallback mit <code>display: inline-block</code> ist es zudem notwendig Whitespace, den <code>inline-block</code> mitbringt, zu eliminieren. Der Blogbeitrag von <a href="https://css-tricks.com/fighting-the-space-between-inline-block-elements/">CSS-Tricks</a> zeigt die unterschiedlichen Möglichkeiten. Ich finde die <code>font-size: 0</code> Methode oft am praktischsten. </p>
<p>Hier mal ein einfaches responsive „floating“ flex-wrap Fallback-Beispiel mit <code>inline-block</code> (hab ich alle buzzwords eingebunden?):</p>
<p><img src="http://maddesigns.de/wp-content/uploads/2016/01/flexbox3-640x168.png" alt="Flexbox Grid" width="640" height="168" class="alignnone size-large wp-image-2687" srcset="http://maddesigns.de/wp-content/uploads/2016/01/flexbox3-640x168.png 640w, http://maddesigns.de/wp-content/uploads/2016/01/flexbox3-360x95.png 360w, http://maddesigns.de/wp-content/uploads/2016/01/flexbox3-768x202.png 768w" sizes="(max-width: 640px) 100vw, 640px" /></p>
<p>Codepen-Link: <a href="http://codepen.io/maddesigns/pen/EBlHd">http://codepen.io/maddesigns/pen/EBlHd</a></p>
<p><strong>Vorteile: &#8218;display: inline-block&#8216;</strong></p>
<ul>
<li>vertikales Zentrieren</li>
<li>kein Clearing notwendig</li>
</ul>
<p><strong>Nachteile: &#8218;display: inline-block&#8216;</strong></p>
<ul>
<li>keine gleichen Höhen</li>
<li>Whitespace-Foo</li>
<li>kein Clearing möglich</li>
</ul>
<p><strong>Vorteile: &#8218;float&#8216;</strong></p>
<ul>
<li>Verhalten und Anwendung von <code>float</code> ist den meisten Entwickler vertraut</li>
</ul>
<p><strong>Nachteile: &#8218;float&#8216;</strong></p>
<ul>
<li>Clearing</li>
<li>kein vertikales Zentrieren</li>
<li>keine gleiche Höhe</li>
</ul>
<p>Selbst für einen einfachen Source-Order-Switch kann man auf <code>display: table</code> als Fallback zurückgreifen. Im Blog-Post: <a href="http://maddesigns.de/content-source-order-in-responsive-webdesign-2577.html">Content-Source Ordering</a> habe ich eine Möglichkeit für IE8 &amp; Co. skizziert. </p>
<p>Grundsätzlich bin ich immer ein Freund von <em>mobile first</em>/<em>semantic first</em>, also erst die richtige Source-Order von der Logik her erstellen und dann das gewünschte Ergebnis visuell abbilden. </p>
<p>Ein typisches Beispiel hatte ich letztens im Projekt auch: Ein Kochrezept! Die visuelle Vorgabe für große Viewports (aka Desktop) sah in etwa so aus:</p>
<p><img src="http://maddesigns.de/wp-content/uploads/2016/01/flex-fallback1-517x480.png" alt="Wireframe Rezeptansicht Desktop" width="517" height="480" class="alignnone size-large wp-image-2683" srcset="http://maddesigns.de/wp-content/uploads/2016/01/flex-fallback1-517x480.png 517w, http://maddesigns.de/wp-content/uploads/2016/01/flex-fallback1-302x280.png 302w, http://maddesigns.de/wp-content/uploads/2016/01/flex-fallback1-768x713.png 768w, http://maddesigns.de/wp-content/uploads/2016/01/flex-fallback1.png 1030w" sizes="(max-width: 517px) 100vw, 517px" /></p>
<p><img src="http://maddesigns.de/wp-content/uploads/2016/01/flex-fallback2-101x280.png" alt="Wireframe Rezept mobile Vorlage" width="101" height="280" class="alignleft size-medium wp-image-2684" srcset="http://maddesigns.de/wp-content/uploads/2016/01/flex-fallback2-101x280.png 101w, http://maddesigns.de/wp-content/uploads/2016/01/flex-fallback2-173x480.png 173w, http://maddesigns.de/wp-content/uploads/2016/01/flex-fallback2.png 494w" sizes="(max-width: 101px) 100vw, 101px" /></p>
<p>Für Schmalscreens und als Struktur entschied ich mich dazu folgenden Wireframe umzusetzen.</p>
<p>Der Fallback für IE9 (der eigentlich nicht unterstützt wird) ist in dem Fall <code>display: inline-block</code>, allerdings bleibt die logische Reihenfolge der Elemente unverändert. Ich finde das nicht tragisch, optisch sieht es vollkommen in Ordnung aus. </p>
<h2>Braucht man aktuell noch alle Flexbox-Varianten?</h2>
<p>Flexbox hat einige Spezifikationsvarianten durchlebt und Browserhersteller haben unterschiedliche Schreibweisen implementiert, so dass wir teilweise nicht nur Vendor-Präfixe, sondern auch verschiedene Schreibweisen (Eigenschaftsnamen) für den Cross-Browser-Support einbinden müss(t)en. Autoprefixer nimmt uns das glücklicherweise alles ab. Wenn man alte Android-Versionen unterstützt (4.x ist auch alt ;)), dann benötigt man auf jeden Fall die alte Schreibweise. IE10 braucht die Zwischenlösung von 2012. </p>
<table>
<caption>Die Tabelle zeigt die verschiedenen Flexbox-Syntaxen und die heutige Schreibweise:</caption>
<thead>
<tr>
<th>Finale Syntax</th>
<th>2011 Hybrid Syntax</th>
<th>2009 Syntax</th>
</tr>
</thead>
<tbody>
<tr>
<td>display: flex</td>
<td>display: flexbox</td>
<td>display: box</td>
</tr>
<tr>
<td>flex-direction: row</td>
<td>box-orient: horizontal</td>
<td>box-orient: horizontal</td>
</tr>
<tr>
<td>justify-content: flex-start</td>
<td>box-pack: start</td>
<td>box-pack: start</td>
</tr>
<tr>
<td>align-items: flex-start</td>
<td>box-align: start</td>
<td>box-align: start</td>
</tr>
<tr>
<td>flex: 1</td>
<td>flex: 1</td>
<td>box-flex: 1</td>
</tr>
</tbody>
</table>
<p>Mir ist aufgefallen, dass es weniger Probleme gibt, wenn man z.B. mit Modernizr den Support testet und dann dementsprechend die Zuweisung der Eigenschaften macht, heißt also Fallback mit <code>.no-flexbox</code>.</p>
<p>Einen einfacher Test, ob Flexbox (mit Flex-Wrap) verfügbar ist, hat Ethan Marcotte in einem <a href="https://24ways.org/2015/putting-my-patterns-through-their-paces/">24ways Artikel</a> gezeigt:</p>
<pre class="language-javascript"><code>var doc = document.body || document.documentElement;
var style = doc.style;
​
if ( style.webkitFlexWrap == '' ||
    style.msFlexWrap == '' ||
    style.flexWrap == '' ) {
  doc.className += &quot; supports-flex&quot;;
</code></pre>
<p>Alle Styles werden dann also mit <code>.supports-flex</code> gepräfixt. </p>
<p><strong>CSS-Beispiel:</strong></p>
<pre class="language-css"><code>.supports-flex .flex-container {
    display: flex;
}

.supports-flex .flex-item {
    flex: 1 1 0%;
}
</code></pre>
<p>Wie so oft, ist es auch leider so, dass bei der Implementation der Spezifikation Fehler unterlaufen und so gibt es auch für Flexbox Bugs in Browsern. Auch das führt oft zur Ablehnung der Technik. Philip Walton hat die <a href="https://github.com/philipwalton/flexbugs">Flexbugs</a> mal zusammengeschrieben.</p>
<p><strong>Die entscheidendsten Bugs sind:</strong></p>
<ol>
<li>In der vertikalen Flexbox-Ausrichtung mit „column“ wird im IE10&#8211;11 die gesetzte Mindesthöhe nicht an die Flex-Items vererbt. Besser wäre es eine definierte Höhe zu setzen.</li>
<li>Chrome, Opera und Safari missachten die per Default vergebene Inhaltsbreite der Flex-Items. Hier empfiehlt es sich den <code>flex-shrink</code> Wert auf 0 statt dem Defaultwert 1 zu setzen um umgewollte Darstellungen zu vermeiden.</li>
<li>Flex-Basis sollte man nicht ohne Einheit in der Flex-Shorthand-Notation benutzen, das führt zu Fehlern im IE10 und 11. Besser ist es 0% anstatt 0px zu verwenden, da einige CSS-Minifizierer 0px zu 0 wandeln (0 ohne Einheit ist ja genau das Problem).</li>
</ol>
<p>Ein PostCSS-Script hilft uns beim Flexbugs fixen &#8211; <a href="https://github.com/luisrudge/postcss-flexbugs-fixes">https://github.com/luisrudge/postcss-flexbugs-fixes</a>. Es scannt das CSS und ersetzt mögliche Problemstellen mit dem empfohlenen Code.</p>
<h2>Flexbox-Polyfill für IE8/9</h2>
<p>Jonathan Neal, der schon den Polyfill „SVG4everybody“ entwickelt hat, hat mit <a href="https://github.com/10up/flexibility">Flexibility</a> einen Flexbox-Polyfill für IE8 und 9 veröffentlicht. Der Polyfill scannt die Seite und das CSS und stellt das Flexbox-Verhalten mit JavaScript nach. Also kein manueller Aufwand für Entwickler. Als Trigger für JavaScript wird in CSS <code>-js-display: flex;</code> gesetzt.</p>
<pre class="language-css"><code>.foo {
    -js-display: flex;
    display: flex;
}
</code></pre>
<p>Um das noch weiter zu Vereinfachen gibt es auch dafür ein <a href="https://github.com/7rulnik/postcss-flexibility">PostCSS-Plugin</a>, dass das Einfügen des Triggers <code>-js-display: flex</code> automatisch macht. </p>
<p>Natürlich sollte man genau überprüfen, ob das gewünschte Ergebnis damit auch erzielt wird bzw. ob es notwendig ist dafür extra JavaScript zu verwenden &#8211; oft reicht ja auch ein wenig CSS als Fallback aus. Auch wenn das Ergebnis nicht immer 100%ig das Gleiche ist, so gibt es eine Reihe guter Fallbacks für Flexbox &#8211; denn <a href="http://dowebsitesneedtolookexactlythesameineverybrowser.com/">müssen Webseiten in jedem Browser gleich aussehen</a>? Nein!</p>
<h3>Update 06.04.2016:</h3>
<p>Eine sehr schöne Übersicht dazu hat Kenan Yusuf erstellt: <a href="http://kyusuf.com/post/almost-complete-guide-to-flexbox-without-flexbox">Almost complete guide to flexbox (without flexbox)</a></p><p>Der Beitrag <a href="http://maddesigns.de/flexbox-fallbacks-2670.html/" target="_blank">Flexbox Fallbacks</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/flexbox-fallbacks-2670.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Responsive Navigation aus UX-Sicht</title>
		<link>http://maddesigns.de/responsive-navigation-ux-2650.html</link>
		<pubDate>Wed, 25 Nov 2015 22:16:54 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[RWD]]></category>
		<category><![CDATA[UX]]></category>
		<category><![CDATA[navigation]]></category>
		<category><![CDATA[responsive]]></category>
		<category><![CDATA[ux]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2650</guid>
		<description><![CDATA[<p>Optimierte Navigation bei mobilem Webdesign Eines der komplizierteren Themen im Responsive Webdesign ist unbestritten die Navigation, gerade wenn ein Relaunch bestehender Inhalte geplant ist. Wird auf der vorhandenen Webseite eine umfangreiche Navigation (z. B. „Mega Dropdown“) verwendet, ist eine Anpassung auf kleinere Bildschirme eine herausfordernde Aufgabe. Hier gibt es keine Einheitslösung, es muss eine gut &#8230; <a href="http://maddesigns.de/responsive-navigation-ux-2650.html" class="more-link"><span class="screen-reader-text">Responsive Navigation aus UX-Sicht</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/responsive-navigation-ux-2650.html/" target="_blank">Responsive Navigation aus UX-Sicht</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<h3>Optimierte Navigation bei mobilem Webdesign</h3>
<p>Eines der komplizierteren Themen im Responsive Webdesign ist unbestritten die Navigation, gerade wenn ein Relaunch bestehender Inhalte geplant ist. Wird auf der vorhandenen Webseite eine umfangreiche Navigation (z. B. „Mega Dropdown“) verwendet, ist eine Anpassung auf kleinere Bildschirme eine herausfordernde Aufgabe. Hier gibt es keine Einheitslösung, es muss eine gut durchdachte Lösung gefunden werden. Beim Responsive Re-Design sollte es immer eine Anpassung von Inhalt (Content Strategy) und Navigationsstruktur geben, auch wenn dies sicherlich schwerfällt.<br />
<span id="more-2650"></span></p>
<p>Verfolgt man den „Mobile First“ Ansatz, bei dem man zuerst für mobile Geräte konzipiert und designt, ist es oft leichter sich auf die wesentlichen Kernpunkte der Navigation zu konzentrieren. Demzufolge ist eine simple Navigation zu erstellen mit den wichtigsten Navigationspunkten. Eine Navigation mit sehr vielen Unterebenen ist für Benutzer &#8211; gerade auf kleinen Bildschirmen &#8211; schwer zu erfassen. Hier muss in der Konzeption darauf geachtet werden, dass die Navigationsstränge für den Besucher schlüssig sind.</p>
<p>Das direkte Erfassen der Navigationsstruktur bzw. der Kategorien eines Shops hat sich als enorm wichtig herausgestellt. Auch wenn Lösungen wie das „Off-Canvas-Menü“ praktisch sind um bei größeren Menüs Platz im Sichtbereich zu sparen, sind diese doch für unerfahrene Nutzer oft eine Hürde. Studien haben gezeigt, dass Benutzer, die zum ersten Mal auf einer neuen Shop-Homepage landen, sich zuerst durch hoch- und runterscrollen orientieren. Dies geschieht, um für sich zu Erfassen, ob das Gesuchte (die gewünschte Kategorie) auf der Webseite zu finden ist, also ob die Seite thematisch den Erwartungen entspricht. Platzieren Sie zumindest ein paar Hauptmenüpunkte direkt auf der Startseite im Header.</p>
<p>Ein großer Aufhänger für Meinungsverschiedenheiten ist das sogenannte „Hamburger-Icon“. Das in der Designer- und Entwicklergemeinde bekannte Icon wird mittlerweile häufig verwendet, um ein (Off-Canvas)-Menü zu öffnen. Inzwischen wurde es oft wieder von Webseiten entfernt, da Studien zeigten, dass viele Nutzer das Icon (noch) nicht verstehen. Es ist für den Einsatz des Hamburger-Icons daher abzuwägen, welche Zielgruppe man auf der Webseite hat. Bei einer Seite mit technik-affiner Zielgruppe ist der Einsatz durchaus denkbar, bei einer internetunerfahrenen oder breiten Nutzergruppe ist eher darauf zu verzichten.</p>
<p>Der Online-Auftritt der britischen Zeitung „The Guardian“ verwendet auf ihrer Seite ein ausgeklügeltes Navigationskonzept. Das sogenannte „Priority“-Konzept zeigt in einer horizontal swipebaren Navigation schon so möglichst viele Navigationspunkte im verfügbaren Sichtbereich. Alle weiteren Punkte sind über einen Menü-Button erreichbar. Je größer das Gerät, umso mehr Menüpunkte können direkt vom User erfasst werden.</p>
<p>Unbestritten ist es gerade bei Shops mit vielen Kategorien schwierig — wie etwa m.zalando.de oder otto.de — eine einfache Navigationsform zu finden. Aber auch hier wurde versucht, in flachen Hierarchien zu bleiben. Nichts ist schlimmer, als sich immer tiefer in einen Navigationsstrang zu graben, nicht das zu finden, was man sucht und zum Schluss gar nicht mehr zu wissen, wo man sich befindet. Für viele Nutzer ist es um so wichtiger, eine gute Suche und umfangreiche Filtermöglichkeiten zur Verfügung zu stellen.</p>
<p>Natürlich muss man dann nicht auf eine erweiterte Navigation auf Desktopgröße verzichten. Optimalerweise lädt man die „fehlenden“ Untermenüs dort nach. Technisch gesehen ist dies die bessere Lösung, als zwei verschiedene Menüs in die Seite einzubauen und diese jeweils auf Smartphone- und Desktopscreens ein- bzw. auszublenden.</p>
<p>Unterschätzt wird gerade bei Shops der Einsatz von Breadcrumb-Pfad-Navigationen. Auch wenn diese in großen verzweigten Kategoriebäumen eher visuell störend empfunden werden, hilft es dem Besucher enorm, wenn er auf einer Produktdetailseite nicht genau das gefunden hat, was er suchte. Viele User gehen dann über die Breadcrumb-Navigation in die übergeordnete Kategorie zurück, um von dort weiterzusuchen.</p>
<p>Allerdings wird das Thema Navigation im Online-Shop-Bereich manchmal überschätzt. Einige Nutzergruppen (speziell Frauen) gehen eher so vor, dass sie von Übersicht zu Übersicht springen (aka. „bummeln“), bis sie etwas Interessantes entdecken. Sie navigieren also nicht übers Menü. Andere suchen eher ein bestimmtes Produkt und nutzen die Suche oder navigieren durch Empfehlungen.</p>
<p>Festzuhalten bleibt: Die Navigation sollte simpel gehalten sein und den User unterstützen und ihn nicht verwirren. Denn wie sagte schon der Usability-Guru Steve Krug: „Don’t Make Me Think.“</p>
<hr>
<p><strong>Dieser Artikel zum Thema „Responsive Navigation aus UX-Sicht“ erschien zuerst im  Newsletter des E-Commerce Dienstleisters <a href="https://www.dc-solution.de/dc/de/info/news/?collection_id=331">dynamic commerce GmbH</a>.</strong></p><p>Der Beitrag <a href="http://maddesigns.de/responsive-navigation-ux-2650.html/" target="_blank">Responsive Navigation aus UX-Sicht</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>Assemble – erste Schritte mit dem Static Site Generator für Grunt</title>
		<link>http://maddesigns.de/assemble-static-site-generator-grunt-2625.html</link>
		<comments>http://maddesigns.de/assemble-static-site-generator-grunt-2625.html#comments</comments>
		<pubDate>Thu, 21 May 2015 15:48:25 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Grunt]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2625</guid>
		<description><![CDATA[<p>Wie bereits im Artikel „Static Site Generators“ geschrieben, habe ich mich letztes Jahr projektbedingt mit Assemble beschäftigt. Assemble ist ein Static Site Generator für Grunt und nutzt Handlebars als Template-Engine. tl;dr; „Warum ist mir egal, ich will Code sehen” =&#62; hier klicken Mir persönlich nutzt ein Static Site Generator oft bei meinem täglichen Workflow, beim &#8230; <a href="http://maddesigns.de/assemble-static-site-generator-grunt-2625.html" class="more-link"><span class="screen-reader-text">Assemble – erste Schritte mit dem Static Site Generator für Grunt</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/assemble-static-site-generator-grunt-2625.html/" target="_blank">Assemble – erste Schritte mit dem Static Site Generator für Grunt</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Wie bereits im Artikel „<a href="http://maddesigns.de/static-site-generators-2138.html">Static Site Generators</a>“ geschrieben, habe ich mich letztes Jahr projektbedingt mit <a href="http://assemble.io/">Assemble</a> beschäftigt. Assemble ist ein Static Site Generator für Grunt und nutzt Handlebars als Template-Engine. </p>
<h2>tl;dr; „Warum ist mir egal, ich will Code sehen” =&gt; <a href="http://maddesigns.de/assemble-static-site-generator-grunt-2625.html#show_me_code">hier klicken</a></h2>
<p>Mir persönlich nutzt ein Static Site Generator oft bei meinem täglichen Workflow, beim Erstellen von Klickdummys und Templates. Der Vorteil eines „Static Site Generator“ liegt auf der Hand: man nutzt die Dynamik einer Script-Sprache um wiederholende Elemente nicht jedes Mal neu schreiben zu müssen oder Markup mit dynamischen Daten zu vermischen. Man stelle sich vor, man muss bei einer statischen Seite einen Navigationspunkt ändern und das bei vielen Seiten, das ist aufwändig und fehleranfällig.</p>
<p> <span id="more-2625"></span></p>
<p>OK, jetzt könnte man meinen, dass man doch gleich PHP oder ähnliches nehmen könnte. Ja kann man auch. ;) Aber auch hier wäre es von Vorteil, wenn man das Markup von der Logik entkoppelt, also sowas wie ein MVC-Prinzip. Möchte/Soll man die Template-Schnipsel wieder verwenden können, also sollen die Schnippets möglichst modular wiederverwendbar sein, ist man schnell bei einer Template-Engine, die das unterstützt. </p>
<p>Ähnlich mit Javascript-Bausteinen. Immer mehr Teile der Website werden mit dynamischen Daten und Markup-Schnipseln in die Seite integriert, bzw. werden ja bereits viele JS-Anwendungen komplett im Browser zusammengebaut… buh! lang lebe semantisches Markup!</p>
<p>Auch hier gibt es Template-Engines, z.B. Handlebars, die eine klare Trennung von Markup und Logik handle’n ;). Und schwuppdiwupp ist man schon bei einem System, aus dem man auch statische Seiten exportieren könnte. Mit Grunt ein paar Prozesse definiert, fertig. Bonus: die Handlebars-Templates können auch im Javascript verwendet werden.</p>
<p>Assemble macht das alles und bringt noch ein paar Features mehr mit.</p>
<ul>
<li>Handlebars (nutzt <a href="https://mustache.github.io/">Mustache</a> Syntax)</li>
<li>YAML Frontmatter</li>
<li>Datenverarbeitung aus JSON oder YAML</li>
</ul>
<h2 id="show_me_code">Installation von Assemble</h2>
<pre><code class="language-bash">npm install assemble --save-dev</code></pre>
<p><strong>Grunt Beispiel Config</strong></p>
<pre><code class="language-javascript">assemble: {
    options: {
        flatten: true,
        assets: 'assets',
        helpers: ['templates/helpers/*.js', 'handlebars-helpers'],
        partials: ['templates/partials/**/*.hbs'],
        layout: ['templates/layouts/default.hbs'],
        data: ['templates/data/*.{json,yml}']
    },
    pages: {
        src: ['templates/pages/**/*.hbs'],
        dest: 'dist'
    },
    docs: {
        src: ['templates/docs/**/*.hbs'],
        dest: 'dist/docs'
    }
}</code></pre>
<h3>Ein einfaches Default-Layout mit Partials</h3>
<p>Ein einfaches HTML5-Dokument als Beispiel für die Haupt-Layout-Datei. Über <code>{{&gt; Name}}</code> können so genannte Partials integriert werden. In dem Beispiel, Teile des Dokuments, die immer auf der Seite sind (Header, Footer,…).</p>
<p><strong>layout: default.hbs</strong></p>
<pre><code class="language-handlebars">&lt;!DOCTYPE html&gt;
&lt;html lang="en" class="no-js"&gt;
  &lt;head&gt;
    &lt;title&gt;{{page-title}}&lt;/title&gt;
    {{&gt; head }}
  &lt;/head&gt;
  &lt;body {{#if site-class}} class="{{site-class}}"{{/if}}&gt;
    {{&gt; header}}
    {{&gt; nav}}
    {{&gt; body}}
    {{&gt; footer}}
    {{&gt; foot }}
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>Das <code>{{&gt; body&nbsp;}}</code> Partial ist hier etwas spezieller und wird als Platzhalter für die jeweiligen Seiten verwendet. Es kann im oberen Bereich der Seite eine YAML-Frontmatter-Konfiguration enthalten. Diese YAML-Daten können z.B. auch an das Haupt-Layout-Template (Default.hbs) übergeben werden.</p>
<p><strong>pages: index.hbs (body partial)</strong></p>
<pre><code class="language-handlebars">---
page-title: Index Template
site-class: "index"

intro: 
  name: 
  - the name 1
  - the name 2
  - the name 3
---
&lt;h1&gt;here comes the hotstepper&lt;/h1&gt;

&lt;ul class="intro"&gt;
  {{#each intro }}
  &lt;li class="intro_item
    {{#unless @index}}
    is-active
    {{/unless}}"&gt;
    &lt;h3&gt;{{ this.name }}&lt;/h3&gt;
    &lt;img src="{{ assets }}/img/{{hyphenate this.name }}.jpg" alt="{{ this.name }}"&gt;
    &lt;p&gt;{{ lorem ipsum.sentence }}&lt;/p&gt;
  &lt;/li&gt;
  {{/each}}
&lt;/ul&gt;</code></pre>
<p>Diese Intro-Section (vielleicht News-Teaser) kann man als Partial auslagern, wenn man dieses HTML-Konstrukt mehrfach nutzen möchte. </p>
<p><strong>partials: _intro-section.hbs</strong></p>
<pre><code class="language-handlebars">&lt;ul class="intro"&gt;
  {{#each intro }}
  &lt;li class="intro_item
    {{#unless @index}}
    is-active
    {{/unless}}"&gt;
    &lt;h3&gt;{{ this.name }}&lt;/h3&gt;
    &lt;img src="{{ assets }}/img/{{hyphenate this.name }}.jpg" alt="{{ this.name }}"&gt;
    &lt;p&gt;{{ lorem ipsum.sentence }} &lt;/p&gt;
  &lt;/li&gt;
  {{/each}}
&lt;/ul&gt;
</code></pre>
<h3>Anderes Page-Layouts innerhalb „pages“ verwenden</h3>
<p>Wenn man für bestimmte Seite ein anderes „Page-Layout“ verwenden möchte, kann man das einfach in Kopfbereich (YAML-Frontmatter-Bereich) der Seite angeben. </p>
<p><strong>pages: test.hbs</strong></p>
<pre><code class="language-markup">---
page-title: pages
layout: pages.hbs
---
</code></pre>
<p>Die Datei ‘pages.hbs’ legt man in das Layout-Verzeichnis, das man in der Grunt-Config angegeben hat. Hier kann man auch das Layout-Verzeichnis mit <code>layoutdir</code> angeben:</p>
<pre><code class="language-javascript">assemble: {
    options: {
        layout: 'default.hbs',
        layoutdir: 'templates/layout/'
    }
}
</code></pre>
<p>Dann wird unter ‘layout’ nur noch der Name der Default-Datei angegeben.</p>
<h3>Anders Dateiformat in der Ausgabe generieren</h3>
<p>Standardmäßig wird aus den .hbs Dateien eine HTML-Datei generiert. Möchte man ein anderes Dateiformat generieren, kann man dafür eine gesonderte Konfiguration in Grunt angeben. In den ‘options’ kann die ’ext’ention festgelegt werden.</p>
<p><strong>gruntconfig.js</strong></p>
<pre><code class="language-javascript">assemble: {
  // Build sitemap from JSON and templates 
  sitemap: {
    options: { ext: '.xml' },
    files: {
      '.': ['path/to/sitemap.tmpl' ]
    }
  },
  // Build README from YAML and templates 
  readme: {
    options: { ext: '.md'  },
    files: {
      '.': ['path/to/readme.tmpl' ]
    }
  }
}
</code></pre>
<h3>Dynamische Daten verwenden</h3>
<p>Ein großer Vorteil von Assemble ist es, dass mit Assemble Daten im JSON- oder YAML-Format verarbeitet werden können. Das ist praktisch, wenn man z.B. wiederkehrende Daten hat. Diese Daten legt man das in den Grunt-Options festgelegte Verzeichnis, z.B. in ‘templates/data/’. </p>
<pre><code class="language-javascript">assemble: {
    options: {
        data: ['templates/data/*.{json,yml}']
    }
}</code></pre>
<p>Wiederkehrende Daten kann man in ein JSON-Objekt oder in eine YAML-Notation auslagern. </p>
<p><strong>Beispiel: site.json</strong></p>
<pre><code class="language-javascript">{
    "sociallinks": [
        "facebook",
        "youtube",
        "xing"
    ]
}</code></pre>
<p><strong>sociallinks.hbs partial template</strong></p>
<pre><code class="language-handlebars">&lt;div class="social-links"&gt;
    {{#each site.sociallinks}}
    &lt;a href="#linkurl" title="Link to {{capitalizeEach this }}"&gt;
        {{.}}
    &lt;/a&gt;
    {{/each}}
&lt;/div&gt;
</code></pre>
<h4>simple Daten übergeben</h4>
<p>Mit dem Helper <code>parseJSON</code> kann man einfache Daten bei der Einbindung an ein Partial übergeben. </p>
<p><strong>Einbindung des Partials in page-Template</strong></p>
<pre><code class="language-handlebars">{{#parseJSON '{"teasertext": false, "limit": 5}'}}
    {{&gt; _newslist }}
{{/parseJSON}}</code></pre>
<pre><code class="language-handlebars">### partial code
&lt;ul class="teaserlist"&gt;
{{#each limit==limit}}
    &lt;li&gt;
        &lt;h3&gt;Teaser Headline&lt;/h3&gt;
        {{#is teasertext true}}
        &lt;p&gt;lorem ipsum&lt;/p&gt;
        {{/is}}
    &lt;/li&gt;
{{/each}}
&lt;/ul&gt;</code></pre>
<p>So kann man ein Partial an anderen Stellen in leicht veränderter Ausgabe verwenden, schön modular. In dem Beispiel wird eine Teaserliste mit 5 Teasern und ohne Teaser-Text ausgegeben. </p>
<h3>Eine Übersicht der generierten Seiten erstellen (Sitemap)</h3>
<p>Um eine Link-Liste mit den generierten Seiten als Übersicht zu erstellen, kann man den View-Helper ’{{#pages}}’ verwenden.</p>
<pre><code class="language-handlebars">---
title: Overview
---
&lt;ul&gt;
{{#pages}}
    &lt;li&gt;&lt;a href="{{lowercase basename}}{{ext}}"&gt;{{data.title}}&lt;/a&gt;&lt;/li&gt;
{{/pages}}
&lt;/ul&gt;
</code></pre>
<p>Für die Linkbezeichner wird hier der Wert aus dem YML-Kopfbereich ‘title’ verwendet. Zugriff auf die Daten bekommt man mit ‘data’, also ‘data.title’.</p>
<h3>Weitere nützliche Handlebars-Helpers</h3>
<p>Mittlerweile gibt es eine Vielzahl an zusätzlichen Plugins bzw. <a href="https://github.com/assemble/handlebars-helpers">Handlebars-Helpers</a>.</p>
<p>Nach dem Installieren, die Helper in den Grunt-Options Grunt-Options hinzufügen.</p>
<pre><code class="language-javascript">assemble: {
    options: {
        helpers: ['templates/helpers/*.js', 'handlebars-helpers', 'handlebars-partials'],
    }
}
</code></pre>
<p>Soweit ein kleiner Einblick in Assemble. Letztlich hab ich festgestellt, dass der Artikel mehr zu einer Tipps &amp; Tricks Liste geworden ist… und wieder mal länger als anfangs gedacht. </p>
<p>Habt ihr weitere Tipps zur Verwendung?</p><p>Der Beitrag <a href="http://maddesigns.de/assemble-static-site-generator-grunt-2625.html/" target="_blank">Assemble – erste Schritte mit dem Static Site Generator für Grunt</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/assemble-static-site-generator-grunt-2625.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Responsive iFrames</title>
		<link>http://maddesigns.de/responsive-iframes-2417.html</link>
		<comments>http://maddesigns.de/responsive-iframes-2417.html#comments</comments>
		<pubDate>Mon, 04 May 2015 07:00:16 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[RWD]]></category>
		<category><![CDATA[iframe]]></category>
		<category><![CDATA[responsive]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2417</guid>
		<description><![CDATA[<p>Responsive Retrofitting Teil&#160;3 Ein Blogpost der nunmehr 3 Jahre auf Vollendung wartet, ist jetzt endlich fertig :) Responsive iFrame? Das klingt schon falsch und ist auch ein schwieriges Pflaster. Grundsätzlich können iFrames responsive sein, Voraussetzung ist natürlich, dass sich deren Inhalt ebenfalls responsive verhält. Es ist ja quasi ein Browserfenster im Browserfenster. Doch die Anpassung &#8230; <a href="http://maddesigns.de/responsive-iframes-2417.html" class="more-link"><span class="screen-reader-text">Responsive iFrames</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/responsive-iframes-2417.html/" target="_blank">Responsive iFrames</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<h2>Responsive Retrofitting Teil&nbsp;3</h2>
<p><em>Ein Blogpost der nunmehr 3 Jahre auf Vollendung wartet, ist jetzt endlich fertig :)</em></p>
<p>Responsive iFrame? Das klingt schon falsch und ist auch ein schwieriges Pflaster. Grundsätzlich können iFrames responsive sein, Voraussetzung ist natürlich, dass sich deren Inhalt ebenfalls responsive verhält. Es ist ja quasi ein Browserfenster im Browserfenster. Doch die Anpassung der Breite ist nicht das Problem, die Anpassung der Höhe macht es kompliziert.</p>
<p><span id="more-2417"></span></p>
<h2>Prominentes Beispiel: YouTube Video responsive einbinden</h2>
<p>Der YouTube-iFrame soll folgendermaßen eingebunden werden:</p>
<pre class="language-markup"><code>&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/9T7eSyo7DRU" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;</code></pre>
<p>Die Breite des iFrame überschreibt man durch CSS wie auch bei Responsive Images:</p>
<pre class="language-css"><code>img,
iframe {
  max-width: 100%;
}</code></pre>
<p>Die Breite passt sich immer dem Container an. Die Höhe wird leider nicht automatisch angepasst, im Beispiel bleibt die Höhe also bei 315px. Die Regel <code class="language-css">height: auto;</code> hat hier leider keinen Einfluss auf unseren iFrame. Das Problem bleib die relationale Höhenanpassung des iFrames, wenn sich die Breite verändert. Für das reponsive iFrame Video behelfen wir uns mit einem bekannten Trick. Den iFrame umschließen wir mit einem Container-DIV und erweitern den Container mit &#8218;padding-bottom&#8216; durch die prozentuale Höhe des Seitenverhältnis vom iFrames, genauso wie bei <a href="http://maddesigns.de/responsive-images-lazy-loading-2151.html" title="Responsive Images – width/height-Attribute entfernen, lazy loading &#038; padding-bottom Trick">Lazy Loading Responsive Images Blogpost</a>.</p>
<p><strong>Beispiel:</strong></p>
<pre class="language-markup"><code>&lt;div class="embed-container"&gt;
    &lt;iframe width="560" height="315" src="https://www.youtube.com/embed/9T7eSyo7DRU" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div></code></pre>
<pre class="language-css"><code>.embed-container {
  position: relative; 
  padding-bottom: 56.25%; /* ratio 16x9 */
  height: 0; 
  overflow: hidden; 
  width: 100%;
  height: auto;
}
.embed-container iframe {

  position: absolute; 
  top: 0; 
  left: 0; 
  width: 100%; 
  height: 100%; 
}
/* ratio 4x3 */
.embed-container.ratio4x3 {
  padding-bottom: 75%;
}</code></pre>
<p>Jetzt wird die Video-Containerhöhe immer relational an die Breite angepasst. Je nach Seitenverhältnis kann man auch weitere Klassen im <code class="language-css">.embed-container</code> verwenden, z.B. <code class="language-css">.ratio4x3</code> für ein Seitenverhälnis 4:3.</p>
<p>Bei einem externen Video mit festem Seitenverhältnis ist das recht einfach, schwieriger wird es mit interaktiven Inhalten, die eine dynamische Höhe haben.</p>
<h3>iFrame Interaktion</h3>
<p>Wenn man im iFrame weitere Aktionen durchführen kann (Bestellformular, etc.) und die iFrame-Inhaltsseiten unterschiedlich lang sind, wird unter Umständen ein Scrollbalken angezeigt oder man hat viel Weißraum. Dieses Verhalten ist verständlicherweise nicht gewollt. In einem Projekt sollte die Anwendung (Berechnung einer Versicherung) in Partnerwebseiten eingebunden werden, ohne dass auffällt, dass es eine externe Anwendung (ein externes Produkt) ist.</p>
<p>Das ist unlängst komplizierter, da iFrames insbesondere von verschiedenen Domains aus Sicherheitsgründen nicht so einfach miteinander kommunizieren dürfen (<a href="https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy">Same-Origin-Policy</a>).</p>
<h4>Same Origin iFrame</h4>
<p>Wenn der iFrame von der gleichen Domain aus z.B. mit der ID „responsive-iframe“ eingebunden ist, kann man folgende jQuery-Funktion verwenden.</p>
<pre class="language-javascript"><code>$(function(){
  $(window).on('load resize', adjustIframe);
});

function adjustIframe() {
  $(parent.document.getElementById("responsive-iframe")).css("height", $("html").css("height"));
}</code></pre>
<p>Erfolgt die Einbindung unter einer anderen Domain, muss man eine andere Technik verwenden damit die Kommunikation zwischen den Frames gewährleistet ist.</p>
<h4>Cross Origin iFrame</h4>
<p>In HTML5 ist <code>postMessage</code> eingeführt worden, das eine Kommunikation zwischen Browserfenstern erlaubt. Hiermit ist es möglich die aktuelle Höhe des iFrame-Inhalt an die einbindende Seite zu übermitteln.</p>
<p><strong>postMessage Definition:</strong></p>
<pre class="language-javascript"><code>otherWindow.postMessage(message, targetOrigin, [transfer]);</code></pre>
<h3>JavaScript Funktion für Cross-Origin responsive iFrames</h3>
<p><strong>iframe.html &#8211; Sender:</strong></p>
<pre class="language-javascript"><code>var rIframe = {};
rIframe.requestAnimFrame = (function(){
        
    return  window.requestAnimationFrame       ||
            window.webkitRequestAnimationFrame ||
            window.mozRequestAnimationFrame    ||
            window.oRequestAnimationFrame      ||
            window.msRequestAnimationFrame     ||
            function( callback ){
                window.setTimeout(callback, 1000 / 60);
            };
})();    
rIframe.windowHeight = 0;
rIframe.htmlElement = document.getElementsByTagName('html')[0];
rIframe.targetDomain = 'domain.tld';
rIframe.resizeFrame = function (){
    var windowHeight = document.body ? Math.max(document.body.offsetHeight, rIframe.htmlElement.offsetHeight) : rIframe.htmlElement.offsetHeight ;
    if ( rIframe.windowHeight === windowHeight ) {
        rIframe.requestAnimFrame.call(window, rIframe.resizeFrame);
        return false;
    }
    rIframe.windowHeight = windowHeight;
    try {
        // Same Origin iFrame
        window.frameElement.style.height = windowHeight + 'px';
    }
    catch ( e ) {
        // Cross Origin iFrame
        window.parent.postMessage('resize:' + windowHeight , rIframe.targetDomain);
    }
    rIframe.requestAnimFrame.call(window, rIframe.resizeFrame);
};
rIframe.requestAnimFrame.call(window, rIframe.resizeFrame);</code></pre>
<p><strong>index.html &#8211; Empfänger:</strong></p>
<pre class="language-javascript"><code>function receiveMessage(event) {
    var message = event.data.split(':');
    var eventName = message[0];
    var iframes, len, i = 0;

    // only receive messages from this domain
    var senderDomains = ['domain.tld'];

    if ( senderDomains.indexOf(event.origin) !== -1 && eventName === 'resize' ) {
        iframes = document.getElementsByTagName('iframe');
        len = iframes.length;
        
        for (; i < len; i++) {
            if ( ( iframes[i].contentWindow || iframes[i].documentWindow ) == event.source) {
                iframes[i].style.height = message[1] + "px";
                return;
            }
        }
    }
}

if ( window.addEventListener ) {
    window.addEventListener('message', receiveMessage, false);
} 
else if (window.attachEvent)  {
    window.attachEvent('onmessage', receiveMessage);
}</code></pre>
<p>Den kompletten Code findet man <a href="https://github.com/closingtag/super-awesome-responsive-iframe-solution">hier</a></p>
<h3>JavaScript-Plugins</h3>
<h4>easyXMD</h4>
<p>easyXDM ist eine Javascript Library, die es Entwicklern ermöglich mit den Limitierung der Same Origin Policy umzugehen und Anwendungen Cross-Domain kommunizieren zu lassen. Im Blogpost auf <a href="http://easyxdm.net/wp/2010/03/17/resize-iframe-based-on-content/">http://easyxdm.net/wp/2010/03/17/resize-iframe-based-on-content/</a> wird gut beschrieben, welche Schritte man unternehmen muss.</p>
<p><a href="http://easyxdm.net/wp/">http://easyxdm.net/wp/</a></p>
<p>Wer im Projekt jQuery verwendet, kann das „responsiveiframe” Plugin von NPR verwenden.</p>
<p><a href="http://npr.github.io/responsiveiframe/">http://npr.github.io/responsiveiframe</a></p>
<p>Eine umfangreiche API für iFrame Embeds bietet <strong>iframely</strong>. Die Basisvariante ist auch auf <a href="https://github.com/itteco/iframely">Github verfügbar</a>. Der Online-Service bietet noch weitere Features, wenn man ein Bezahlmodell wählt.</p>
<p><a href="https://iframely.com/">https://iframely.com/</a></p>
<h3>Performance Tweak</h3>
<p>Ein letzter Hinweis, wenn der iFrame onload nicht im Viewport ist, sollte man überlegen, ob man den iFrame mit einer Lazy Loading Technik verzögert lädt. Am Beispiel der <a href="http://afarkas.github.io/lazysizes/">lazySizes</a> Bibliothek von Alex Farkas, ist das sehr einfach zu integrieren.</p>
<pre class="language-markup"><code>&lt;iframe data-src="//www.youtube.com/embed/ZfV-aYdU4uE" class="lazyload" frameborder="0" allowfullscreen>&lt;/iframe></code></pre>
<p>Die eigentliche Soure (src) wird durch „data-src“ ersetzt, zusätzlich mit der Klasse „lazyload“ versehen. Das Script lädt dann den iFrame beim Scrollen nach, wenn der iFrame sich den Viewport nähert.</p>
<p>Das ist aber mehr oder weniger nur ein Zusatzfeature der Bibliothek - das Hauptaugenmerk liegt auf das Lazy Loading von Responsive Images (srcset/picture). Also durchaus eine Script, das man in vielerlei Hinsicht verwenden kann.</p><p>Der Beitrag <a href="http://maddesigns.de/responsive-iframes-2417.html/" target="_blank">Responsive iFrames</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/responsive-iframes-2417.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Content Source Order in RWD</title>
		<link>http://maddesigns.de/content-source-order-in-responsive-webdesign-2577.html</link>
		<pubDate>Mon, 23 Mar 2015 07:01:53 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[RWD]]></category>
		<category><![CDATA[Content]]></category>
		<category><![CDATA[flexbox]]></category>
		<category><![CDATA[Order]]></category>
		<category><![CDATA[Retrofitting]]></category>
		<category><![CDATA[Source]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2577</guid>
		<description><![CDATA[<p>Responsive Retrofitting Teil 2 Diese kleine Serie gibt ein paar Beispiele, wie man ein paar knifflige Aufgaben beim „responsive-fähig-machen” einer Desktop-Seite lösen kann. Wie schon in Teil 1 zum Thema „Responsive Tabellen“, nochmals vorab der Hinweis, dass man bei einer umfangreicheren Seite mit neuer Code-Basis im Mobile-First-Modus starten sollte. Ein häufiges Problem beim sogenannten „Responsive &#8230; <a href="http://maddesigns.de/content-source-order-in-responsive-webdesign-2577.html" class="more-link"><span class="screen-reader-text">Content Source Order in RWD</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/content-source-order-in-responsive-webdesign-2577.html/" target="_blank">Content Source Order in RWD</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<h2>Responsive Retrofitting Teil 2</h2>
<p><em>Diese kleine Serie gibt ein paar Beispiele, wie man ein paar knifflige Aufgaben beim „responsive-fähig-machen” einer Desktop-Seite lösen kann.</em></p>
<p><em>Wie schon in <a title="Responsive Tabellen" href="http://maddesigns.de/responsive-tables-2393.html">Teil 1 zum Thema „Responsive Tabellen“</a>, nochmals vorab der Hinweis, dass man bei einer umfangreicheren Seite mit neuer Code-Basis im Mobile-First-Modus starten sollte.</em></p>
<p>Ein häufiges Problem beim sogenannten „Responsive Retro Fitting”, also bestehende Desktop Webseiten „responsivefähig” zu machen, ist die visuelle Neuordnung von Inhalt, wenn man am bestehenden Markup nichts ändern kann/darf.</p>
<p><span id="more-2577"></span></p>
<p><strong>Ein kleines Beispiel dafür:</strong></p>
<p>Auf einer Desktopseite ist das User-Login-Formular in der „rechten” Spalte. Linearisiert man jetzt das Layout, so dass die Inhaltscontainer nicht mehr nebeneinander floaten, würde das Login-Formular erst unter dem Hauptinhalt kommen. Das kann ja durchaus so gewollt sein, meist möchte man aber das Login-Formular als ersten Inhaltsbereich auf der Seite sehen, um sich schnell einloggen zu können und nicht erst lange scrollen zu müssen.</p>
<p>Ein anderes Beispiel: „Aktuelle News” in der rechten Spalte, News-Listenansicht in der „linken Spalte” – die aktuellen Nachrichten erwartet man in der Smartphone-Ansicht eher oberhalb der alten News.</p>
<p><strong>Ein typisches Markup</strong></p>
<pre class="lang-markup"><code><!-- old desktop -->
&lt;div class="container"&gt;
    &lt;div class="col-left"&gt;
        left content
    &lt;/div&gt;
    &lt;div class="col-right"&gt;
        right content
    &lt;/div&gt;
&lt;/div&gt;
</code></pre>
<p>Gesetzt den Fall, dass man die Elemente bereits fluide mit prozentualen Breiten ausgestattet hat, könnte man für kleine Bildschirme (wir nehmen hier kleiner als 600px an) folgendes CSS zuweisen um die Reihenfolge der Spalten zu verändern.</p>
<p><strong>CSS</strong></p>
<pre class="lang-css"><code>@media screen and (max-width: 600px) {
  .container {
    display: table;
  }
  .col-left {
    display: table-footer-group;
  }
  .col-right {
    display: table-head-group;
  }
}
</code></pre>
<p>Hierbei kommt ein kleiner Trick zum Einsatz, der eigentlich für das Styling von Tabellen gedacht ist, nämlich das Setzen einer Display-Eigenschaft für Table-Head bzw. Table-Foot. Das ist zwar ein wenig dirty, aber es funktioniert.</p>
<p>Dieser Trick wird von allen modernen Browsern verstanden, selbst der IE8 würde das machen – der bekommt aber normalerweise keine Smartphone-/Tablet-View, da nur auf Desktop-Geräten im Einsatz, wenn er überhaupt noch was bekommt…</p>
<p>Allerdings begegnet uns hier ein kleines Problem &#8211; <code>table-footer-group</code> nimmt kein <code>padding</code> an, da es eigentlich nur als Container ohne Eigenschaften agiert.</p>
<p><strong>Eine alternative Variante:</strong></p>
<pre class="lang-css"><code>@media screen and (max-width: 600px) {
    .container {
        display: table;
    }
    .col-left,.col-right {
        display: table-caption;
        padding: 1em;
    }
    .col-left {
        caption-side: bottom;
    }
    .col-right {
        caption-side: top;
    }
}
</code></pre>
<p>Wir nutzen hier wieder CSS-Eigenschaften, die für das Stylen von Datentabellen gedacht waren, <code>caption-side: top/bottom</code> ist eigentlich für die Anordnung der Tabellenbeschreibung (<code>&lt;caption&gt;</code>) gedacht. So ist es möglich den Spalten auch ein <code>padding</code> zuweisen.</p>
<h2>Anordnung mit Flexbox</h2>
<p>Besser geeignet und für solche Anwendungsfälle gedacht, ist die Eigenschaft <code>flex-direction: column-reverse</code> im Flexbox-Kontext.</p>
<p><strong>Flexbox column-reverse Beispiel</strong></p>
<pre class="lang-css"><code>@media screen and (max-width: 600px) {
    .container {
        display: flex;
        flex-direction: column-reverse;
    }
    .col-left,.col-right {
        padding: 1em;
    }
}
</code></pre>
<p>Hier werden die Elemente, die innerhalb des Container liegen als Spalte in umgekehrter Reihenfolge gestapelt. Die direkten Kindelemente vom Flexbox-Container (<code>display: flex/inline-flex</code>) werden in ihrer Reihenfolge umgekehrt angezeigt.</p>
<p>Angenommen man hat mehr als zwei Elemente, ist es ratsam mit der Flexbox-Eigenschaft <code>order</code> zu arbeiten, um genauer definieren zu können, welche Spalte an welcher Stelle kommt.</p>
<p><strong>Flexbox Order Beispiel: HTML</strong></p>
<pre class="lang-markup"><code>&lt;div class="container"&gt;
    &lt;div class="col-left"&gt;
        left content
    &lt;/div&gt;
    &lt;div class="col-middle"&gt;
        middle content
    &lt;/div&gt;
    &lt;div class="col-right"&gt;
        right content
    &lt;/div&gt;
&lt;/div&gt;
</code></pre>
<p><strong>CSS</strong></p>
<pre class="lang-css"><code>@media screen and (max-width: 600px) {
    .container {
        display: flex;
        flex-direction: column;
    }
    .col-left {
        order: 3;
    }
    .col-middle {
        order: 2;
    }
    .col-right {
        order: 1;
    }
}</code></pre>
<p>Mit <code>order</code> kann man ganz genau bestimmen welches Element wann kommt.</p>
<h3>Browser-Support</h3>
<p><img class="alignnone size-full wp-image-2586" src="http://maddesigns.de/wp-content/uploads/2015/03/Can-I-use...-Support-tables-for-HTML5-CSS3-etc-2015-03-23-07-46-54.png" srcset="http://maddesigns.de/wp-content/uploads/2015/03/Can-I-use...-Support-tables-for-HTML5-CSS3-etc-2015-03-23-07-46-54-360x189.png 360w, http://maddesigns.de/wp-content/uploads/2015/03/Can-I-use...-Support-tables-for-HTML5-CSS3-etc-2015-03-23-07-46-54-640x335.png 640w, http://maddesigns.de/wp-content/uploads/2015/03/Can-I-use...-Support-tables-for-HTML5-CSS3-etc-2015-03-23-07-46-54.png 1177w" alt="Flexbox browser support" width="1177" height="617" /></p>
<p>Der Browser-Support für Flexbox ist mittlerweile sehr gut. Allerdings sollte man für ältere Browser, die eine ältere Spezifikation von Flexbox implementiert haben oder noch Vendor-Prefixe verwenden ( Android, iOS, IE10, … ) und die dementsprechenden Eigenschaften verwenden. Zudem sollte man auf die <a title="Flexbox Bugs" href="http://philipwalton.com/articles/normalizing-cross-browser-flexbox-bugs/">Flexbugs-Liste</a> ein Auge werfen, ob nicht ein Browser doch noch ein Bug mitliefert.</p>
<p>Für die Generierung des alten Flexbox-Syntax mit Browser-Prefix empfehle ich <a title="Autoprefixer PostCSS" href="https://github.com/postcss/autoprefixer">Autoprefixer</a>. Wer Sass verwendet, aber kein Autoprefixer, dem sei das <a title="Flexbox Sass Mixin" href="https://github.com/mastastealth/sass-flex-mixin">Flexbox Mixin</a> ans Herz gelegt. Besser wäre aber Autoprefixer in seinen Workflow zu integrieren.</p>
<p>Happy Retrofitting!</p><p>Der Beitrag <a href="http://maddesigns.de/content-source-order-in-responsive-webdesign-2577.html/" target="_blank">Content Source Order in RWD</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>CSS clip-path</title>
		<link>http://maddesigns.de/css-clip-path-2514.html</link>
		<pubDate>Mon, 01 Dec 2014 07:00:22 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[clip-path]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[mask]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2514</guid>
		<description><![CDATA[<p>clip-path ist eine neue CSS-Eigenschaft, die wie viele andere CSS3-Eigenschaften ebenfalls den Ursprung in SVG hat. Wie bei shapes-outside kann man clip-path über Pfadfunktionen wie circle(), ellipse(), inset() oder polygon() eine Form zuweisen, die dann das Bild oder den Container in der jeweiligen Form beschneiden. Alles, was außerhalb der definierten Form ist, wird entfernt und &#8230; <a href="http://maddesigns.de/css-clip-path-2514.html" class="more-link"><span class="screen-reader-text">CSS clip-path</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/css-clip-path-2514.html/" target="_blank">CSS clip-path</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p><code>clip-path</code> ist eine neue CSS-Eigenschaft, die wie viele andere CSS3-Eigenschaften ebenfalls den Ursprung in SVG hat. Wie bei <a title="CSS Shapes – neue Formen braucht das Web" href="http://maddesigns.de/css3-shapes-2451.html"><code>shapes-outside</code></a> kann man <a href="http://www.w3.org/TR/css-masking-1/#clipping-paths"><code>clip-path</code></a> über Pfadfunktionen wie <code>circle()</code>, <code>ellipse()</code>, <code>inset()</code> oder <code>polygon()</code> eine Form zuweisen, die dann das Bild oder den Container in der jeweiligen Form beschneiden. Alles, was außerhalb der definierten Form ist, wird entfernt und der Hintergrund des Elternelements erscheint.</p>
<p>Die alte Eigenschaft <code>clip</code> gibt es zwar schon länger in CSS, wurde jetzt aber überarbeitet spezifiziert. Der aktuelle Einsatz von <code>clip</code> ist sicherlich ein anderer als ursprünglich angedacht. Meist nutzen Webworker <code>clip</code> für barrierefreies Verstecken von Elementen wie <code>&lt;input type="radio" /&gt;</code> um ein Custom-Design zu integrieren und gleichzeitig die Browser-Funktionen zu erhalten. Die <a href="https://github.com/h5bp/html5-boilerplate/blob/master/dist/css/main.css#L135">HTML-Boilerplate</a> nutzt dies in der <code>.visuallyhidden</code> Definition.<span id="more-2514"></span> Ein Beispiel: <a title="codepen clip hide demo" href="http://codepen.io/maddesigns/pen/jbiDn">http://codepen.io/maddesigns/pen/jbiDn</a></p>
<p><strong>Die alte Clip-Eigenschaft:</strong></p>
<pre class="language-css"><code>.clip-me {
  /* old:  absolute or fixed positioning required */
  position: absolute;  
  /* deprecated version */
  clip: rect(110px, 160px, 170px, 60px);
  /* reset/default on deprecated version */
  clip: auto;
}
</code></pre>
<p><strong>Diese neuen hilfreiche Funktionen sind nun hinzu gekommen:</strong></p>
<pre class="language-css"><code>.clip-me {
  /* reset/default on current version */
  clip-path: none;
  /* current version */
  clip-path: rect(110px, 160px, 170px, 60px);
  /* rounded rectangle */
  clip-path: inset(10% 10% 10% 10% round 20%, 20%);
  /* circle */
  clip-path: circle(30px at 35px 35px);
  /* ellipse */
  clip-path: ellipse(65px 30px at 125px 40px);
  /* polygon */
  clip-path: polygon(0% 0%, 100% 50%, 0% 100%, 0% 0%);
}
</code></pre>
<p><strong>Beispiel:</strong></p>
<p class="codepen" data-height="643" data-theme-id="0" data-slug-hash="pvJJJP" data-default-tab="result" data-user="maddesigns">See the Pen <a href="http://codepen.io/maddesigns/pen/pvJJJP/">Simple CSS Shapes demo</a> by Sven Wolfermann (<a href="http://codepen.io/maddesigns">@maddesigns</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<p>Zudem können auch die bereits vorhandenen Formenausmaße als Clip-Path verwendet werden.</p>
<pre class="language-css"><code>clip-path: fill-box | stroke-box | view-box</code></pre>
<h2>clip-path: url() &#8211; SVG-Vorlage mit &lt;clipPath&gt;</h2>
<p>Neben den einfachen Clip-Formen kann man auch umfangreiche Clip-Pfade, die in SVG definiert sind, verwenden. So können auch Bézierkurven verwendet werden, ganze Formen-Gruppen (&lt;rect&gt;, &lt;circle&gt;, &lt;path&gt; etc.) oder auch Texte.</p>
<p><a title="MDN-Referenz clipPath" href="https://developer.mozilla.org/en-US/docs/Web/SVG/Element/clipPath">SVG clipPath MDN-Referenz</a></p>
<p>Diese definierten Formen können im Anschluss in CSS als URL referenziert werden.</p>
<pre class="language-css"><code>.element {

  /* referencing path from (inline SVG) &lt;clipPath&gt; */
  clip-path: url(#clipPath);

  /* referencing path from external SVG */
  clip-path: url(img/path.svg#clipPath);

}
</code></pre>
<p><strong>Beispiel:</strong></p>
<p class="codepen" data-height="510" data-theme-id="0" data-slug-hash="yyNNbP" data-default-tab="result" data-user="maddesigns">See the Pen <a href="http://codepen.io/maddesigns/pen/yyNNbP/">CSS Shapes &amp; responsive clipPath SVG image</a> by Sven Wolfermann (<a href="http://codepen.io/maddesigns">@maddesigns</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<p>Wenn sich die beschnittenen HTML-Elemente responsive verhalten sollen, muss man auf das in SVG angewendete Koordinatensystem acht geben. Gewöhnlicher Weise wird hier mit absoluten Pixelwerten gearbeitet, so dass sich Schnittmaske nicht mit skaliert. Durch <code>clipPathUnits="objectBoundingBox"</code> wird das Koordinatensystem so umgestellt, dass es sich relative zur viewBox verhält. Es ist also ratsam das Bild über &lt;image&gt; in SVG zu definieren und das komplette SVG inline in HTML zu integrieren.</p>
<h3>SVG mit Text</h3>
<p>Wie schon kurz erwähnt kann auch Text in SVG als Pfad- bzw. Beschnittform dienen. Über CSS @font-face ist es dann natürlich auch möglich den gewünschte Webfont nutzen. Die Positionierung kann manchmal etwas hakelig sein.</p>
<p><strong>Beispiel:</strong></p>
<p class="codepen" data-height="450" data-theme-id="0" data-slug-hash="qEddpw" data-default-tab="result" data-user="maddesigns">See the Pen <a href="http://codepen.io/maddesigns/pen/qEddpw/">SVG clipPath text</a> by Sven Wolfermann (<a href="http://codepen.io/maddesigns">@maddesigns</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<h3>Animated clip-path</h3>
<p>Die Beschnittpfade können auch animiert sein, bzw. auf Mouse-Aktionen Transitions durchführen. Wichtig ist dabei, dass die Knotenanzahl des Pfades gleich bleibt, sonst funktioniert die Animation nicht. Es ist also nicht möglich von einem Stern-Polygon zu einem Viereck zu animieren, die Knoten müssen alle erhalten bleiben und dementsprechend positioniert werden, dann geht’s.</p>
<pre class="language-css"><code>img {
    clip-path: polygon(0% 0%, 100% 50%, 0% 100%, 0% 0%);
    transition: clip-path 0.3s 0.1s;

    &amp;:hover {
        clip-path: polygon(0% 0%, 100% 0%, 0% 100%, 0% 0%);
    }
}
</code></pre>
<p>Eine Animation kann auch direkt in SVG definiert sein. Es gibt aber teilweise große Performance-Unterschiede in den verschiedenen Browsern, also vorsichtig damit experimentieren.</p>
<ul>
<li><a title="Animated SVG clipping mask" href="http://www.pencilscoop.com/demos/animating-svg-clipping-masks/">http://www.pencilscoop.com/demos/animating-svg-clipping-masks/</a></li>
<li><a title="animated clip path" href="http://codepen.io/maddesigns/pen/xvipD">http://codepen.io/maddesigns/pen/xvipD</a></li>
</ul>
<h3>Tools</h3>
<p>Um <code>clip-path</code> zu experimentieren, hat Bennett Feely ein tolles Online-Tool entwickelt. Dort sind mehrere Formen bereits vordefiniert. Die Veränderung der Formen und die Auswirkung auf den CSS-Code ist schön umgesetzt. Ein weiteres Tool stammt von Alex Bylim &#8211; der Clip-Path-Generator.</p>
<ul>
<li><a title="Clippy - CSS clip-path online tool" href="http://bennettfeely.com/clippy/">http://bennettfeely.com/clippy/</a></li>
<li><a title="clip-path generator" href="http://cssplant.com/clip-path-generator">http://cssplant.com/clip-path-generator</a></li>
</ul>
<p>Wie für CSS-Shapes, kann man auch für <code>clip-path</code> die <a href="https://chrome.google.com/webstore/detail/nenndldnbcncjmeacmnondmkkfedmgmp">Chrome-Browser-Erweiterung</a> nutzen, um in den Dev-Tools Formen hinzuzufügen oder zu verändern.</p>
<h4>Browser-Support</h4>
<p>Der Browser-Support sieht grundsätzlich, mit Abstrichen, ganz gut aus. Aber der aktuelle Standard ist noch nicht in allen Browsern verfügbar. Chrome/Opera und Safari unterstützen die erwähnten Form-Funktionen in <code>clip-path</code>, allerdings mit -webkit-Präfix. Firefox unterstützt die Form-Funktionen leider noch nicht, aber die Variante mit <code>url(#clipPath)</code>. Der Internet-Explorer unterstützt leider gar nichts davon. Hier müsste man das zu beschneidende Element (z.B. Bild) direkt in SVG einbinden, darauf anwenden und diesen SVG-Code inline ins HTML einfügen (Beipiel: <a title="Responsive Image SVG clip-path" href="http://codepen.io/maddesigns/pen/kbqzu">http://codepen.io/maddesigns/pen/kbqzu</a>). Dann funktioniert es auch dort.</p>
<p>Der komplette Browser-Support:<br />
<a title="Can I Use clip-path" href="http://caniuse.com/#feat=css-clip-path"><br />
<img src="http://maddesigns.de/wp-content/uploads/2014/11/caniuse-clip-path-360x203.png" srcset="http://maddesigns.de/wp-content/uploads/2014/11/caniuse-clip-path-360x203.png 360w, http://maddesigns.de/wp-content/uploads/2014/11/caniuse-clip-path-640x361.png 640w, http://maddesigns.de/wp-content/uploads/2014/11/caniuse-clip-path.png 1270w" alt="caniuse-clip-path" width="360" height="203" class="alignnone size-medium wp-image-2533" /><br />
</a></p>
<h3>Empfohlene Blog Posts:</h3>
<ul>
<li><a title="CSS SVG Clipping by Sara Soueidan" href="http://sarasoueidan.com/blog/css-svg-clipping/">http://sarasoueidan.com/blog/css-svg-clipping/</a></li>
<li><a title="Adobe making the web sweeter" href="http://blogs.adobe.com/webplatform/2014/01/16/making-the-web-sweeter/">http://blogs.adobe.com/webplatform/2014/01/16/making-the-web-sweeter/</a></li>
</ul>
<p>Das Schöne ist, das <code>clip-path</code> auf alle möglichen Elemente angewandt werden kann, z.B. auch <a href="http://codepen.io/yoksel/pen/oggRwR">Videos</a> oder Textblöcke, nicht nur Bilder. Zudem sind die Beschnittpfade animierbar und können dynamisch über JavaScript generiert werden. Mit den zusätzlichen Möglichkeiten von SVG, bleibt kaum ein Wunsch an Gestaltungsmöglichkeiten offen. Wenn jetzt nur noch der Browser-Support insgesamt besser würde…</p>
<h1>Bonus: Mask</h1>
<p>Eine ähnliche Eigenschaft wie <code>clip-path</code> ist <code>mask</code>, was ebenfalls aus der SVG-Spezifikation her rührt. Neu ist die CSS-Eigenschaft ja eigentlich nicht, Safari (WebKit) hat <code>mask</code> bereits 2008 in einem <a title="Webkit Blog about CSS Mask" href="https://www.webkit.org/blog/181/css-masks/">Blog-Post</a> beschrieben und Christian <a title="Christian Schaefer on twitter" href="https://twitter.com/derSchepp">@derSchepp</a> Schaefer beschrieb in seinem <a title="CSS Masking even for older Browsers" href="http://thenittygritty.co/css-masking">Blog-Post</a> wie man die <code>mask</code>-Eigenschaft auch in alten IEs umsetzen kann. <code>mask</code> kann man (halb-)transparente URLs zuweisen, wie bei <code>shape-outside</code>. Im Unterschied zu <code>clip-path</code> kann <code>&lt;mask&gt;</code> auch halbtransparente Flächen beinhalten und somit das zu maskierende Element auch nur halbtransparent „beschneiden“.</p>
<ul>
<li><a title="masking tutorial" href="http://www.html5rocks.com/en/tutorials/masking/adobe/">http://www.html5rocks.com/en/tutorials/masking/adobe/</a></li>
<li><a title="How to create css image mask" href="http://collidercreative.com/how-to-create-css-image-masks-for-the-web-with-svgs/">http://collidercreative.com/how-to-create-css-image-masks-for-the-web-with-svgs/</a></li>
</ul>
<p>Einen Maske kann direkt in SVG definiert werden und dort natürlich alle Möglichkeiten nutzen. Unter Anderem könnte man auch Text als Maske benutzen, hier ein Beispiel:</p>
<p><strong>Beispiel: </strong></p>
<p class="codepen" data-height="500" data-theme-id="0" data-slug-hash="PwqYON" data-default-tab="result" data-user="maddesigns">See the Pen <a href="http://codepen.io/maddesigns/pen/PwqYON/">SVG text mask </a> by Sven Wolfermann (<a href="http://codepen.io/maddesigns">@maddesigns</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<p>Allerdings ist hier der Browser-Support nicht ganz so einfach zu lesen <a title="caniuse CSS Mask" href="http://caniuse.com/#feat=css-mask">http://caniuse.com/#feat=css-mask</a> da hier verschiedene Stufen der Spezifikation integriert sind.</p>
<p><script src="//assets.codepen.io/assets/embed/ei.js" async=""></script></p><p>Der Beitrag <a href="http://maddesigns.de/css-clip-path-2514.html/" target="_blank">CSS clip-path</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>CSS Shapes &#8211; neue Formen braucht das Web</title>
		<link>http://maddesigns.de/css3-shapes-2451.html</link>
		<comments>http://maddesigns.de/css3-shapes-2451.html#comments</comments>
		<pubDate>Mon, 17 Nov 2014 07:56:46 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[shape-outside]]></category>
		<category><![CDATA[shapes]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2451</guid>
		<description><![CDATA[<p>Die Welt ist eine Scheibe und das Web ist eckig… so ungefähr könnte man anfangen um in das Thema einzusteigen. Aber ihr wisst ja, dass es anders ist. Nachdem wir mit CSS3 schon die Möglichkeit bekommen haben, die Ecken einer Box optisch abzurunden, bleibt natürlich eines offen – der Text bricht nach wie vor an &#8230; <a href="http://maddesigns.de/css3-shapes-2451.html" class="more-link"><span class="screen-reader-text">CSS Shapes &#8211; neue Formen braucht das Web</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/css3-shapes-2451.html/" target="_blank">CSS Shapes - neue Formen braucht das Web</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Die Welt ist eine Scheibe und das Web ist eckig… so ungefähr könnte man anfangen um in das Thema einzusteigen. Aber ihr wisst ja, dass es anders ist. </p>
<p>Nachdem wir mit CSS3 schon die Möglichkeit bekommen haben, die Ecken einer Box optisch abzurunden, bleibt natürlich eines offen – der Text bricht nach wie vor an der „geraden” Box-/Bildkante um, dass heißt er orientiert sich z.B. nicht an der Kante von border-radius, erst recht nicht am Inhalt des Bilds. Die eigentliche Box bleibt viereckig. Das ändert CSS-Shapes. </p>
<p><span id="more-2451"></span></p>
<p>Mit der neuen Eigenschaft <code>shape-outside</code>, die auf <a href="http://webplatform.adobe.com/shapes/" title="Adobe CSS Shapes">Initiative von Adobe</a> als W3C-Standard etabliert wurde, können nun geometrische Formen zu einer Box hinzugefügt werden, so dass sich der Textfluß an den Formen orientiert. Diese Formen (<a href="http://www.w3.org/TR/css-shapes/" title="W3C Spec">Shapes</a>) können mit folgenden Funktionen generiert werden:</p>
<ul>
<li>circle() &#8211; Kreis</li>
<li>ellipse() &#8211; Ellipse (ovale Kreisform)</li>
<li>inset() &#8211; orientiert sich an der Box</li>
<li>polygon() &#8211; eigene Form mit mehreren Knotenpunkten</li>
</ul>
<h3>einfaches Beispiel Kaffeetasse &#8211; circle()</h3>
<pre class="language-css"><code>img.coffeecup {
    float: right;
    width: 33%;
    shape-outside: circle(50%);
}</code></pre>
<p><strong>Beispiel-Grafik:</strong></p>
<p><img src="http://maddesigns.de/wp-content/uploads/2014/11/CSS3-shapes-coffee.png" alt="screenshot CSS Shapes circle() coffee cup" width="630" height="321" class="alignnone size-full wp-image-2461" srcset="http://maddesigns.de/wp-content/uploads/2014/11/CSS3-shapes-coffee.png 630w, http://maddesigns.de/wp-content/uploads/2014/11/CSS3-shapes-coffee-360x183.png 360w" sizes="(max-width: 630px) 100vw, 630px" /></p>
<p>Noch einfacher – der Textfluss kann sich auch am Border-Box-Model orientieren, also z.B. falls dem Element <code>border-radius</code> zugewiesen ist. </p>
<pre class="language-css"><code>shape-outside: margin-box | border-box | padding-box | content-box;</code></pre>
<h3>Shape: polygon()</h3>
<p>Mit <code>polygon()</code> kann man ein Form mit mehreren Knotenpunkten erstellen – allerdings keine Beziér-Kurven-Formen, sondern nur gerade Linien zwischen den Knotenpunkten. Aber klar… umso mehr Punkte, umso mehr könnte man eine Kreisform abbilden. </p>
<p><strong>einfaches Beispiel: Dreckeckform</strong></p>
<pre class="language-css"><code>.triangle {
    shape-outside: polygon(0 0, 100% 50%, 0% 100%);
}</code></pre>
<p><img src="http://maddesigns.de/wp-content/uploads/2014/11/css-shapes-polygon.png" alt="css-shapes-polygon" width="417" height="411" class="alignnone size-full wp-image-2490" srcset="http://maddesigns.de/wp-content/uploads/2014/11/css-shapes-polygon.png 417w, http://maddesigns.de/wp-content/uploads/2014/11/css-shapes-polygon-284x280.png 284w" sizes="(max-width: 417px) 100vw, 417px" /></p>
<p><em>(Hier im Beispiel sind nur 3 Werte angegeben, polygon() braucht normal min. 4 Werte um die Form zu schließen, allerdings wird die Form immer zum Ausgangspunkt hin automatisch geschlossen. Deshalb funktioniert das Beispiel mit dem Pfeil trotzdem wie erwartet.)</em></p>
<h3>Shape aus Bildvorlage &#8211; url()</h3>
<p>Zudem kann aber auch ein URL-Asset, als Shape-Vorlage verwendet werden.</p>
<p><strong>Das wird dann wie folgt eingebunden:</strong></p>
<pre class="language-css"><code>img {
    float: right;
    shape-outside: url(path/to/image-with-shape.png);
}</code></pre>
<p><strong>Klassisches Anwendungsbeispiel ist eine Vorlage wie diese:</strong></p>
<p><img src="http://maddesigns.de/wp-content/uploads/2014/11/iphone6.jpg" alt="iPhone 6 Mockup" width="600" height="450" class="alignnone size-full wp-image-2470" srcset="http://maddesigns.de/wp-content/uploads/2014/11/iphone6.jpg 600w, http://maddesigns.de/wp-content/uploads/2014/11/iphone6-360x270.jpg 360w" sizes="(max-width: 600px) 100vw, 600px" /></p>
<p>Ein Bild mit „transparenten” Flächen (bzw. der gleichen Hintergrundfarbe wie der Background). Hier wäre es doch praktisch, wenn der Text sich optimaler Weise an der „transparenten” Kante orientieren könnte. </p>
<p><strong>HTML</strong></p>
<pre class="language-markup"><code>&lt;section class=&quot;intro&quot;&gt;
    &lt;h2&gt;headline&lt;/h2&gt;
    &lt;img src=&quot;img/iphone6.jpg&quot; height=&quot;450&quot; width=&quot;600&quot; alt=&quot;new iPhone 6&quot;&gt;
    &lt;p&gt;Lorem&lt;/p&gt;
    &lt;p&gt;Lorem&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;Lorem ipsum dolor sit amet.&lt;/li&gt;
        &lt;li&gt;Eius enim unde esse alias aut.&lt;/li&gt;
        &lt;li&gt;Aliquam mollitia itaque officiis ab blanditiis.&lt;/li&gt;
    &lt;/ul&gt;
&lt;/section&gt;  </code></pre>
<p><strong>CSS</strong></p>
<pre class="language-css"><code>.intro img {
    float: right;
    shape-outside: url(img/iphone6.png);
}
</code></pre>
<p>Weitere Eigenschaften um den Fluss des Textes um das Shape-Bild zu verändern:</p>
<pre class="language-css"><code>shape-image-threshold: 0.5;
shape-margin: 1em;
</code></pre>
<ul>
<li><code>shape-margin</code> dürfte klar sein – Abstand vom transparenten Bildkante nach außen.</li>
<li><code>shape-image-threshold</code> &#8211; Schwellenwert ab wann ein halbtransparenter Pixel als Shapes-Kante gilt. Ein Wert von 0.5 bedeutet, dass der Shape-Kantenverlauf an Pixeln mit mehr als 50% Deckung verläuft.</li>
</ul>
<p><a href="http://maddesigns.de/css-shapes/demo/css-shapes-demo.html" title="CSS-Shapes Demo">CSS-Shapes Demo</a></p>
<p><strong>Codepen Live-Demo</strong></p>
<p data-height="400" data-theme-id="0" data-slug-hash="iceAH" data-default-tab="result" data-user="maddesigns" class='codepen'>See the Pen <a href='http://codepen.io/maddesigns/pen/iceAH/'>CSS Shapes url()</a> by Sven Wolfermann (<a href='http://codepen.io/maddesigns'>@maddesigns</a>) on <a href='http://codepen.io'>CodePen</a>.</p>
<h2>Shape-Masken Bild aus Photoshop-Vorlage erstellen</h2>
<p>Recht einfach ist es, wenn man bereits eine freigestellte Grafik hat &#8211; z.B. in Photoshop auf einer transparenten Ebene. Beim Exportieren die Grafik reduziert man das Bild auf zwei (2) Farben und lässt Transparenz aktiviert. Fertig.</p>
<p><img src="http://maddesigns.de/wp-content/uploads/2014/11/exporting-shapes-in-photoshop2.jpg" alt="exporting-shapes-in-photoshop2" width="986" height="710" class="alignnone size-full wp-image-2463" srcset="http://maddesigns.de/wp-content/uploads/2014/11/exporting-shapes-in-photoshop2.jpg 986w, http://maddesigns.de/wp-content/uploads/2014/11/exporting-shapes-in-photoshop2-360x259.jpg 360w, http://maddesigns.de/wp-content/uploads/2014/11/exporting-shapes-in-photoshop2-768x553.jpg 768w, http://maddesigns.de/wp-content/uploads/2014/11/exporting-shapes-in-photoshop2-640x461.jpg 640w" sizes="(max-width: 986px) 100vw, 986px" /><br />
<img src="http://maddesigns.de/wp-content/uploads/2014/11/exporting-shapes-in-photoshop1.jpg" alt="exporting-shapes-in-photoshop1" width="986" height="710" class="alignnone size-full wp-image-2462" srcset="http://maddesigns.de/wp-content/uploads/2014/11/exporting-shapes-in-photoshop1.jpg 986w, http://maddesigns.de/wp-content/uploads/2014/11/exporting-shapes-in-photoshop1-360x259.jpg 360w, http://maddesigns.de/wp-content/uploads/2014/11/exporting-shapes-in-photoshop1-768x553.jpg 768w, http://maddesigns.de/wp-content/uploads/2014/11/exporting-shapes-in-photoshop1-640x461.jpg 640w" sizes="(max-width: 986px) 100vw, 986px" /></p>
<h3>Unterstützte Bildformate für <code>shape-outside: url()</code></h3>
<ul>
<li>grundsätzlich wird jedes Format unterstützt</li>
<li>bei animierten Bilder wird laut Spezifikation der erste Frame verwendet, funktioniert aber aktuell mit alles Frames</li>
<li>Data URIs geht ebenfalls</li>
<li>die Bilder müssen den gleichen Ursprung haben (same origin) oder die Nutzung muss durch CORS zugelassen werden <em>hatte ich Probleme bei Codepen-Beispielen</em></li>
<li>generierte Verläufe funktionieren ebenfalls, sowohl linear-gradient als auch radial-gradient</li>
<li>in Zukunft noch mehr, wenn die CSS image Werte erweitert werden</li>
</ul>
<h2>Shape-Form mit Chrome-Devtools-Erweiterung erstellen</h2>
<p>Die Chrome-Erweiterung <a href="https://chrome.google.com/webstore/detail/nenndldnbcncjmeacmnondmkkfedmgmp">CSS-Shapes-Editor</a> ermöglicht es in den Chrome-Developer-Tools einem Element eine Shape-Form hinzuzufügen. </p>
<p><img src="http://maddesigns.de/wp-content/uploads/2014/11/shapes-chrome-ext-1024x409.jpg" alt="shapes-chrome-ext" width="660" height="263" class="alignnone size-large wp-image-2464" /></p>
<h2>Probleme:</h2>
<ul>
<li>CSS-Shapes ist eine Technik, die sich schwerlich in ein CMS integrieren lässt, wie ich finde. Nicht dass es nicht möglich ist, aber es verlangt den Redakteuren ein erhöhtes Mehrwissen ab. Ich sehe den Einsatz eher auf speziellen (statischen) Seiten. Sicherlich ist es möglich ein Tool zu bauen um Polygone zu editieren bzw. zu erstellen, lieber würde ich aber ein schönes Admin-Tool für Responsive Art-Direction Images sehen. Zudem muss dynamisches CSS generiert werden, bzw. Inline-Styles, was natürlich nicht das optimalste ist.</li>
<li>Aktuell können CSS-Shapes nur auf Elemente, die floaten angewandt werden, nicht aber auf Hintergrundbilder. Bedeutet also, die <img> müssen, auch wenn es nur dekorierende Bilder sein sollten, ins Markup eingebunden werden. Wenn zudem ein Shape-Bild verwendet wird, dann werden zwei Bilder geladen. Hier sollte man auf die Performance acht geben, dass nicht zu viele Daten geladen werden. Das zusätzliche Shape-Bild ist sicherlich recht klein, aber der zusätzliche Request ist natürlich unschön. Es könnte auch ein und dasselbe transparente PNG24 für die Darstellung und die Form verwendet werden, aber hierbei wird das Bild leider trotzdem 2x geladen (quasi 1x von HTML &amp; 1x von CSS).</li>
</ul>
<blockquote>
<p>Linktipp: wer bei transparenten PNG-Bilder die Datenmenge reduzieren will – und das sollte jeder tun – dem sei <a href="http://pngmini.com/" title="PNG Mini">pngmini.com</a> oder <a href="https://tinypng.com/" title="Tiny PNG">tinypng.com</a> ans Herz gelegt.  </p>
</blockquote>
<p><a href="http://maddesigns.de/css-shapes/demo/css-shapes-demo.html">Shapes circle() &#038; url() Beispiel</a></p>
<h2>Browser-Support:</h2>
<p>Aktuell unterstützen diese Technik</p>
<ul>
<li>Chrome 37 (Opera 24)</li>
<li>Safari 8 mit <code>-webkit-prefix</code></li>
</ul>
<p>Der Fallback ist das was man bereits kennt, also im Moment ist das Feature ein Enhancement. Es gibt zwar ein <a href="https://github.com/adobe-webplatform/css-shapes-polyfill">Polyfill</a>, den würde ich aber nicht einsetzen, wenn es sich nicht vermeiden lässt, denn der Polyfill generiert in nicht unterstützten Browsers massig zusätzlichen Code, dass geht natürlich zu Lasten der Scroll-Performance.</p>
<p><img src="http://maddesigns.de/wp-content/uploads/2014/11/shapes-polyfill-1024x680.png" alt="shapes-polyfill" width="660" height="438" class="alignnone size-large wp-image-2465" /></p>
<p><a href="http://blogs.adobe.com/webplatform/2014/05/12/css-shapes-polyfill/">Adobe Blogartikel über den CSS Shapes Polyfill</a></p>
<p>Man kann dieses Feature natürlich auch mit der nativen CSS-Methode <code>@supports</code> einbinden.</p>
<h3>@supports feature query</h3>
<pre class="language-css"><code>@supports (shape-outside: circle(50%)){
  /* styles only for browsers which support CSS Shapes */
  .element {
    shape-outside: circle(50%);
  }
}</code></pre>
<p><strong>Beispiel:</strong></p>
<p data-height="550" data-theme-id="0" data-slug-hash="mAIsl" data-default-tab="result" data-user="maddesigns" class='codepen'>See the Pen <a href='http://codepen.io/maddesigns/pen/mAIsl/'>Responsive CSS Shapes Google Map</a> by Sven Wolfermann (<a href='http://codepen.io/maddesigns'>@maddesigns</a>) on <a href='http://codepen.io'>CodePen</a>.</p>
<p>Ärgerlich ist, dass Safari <code>@supports</code> nicht unterstützt, so dass hier <code>shape-outside</code> nicht angezeigt würde obwohl Safari die Eigenschaft ja unterstützt. Also doch wieder <code>Modernizr</code> Feature-Detection.</p>
<h3>shape-inside()</h3>
<p>Die Eigenschaft <code>shape-inside()</code>, die in manchen Tutorials genannt wurde, wird es zunächst erstmal nicht geben. Mit <code>shape-inside</code> soll es möglich sein, die eigene Form einer (Text-)Box zu manipulieren. Das ist dann praktisch, wenn man <code>background-image</code> auf einer Box verwendet. Das ist allerdings nicht ganz trivial in Browser zu integrieren, da auch Eigenschaften wie  <code>position: absolute</code>, <code>flexbox</code> &amp; Co. berücksichtigt werden müssten, was nicht so trivial ist. </p>
<h2>Codepen-Collection</h2>
<p><a href="http://codepen.io/collection/XydgVA/"><img src="http://maddesigns.de/wp-content/uploads/2014/11/CSS-Shapes-a-Collection-by-Sven-Wolfermann-on-CodePen-2014-11-14-12-59-54-1024x292.jpg" alt="CSS Shapes - a Collection by Sven Wolfermann on CodePen 2014-11-14 12-59-54" width="660" height="188" class="alignnone size-large wp-image-2488" /></a><br />
Auf codepen.io habe ich unterschiedlichste <a href="http://codepen.io/collection/XydgVA/">Beispiele</a> zusammengestellt. Einige ganz simple, andere mit Fallback für nicht unterstützte Browser.</p>
<h2>Weitere Informationen / Blog-Posts</h2>
<ul>
<li><a href="http://alistapart.com/article/css-shapes-101" title="CSS Shapes 101 by Sara Soueidan">CSS Shapes 101</a></li>
<li><a href="http://sarasoueidan.com/blog/css-shapes/" title="Creating Non-Rectangular Layouts With CSS Shapes by Sara Soueidan">Creating Non-Rectangular Layouts With CSS Shapes</a></li>
<li><a href="http://www.sitepoint.com/css-shapes-breaking-rectangular-design/" title="CSS Shapes: Breaking the Rectangular Design Shackles by Patrick Catanzariti">CSS Shapes: Breaking the Rectangular Design Shackles</a></li>
<li><a href="http://t3n.de/news/css-shapes-modul-vorstellung-563960/" title="CSS3-Shapes: Diese Möglichkeiten eröffnen sich mit dem neuen CSS-Modul von Ilja Zaglov">CSS3-Shapes: Diese Möglichkeiten eröffnen sich mit dem neuen CSS-Moduls</a></li>
</ul>
<p><strong>Habt ihr schöne Anwendungsbeispiele für CSS-Shapes? Lass es mich wissen.</strong></p>
<p><script async src="//assets.codepen.io/assets/embed/ei.js"></script></p><p>Der Beitrag <a href="http://maddesigns.de/css3-shapes-2451.html/" target="_blank">CSS Shapes - neue Formen braucht das Web</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/css3-shapes-2451.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Responsive Tabellen</title>
		<link>http://maddesigns.de/responsive-tables-2393.html</link>
		<comments>http://maddesigns.de/responsive-tables-2393.html#comments</comments>
		<pubDate>Tue, 26 Aug 2014 06:51:26 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[CSS3]]></category>
		<category><![CDATA[RWD]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[responsive]]></category>
		<category><![CDATA[tabelle]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2393</guid>
		<description><![CDATA[<p>Responsive Retrofitting Teil 1 Wenn wir mit bestehenden Inhalten planen müssen, kommt es oft vor, dass wir Daten-Tabellen responsive darstellen sollen. Diese Tabellen sind naturgemäß meist sehr schwierig auf kleinen Bildschirmen abzubilden, viele Tabellen sind sehr groß und enthalten viele Daten. Das rührt daher, dass Redakteure (bzw. diejenigen, die für den Inhalt verantwortlich sind) versuchen &#8230; <a href="http://maddesigns.de/responsive-tables-2393.html" class="more-link"><span class="screen-reader-text">Responsive Tabellen</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/responsive-tables-2393.html/" target="_blank">Responsive Tabellen</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<h2>Responsive Retrofitting Teil 1</h2>
<p>Wenn wir mit bestehenden Inhalten planen müssen, kommt es oft vor, dass wir Daten-Tabellen responsive darstellen sollen. Diese Tabellen sind naturgemäß meist sehr schwierig auf kleinen Bildschirmen abzubilden, viele Tabellen sind sehr groß und enthalten viele Daten. Das rührt daher, dass Redakteure (bzw. diejenigen, die für den Inhalt verantwortlich sind) versuchen über Excel-Tabellen komplexe Daten abzubilden und die Daten so ins Web übernommen werden (sollen). In der Vergangenheit war der Platz auf großen Bildschirmen vorhanden, im Multi-Screen-Zeitalter und in einer responsiven Website heutzutage, meist nicht mehr.</p>
<p> <span id="more-2393"></span></p>
<p>Meine erste Regel wenn Tabellen &#8222;responsive&#8220; abgebildet werden sollen, prüfen ob man den Inhalt nicht auch anders ausgezeichnet werden kann, bzw. flexiblere HTML-Elemente für die Abbildung verwendet werden können. So haben wir in einem Projekt eine Suchergebniss-Ausgabe von einer Tabellenansicht in eine Listenansicht (UL) umgewandelt.</p>
<p>Ein schlechtes Beispiel, wie ich finde, ist die Verwendung von DIV-Containern wie im Artikel <a href="http://mobifreaks.com/user-interface/responsive-and-seo-friendly-data-tables/">&#8222;Responsive and SEO friendly data tables&#8220;</a> beschrieben. Tabellendaten haben (wenn richtig verwendet) auch eine semantische Zuordnung untereinander. Über Tabellenkopf (<code>thead</code>, <code>th</code>) und Tabellenzellen (<code>tbody</code>, <code>td</code>), optimalerweise auch über scope-Attribute können die Zusammenhänge im Markup ausgezeichnet werden. Das kann man nicht mit unsematischen DIV-Container nachbilden (es sein denn man nutzt zusätzlich WAI-Aria Attribute, aber lassen wir mal die Kirche im Dorf).</p>
<p>Besser geeignet für diesen Zweck sind semantische Elemente wie eine Description List (DL). Ein <code>&lt;dl&gt;</code>-Element ist dann im übertragenem Sinne ein <code>&lt;tr&gt;</code>, ein <code>&lt;dt&gt;</code> ist ein <code>&lt;th&gt;</code> und ein <code>&lt;dd&gt;</code> das Äquivalent zu <code>&lt;td&gt;</code>. Somit haben die Inhalte auch eine semantische Bedeutung zueinander. Das ist zwar auch von hinten durch die Brust ins Auge, aber besser als DIVs.</p>
<p><strong>Ein Beispiel:</strong></p>
<pre class="language-markup"><code>&lt;div class="tabled-view"&gt;
  &lt;dl&gt;
    &lt;dt&gt;Beschreibung:&lt;/dt&gt;
    &lt;dd&gt;Lorem ipsum is evil!&lt;/dd&gt;
  &lt;/dl&gt;
&lt;/div&gt;
</code></pre>
<h2>Altlasten</h2>
<p>Für den Fall, dass man das Markup nicht verändern kann, muss man sich anderer Tricks behelfen. Eine Möglichkeit wäre das <a href="http://zurb.com/playground/responsive-tables">&#8222;Responsive Tables&#8220;</a> jQuery-Plugin von Zurb (die Macher von <a href="http://foundation.zurb.com/">Foundation</a>). Das Plugin klont die Tabelle, überlagert beide Tabellen und blendet einerseits die Tabellenzellen, andererseits die Tabellenköpfe aus. Zudem macht das Script den Zellenbereich horizontal scrollbar. Der ein oder andere kennt das vielleicht von Excel, dort kann man ebenfalls einen Bereich festsetzen und den Rest der Zeilen scrollen.</p>
<p><strong>CSS und JavaScript in den HEAD einfügen:</strong></p>
<pre class="language-markup"><code>&lt;link rel="stylesheet" href="responsive-tables.css" /&gt;
&lt;script src="responsive-tables.js"&gt;&lt;/script&gt;
</code></pre>
<p>Die Klasse „responsive” zur Tabelle hinzufügen, fertig.</p>
<pre class="language-markup"><code>&lt;table class="responsive"&gt;
  &lt;tr&gt; … &lt;/tr&gt;
&lt;/table&gt;
</code></pre>
<p><strong>Nachteil:</strong> es ist nur ein fester Breakpoint im JavaScript gesetzt. Das könnte im Fall der Tabelle auch ausreichen, aber man weiß ja nie… Ich habe zudem noch <code>-webkit-overflow-scrolling: touch</code> hinzugefügt für ein flüssigeres Momentum-Scrollen in <span lang="en">WebKit-Browsern</span>.</p>
<pre class="language-css"><code>div.table-wrapper div.scrollable { 
  overflow: scroll; 
  overflow-y: hidden;  
  -webkit-overflow-scrolling: touch; 
}</code></pre>
<p><strong>Weitere Plugins:</strong></p>
<ul>
<li><a href="http://themergency.com/footable/">FooTable</a></li>
<li><a href="https://github.com/filamentgroup/tablesaw" title="Tablesaw from Filament Group">Filament Table Saw</a></li>
</ul>
<h2>CSS-only Lösung</h2>
<p>Eine weitere Möglichkeit, die ich bereits in Projekten verwendet habe, beschreibt Chris Coyier im Artikel <a href="http://css-tricks.com/responsive-data-tables/">&#8222;Responsive Data Tables&#8220;</a>. Hierbei werden alle Tabellen-Zellen in Blockelemente umgewandelt und mit Pseudo-Elementen versehen, die wiederum die Zeilenbeschreibungen als <code>content</code> Wert mitbringen. Das funktioniert sehr gut, ist aber nicht so flexibel, da fest in CSS geschrieben.</p>
<pre class="language-css"><code>/* Label the data */
  th:nth-of-type(1):before { content: "Name:"; }
  th:nth-of-type(2):before { content: "Vorname:"; }
  th:nth-of-type(3):before { content: "Straße:"; }
  th:nth-of-type(4):before { content: "PLZ:"; }
  th:nth-of-type(5):before { content: "Ort:"; }
</code></pre>
<p>Chris beschreibt weiter in seinem Blogpost, wie man die Variante mit HTML5 data-Attributen flexibel bekommt (Idee von <a href="https://twitter.com/chriseppstein">@chriseppstein</a>).</p>
<pre class="language-markup"><code>&lt;th data-label="Name"&gt;Name&lt;/th&gt;</code></pre>
<pre class="language-css"><code>th:before { content: attr(data-label); }</code></pre>
<p>Beispiel: <a href="http://codepen.io/maddesigns/full/pHqnt">http://codepen.io/maddesigns/full/pHqnt</a></p>
<h3>Browser-Support für diese Lösung</h3>
<p>Der IE9, sowie alle älteren IEs mögen es nicht, wenn man Tabellen auf &#8218;display: block&#8216; setzt, es kann – muss nicht – zu Darstellungsfehlern kommen. Das sollte man bedenken.</p>
<p>Wichtig ist, dass man sich den Inhalt vorher genau anschaut und dann entscheidet, welche Responsive Tabellen Lösung die Beste ist, <a href="http://blog.cloudfour.com/picking-responsive-tables-solution/">es kommt auf den Inhalt an</a>.</p>
<p>There I said it: Content First!</p>
<aside>
Den Artikel habe ich ursprünglich für ein Print-Magazin geschrieben, ist aber immer noch nicht veröffentlicht worden… deswegen gibt es jetzt hier einen Dreiteiler im Blog.</p>
</aside><p>Der Beitrag <a href="http://maddesigns.de/responsive-tables-2393.html/" target="_blank">Responsive Tabellen</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/responsive-tables-2393.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Responsive SVG-Logos</title>
		<link>http://maddesigns.de/responsive-svg-logos-2361.html</link>
		<comments>http://maddesigns.de/responsive-svg-logos-2361.html#comments</comments>
		<pubDate>Thu, 24 Jul 2014 10:50:14 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[CSS3]]></category>
		<category><![CDATA[RWD]]></category>
		<category><![CDATA[Logo]]></category>
		<category><![CDATA[responsive]]></category>
		<category><![CDATA[svg]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2361</guid>
		<description><![CDATA[<p>Letztens flog mal wieder ein Link durchs Netz, der vielversprechend klang – http://www.responsivelogos.co.uk/ (via @gisugosu) – ein Showcase wie sich Logos ebenfalls „responsive” verhalten können und dabei aber ihre Wiedererkennbarkeit erhalten bleibt. Ich hatte mich auch gefreut, als ich ein SVG als Quelldatei sah, was dann geschah, glaubt ihr nicht… böses heftig.co – geh weg! &#8230; <a href="http://maddesigns.de/responsive-svg-logos-2361.html" class="more-link"><span class="screen-reader-text">Responsive SVG-Logos</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/responsive-svg-logos-2361.html/" target="_blank">Responsive SVG-Logos</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Letztens flog mal wieder ein Link durchs Netz, der vielversprechend klang – <a href="http://www.responsivelogos.co.uk/">http://www.responsivelogos.co.uk/</a> (via <a href="https://twitter.com/gisugosu/status/491243317880184832" title="Tweet von @gisugosu">@gisugosu</a>) – ein Showcase wie sich Logos ebenfalls „responsive” verhalten können und dabei aber ihre Wiedererkennbarkeit erhalten bleibt.</p>
<p>Ich hatte mich auch gefreut, als ich ein SVG als Quelldatei sah, was dann geschah, glaubt ihr nicht… <em>böses heftig.co – geh weg!</em></p>
<p><span id="more-2361"></span></p>
<p>Das SVG-Logo ist als Background-SVG-Sprite eingebunden, welches mehrere Zustände hatte und wurde, wie man es von CSS-Sprites kennt, über <code>background-position</code> je Breakpoint verschoben.</p>
<p><img src="http://maddesigns.de/wp-content/uploads/2014/07/responsive-logo.png" alt="responsive-logo" title="" width="189" height="576" class="alignleft size-full wp-image-2365"  src-medium="http://maddesigns.de/wp-content/uploads/2014/07/responsive-logo-98x300.png"  src-post-thumbnail="http://maddesigns.de/wp-content/uploads/2014/07/responsive-logo-189x372.png"  src-twentyfourteen-full-width="http://maddesigns.de/wp-content/uploads/2014/07/responsive-logo.png"  src-full="http://maddesigns.de/wp-content/uploads/2014/07/responsive-logo.png" srcset="http://maddesigns.de/wp-content/uploads/2014/07/responsive-logo.png 189w, http://maddesigns.de/wp-content/uploads/2014/07/responsive-logo-92x280.png 92w" sizes="(max-width: 189px) 100vw, 189px" /></p>
<p>Das ist nicht unbedingt das, was ich unter einem Responsive Logo verstehe, da man in SVG viel mehr Möglichkeiten hat. SVG ist eine Textdatei und besteht ebenfalls aus einzelnen Elementen oder Gruppen, vergleichbar mit einem HTML-Dokument, die ebenfalls mit CSS und JavaScript angesprochen werden können. Man könnte also die „Responsiveness” auch im SVG behandeln, was bei einem Logo Sinn ergeben würde. Media Queries sind auch hier möglich, so dass man Breakpoints festlegen und dementsprechend Logo-Teile sinnvoll ausblenden kann. Zu beachten ist, dass sich die angegebenen Werte (z.B. min-width/max-width) der Breakpoints auf die SVG-Ausmaße selbst beziehen, also nicht auf den Viewport der einbindenden Seite. Quasi so etwas wie Element Querys &#8211; ha!</p>
<p>Bei der <a href="http://www.standardista.com/responsive-images-clown-car-technique/" title="Clown Car Responsive Images Technik ">Clown-Car-Technik</a> für Responsive Images kommt die Media Query Technik zum Einsatz (Pssst: aber nicht verwenden, gibt jetzt einen offiziellen Standard – war ne wilde Zeit damals).</p>
<p>Ein fantastisches „Responsive Logo” <a href="http://people.opera.com/andreasb/demos/demos_svgopen2009/update/svgscalelogo.html">Beispiel</a> hat Andreas Bovens bereits 2009 veröffentlicht. So verstehe ich ein Responsive Logo. </p>
<p>Ein einfaches Beispiel wäre, eine Logo Textzeile auf kleinen Displays auszublenden. </p>
<figure>
<div style="overflow: hidden; resize: both">
<img src="http://maddesigns.de/wp-content/uploads/2014/07/responsive-logo.svg" />
</div><figcaption>Das Logo kann resized werden. Unter 400px Elementbreite verschwindet die Logo-Subzeile.</figcaption></figure>
<p>Was auch denkbar ist, dass man für den Druckmodus – <code class="language-css">@media print</code> – das Logo einfarbig (schwarz) gestaltet. Das funktioniert allerdings nur, wenn man das SVG-Logo direkt ins HTML einbindet und nicht über eine &lt;img src=&#8220;*.svg&#8220;>.</p>
<p>Diese Technik, innerhalb von SVG je Breakpoint Veränderungen vorzunehmen, nutzen mittlerweile auch einige Icon-Libraries. <a href="https://useiconic.com/guides/using-iconic-responsively/">Iconic</a> wirbt damit und auf Smashing Magazine gab es Anfang des Jahres ein <a href="http://www.smashingmagazine.com/2014/03/05/rethinking-responsive-svg/">Tutorial dazu</a>.</p>
<p>Es ist also einiges möglich in dem Bereich. Für Icons bevorzuge ich mittlerweile <a href="http://maddesigns.de/svg-sprites-icon-fonts-2309.html">SVG-Sprites</a>, da dies im Gegensatz zu Icon-Fonts viele Vorteile hat.</p><p>Der Beitrag <a href="http://maddesigns.de/responsive-svg-logos-2361.html/" target="_blank">Responsive SVG-Logos</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/responsive-svg-logos-2361.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SVG Sprites vs. Icon-Fonts</title>
		<link>http://maddesigns.de/svg-sprites-icon-fonts-2309.html</link>
		<comments>http://maddesigns.de/svg-sprites-icon-fonts-2309.html#comments</comments>
		<pubDate>Tue, 08 Jul 2014 07:01:12 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[RWD]]></category>
		<category><![CDATA[iconfonts]]></category>
		<category><![CDATA[icons]]></category>
		<category><![CDATA[svg]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2309</guid>
		<description><![CDATA[<p>Aktuell stellt sich mir häufiger die Frage „SVG-Icons oder Icon-Fonts” zu verwenden. Wer für ein Multi-Display-Web entwickelt, kommt nicht drumherum Bilder und Icons hochauflösend bereit zu stellen. Mit dem iPhone4 und dem sog. „Retina Display” hat man schnell gemerkt, dass normal auflösende Bildinhalte auf dem Display pixelig aussehen. Bisher war die einfache Lösung, die Icon-Sprites &#8230; <a href="http://maddesigns.de/svg-sprites-icon-fonts-2309.html" class="more-link"><span class="screen-reader-text">SVG Sprites vs. Icon-Fonts</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/svg-sprites-icon-fonts-2309.html/" target="_blank">SVG Sprites vs. Icon-Fonts</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Aktuell stellt sich mir häufiger die Frage „SVG-Icons oder Icon-Fonts” zu verwenden. Wer für ein Multi-Display-Web entwickelt, kommt nicht drumherum Bilder und Icons hochauflösend bereit zu stellen. Mit dem iPhone4 und dem sog. „Retina Display” hat man schnell gemerkt, dass normal auflösende Bildinhalte auf dem Display pixelig aussehen. Bisher war die einfache Lösung, die Icon-Sprites (PNG) in doppelter Auflösung anzulegen bzw. generieren zu lassen. Das Problem, dass die Icons dann trotzdem nur in einer „Ansichtsgröße” vorliegen, bestand weiterhin.</p>
<p>Iconfonts, also Schriften á la Dingbats, die anstatt Buchstaben und Ziffern Symbole haben, wurden bisher als ein adäquates Mittel für skalierbare Icons eingesetzt. Dass das auch immer mit Problemen behaftet ist, werden viele Webentwickler schon festgestellt haben.<br />
<span id="more-2309"></span></p>
<p><strong>Probleme Icon-Fonts:</strong></p>
<ul>
<li>Fallback (-schrift)</li>
<li>Zugänglichkeit</li>
<li>Positionierung (line-height)</li>
<li>Rendering</li>
<li>Einfarbigkeit</li>
<li>Ladezeit (werden später geladen)</li>
</ul>
<p>Für einige der Probleme gibt es mittlerweile <a title="Bulletproof Icon Fonts" href="http://filamentgroup.com/lab/bulletproof_icon_fonts.html">gute Anleitungen</a>, um dies zu verhindern – oft denkt man sich aber, „das sind doch alles nur Hacks und nichts solides, das muss doch irgendwie einfacher gehen.”</p>
<h2>SVG-Sprites</h2>
<p>Wir wissen, SVG ist ein Vektor-Grafikformat, das dafür genau das Richtige ist. Eine Option ist natürlich das Icon-Sprite aus SVG-Grafiken zu erstellen und wie gewohnt über <code>background-position</code> anzuzeigen. Allerdings haben wir auch dann kaum Einfluss auf die Größendarstellung der Icons.</p>
<p>SVG-Inhalte können in modernen Browsern auch direkt in HTML integriert werden. Das hat dann den Vorteil, dass wir auf die SVG-Elemente mit CSS und JS zugreifen können und so Veränderung vornehmen könnten.</p>
<p>SVG bietet zudem die Möglichkeit auf ein einzelnes Element zu referenzieren, also einen Inhalt woanders darzustellen. Über <code>&lt;use xlink:href="" /&gt;</code> können die Inhalte an anderer Stelle ausgegeben werden. Das kann ein SVG-Block innerhalb der Seite sein, das kann aber auch eine externe SVG-Datei sein. Extern eingebundene Ressourcen haben natürlich den Vorteil des Browser-Caching.</p>
<p><strong>internes SVG-Element referenzieren</strong></p>
<pre class="language-markup"><code>&lt;use xlink:href="#menu"&gt;&lt;/use&gt;</code></pre>
<p><strong>externe SVG-Datei referenzieren</strong></p>
<pre class="language-markup"><code>&lt;use xlink:href="img/all.svg#menu"&gt;&lt;/use&gt;</code></pre>
<p>Chris Coyier hat dazu in letzter Zeit einiges auf css-tricks.com geschrieben: </p>
<ul>
<li><a href="http://css-tricks.com/icon-fonts-vs-svg/" title="Inline SVG vs Icon Fonts">Inline SVG vs Icon Fonts</a></li>
<li><a href="http://css-tricks.com/svg-use-external-source/" title="SVG `use` with External Source">SVG `use` with External Source</a></li>
<li><a href="http://css-tricks.com/svg-symbol-good-choice-icons/" title="http://css-tricks.com/svg-symbol-good-choice-icons/">SVG `symbol` a Good Choice for Icons</a></li>
</ul>
<figure id="attachment_2331" style="width: 1024px" class="wp-caption aligncenter"><img src="http://maddesigns.de/wp-content/uploads/2014/07/svg-icons-vs-icon-fonts.jpg" alt="Übersicht SVG-Icons / Icon-Fonts" title="" width="1024" height="768" class="size-full wp-image-2331"  src-medium="http://maddesigns.de/wp-content/uploads/2014/07/svg-icons-vs-icon-fonts-300x225.jpg"  src-post-thumbnail="http://maddesigns.de/wp-content/uploads/2014/07/svg-icons-vs-icon-fonts-672x372.jpg"  src-twentyfourteen-full-width="http://maddesigns.de/wp-content/uploads/2014/07/svg-icons-vs-icon-fonts-1024x576.jpg"  src-full="http://maddesigns.de/wp-content/uploads/2014/07/svg-icons-vs-icon-fonts.jpg" srcset="http://maddesigns.de/wp-content/uploads/2014/07/svg-icons-vs-icon-fonts.jpg 1024w, http://maddesigns.de/wp-content/uploads/2014/07/svg-icons-vs-icon-fonts-360x270.jpg 360w, http://maddesigns.de/wp-content/uploads/2014/07/svg-icons-vs-icon-fonts-768x576.jpg 768w, http://maddesigns.de/wp-content/uploads/2014/07/svg-icons-vs-icon-fonts-640x480.jpg 640w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-caption-text">Übersicht SVG-Icons / Icon-Fonts – Foto von  Marcel Böttcher (@73inches)</figcaption></figure>
<h3>Vorteile SVG-Icons:</h3>
<ul>
<li>Semantik</li>
<li>barrierefrei(er)</li>
<li>Mehrfarbig + Effekte</li>
<li>bessere Positionierung</li>
<li>mit CSS + SVG-CSS stylebar (win-win ;))</li>
</ul>
<h2>SVG Store – ein Grunt-Task für SVG-Sprites</h2>
<p>Mit dem Grunt-Task „<a href="https://github.com/FWeinb/grunt-svgstore" title="Grunt SVGStore">SVG-Store</a>” hat man die Möglichkeit aus den einzelnen SVG-Dateien ein „SVG-Sprite” zu erstellen. In Wirklichkeit ist es ja kein richtiges Sprite wie wir es kennen, sondern eher ein Dokument, in dem hintereinander alle einzelnen SVG-Blöcke gepackt werden, die dann über eine ID referenziert werden können.</p>
<p><strong>Installation grunt-svgstore:</strong> </p>
<pre class="language-bash"><code>npm install grunt-svgstore --save-dev</code></pre>
<p><strong>Grunt-Task:</strong> </p>
<pre class="language-bash"><code>svgstore: { 
  options: {}, 
  dist: { 
    files: { 
      'dist/img/all.svg': ['source/img/icons/*.svg'] 
    } 
  } 
}</code></pre>
<p>Im Anschluss kann man noch zusätzlich <a href="https://github.com/sindresorhus/grunt-svgmin" title="SVG minify task">SVGmin</a> zur Komprimierung drüber laufen lassen.</p>
<p>Alternativ sollte man sich auch ’<a href="https://github.com/jkphl/iconizr" title="Iconizr Tool">Iconizr</a>’ bzw. ’<a href="https://github.com/jkphl/grunt-iconizr" title="Grunt Iconizr">grunt-iconizr</a>’ anschauen!</p>
<h2>Einbindung in HTML und Styling mit CSS</h2>
<p><strong>Einbindung in HTML:</strong> </p>
<pre class="language-markup"><code>&lt;svg class="icon-menu" role="img" title="Menu Icon" 
     viewbox="0 0 75 75" width="25" height="25"&gt; 
  &lt;use xlink:href="img/all.svg#menu"&gt;&lt;/use&gt; 
&lt;/svg&gt;</code></pre>
<p> Hier wird auf ein eine SVG-Datei mit allen Icons referenziert und das Element mit der ID „menu” angezeigt. Das SVG-Snippet kann man nun über (SVG-)CSS-Eigenschaft <code class="language-css">fill</code> einfärben.</p>
<pre class="language-css"><code>.icon-menu { 
  fill: green; 
}
/* other context */
header .icon-menu {
    fill: pink;
}</code></pre>
<p>In der Original SVG-Icon Datei kann man ebenfalls Klassen zum Styling vergeben. </p>
<pre class="language-markup"><code>… 
  &lt;path class="original-svg-pin" … /&gt; 
…</code></pre>
<p>Auch das kann man dann über die <code>fill</code> Eigenschaft anders einfärben.</p>
<pre class="language-css"><code>.original-svg-pin { 
  fill: blue; 
}</code></pre>
<p>Andere SVG-Style-Eigenschaften wie <code>stroke</code> oder <code>stroke-width</code> sind natürlich auch möglich.</p>
<p>Chris Coyier beschreibt in seinem Blogpost „<a href="http://css-tricks.com/cascading-svg-fill-color/" title="Cascading SVG fill color">Cascading SVG fill color</a>” die Möglichkeit mit <code>currentColor</code>, dazu hab ich aber folgendes Problem auf Stackoverflow gefunden: Geht nicht im <a href="http://stackoverflow.com/questions/23936150/issues-with-css-currentcolor-keyword-in-ios-and-safari">iOS Safari</a>, das Beispiel geht aber bei mir, hm…</p>
<h3>Probleme &amp; Tipps</h3>
<ul>
<li>wird nicht von allen Browsern unterstützt (kein IE9-IE11 Support) – das ist aktuell das größte Problem</li>
<li>Es ist nur eine fill-Farbe für alle Pfade (path, polygon, …) in dem verknüpften SVG-Snippet zuweisbar – über Selektoren möglich (werden allerdings nicht in den Developer-Tools angezeigt), sonst nur direkt über Klassen in der SVG-Datei</li>
<li>der Attribut-Selektor <code>[viewBox] {}</code> geht nicht in WebKit-based Browsern (hat nix mit den SVG-Icons zu tun, ist aber trotzdem doof)</li>
<li>SVGs werden onLoad auf die volle Bildschirmbreite gezogen, deshalb <code>width=""</code> + <code>height=""</code> wie bei Pixelgrafiken setzen, kann anschließend mit CSS überschrieben werden</li>
<li>aufpassen bei backface-visibility &amp; z-index –&gt; SVG-Icons auf der gleichen Ebene werden nicht neu hochauflösend gerendert (und wirken also pixelig)</li>
</ul>
<h2>SVG4everybody</h2>
<p>Die JS-Library <a href="https://github.com/jonathantneal/svg4everybody" title="SVG Polyfill svg4everybody">SVG4everybody</a> löst die fehlende Browser-Kompatibilität, so funktioniert die Technik nun auch im IE9-11. Mit ’SVG4everybody’ werden die SVG-Fragmente über Ajax direkt in die Seite geladen, das hat zudem den Vorteil, dass man die SVG-Inhalte besser stylen kann.</p>
<p><strong>CSS styling with ’fill’</strong></p>
<pre class="language-css"><code>/* inherit the fill color from parent */ 
svg { 
  polygon, 
  path, 
  rect { 
    fill: inherit; 
  } 
}</code></pre>
<p>Alle Icon-Pfade sollen die ’fill’-Farbe vom Elternelement erben.</p>
<pre class="language-css"><code>/* fill all elements contains the class „icon” with ’red’ */ 
[class*="icon"] { 
  fill: red; 
}</code></pre>
<p>Alle Icons werden mit ’icon’ benannt und bekommen alle die gleiche Einfärbung.</p>
<pre class="language-css"><code>/* set individual color – cascade after [class*="icon"] */ 
.icon-menu { 
  fill: green; 
}</code></pre>
<p>Individuelle Icons kann man noch individuell färben.</p>
<ul>
<li>Vergibt man wie im obigen Beispiel mehrere CSS-Klassen für die einzelnen Elemente der Originaldatei, dann ist es möglich SVG-Einzelteile einzeln zu stylen/zu färben.</li>
<li>Problem, das mir aufgefallen ist: mehrere Requests &#8211; für jedes Bild wird je ein Request benötigt bzw. im Network-Panel angezeigt</li>
</ul>
<h3>Blurry Rendering in Firefox (Win)</h3>
<p><a href="https://twitter.com/FabianBeiner" title="Fabian Beiner auf Twitter">Fabian Beiner</a> hatte ein <a href="https://twitter.com/FabianBeiner/status/480641763661840384">Problem mit dem Rendering von SVG im Firefox (Windows)</a> festgestellt. Unter bestimmten Bedingungen wirken harte Kanten unscharf. Dieser Hinweis behebt das Problem:</p>
<hr />
<p>Try styling your rects with shape-rendering: crisp-edges to remove antialiasing and force the lines to really be 1px. Also try offsetting the rects 1px (&lt;rect x=&#8220;1&#8243;). The border can be cropped by the border of the svg.</p>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/shape-rendering" title="MDN SVG shape-rendering">SVG shape-rendering</a></p>
<hr />
<h2>SVG-Fallback für IE8 &amp; Android 2.3</h2>
<p>IE8 sowie Android-Browser der Version 2.x unterstützen kein SVG, hier müsste man, wenn man die Browser unterstützt, einen Fallback mit PNG-Grafiken einsetzen.</p>
<ul>
<li><a href="https://github.com/dbushell/grunt-svg2png">SVG2PNG</a> &#8211; Grunt-Task zum einfachen Umwandeln von SVG zu PNG</li>
<li>SVG4everybody stellt einen Fallback für IE8 bereit.</li>
<li>Problem: die PNG-Datei hat die originale SVG-fill-Farbe – wenn mit CSS die ’fill’-Color verändert wurde, wird das natürlich nicht erkannt und das icon wird nicht eingefärbt</li>
<li>auch hier mehrere Requests (PNG-Sprite wäre besser, Aufwand/Nutzen ist aber vertretbar)</li>
</ul>
<h2>Icomoon</h2>
<p>Der Online-Service <a href="http://icomoon.io">Icomoon</a> bietet seit einiger Zeit ebenfalls die Möglichkeit die gewählten Icons als SVG(-Sprite) herunterzuladen. Hier hat man nun alle Möglichkeiten, entweder Icon-Font generieren oder SVG-Icons herunterladen – oder beides. Toller Service!</p>
<h2>Vorteil Icon-Fonts</h2>
<p>„Aber irgendwas gutes müssen Iconfonts doch haben, oder?!” Ja: </p>
<ul>
<li>Browser-Support</li>
<li>Hinting</li>
<li>Subpixel Rendering</li>
</ul>
<p>Wer noch nicht überzeugt ist, dass SVG-Icons die bessere Wahl ist, sollte sich den Blogpost <a href="http://ianfeather.co.uk/ten-reasons-we-switched-from-an-icon-font-to-svg/" title="Ten reasons we switched from an icon font to SVG">Ten reasons we switched from an icon font to SVG</a> von Ian Feather durchlesen.</p>
<p>Das Video von der Beyond Tellerrand Konferenz zum Thema „<a href="http://vimeo.com/99828116" title="SVG is for everybody">SVG Is For Everybody</a>” von Chris Coyier ist jetzt online &#8211; solltet ihr euch unbedingt (nochmal) anschauen.</p>
<h4>Codepen Beispiel:</h4>
<p data-height="291" data-theme-id="0" data-slug-hash="kBqIg" data-default-tab="result" class='codepen'>See the Pen <a href='http://codepen.io/maddesigns/pen/kBqIg/'>SVG use example</a> by Sven Wolfermann (<a href='http://codepen.io/maddesigns'>@maddesigns</a>) on <a href='http://codepen.io'>CodePen</a>.</p>
<p><script async src="//codepen.io/assets/embed/ei.js"></script></p>
<p>Wer jetzt noch tiefer in die Thematik einsteigen will, dem sei der Artikel <a href="http://sarasoueidan.com/blog/structuring-grouping-referencing-in-svg/" title="Structuring, Grouping, and Referencing in SVG – The &lt;g&gt;, &lt;use&gt;, &lt;defs&gt; and &lt;symbol&gt; Elements">Structuring, Grouping, and Referencing in SVG – The &lt;g>, &lt;use>, &lt;defs> and &lt;symbol> Elements</a> von Sara Soueidan ans Herz gelegt.</p>
<p>Habt ihr noch weitere Tipps oder Probleme festgestellt?</p><p>Der Beitrag <a href="http://maddesigns.de/svg-sprites-icon-fonts-2309.html/" target="_blank">SVG Sprites vs. Icon-Fonts</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/svg-sprites-icon-fonts-2309.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>CSS3 – position: sticky</title>
		<link>http://maddesigns.de/css3-position-sticky-2279.html</link>
		<comments>http://maddesigns.de/css3-position-sticky-2279.html#comments</comments>
		<pubDate>Fri, 16 May 2014 12:44:40 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[CSS3]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[position]]></category>
		<category><![CDATA[sticky]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2279</guid>
		<description><![CDATA[<p>Mit position: sticky können wir nun endlich einen Container/Element ab einer bestimmten Position festsetzen. Ein kurzer Reminder: Bisher können Webworker folgende Positionen für Container/Elemente einer Seite zuweisen. position: static (default) position: relative (relative position in document order) position: absolute (absolute position in relative context) position: fixed (fixed in viewport) Die Idee ein Container/Element ab einer &#8230; <a href="http://maddesigns.de/css3-position-sticky-2279.html" class="more-link"><span class="screen-reader-text">CSS3 – position: sticky</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/css3-position-sticky-2279.html/" target="_blank">CSS3 – position: sticky</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Mit position: sticky können wir nun endlich einen Container/Element ab einer bestimmten Position festsetzen.</p>
<p><span id="more-2279"></span></p>
<p><strong>Ein kurzer Reminder:</strong></p>
<p>Bisher können Webworker folgende <a href="http://dev.w3.org/csswg/css-position/#sticky-positioning" title="W3C CSS Position">Positionen</a> für Container/Elemente einer Seite zuweisen.</p>
<ul>
<li>position: static (default)</li>
<li>position: relative (relative position in document order)</li>
<li>position: absolute (absolute position in relative context)</li>
<li>position: fixed (fixed in viewport)</li>
</ul>
<p>Die Idee ein Container/Element ab einer bestimmten Position „sticky“ zu setzen, also zuerst mitscrollen zu lassen und dann ab einer bestimmten Position zu fixieren, gibt es im Webdesign schon länger. Ich erinnere mich noch als <a href="https://twitter.com/rem" title="Remy Sharp on Twitter">@rem</a> auf <a href="http://jqueryfordesigners.com/index.html%3Fp=214.html" title="Fixed Floating Elements with jquery">jqueryfordesigners.com</a> die Umsetzung mit jQuery erklärt hat.</p>
<p>Seit einiger Zeit gibt es aber eine neue CSS3-Eigenschaft, die das Verhalten nativ im Browser integriert. Diese ist bereits im Safari 6.1 und neuer (mit -webkit-Prefix) aktiviert, funktioniert also auch im Safari Mobile. Chrome und Firefox (auch auf Android) haben die Eigenschaft aktuell hinter einem Flag integriert, Microsoft <a href="http://status.modern.ie/positionsticky">denkt drüber nach</a>.</p>
<hr />
<h4>position: sticky in Chrome/Firefox aktivieren</h4>
<p>im Chrome in der Adresszeile <code>chrome://flags/#enable-experimental-web-platform-features</code> eingeben und „<strong>Experimentelle Webplattformfunktionen</strong>” aktivieren</p>
<p>im Firefox  in der Adresszeile <code>about:config</code> eingeben, <code>layout.css.sticky.enabled</code> suchen und auf <code>true</code> setzen.</p>
<hr />
<h3>Verwendung in CSS</strong></h3>
<pre class="language-css"><code>.sticky {
  position: -webkit-sticky;
  position: sticky;
}</code></pre>
<h4>Modernizr Feature Detection</h4>
<p>Mit Modernizr kann ich mit einem zusätzlich eingebundenem Test prüfen ob der Browser &#8218;position: sticky&#8216; unterstützt. Auf der <a href="http://modernizr.com/download/">http://modernizr.com/download/</a> ist die Option unter „Non-core detects”, hier den Haken setzen und ein Custom-Build erstellen.</p>
<p>Wer <a href="https://github.com/Modernizr/grunt-modernizr" title="Grunt Modernizr Task">grunt-modernizr</a> verwendet, gibt als Option den zusätzlichen Test mit <code>tests: ['css-positionsticky']</code> in der Grunt-Config (gruntfile.js) an:</p>
<pre class="language-javascript">
<code>// Build modernizr
modernizr: {
  dist: {
    devFile: 'path/to/source/modernizr.js',
    outputFile: 'path/to/build/modernizr.min.js',
    files: {
      src: [
        'js/{,*/}*.js',
        'css/{,*/}*.scss',
        '!js/vendor/*'
      ]
    },
    uglify: true,
    parseFiles: true,
    tests: ['css-positionsticky']
  }
}</code></pre>
<p>Dann kann anschließend die Eigenschaft mit Javascript abgefragt werden:</p>
<pre class="language-javascript"><code>Modernizr.csspositionsticky; // true or false</code></pre>
<h2>Fallbacks und Polyfills</h2>
<p>Ich tendiere ja immer dazu ein visuelles Verhalten nur für Browser zu aktivieren, die das bereits vollständig nativ unterstützen. Besonders bei Responsive Webdesign lässt sich ein Fallback zu <code>position: fixed</code> schwieriger integrieren, da die dynamischen Positionen von Javascript immer neu berechnet werden müssten, das kann sich natürlich negativ auf die Performance auswirken.</p>
<p><strong>Der mögliche Fallback sollte also immer getestet werden.</strong></p>
<p>Aktuell empfehle ich die sticky Eigenschaften nur mit zusätzlicher (Detection-) Klasse zu nutzen. Die Position (top/bottom) also nur zusammen mit sticky setzen.</p>
<p><strong>Beispiel</strong></p>
<pre class="language-css"><code>.sticky {
  position: static;
}
.csspositionsticky .sticky {
  position: sticky;
  top: 20em;
}</code></pre>
<h3>Polyfill:</h3>
<p>Die Filamentgroup hat einen <a href="https://github.com/filamentgroup/fixed-sticky" title="position: sticky polyfill">Polyfill</a> für <code>position: sticky</code> veröffentlicht, der das Verhalten auch für Browser implementiert, die die Eigenschaft nicht unterstützen.</p>
<p>Den Polyfill bei Bedarf nachladen kann man über Modernizr.load</p>
<pre class="language-javascript"><code>Modernizr.load({
  test: Modernizr.csspositionsticky,
  nope: 'fixedsticky.js'
});</code></pre>
<p><em>Hinweis: in Modernizr 3.0 soll Modernizr.load (das unter der Haube ja yepnope ist) wieder herausgelöst werden, dann also <a href="http://yepnopejs.com/" title="yepnope, asynchronous conditional resource loader">yepnope</a> verwenden</em></p>
<h2>Demo: Sticky Header</h2>
<p data-height="335" data-theme-id="0" data-slug-hash="aKyAg" data-default-tab="result" class='codepen'>See the Pen <a href='http://codepen.io/maddesigns/pen/aKyAg/'>position: sticky header</a> by Sven Wolfermann (<a href='http://codepen.io/maddesigns'>@maddesigns</a>) on <a href='http://codepen.io'>CodePen</a>.</p>
<p><script async src="//codepen.io/assets/embed/ei.js"></script></p>
<p>Ich hoffe, dass Chrome und Firefox die Eigenschaft bald frei schalten – fehlt nur noch der IE…</p><p>Der Beitrag <a href="http://maddesigns.de/css3-position-sticky-2279.html/" target="_blank">CSS3 – position: sticky</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/css3-position-sticky-2279.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Webfonts *richtig* verwenden</title>
		<link>http://maddesigns.de/webfonts-richtig-verwenden-2216.html</link>
		<comments>http://maddesigns.de/webfonts-richtig-verwenden-2216.html#comments</comments>
		<pubDate>Thu, 06 Mar 2014 10:04:31 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[font-face]]></category>
		<category><![CDATA[fonts]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[webfonts]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2216</guid>
		<description><![CDATA[<p>Da fragt sich jetzt der ein oder andere Webentwickler „Was kann man da falsch machen? Man bindet den (new) Bulletproof @font-face Syntax ein und gut ist“. Problem hierbei wie immer unser geliebte OldIE, der Webfonts zwar schon im zarten Alter von Version 5.5 beherrschte, aber immer noch einen „alten“ Syntax braucht. Das Problem: faux-bold Fehldarstellung &#8230; <a href="http://maddesigns.de/webfonts-richtig-verwenden-2216.html" class="more-link"><span class="screen-reader-text">Webfonts *richtig* verwenden</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/webfonts-richtig-verwenden-2216.html/" target="_blank">Webfonts *richtig* verwenden</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Da fragt sich jetzt der ein oder andere Webentwickler „Was kann man da falsch machen? Man bindet den <a href="http://www.fontspring.com/blog/the-new-bulletproof-font-face-syntax" title="The New Bulletproof @Font-Face Syntax">(new) Bulletproof @font-face Syntax</a> ein und gut ist“. Problem hierbei wie immer unser geliebte OldIE, der Webfonts zwar schon im zarten Alter von Version 5.5 beherrschte, aber immer noch einen „alten“ Syntax braucht.</p>
<p><strong>Das Problem:</strong> faux-bold</p>
<figure>
<img src="http://maddesigns.de/wp-content/uploads/2014/03/faux-bold-360x202.jpg" srcset="http://maddesigns.de/wp-content/uploads/2014/03/faux-bold-360x202.jpg 360w" alt="faux bold text" width="360" height="202" class="alignnone size-medium wp-image-2227" /><figcaption>Fehldarstellung – der Browser interpoliert die Schriftfetten</figcaption></figure>
<p><span id="more-2216"></span></p>
<p>Das Problem ist nicht neu, 2012 schrieb Alan Stearns bei A List Apart den Artikel „<a href="http://alistapart.com/article/say-no-to-faux-bold" title="Say No to Faux Bold">Say No to Faux Bold</a>“ und erst kürzlich Gerrit van Aaken im Artikel „<a href="http://praegnanz.de/weblog/webfonts-fette-fehlerquelle" title="Webfonts: Fette Fehlerquelle">Webfonts: Fette Fehlerquelle</a>“.</p>
<p>Abhilfe soll die Eigenschaft &#8218;<a href="http://www.w3.org/TR/css-fonts-3/#font-synthesis-prop" title="W3C Spec for font-synthesis">font-synthesis</a>&#8218; schaffen:</p>
<pre class="language-css"><code>.say-no-to-faux-bold {
  font-synthesis: none;
}</code></pre>
<p>leider wird die Eigenschaft von keinem Browser unterstützt :( </p>
<h2>@font-face Einbindung für moderne Browser</h2>
<p>Um die Fehldarstellungen zu vermeiden, bindet man den Font wie folgt ein:</p>
<pre class="language-css"><code>@font-face {
  font-family: Fontname; /* regular font */
  src: url(&quot;Fontname-Regular.woff&quot;) format(&quot;woff&quot;);
  font-weight: normal; font-style: normal; }

@font-face {
  font-family: Fontname; /* bold font */
  src: url(&quot;Fontname-Bold.woff&quot;) format(&quot;woff&quot;);
  font-weight: bold; font-style: normal; }

@font-face {
  font-family: Fontname; /* light font */
  src: url(&quot;Fontname-Light.woff&quot;) format(&quot;woff&quot;);
  font-weight: 300; font-style: normal; }

@font-face {
  font-family: Fontname; /* italic font */
  src: url(&quot;Fontname-Italic.woff&quot;) format(&quot;woff&quot;);
  font-weight: normal; font-style: italic; }

@font-face {
  font-family: Fontname; /* bolditalic font */
  src: url(&quot;Fontname-BoldItalic.woff&quot;) format(&quot;woff&quot;);
  font-weight: bold; font-style: italic; }</code></pre>
<p><strong>für Android zusätzlich TTF/OTF einbinden</strong></p>
<pre class="language-css"><code>@font-face {
  font-family: Fontname; /* regular font */
  src: url(&quot;path/Fontname-Regular.ttf&quot;) format(&quot;truetype&quot;),
       url(&quot;path/Fontname-Regular.woff&quot;) format(&quot;woff&quot;);
  font-weight: normal;
  font-style:  normal; }</code></pre>
<p><strong>Zuweisung in Überschrift:</strong></p>
<pre class="language-css"><code>h1 {
  font-family: Fontname, sans-serif;
}</code></pre>
<h2>@font-face für Old-IE (IE8)</h2>
<p>Für die älteren Internet Explorer, die das WOFF-Format nicht unterstützen, kann man die Schrift im EOT-Format einbinden. Hier denke ich auch immer an die Performance und an das Rendering der Schriften und empfehle meist, für die Browser keine Webfonts zu verwenden. Zudem sollte man die Zugriffsstatistik für die Versionen prüfen, bevor man sich die Mühe macht. Zugegeben bisher wollten noch nicht sehr viele Kunden der Empfehlung, die Schriften für IE8 weg zu lassen, folgen. ;)</p>
<p>Für IE8 muss die Schriften wie folgt eingebunden werden:</p>
<pre class="language-css"><code>/* ie-specific.css */
@font-face {
  font-family: Fontname-regular; /* regular IE font */
  src: url(&quot;Fontname-Regular.eot&quot;); }

@font-face { /* bold IE font */
  font-family: Fontname-bold;
  src: url(&quot;Fontname-Bold.eot&quot;); }

@font-face { /* italic IE font */
  font-family: Fontname-italic;
  src: url(&quot;Fontname-Italic.eot&quot;); }

@font-face { /* bold italic IE font */
  font-family: Fontname-bolditalic;
  src: url(&quot;Fontname-BoldItalic.eot&quot;); }</code></pre>
<p><strong>über Conditional Comments in die Seite einbinden</strong></p>
<pre class="language-markup"><code>&lt;!--[if lt IE 9]&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;ie-specific.css&quot; media=&quot;screen&quot; /&gt;
&lt;![endif]--&gt;</code></pre>
<h2>Font-Loading Performance</h2>
<p>Text der mit Webfonts ausgezeichnet ist, wird in einigen Browsern solange nicht angezeigt, bis die Schrift heruntergeladen ist, um den „FOUT“ (flash of unstyled text) zu vermeiden. Besonders nachteilig ist dieses Verhalten in mobilen Browsern, z.B. Mobile Safari (iOS), da das Laden im Mobilnetz häufig langsamer ist (Stichwort Latenz). Hier wartet man oftmals lange bis man endlich den Text lesen kann. Besonders ärgerlich ist das meiner Meinung nach bei Schriften, die nicht großartig anders aussehen als vorhandene Systemschriften. <em>(Typonazis werden mich jetzt steinigen)</em></p>
<figure>
<img src="http://maddesigns.de/wp-content/uploads/2014/03/font-loading-ala-158x280.jpg" srcset="http://maddesigns.de/wp-content/uploads/2014/03/font-loading-ala-158x280.jpg 158w, http://maddesigns.de/wp-content/uploads/2014/03/font-loading-ala-270x480.jpg 270w, http://maddesigns.de/wp-content/uploads/2014/03/font-loading-ala.jpg 640w" alt="font-loading-ala" width="158" height="280" class="alignnone size-medium wp-image-2268" /><figcaption>Webfont Loading Performance (FOUT)</figcaption></figure>
<p><strong>Randnotiz:</strong> Moderne Browser laden Schriften erst, wenn sie im CSS zugewiesen sind. Bedeutet also man könnte mehrere Schriften über @font-face verknüpfen, das Laden der Schrift erfolgt erst, wenn im CSS die Zuweisung über <code>font-family</code> geschieht.</p>
<p><em>In Firefox für Android kann man Webfonts über about:config deaktivieren (geht auch beim Desktop Firefox)</em></p>
<pre>gfx.downloadable_fonts.enabled = false</pre>
<p>Auch die Zeit, wann ein Fallback-Font geladen wird, kann eingestellt werden, der Defaultwert ist aktuell 3000ms für die Anzeige des Fallback-Font.</p>
<figure>
<pre>gfx.downloadable_fonts.fallback_delay = 1000</pre><figcaption>fallback-delay auf 1sek kürzen.</figcaption></figure>
<p>Paul Irish hat für  Chrome (Blink) letztens <a href="https://plus.google.com/+PaulIrish/posts/MeoUmZxNRZB" title="Paul Irish - Web Fonts and FOUT…">eine Umfrage unter den Entwicklern gestartet</a>, wie das Browserverhalten beim Laden von Schriften sein sollte. Ilya Grigorik beschreibt <a href="https://plus.google.com/+IlyaGrigorik/posts/hEhRubu9za7">auf Google+</a> wie die Ladeperformance in Chrome verbessert wurde und sich Chrome in Zukunft wie Firefox verhält.</p>
<h3>Fonts base64 decodieren</h3>
<p>Fonts sollten nicht mit base64 codiert in CSS eingebunden werden, da das das Stylesheet unnötig aufbläst und somit das Rendering der Seite verzögert. </p>
<h2>Webfontloader – Webfonts asynchron laden</h2>
<p><a href="https://github.com/typekit/webfontloader">Webfontloader</a> ist ein Open-Source-Script von Typekit, mit dem man die Schriften von Typekit, Google, Fontdeck, Fonts.com und weiteren Foundries asynchron laden kann. Zu dem kann man auch selbst gehostete Fonts über den Webfontloader laden.</p>
<p><strong>Einbindung des Webfontloader</strong></p>
<pre class="language-javascript"><code>&lt;script>
WebFontConfig = {
  typekit: { id: 'xxxxxx' }
};
(function() {
  var wf = document.createElement('script');
  wf.src = ('//ajax.googleapis.com/ajax/libs/webfont/1.4.7/webfont.js';
  wf.type = 'text/javascript';
  wf.async = 'true';
  var s = document.getElementsByTagName('script')[0];
  s.parentNode.insertBefore(wf, s);
})();
&lt;/script></code></pre>
<h3>Font-Events</h3>
<p>Bindet man das Script ein, stellt Webfontloader beim Aufruf Klassen für die erfolgten Font-Events bereit. Das Script meldet also, was der aktuelle Zustand des Ladevorgangs ist. Die Klassen werden wie bei Modernizr zum<br />
&lt;html> Class-Attribut hinzugefügt.</p>
<p><strong>Klassen, die Webfontloader hinzufügt:</strong></p>
<pre class="language-css"><code>.wf-loading
.wf-active
.wf-inactive
.wf-&lt;familyname&gt;-&lt;fvd&gt;-loading
.wf-&lt;familyname&gt;-&lt;fvd&gt;-active
.wf-&lt;familyname&gt;-&lt;fvd&gt;-inactive</code></pre>
<p><strong>Verwendung im CSS:</strong></p>
<pre class="language-css"><code>h1, h2, h3 {
  font-family: sans-serif;
}

.wf-active h1, .wf-active h2, .wf-active h3 {
  font-family: &quot;webfont&quot;, sans-serif;
}</code></pre>
<p>Beispiel: Einbindung der „Source Sans Pro“ mit Webfontloader über GoogleFonts.com:</p>
<pre class="language-javascript"><code>//= require webfonts.js

WebFont.load({
    google: { families: [ &#39;Source+Sans+Pro:400,300,600:latin&#39; ] }
    // load Source Sans Pro: light, normal, bold, light italic, normal italic, bold italic : latin subset
    // google: { families: [ &#39;Source+Sans+Pro:400,300,700,700italic,400italic,300italic:latin&#39; ] }
});</code></pre>
<p>Wie sich vielleicht erahnen lässt, kann man in der Konfiguration mehrere Schriftschnitte, die man laden möchte, definieren.</p>
<ul>
<li>400 == normal</li>
<li>700 == bold</li>
<li>300 == light</li>
<li>400italic == normal kursiv</li>
<li>500 == medium</li>
</ul>
<p>Mit dem Zusatz <code>:latin</code> kann man den Zeichenumfang steuern, hier wären es alle lateinischen Schriftzeichen. Welche Schriftzeichen wirklich vorhanden sind, sollte man genau prüfen manchmal fehlen Schriftzeichen (skandinavische).</p>
<h3>native HTML5 Font-Events</h3>
<p>… gibt es noch nicht, sind aber bereits in einer <a href="http://www.w3.org/TR/css-font-loading/" title="W3C Font Loading Events">ersten Version spezifiziert</a>. Dafür gibt es aber bereits einen Polyfill: <a href="https://github.com/bramstein/fontloader" title="Font Loading Polyfill">Polyfill für native Font-Events</a></p>
<h3>lokale System-Fonts bevorzugen</h3>
<p>Nicht immer muss ein Webfont geladen werden, in Mac OSX ist z.B. seit Mavericks &#8218;PT Sans&#8216; im System verfügbar, den Font extra zu laden wäre unnötig. Mit dem Keyword &#8218;local&#8216; werden Systemfonts bevorzugt.</p>
<pre class="language-css"><code>@font-face {
  font-family: &#39;PT Sans&#39;;
  src: local(&#39;PT Sans&#39;), local(&#39;PTSans-Regular&#39;), url(&#39;fonts/ptsans-regular.woff&#39;) format(&#39;woff&#39;),
       local(&#39;PT Sans&#39;), local(&#39;PTSans-Regular&#39;), url(&#39;fonts/ptsans-regular.ttf&#39;) format(&#39;truetype&#39;);
  font-weight: normal;
  font-style: normal;
}</code></pre>
<p>Auch die in <a href="http://iosfonts.com/">iOS7</a> hinzugekommene &#8218;Helvetica Neue Condensed Bold&#8216; kann über den <a href="http://stackoverflow.com/questions/5612506/how-can-i-use-helvetica-neue-condensed-bold-in-css#comment30950211_5612781">Post-Script Namen</a> verwendet werden.</p>
<pre class="language-css"><code>@font-face { 
  font-family: Helvetica; 
  font-weight: bold; 
  src: local(HelveticaNeue-CondensedBold); 
}</code></pre>
<h2>Fallback-Font auf mobilen Geräten</h2>
<p>Wenn man responsive Webseiten erstellt, sollte man sich bewusst sein, dass nicht alle Schriften, die verwendet werden sollen, auch auf dem Endgerät vorhanden ist. Android hat nur wenige Schriften vorinstalliert. Jordan Moore hat eine <a href="http://www.jordanm.co.uk/tinytype" title="A compatibility table showing the available default system fonts across different mobile platforms">Übersichttabelle der Systemfonts auf mobilen Systemen</a> bereit gestellt. Allerdings fehlt dort noch ein iOS7 Update. ;)</p>
<p><img src="http://maddesigns.de/wp-content/uploads/2014/03/fallback-fonts1-360x186.png" srcset="http://maddesigns.de/wp-content/uploads/2014/03/fallback-fonts2-360x171.png 360w, http://maddesigns.de/wp-content/uploads/2014/03/fallback-fonts2-640x303.png 640w, http://maddesigns.de/wp-content/uploads/2014/03/fallback-fonts2.png 941w" alt="fallback-fonts2" width="941" height="446" class="alignnone size-full wp-image-2251" /></p>
<p><img src="http://maddesigns.de/wp-content/uploads/2014/03/fallback-fonts2-360x171.png" srcset="http://maddesigns.de/wp-content/uploads/2014/03/fallback-fonts2-360x171.png 360w, http://maddesigns.de/wp-content/uploads/2014/03/fallback-fonts2-640x303.png 640w, http://maddesigns.de/wp-content/uploads/2014/03/fallback-fonts2.png 941w" alt="fallback-fonts2" width="360" height="171" class="alignnone size-medium wp-image-2251" /></p>
<p>Auf Android sind weder Arial, noch Helvetica oder Times installiert, die Standard-Schrift ist Droid (Sans/Serif). Man sollte meinen, wenn man <code>font-family: 'Times New Roman', Times, serif;</code> angibt, dass Android dann auf den Serif Font zurück fällt. Anscheinend kann das Android ganz schön verwirren und führt zu Fehldarstellungen.</p>
<figure>
<img src="http://maddesigns.de/wp-content/uploads/2014/03/fallback-fonts4.png" srcset="http://maddesigns.de/wp-content/uploads/2014/03/fallback-fonts4.png 320w" alt="fallback-fonts4" width="320" height="225" class="alignnone size-full wp-image-2253" /><figcaption>Samsung GT-I9300 (Android 4.1.2)</figcaption></figure>
<figure>
<img src="http://maddesigns.de/wp-content/uploads/2014/03/fallback-fonts3.png" srcset="http://maddesigns.de/wp-content/uploads/2014/03/fallback-fonts3.png 320w" alt="fallback-fonts3" width="320" height="225" class="alignnone size-full wp-image-2252" /><figcaption>Samsung GT-S5830 (Android 2.3.3)</figcaption></figure>
<p>Als Fix, damit alle getesteten Androids den Fallback-Font anzeigen, musste &#8218;Droid Serif&#8216; explizit angegeben werden. (HT <a href="https://twitter.com/closingtag">@closingtag</a>)</p>
<pre class="language-css"><code>font-family: 'Serif Webfont', 'Droid serif', 'Times New Roman', Times, serif;</code></pre>
<p>Wer noch Ergänzungen hat, bitte einfach kommentieren. </p><p>Der Beitrag <a href="http://maddesigns.de/webfonts-richtig-verwenden-2216.html/" target="_blank">Webfonts *richtig* verwenden</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/webfonts-richtig-verwenden-2216.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Responsive Imagemap</title>
		<link>http://maddesigns.de/responsive-imagemap-2194.html</link>
		<pubDate>Mon, 17 Feb 2014 13:37:14 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[RWD]]></category>
		<category><![CDATA[imagemap]]></category>
		<category><![CDATA[responsive images]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2194</guid>
		<description><![CDATA[<p>Ein Relikt aus dem Web 1.0 ist die Imagemap, bei der man Klickflächen über ein Bild positionieren kann. Der Vorteil zum normalen &#34;Link um Bild&#34; ist, dass dabei geometrische Formen und individuelle Polygone verwenden können, also z.B. eine Form die im Bild sichtbar ist, nachgebildet werden kann. Die Positionswerte dieser Klickflächen basieren allerdings auf Pixelwerten, &#8230; <a href="http://maddesigns.de/responsive-imagemap-2194.html" class="more-link"><span class="screen-reader-text">Responsive Imagemap</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/responsive-imagemap-2194.html/" target="_blank">Responsive Imagemap</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Ein Relikt aus dem Web 1.0 ist die Imagemap, bei der man Klickflächen über ein Bild positionieren kann. Der Vorteil zum normalen &quot;Link um Bild&quot; ist, dass dabei geometrische Formen und individuelle Polygone verwenden können, also z.B. eine Form die im Bild sichtbar ist, nachgebildet werden kann. Die Positionswerte dieser Klickflächen basieren allerdings auf Pixelwerten, und hier beginnt unser Problem.<span id="more-2194"></span></p>
<p>Das Bild responsive zu machen, ist nicht schwer:</p>
<pre class="language-css"><code>img {
  max-width: 100%;
  height: auto;
}</code></pre>
<p>Die Imagemap-Area mit der Klickfläche passt sich allerdings nicht an, also auch wenn das Bild verkleinert auf ein Smartphone-Bildschirm passt, ist die Klickfläche noch immer in der Ausgangsgröße.</p>
<p>Abhilfe schafft hier ein jQuery-Plugin von <a href="https://twitter.com/stowball">Matt Stow</a> namens <a href="https://github.com/stowball/jQuery-rwdImageMaps">RWD-ImageMap</a> , das die Klickflächen automatisch je Screen-Größe umrechnet. Die Einbindung ist einfach:</p>
<pre class="language-javascript"><code>//= require &quot;vendor/jquery.min.js&quot;
//= require &quot;vendor/jquery.rwdImageMaps.min.js&quot;
$(&#39;img[usemap]&#39;).rwdImageMaps();</code></pre>
<p>Soweit so gut. Problem ist allerdings, dass man die Klickflächen nur mit einer Maus (oder Stylus) erfahren (im Sinne von mouseover) kann. Auf einem Touchdisplay hat man keinerlei visuelle Hilfen (Mauszeiger wechselt). Man müsste auf gut Glück überall tappen um zu erfahren, ob ein Bild eine Imagemap ist, in der bestimmte Bereiche verlinkt sind. Das ist natürlich problematisch und sollte bei der Konzeption bereits bedacht werden. Ich würde grundsätzlich davon abraten eine Imagemap im klassischen Sinne zu verwenden.</p>
<p>Eine Idee von <a href="http://twitter.com/dudleystorey">Dudley Storey</a> beschreibt eine <a href="http://demosthenes.info/blog/760/Create-A-Responsive-Imagemap-With-SVG">Umsetzung mithilfe von SVG</a>. Hier sollte man beachten, dass <a href="http://caniuse.com/svg-html5">SVG direkt im HTML eingebunden</a> unter Android 2.3 oder im Opera Mini nicht funktioniert. Weiterhin bin ich der Meinung, dass man die Klickflächen in SVG einen Rand geben sollte (zumindest für touchfähige Geräte), damit man sie eher als solche wahrnimmt.</p>
<h2>Responsive Imagemap mit Akkordion-Liste</h2>
<p>In einem Projekt war eine responsive Imagemap allerdings Anforderung. Glücklicherweise waren die Klickflächen direkt im Bild farblich hinterlegt, so dass das den Eindruck einer Schaltfläche ergab. Der Tap auf eine visuelle Schaltfläche sollte den Beschreibungstext unterhalb der Imagemap einblenden.</p>
<p>Ein paar Zeilen jQuery blendet die Texte ein und wieder aus:</p>
<pre class="language-javascript"><code>$('area').on('click', function(e) {
  e.preventDefault();
  var target = $(this).attr('href');
  var imagemapItems = $('.imagemap__item');
  imagemapItems.hide();
  $(target).show();
  $(target +' > h3').addClass('is-open');
});</code></pre>
<p>Das CSS dazu (Desktopansicht):</p>
<pre class="language-css"><code>@media screen and (min-width: 48em) {
  .imagemap__item {
    display: none;
  }
  .imagemap__item:target {
    display: block;
  }
  .imagemap__item:target > .imagemap__text {
    display: block;
  }
}</code></pre>
<p>In der Smartphone-Ansicht bis maximal 600px (37.5em) sollte das Imagemap-Bild und die Überschriften der beschreibenden Texte angezeigt werden und als Akkordion dargestellt werden. Die Imagemap-Funktionalität sollte verhindert werden. Einerseits weil die Schaltflächen zu klein werden, andererseits weil der User nicht unbedingt eine Imagemap auf einem Touch-Device erwartet.</p>
<p>Außerdem ist es problematisch, dass man die ImageMap-Klickflächen nicht mit CSS stylen kann. Man kann sie weder Off-Canvas positionieren, noch mit <code class="language-css">display: none;</code> ausblenden. Einzige Möglichkeit, das ImageMap-Markup mit JavaScript löschen.</p>
<pre class="language-javascript"><code>// remove ImageMaps Markup
var imageMaps = document.querySelectorAll(".m-imagemap map");
[].forEach.call( imageMaps, function(el) {
    el.parentNode.removeChild(el);
});</code></pre>
<p>Wie man in dem Beispiel sehen kann, werden hier Standard HTML5 Javascript Funktionen und nicht jQuery verwendet. In dem Projekt wurde sehr auf Performance geachtet. So wurde erst ab dem Bereich &quot;Tablet&quot; jQuery hinzu geladen. Smartphones mit HTML5-Unterstützung können anhand von CSS-Selektoren sowohl eine Auswahl generieren <code>document.querySelectorAll</code>, als auch Klassen im DOM toggle&#8217;n <code>classList.toggle()</code>.</p>
<p><strong>Eine einfache HTML5 class-toggle-Funktion mit Vanilla-JS:</strong></p>
<pre class="language-javascript"><code>// select all H3 headers in .imagemap__item
var imageMapList =  document.querySelectorAll('.imagemap__item h3');

// on click handler to toggle .imagemap__text visibility
[].forEach.call(imageMapList, function(el) {
   el.addEventListener('click', function() {
     this.classList.toggle('is-open');
  }, false);
});</code></pre>
<p><strong>CSS:</strong></p>
<pre class="language-css"><code>.js .imagemap__text {
  display: none;
}
.imagemap__item .is-open + .imagemap__text {
  display: block;
}</code></pre>
<p>Für Android 2.3 muss man allerdings einen <a href="https://github.com/eligrey/classList.js/" title="classList Polyfill">classList-Polyfill</a> einbinden um die toggle Funktion zu nutzen (classList.toggle wird erst ab Android 4 unterstützt). Mit Modernizr testet man ob der Viewport maximal 600px breit ist und ob classList nicht unterstützt wird. Wenn der Test <code>true</code> ergibt, wird die Polyfill-Datei (classList.min.js) geladen.</p>
<pre class="language-javascript"><code>Modernizr.load([{
  test: Modernizr.mq("only screen and (max-width: 600px)") &amp;&amp; !Modernizr.classlist,
  yep: "./js/classList.min.js";
}]);</code></pre>
<p>Ich hab mal versucht ein reduziertes Beispiel aus dem Projekt heraus zu eisen und separat zusammen zu bauen: <a href="http://maddesigns.de/responsive-image-map/" title="Responsive Image Map">Demo Responsive Image Map</a></p>
<p>Wie gesagt, technisch alles machbar, aber manchmal ist es besser die Inhalte konzeptionell zu ändern. Das bedingt aber einen anderen Prozess. Aber das ist ein anderes Thema…</p><p>Der Beitrag <a href="http://maddesigns.de/responsive-imagemap-2194.html/" target="_blank">Responsive Imagemap</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>Responsive Images – width/height-Attribute entfernen, lazy loading &#038; padding-bottom Trick</title>
		<link>http://maddesigns.de/responsive-images-lazy-loading-2151.html</link>
		<comments>http://maddesigns.de/responsive-images-lazy-loading-2151.html#comments</comments>
		<pubDate>Mon, 10 Feb 2014 08:00:58 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[RWD]]></category>
		<category><![CDATA[Sass]]></category>
		<category><![CDATA[fixed ratio]]></category>
		<category><![CDATA[lazy loading]]></category>
		<category><![CDATA[responsive images]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2151</guid>
		<description><![CDATA[<p>Für das Einbinden von Bildern im Responsive Webdesign wird häufig empfohlen die &#8218;width&#8216;- und &#8218;height&#8216;-Attribute im HTML-Quellcode zu entfernen. Das ist aber nicht nötig und meiner Meinung nach auch nicht gut in Hinblick auf hochauflösende Bilder. Mit CSS kann man die im HTML festgelegten Breiten überschreiben und die Bilder so flexibel machen. Responsive Images basics: &#8230; <a href="http://maddesigns.de/responsive-images-lazy-loading-2151.html" class="more-link"><span class="screen-reader-text">Responsive Images – width/height-Attribute entfernen, lazy loading &#038; padding-bottom Trick</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/responsive-images-lazy-loading-2151.html/" target="_blank">Responsive Images – width/height-Attribute entfernen, lazy loading & padding-bottom Trick</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Für das Einbinden von Bildern im Responsive Webdesign wird häufig empfohlen die &#8218;width&#8216;- und &#8218;height&#8216;-Attribute im HTML-Quellcode zu entfernen. Das ist aber nicht nötig und meiner Meinung nach auch nicht gut in Hinblick auf hochauflösende Bilder.</p>
<p>Mit CSS kann man die im HTML festgelegten Breiten überschreiben und die Bilder so flexibel machen.</p>
<p><strong>Responsive Images basics:</strong></p>
<pre class="lang-css"><code>img {
  max-width: 100%;
  height: auto;
}</code></pre>
<p>Das Bild passt sich somit immer dem Container an, wird aber nie größer als seine eigentliche Originalgröße in Pixel. Das dürfe sicherlich bekannt sein. Wenn das nicht funktioniert, liegt ein anderer „Fehler“ vor, wie ein anderer <abbr title="Block Formatting Context">BFC</abbr> durch &#8218;float&#8216; oder ähnliches.</p>
<p><span id="more-2151"></span></p>
<p>Aber gehen wir mal zurück, auf das Problem der fehlenden &#8218;width&#8216; und &#8218;height&#8216; Attribute. Angenommen, dass Bild soll links im Text floaten. Wenn die Breiten- und Höhenattribute fehlen wird der Platz für das Bild im Layout nicht vorgehalten und der Text läuft über die gesamte Breite. Ist das Bild dann vollständig geladen, springt der Text und fließt um das Bild. Das kann je nachdem wie viele Bilder man lädt und was für ein Layout man hat, sehr hin-und-her springen. Der Browser führt jeweils einen Reflow durch.</p>
<aside>
<h3>Exkurs Reflow &amp; Repaint (by <a href="https://twitter.com/derSchepp" title="Christian Schepp Schaefer">D(e)r. Schepp</a>)</h3>
<p>Beim Rendering einer Seite unterscheidet man zwischen zwei Ereignissen: den Reflows, auch Relayouts genannt, und den Repaints:</p>
<p>Bei einem Reflow-Ereignis wird das gesamte Layout aller, oder auch nur bestimmter Elemente neu berechnet. Der Wortbetandteil &quot;Flow&quot; ergibt sich aus der Art, wie HTML-Elemente aneinandergereiht werden, wie Bilder eines Comic-Heftes, von oben links nach unten rechts. Sie stehen also in einer Beziehung zueinander und Änderungen weiter oben im Dokument können zu einem Rattenschwanz an Reflowberechnungen für enthaltene und nachfolgende Elemente führen. Ein bisschen kann man sich das vorstellen, wie die kreisförmigen Wellen, wenn man einen Stein im Wasser versenkt. Reflowberechnungen werden immer dann angestoßen, wenn ein Element seine Größe verändert, also jemand Hand anlegt an Breite, Höhe, Margin, Padding oder Border, oder ein Element neu in den Dokumentenfluss eingefügt wird, durch erstmaliges Erzeugen, durch Sichtschalten oder durch ein Wegnehmen vorhandener absoluter Positionierung. Die dabei ausgelöste Reflow-Welle dehnt sich so lange weiter nach unten ins Dokument aus, bis es an einen umgebenden Container stößt, dessen Ausdehnung fest verdrahtet ist. Wenn z.B. außen herum um ein verändertes Element ein DIV-Container mit in CSS definierter width und height liegt, dann stoppt er die Welle wie ein Damm, weil er sich selbst ja nicht ausdehnen wird. Also schiebt er auch nichts nach unten, das ihm im Fluss folgt. Man sprich dann von einem Layout-Containment.</p>
<p>Bei einem Repaint-Ereignis hingegen bleibt alles an Ort und Stelle. Die betroffenen Elemente erhalten nur einen neuen Farbanstrich. Repaints sind nötig, wenn sich Farben oder Texturen ändern, oder beispielsweise ein Element über ein anderes gezeichnet werden muss. Klassische Beispiele für Repaints sind Hover-Effekte, oder dauerhaft fixierte Menüs, die ständig andere Elemente der Seite überlagern.</p>
<p>Einem Reflow folgt immer auch ein Repaint, deshalb ist ein Reflow für den Browser um ein vielfaches teurer in der Berechnung als ein Repaint. Und daher sollte man ihn tunlichst vermeiden.</p>
<p><a href="http://www.youtube.com/watch?v=ZTnIxIA5KGw">Gecko Reflow Visualization</a></p>
</aside>
<p>Zugegeben, wenn wir von Responsive Images reden, ist das mit der Angabe von &#8218;width&#8216;- und &#8218;height&#8216;-Attributen im HTML-Quellcode schon fast wieder hinfällig. Durch die Angabe <code>max-width:&nbsp;100%; height:&nbsp;auto;</code> muss der Browser die anzuzeigende Größe so oder so berechnen und das erzwingt dann den Reflow.</p>
<h2>Hochauflösende Bilder / Retina</h2>
<p>Bei der klassischen Einbindung von Bildern für hochauflösende Displays, aka Retina, geht man davon aus, dass man ein Bild in doppelter Größe einbindet. Bei der heutigen Varianz der Displaygrößen und Pixel-Ratios ist das um einiges komplizierter geworden, aber das ist noch mal ein anderes Thema…</p>
<p>Gehen wir mal von der doppelten Bildgröße und folgendem Beispiel aus:</p>
<pre class="lang-markup"><code>&lt;p&gt;
  &lt;img src=&quot;images2x.jpg&quot; alt=&quot;&quot;&gt;
  lorem ipsum
&lt;/p&gt;</code></pre>
<p>Angenommen das Bild hat in einfacher Auflösung eine Größe von 400x300px, das Retina-Bild ist dementsprechend 800px breit. Ohne weitere Angaben würde das Bild im obigen Beispiel auf größeren Bildschirmen 800px breit angezeigt werden, bzw. so breit wie der Container ist. Initial wollten wir aber dass das Bild maximal 400px breit ist.</p>
<p>Mit einer Breiten-Angabe <code>width=&quot;400&quot;</code> im HTML wäre unser Retina-Bild auch nur max 400px breit und nicht größer.</p>
<pre class="lang-markup"><code>&lt;p&gt;
  &lt;img src=&quot;images2x.jpg&quot; width=&quot;400&quot; height=&quot;300&quot; alt=&quot;&quot;&gt;
  lorem ipsum
&lt;/p&gt;</code></pre>
<p>Demo: <a href="http://codepen.io/maddesigns/full/bFwnK">http://codepen.io/maddesigns/full/bFwnK</a></p>
<p>An dieser Stelle möchte ich nicht auf Responsive Images (Adaptive Images) eingehen, also für die richtige Bildgröße für die passende Displaybreite an zu geben.</p>
<p><a href="http://maddesigns.de/responsive-images/">Slides zum Thema „Responsive Images“</a></p>
<h2>Lazy-Loading</h2>
<p>Um nicht sofort alle Bilder zu laden, die nicht im Sichtbereich der Seite sind, gibt es schon seit Jahren eine Methode die man „Lazy Loading“ nennt. Alter Hut… Mit statischem Layout hatte man da kaum Probleme, mit flexiblem Layout schon. Einen faden Beigeschmack hat das allerdings, wenn Browser die Bilder <span lang="en">ondemand</span> laden. Man umgeht damit den Preparser des Browsers, der schon Vorarbeit beim Aufruf der Seite leistet. Das Hinzufügen von DOM-Elementen durch das Lazy Loading ist „teuer“. Das merkt man besonders bei schwächeren mobilen Endgeräten. Das Bilder sofort laden ist in dem Sinne auch problematisch, da das die gesamte Ladezeit der Seite erhöht, Stichwörter: Requests und Latenzen. Ein Abwägen und Testen der Möglichkeiten ist immer notwendig, wobei ich grundsätzlich zu Lazy Loading tendiere, wenn der Scope hauptsächlich moderne Smartphones/Tablets ist.</p>
<h3>Eine schmale Lazy-Loading-Lösungen mit JS</h3>
<p><a href="http://luis-almeida.github.io/unveil/">Unveil.js</a> ist ein kleines jQuery-/Zepto-Plugin, dass wahlweise auch Retina-Bilder laden kann.</p>
<pre class="lang-markup"><code>&lt;img src=&quot;img/loader.gif&quot; data-src=&quot;img2.jpg&quot; data-src-retina=&quot;img2-retina.jpg&quot; /&gt;</code></pre>
<h3>Lazy Loading wird W3C Standard</h3>
<p>Solch ein Verhalten soll in Zukunft eigenständig und optimiert vom Browser selbst durchgeführt werden. Durch ein Attribut soll das Laden einer Resource verzögert werden. Microsoft hat dies bereits im IE11 umgesetzt. Ein Beispiel:</p>
<pre class="lang-markup"><code>&lt;img src=&quot;example.jpg&quot; lazyload=&quot;1&quot; /&gt;</code></pre>
<p>Ich wiederhole das nochmal – Microsoft hat ein natives „Lazy Loading“ im Internet Explorer 11 bereits integriert. Fantastisch, oder?</p>
<p>Allerdings ist das nicht ganz 1:1 von der Idee der JavaScript-Bibliotheken übernommen. „Lazyload“ bedeutet in dem Fall, der Browser lädt die Resource, das können z.B. auch &lt;script&gt; oder &lt;video&gt; Elemente sein, verzögert, also erst nachdem andere Resource geladen sind, auch wenn sie vorher im Dokument sind.</p>
<p>Das Verhalten „Bild wird erst geladen, wenn es im Sichtbereich ist“ soll nach der <a href="http://www.w3.org/TR/resource-priorities/#attr-postpone">Resource-Priorities-Spezifikation</a> mit dem Attribut <code>postpone</code> möglich sein. Einen <a href="https://github.com/lsvx/postpone">Polyfill</a> für <code>postpone</code> gibt es bereits.</p>
<p>Mit der aktuellen Lazy-Loading-Methode im Responsive Webdesign hat man weiterhin das Problem, dass beim Einsetzen der Bilder ein Reflow der Seite durchgeführt wird und der Text springt. Reminder: „teuer“.</p>
<h2>padding-bottom Trick</h2>
<p>Wenn man mit Bildern arbeitet, die ein gleichbleibendes Seitenverhältnis haben, z.B. 16:9 oder 4:3, dann kann man den benötigten Platz bereits vorhalten, so dass Text, der um das Bild fließen würde, bereits richtig positioniert ist und nicht springt wenn das Bild lädt.</p>
<p>Der Container, der die Bilder beinhaltet, benötigt folgende CSS-Regeln:</p>
<pre class="lang-css"><code>.parent {
  display: block; /* if inline element */
  position: relative;
  height: 0;
}</code></pre>
<p>Die richtige Container-Höhe wird anhand des festen Seitenverhältnis berechnet.</p>
<p><strong>Einfacher Dreisatz: 9 &#215; 100% &#8725; 16</strong></p>
<p>Dieser errechnete Wert, ist der Wert, der die Box nun durch padding-bottom visuell vergrößert. Das Bild innerhalb des Containers wird absolut positioniert und mit <code>width:&nbsp;100%</code> sowie <code>height:&nbsp;100%</code> auf die komplette Größe der Containerbox aufgespannt. Stimmt das Seitenverhältnis nicht, erkennt man das am verzerrten Bild.</p>
<pre class="lang-css"><code>.parent {
  display: block;
  position: relative;
  height: 0;
  padding-bottom: 56.25%;
  width: 100%;
}</code></pre>
<pre class="lang-css"><code>.parent &gt; .child {
  display: block;
  position: absolute;
  width: 100%; 
  height: 100%;
  top: 0;
  margin: 0;
  padding: 0;
}</code></pre>
<p>So kann man Bilder (in der passenden Bildschirmgröße) ondemand laden ohne dass der Text erneut ausgerichtet wird (reflow).</p>
<p>Wenn Bilder aber nicht mit einer Container-Breite von 100% eingebunden sind, ist die Dreisatzrechnung eine andere. Angenommen das Bild soll links im Text mit einer Breite von 33% angezeigt werden, dann ist die Berechnung des padding-bottom Abstand folgendermaßen: 9 &#215; 33% &#8725; 16</p>
<p>Den padding-bottom Trick beschreiben Anders Andersen &amp; Tobias Järlund in Ihrem Smashing-Magazine Artikel <a href="http://mobile.smashingmagazine.com/2013/09/16/responsive-images-performance-problem-case-study/">Addressing The Responsive Images Performance Problem: A Case Study</a> ausführlich.</p>
<h3>fixed ratio Sass mixin</h3>
<p>Da man das ja nicht immer selbst ausrechnen möchte, kann man sich hier mit einem kleinen Sass-Mixin aus dem Sass-Toolkit behelfen:</p>
<pre class="lang-scss" lang="sass"><code>// @mixin fixed-ratiobox();
//
// stealed from https://github.com/Team-Sass/toolkit/blob/master/compass/stylesheets/toolkit/_intrinsic-ratio.scss
//
// usage: @include fixed-ratiobox(4/3, 50%, &#39;img, figure&#39;);
//
$intrinsic-ratio: 16/9 !default;
$intrinsic-ratio-width: 100% !default;
$intrinsic-ratio-elements: &#39;&gt; *&#39; !default;
$intrinsic-ratio-extend: true !default;
$intrinsic-ratio-direction: bottom !default;

@mixin intrinsic-ratio-parent($extend: $intrinsic-ratio-extend) {
    @if $extend {
      @extend %intrinsic-ratio-parent;
    }
    @else {
      display: block;
      position: relative;
      height: 0;
    }
}

@mixin intrinsic-ratio-child($extend: $intrinsic-ratio-extend) {
  @if $extend {
    @extend %intrinsic-ratio-child;
  }
  @else {
    display: block;
    position: absolute;
    width: 100%; // !important Nuke the external styles
    height: 100%; // !important Nuke the external styles
    top: 0;
    margin: 0;
    padding: 0;
  }
}

@mixin intrinsic-ratio-ratio($ratio: $intrinsic-ratio, $width: $intrinsic-ratio-width, $direction: $intrinsic-ratio-direction) {
  padding-#{$direction}: (1 / $ratio) * $width;
  width: $width;
}

@mixin intrinsic-ratio($ratio: $intrinsic-ratio, $width: $intrinsic-ratio-width, $elements: $intrinsic-ratio-elements, $extend: $intrinsic-ratio-extend, $direction: $intrinsic-ratio-direction) {
  @include intrinsic-ratio-parent($extend);
  @include intrinsic-ratio-ratio($ratio, $width, $direction);

  @each $element in $elements {
    #{$element} {
       @include intrinsic-ratio-child($extend);
    }
  }
}

@mixin fixed-ratiobox($ratio: $intrinsic-ratio, $width: $intrinsic-ratio-width, $elements: $intrinsic-ratio-elements, $extend: $intrinsic-ratio-extend, $direction: $intrinsic-ratio-direction) {
  @include intrinsic-ratio($ratio, $width, $elements, $extend, $direction);
}

%intrinsic-ratio-parent {
  @include intrinsic-ratio-parent(false);
}

%intrinsic-ratio-child {
  @include intrinsic-ratio-child(false);
}</code></pre>
<p><strong>Anwendung des fixed ratio Mixins</strong></p>
<pre class="lang-scss" lang="sass"><code>.parent {
  @include fixed-ratiobox(2/1);
}</code></pre>
<p><strong>Der generierte CSS-Code:</strong></p>
<pre class="lang-css"><code>.parent {
  position: relative;
  height: 0;
  padding-bottom: 50%;
  width: 100%;
}
.parent &gt; * {
  display: block;
  position: absolute;
  width: 100% !important;
  height: 100% !important;
  top: 0;
  margin: 0;
  padding: 0;
}</code></pre>
<p>Die Einbindung einer Box mit festem 4:3 Seitenverhältnis, welche aber nur 50% der Container-Breite einnimmt und für &#8218;IMG&#8216; oder &#8218;FIGURE&#8216; Kindelemente gilt, geht so:</p>
<pre class="lang-scss" lang="sass"><code>.wrapperclass {
  @include fixed-ratiobox(4/3, 50%, &#39;img, figure&#39;);
}</code></pre>
<pre class="lang-css"><code>.wrapperclass {
  position: relative;
  height: 0;
  padding-bottom: 37.5%;
  width: 50%;
}
.wrapperclass img, .wrapperclass figure {
  display: block;
  position: absolute;
  width: 100% !important;
  height: 100% !important;
  top: 0;
  margin: 0;
  padding: 0;
}</code></pre>
<p>Wer damit herum spielen möchte, kann das mit <a href="http://sassmeister.com/gist/8720504">Sassmeister</a> machen.</p>
<p>Wie man vielleicht auch schon erahnen kann, ist das nicht nur hilfreich für Bilder im festen Seitenverhältnis, sondern auch allgemein für Inhaltselemente mit festem Seitenverhältnis. Diese Technik nutzt man unter anderem auch für die Einbindung von responsive Youtube-Videos. Marc Hinse beschreibt die Technik für gleiche Seitenverhältnisse in seinem Artikel <a href="http://www.mademyday.de/css-height-equals-width-with-pure-css.html">Height equals width with pure CSS</a>.</p><p>Der Beitrag <a href="http://maddesigns.de/responsive-images-lazy-loading-2151.html/" target="_blank">Responsive Images – width/height-Attribute entfernen, lazy loading & padding-bottom Trick</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/responsive-images-lazy-loading-2151.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Static Site Generators</title>
		<link>http://maddesigns.de/static-site-generators-2138.html</link>
		<comments>http://maddesigns.de/static-site-generators-2138.html#comments</comments>
		<pubDate>Wed, 29 Jan 2014 20:31:19 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2138</guid>
		<description><![CDATA[<p>Anfang letzten Jahres habe ich mir überlegt, wie ich meine hauptsächliche Arbeit beschleunigen und verbessern kann. Mein aktueller Job besteht zumeist darin, Responsive Webdesigns in HTML-Templates umzusetzen, die dann im Anschluss in der Software-Entwicklung weiter verarbeitet werden. Manchmal sind es Templates für Content-Management-Systeme, oft ist es aber auch die Grundlage für Java-betriebene Webseiten. Ich habe &#8230; <a href="http://maddesigns.de/static-site-generators-2138.html" class="more-link"><span class="screen-reader-text">Static Site Generators</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/static-site-generators-2138.html/" target="_blank">Static Site Generators</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Anfang letzten Jahres habe ich mir überlegt, wie ich meine hauptsächliche Arbeit beschleunigen und verbessern kann. Mein aktueller Job besteht zumeist darin, Responsive Webdesigns in HTML-Templates umzusetzen, die dann im Anschluss in der Software-Entwicklung weiter verarbeitet werden. Manchmal sind es Templates für Content-Management-Systeme, oft ist es aber auch die Grundlage für Java-betriebene Webseiten. Ich habe überlegt, wie ich schnell und flexibel statische HTML-Templates generieren, gleichzeitig mit Sass (Compass) entwickeln und ein Browser-Reload (Live-Reload) machen kann. Einige Systeme habe ich mir angeschaut und möchte kurz meine Erfahrung teilen.</p>
<p><span id="more-2138"></span></p>
<h2>Hammer for Mac</h2>
<p>Als erstes habe ich mir „<a href="http://hammerformac.com/">Hammer for Mac</a>“ angeschaut. Hammer ist meiner Meinung nach ein einfaches Tool, um ein paar statische HTML-Seiten zusammen zu schrauben. Beim ersten Testlauf stellte ich aber schnell fest, dass Hammer nicht das machen konnte, was ich damit machen wollte.</p>
<p>Problem: Hammer konnte (damals?) keine HTML-Dateien in Unterverzeichnisse kompilieren — das ist doof. Zudem unterstützt Hammer Compass nicht. Das war auch suboptimal, autoprefixer &amp; Co. gab es noch nicht.</p>
<p>Für Hammer gibt es ein kleines (eigenständiges) Zusatztool, das die statischen Seiten über einen kleinen (Ruby-) Server ausliefert – <a href="http://anvilformac.com/">Anvil Server</a>. Man kann so ganz easy virtualle Hosts wie http://project.dev anlegen. Das fand ich ganz gut.</p>
<p>Wie aber schon erwähnt, reichte Hammer für meine Anforderungen nicht aus.</p>
<h2>Codekit</h2>
<p><a href="http://incident57.com/codekit/">Codekit</a> ist eine beliebte Software, die viele Sachen vereint, sämtliche CSS-Präprozessoren sind integriert, zudem JS-Hint/-Lint, Bildkompremierung u.v.m. Ich hatte mir sofort die Beta-Version angesehen und fand es soweit ganz gut. Mit Verlassen der Beta-Phase wurde Codekit kostenpflichtig, kurz danach wurde eine neue Template-Engine in Codekit integriert. Zu dem Zeitpunkt hatte ich mich schon mit Middleman beschäftigt, aber dazu später mehr. Die Template-Language „Kit“ ist meiner Meinung nach nicht ausreichend für etwas komplexere Templates, man kann lediglich einfache „Includes“, sowas wie SSI &amp; Variablen verwenden. Es fehlen aber Schleifen oder If-Else-Bedingungen. Beim Anlegen einer mehr-oder-weniger dynamischen Navigation (beispielsweise mit class=&quot;active&quot; für die aktuelle Seite) scheitert man bereits.</p>
<p>Sonst ist Codekit aber ein feines Tool, mit Browser-Reload und allem was man normal braucht.</p>
<h2>Prepos</h2>
<p><a href="http://alphapixels.com/prepros/">Prepos</a> ist ein Tool, welches ich mal ausprobiert hatte, als ich gezwungen war, vier Wochen in einer Agentur auf einem Windows-Rechner zu coden. Ein Vorteil von Prepos: es ist Windows fokussiert (gibt es aber auch für Mac) und funktioniert wohl ganz gut, soweit ich gehört habe. Mein Problem war, dass ich die Compass-Struktur, die wir in dem Projekt hatten nicht abbilden konnte. So war das Experiement schnell erledigt.</p>
<h2>Mixture.io</h2>
<p><a href="http://mixture.io/">Mixture</a> hatte ich mir ebenfalls in einer frühen Alpha-Version angesehen und ich war vom Featureset sofort begeistert. Mit Mixture ist es möglich komplexere Templates (mit Partials, etc.) umzusetzen. Die benutzte Template-Language ist <a href="http://liquidmarkup.org/">Liquid</a>. Zudem kann man mit Mixture neue Projekte mit Vorlagen wie Foundation oder Bootstrap starten.</p>
<p>Mixture unterstützt eine Daten-Anbindung über JSON, so dass man auf Grund von echten Daten statische Templates erstellen könnte. Das ist toll!</p>
<p>Mixture habe ich mittlerweile schon mehreren Kollegen empfohlen und würde es sofort wieder empfehlen, wenn man sich nicht gern auf der Konsole bewegt. Aber dazu sind ja die Tools da, sie nehmen einen die Arbeit mit der Konsole ab, kosten dafür aber Geld. ;)</p>
<h2>Middleman</h2>
<p>Im Kontext „Static Site Generators” taucht auch schnell <a href="http://middlemanapp.com/">Middleman</a> auf. Wie der Name schon sagt, ist das die Software „dazwischen“. Middleman ist Ruby-basiert und unterstützt demzufolge die Ruby Template-Sprachen ERB, HAML, Slim, etc., aber auch Markdown (Kramdown) oder Jade.</p>
<p>Mit Middleman würde auch gleichzeitig Sass und Compass installiert werden, falls man es nicht bereits installiert hat. Middleman hat einen Server-Task, in dem ein kleiner Ruby-Server für Dateiänderungen gestartet wird. Zudem gibt es natürlich einen Build-Task. Auch für Middleman gibt es <a href="http://directory.middlemanapp.com/#/templates/all">Vorlagen</a>, mit denen man neue Projekte starten kann. Da das aber Open-Source und Community-getrieben ist, werden hier nicht so oft Updates oder neue Versionen veröffentlicht. Anders bei Mixture.io, dort sorgt die Firma dafür, dass Updates oder neue Template-Vorlagen-Versionen schnell zur Verfügung gestellt werden. Ein USP von mixture.io.</p>
<p>Aber zurück zu Middleman: Weiterhin gibt es für Middleman auch viele Plugins wie <a href="https://github.com/porada/middleman-autoprefixer">middleman-autoprefixer</a> oder <a href="https://github.com/middleman/middleman-livereload">middleman-livereload</a>. In der Middleman-Dokumentation werden ERB-Template-Beispiele verwendet. ERB ist für den Einstieg in die Ruby-Template-Engines auch ganz gut, da diese nicht so abstrakt ist wie z.B. HAML. Es sind einige Template-Helper in Middleman integriert. Es können z.B. Platzhaltertexte eingebunden werden, die je Aufruf variieren. Das ist besonders hilfreich beim Erstellen von Responsive Websites, abseits von Lorem Ipsum. In der Konfiguration kann man für den Build-Prozess einstellen, ob JavaScript oder CSS komprimiert und zusammengefasst werden. Middleman unterstützt auch die Rails-Asset-Pipeline sowie Asset-Caching. Eigentlich alles was man für ein statisches Template/eine statische Seite benötigt. Gute Tutorials zu Middleman:</p>
<ul>
<li><a href="http://benfrain.com/understanding-middleman-the-static-site-generator-for-faster-prototyping/">Understanding Middleman – the static site generator for faster prototyping</a></li>
<li><a href="http://12devs.co.uk/articles/204/">Building static websites with Middleman</a></li>
</ul>
<h2>Jekyll</h2>
<p>Jekyll wird aktuell häufig als statischer „Blogersatz“ verwendet. Das ist in Wirklichkeit auch schon das, was man am besten damit machen kann: Jekyll bietet neben der Möglichkeit Inhalte in Markdown-Dialekten oder HTML in verschiedenen Layouts zu publizieren, hauptsächlich Möglichkeiten, die aus der Blogging-Welt kommen: Kategorien, Tags, Posts und dazu passende Paginatoren. Für Entwickler eignet sich das ganze als Ersatz für WordPress ganz besonders: Jekyll publiziert absolut problemlos auf GitHub Pages (ein Wunder, entstammt doch Jekyll auch aus der Feder des GitHub CEOs Tom Preston-Werner) und hat mit Pygments einen Syntax-Highlighting Präprozessor, der diverse JavaScript-Bibliotheken obsolet macht. Mit <a href="http://getpoole.com/">Poole</a> ist sogar ein recht brauchbares Starterkit für Jekyll verfügbar.</p>
<p>Will man über die übliche Dokumentation- oder Blogfunktionalität hinaus, stößt man allerdings schnell an die Grenzen des von Jekyll. Zwar kann man sich zahlreicher <a href="http://jekyllrb.com/docs/plugins/">Plugins</a> bedienen, an die Möglichkeiten die z.B. Assemble (mit Handlebars Helpers) oder Jade bieten, kommt Jekyll nicht heran.</p>
<h2>Assemble</h2>
<p>Ich habe lang gezögert mich näher mit Grunt zu beschäftigen, da ich letztes Jahr nicht so viel Schnittpunkte mit meiner Arbeit gesehen habe. Ich war und bin mit Middleman äußerst zufrieden und würde wahrscheinlich ausschließlich Middleman nutzen.</p>
<p>Im aktuellen Projekt wird allerdings Grunt für die JavaScript-Entwicklung eingesetzt, was Sinn ergibt. Die Überlegung war nun, ob man nicht die Templates, die für die Module, die clientseitig (mit Javascript) verarbeitet werden, die gleiche Template-Engine nutzen könnte. Bei der Suche nach einer Template-Engine, die das unterstützt, bin ich auf <a href="http://assemble.io">Assemble</a> gestoßen. Assemble nutzt <a href="http://handlebarsjs.com/">Handlebars</a> als Template-Engine und unterstützt zusätzlich eine Vielzahl an <a href="https://github.com/assemble/handlebars-helpers">Template-Helpern</a>. Zudem ist die Community recht groß (obwohl das Projekt noch recht neu ist) und es werden für Assemble bereits viele Plugins angeboten. Ich muss das aber erstmal produktiv ausprobieren, Assemble sieht aber sehr vielversprechend aus.</p>
<h3>Fazit:</h3>
<p>Es fällt mir schwer eine Empfehlung auszusprechen. Ich habe im letzten Jahr mehrere Projekte mit Middleman umgesetzt und werde es sicherlich weiterhin benutzen. Hätte ich mich nicht so sehr mit Middleman angefreundet, gleichzeitig auch mit der Konsole, würde ich aktuell zu Mixture tendieren. Wer viel mit Grunt arbeitet, sollte sich vielleicht Assemble anschauen, das macht für mich aktuell den besten Eindruck als Static Site Generator mit Grunt. Unter <a href="http://staticsitegenerators.net/">http://staticsitegenerators.net/</a> findet man eine laaaaaange Liste von aktuell 220 Tools.</p>
<p>Eine lustigen Tweet zum Thema hab ich heute auch entdeckt. ;)</p>
<blockquote class="twitter-tweet" lang="de">
<p>the net award for best static site generator goes to Dreamweaver</p>
<p>&mdash; jennmoneydollars (@jennschiffer) <a href="https://twitter.com/jennschiffer/statuses/428525919155003394">29. Januar 2014</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p><p>Der Beitrag <a href="http://maddesigns.de/static-site-generators-2138.html/" target="_blank">Static Site Generators</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/static-site-generators-2138.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Styleguide generieren mit Sass &#038; Grunt</title>
		<link>http://maddesigns.de/styleguide-mit-grunt-2093.html</link>
		<comments>http://maddesigns.de/styleguide-mit-grunt-2093.html#comments</comments>
		<pubDate>Mon, 06 Jan 2014 08:56:55 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Grunt]]></category>
		<category><![CDATA[RWD]]></category>
		<category><![CDATA[Sass]]></category>
		<category><![CDATA[grunt]]></category>
		<category><![CDATA[sass]]></category>
		<category><![CDATA[styleguide]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2093</guid>
		<description><![CDATA[<p>Ein in größeren Projekten immer wichtiger werdendes Thema ist in meinen Augen ein Styleguide, der einerseits als Dokumentation und andererseits für externe Dienstleister als Referenz genutzt werden kann. Früher™ als man das Design ausschließlich in Photoshop machte, wurde natürlich auch der Styleguide in Photoshop erstellt — mit Bemaßung LOL! Diese Vorlage sollten Webentwickler dann nutzen, &#8230; <a href="http://maddesigns.de/styleguide-mit-grunt-2093.html" class="more-link"><span class="screen-reader-text">Styleguide generieren mit Sass &#38; Grunt</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/styleguide-mit-grunt-2093.html/" target="_blank">Styleguide generieren mit Sass & Grunt</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Ein in größeren Projekten immer wichtiger werdendes Thema ist in meinen Augen ein Styleguide, der einerseits als Dokumentation und andererseits für externe Dienstleister als Referenz genutzt werden kann.</p>
<p>Früher<img src="https://s.w.org/images/core/emoji/11/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" /> als man das Design ausschließlich in Photoshop machte, wurde natürlich auch der Styleguide in Photoshop erstellt — mit Bemaßung LOL! Diese Vorlage sollten Webentwickler dann nutzen, um ein Design möglichst pixelgenau umzusetzen. Ich kann mich an keinen „Styleguide“ erinnern, der zu 100% stimmte. Häufig waren Fehler in der „Bemaßung“ oder in Farbwerten… ihr kennt das.</p>
<p> <span id="more-2093"></span></p>
<p>Die „gedruckten“ Styleguides sind natürlich nicht mehr zeitgemäß. Im Responsive Webdesign können Webseiten-Elemente in unterschiedlichen Ausgabegrößen unterschiedlich dargestellt werden. Zudem werden im agilen <a href="http://maddesigns.de/responsive-workflow/" title="Responsive Workflow">Responsive Workflow</a> Designelemente auch geändert und sehen u.U. nicht mehr so aus, wie es der Designer geplant hatte.</p>
<p>(Anekdote am Rande: Im aktuellen Projekt wurde das Aussehen bei ca. ¾ der Elemente/Module während des agilen Entwicklungsprozess nach Rücksprache mit dem Designer geändert)</p>
<p>Ein „Living Styleguide“, der das Projekt widerspiegelt (also vielleicht responsive ist) und bei Veränderungen ohne großen Aufwand neu generiert wird, brauchte man. Gibt es! Grunt zu Hülf! :)</p>
<h2>Grunt – The JavaScript Task Runner</h2>
<p><a href="http://gruntjs.com/">Grunt</a> ist ein Kommandozeilen „Task Runner“, mit dem man automatisiert Aufgaben erledigen lassen kann. Zum Beispiel kann man <span lang="en">JavaScript</span> auf Validität oder sauberer Schreibweise mit „jslint/jshint“ überprüfen oder Sass kompilieren und eine Vielzahl weiterer Tasks erledigen lassen. Tiefer will ich nicht auf Grunt(d)lagen eingehen, gute Einsteigerartikel findet ihr unter:</p>
<ul>
<li><a href="http://webkrauts.de/artikel/2012/build-tool-grunt">Webkrauts-Artikel</a> von Frederic Hemberger (@fhemberger) und</li>
<li><a href="http://24ways.org/2013/grunt-is-not-weird-and-hard/">Grunt-Einführung (en)</a> von Chris Coyier</li>
</ul>
<h3>Grunt-Styleguide</h3>
<p>Automatisierung von Webentwicklungsaufgaben ist super. Da liegt es natürlich nahe, auch Styleguides automatisiert erstellen zu lassen. Mit <a href="https://github.com/indieisaconcept/grunt-styleguide">Grunt-Styleguide</a> gibt es ein Grunt-Modul, das das für uns erledigen kann.</p>
<p><strong>Installation von Grunt-Styleguide:</strong></p>
<pre><code>npm install grunt-styleguide --save-dev</code></pre>
<p>Die Grunt-Modul-Konfiguration lässt zwei „Styleguide-Frameworks“ zu. Per Default ist <a href="http://jacobrask.github.io/styledocco/">Styledocco</a> aktiv. Styledocco lässt allerdings keine eigenen Styleguide-Vorlagen zu. Das andere Framework, das mit Grunt-Styleguide verwendet werden kann, ist <a href="http://hughsk.github.io/kss-node/">KSS-node</a> und ist ebenfalls bereits im Modul enthalten. Der Node.js-Port von <a href="https://github.com/kneath/kss">KSS</a>, das für die Styleguide-Generierung des <a href="https://github.com/styleguide/css/">Github.com Styleguide</a> verwendet wird, eignet sich meiner Meinung nach besser um individuelle Styleguides zu generieren.</p>
<p><strong>Styleguide-Konfiguration in gruntfile.js:</strong></p>
<p></p>
<pre class="language-javascript"><code>// only the styleguide part of the gruntfile.js
styleguide: {
    options: {
        template: {
            src: &#39;styleguide/template/&#39;
        },
        framework: {
            name: &#39;kss&#39;
        }
    },
    all: {
        files: [{
            &#39;dist/styleguide&#39;: &#39;css/sass/**/*.scss&#39;
        }]
    }
}

grunt.registerTask(&#39;build&#39;, [], function () {
    grunt.loadNpmTasks(&#39;grunt-styleguide&#39;);
    grunt.task.run(&#39;styleguide&#39;);
});</code></pre>
<p><strong>Styleguide-Vorlage</strong><br />
Mit KSS-node ist es möglich, ein eigenes Styleguide-Template zu verwenden und somit den Styleguide an das Look and Feel des Projektes anzupassen.</p>
<p>Im Grunt-Modul ist unter <code>templates/kss/index.html</code> eine Beispiel-Datei hinterlegt. Diese Vorlage kann man in ein anderes Verzeichnis kopieren und nach belieben anpassen. Das Template ist mit <a href="http://handlebarsjs.com/">Handlebars</a> Helpern ausgestattet, um eine flexible Ausgabe der Daten zu ermöglichen.</p>
<p><strong>Styleguide-Navigation in der Styleguide-Vorlage:</strong></p>
<pre class="language-markup"><code>&lt;ul class=&quot;styleguide-navigation&quot;&gt;
  {{#eachRoot}}
    &lt;li&gt;
      &lt;a href=&quot;section-{{reference}}.html&quot;&gt;
        {{reference}}.0: {{header}}
      &lt;/a&gt;
    &lt;/li&gt;
  {{/eachRoot}}
&lt;/ul&gt;</code></pre>
<p>Soweit, so gut. Das Styleguide-Template liegt vor und der Grunt-Task ist konfiguriert, jetzt nur noch den Sass-Code kommentieren und der Styleguide kann erstellt werden.</p>
<h2>Sass Kommentare in Styleguide umwandeln</h2>
<p>Die einzelnen Styleguide-Abschnitte werden anhand von Kommentaren im CSS bzw. direkt aus den Sass-Kommentaren generiert. Das hat gleichzeitig den Vorteil, dass Entwickler ihren Code kommentieren. :)</p>
<p><strong>Ein Beispiel:</strong></p>
<pre lang="sass" class="language-scss"><code>// Links
//
// usual links and style for external links
//
// Markup: &lt;a href=&quot;&quot; class=&quot;{$modifiers}&quot;&gt;Link&lt;/a&gt;
//
// :visited  - visited styles
// :hover    - Highlight the button when hovered.
// :focus    - focus styles
// :active   - &quot;Press&quot; the button down when clicked.
// .external - external link styles
//
// Styleguide 1.1

a {
  color: $link-color;
  text-decoration: underline;

  &amp;:visited {
    color: $link-colorV;
  }
  &amp;:hover {
    color: $link-colorH;
  }
  &amp;:focus {
    color: $link-colorF;
    outline: thin dotted;
  }
  &amp;:active {
    color: $link-colorA;
    outline: none;
  }
  &amp;:hover, &amp;:active {
    outline: none;
  }
  &amp;.external {
    color: $link-external;
  }
}</code></pre>
<p>In den Kommentaren kann man mehrere Teile der Styleguide-Section Beschreibung unterbringen.</p>
<pre lang="sass" class="language-scss"><code>// Titel
//
// Beschreibung
//
// Markup: 
// &lt;div&gt;
//   &lt;span&gt;HTML-Code&lt;/span&gt;
//   &lt;span&gt;mehrzeilig&lt;/span&gt;
// &lt;/div&gt;  
//
// Modifiers ({$modifiers}) 
// z.B. Pseudo-Klassen oder Modifier-Klassen 
// plus Beschreibung 
//
// Styleguide Abschnitt (1.1)</code></pre>
<p>Als großer Unterschied zum <a href="https://github.com/kneath/kss">original KSS</a> Styleguide, der auf Ruby basiert, ist es mit KSS-node möglich über den „Markup-Teil“ in den Kommentaren auch Markup-Beispiele im Styleguide anzuzeigen. Zudem wird pro Modifier das Markup mit der Modifier-Klasse in den Styleguide eingefügt. Bei Pseudo-Klassen wie <code class="language-css">:hover</code> wird das Styling dann per JavaScript (kss.js) on-the-fly eingesetzt.</p>
<p>Die freie Gestaltung des Markups lässt natürlich auch zu, dass man ganze Seitenmodule im Styleguide abbilden kann.</p>
<p><strong>Beispiel Suchfeld:</strong></p>
<pre lang="sass" class="language-scss"><code>// Search
//
// Below are global search field and search result list styles
//
// Styleguide 4

// global search field
//
// Markup:
// &lt;form action=&quot;&quot; class=&quot;global-search&quot;&gt;
//   &lt;fieldset&gt;
//     &lt;label for=&quot;search_field&quot;&gt;Search&lt;/label&gt;
//     &lt;input type=&quot;search&quot; id=&quot;search_field&quot; 
//            name=&quot;search_field&quot; 
//            placeholder=&quot;enter search term&quot;&gt;
//     &lt;button type=&quot;submit&quot; class=&quot;btn-submit&quot;&gt;Search&lt;/button&gt;
//   &lt;/fieldset&gt;
// &lt;/form&gt;
//
// Styleguide 4.1</code></pre>
<p>Ich habe in den Styleguide noch den <a href="http://prismjs.com/">Prism-Syntax-Highlighter</a> von <a href="http://lea.verou.me/">Lea Verou</a> integriert, et voilà, der Living-Styleguide nimmt Formen an.</p>
<p><strong>Screenshots</strong></p>
<p><img src="" alt="Styleguide3" title="" width="1280" height="960" class="aligncenter size-full wp-image-2096"  src-medium="http://maddesigns.de/wp-content/uploads/2014/01/Styleguide3-300x225.jpg"  src-post-thumbnail="http://maddesigns.de/wp-content/uploads/2014/01/Styleguide3-672x372.jpg"  src-twentyfourteen-full-width="http://maddesigns.de/wp-content/uploads/2014/01/Styleguide3-1038x576.jpg"  src-full="http://maddesigns.de/wp-content/uploads/2014/01/Styleguide3.jpg"  /></p>
<p>(leider aktuell nur Screenshots vom Styleguide bis der veröffentlicht wird)</p><p>Der Beitrag <a href="http://maddesigns.de/styleguide-mit-grunt-2093.html/" target="_blank">Styleguide generieren mit Sass & Grunt</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/styleguide-mit-grunt-2093.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Mobile First &#038; IE8 Fallback mit Sass (Teil2)</title>
		<link>http://maddesigns.de/mobile-first-ie8-fallback-mit-sass-teil2-2047.html</link>
		<comments>http://maddesigns.de/mobile-first-ie8-fallback-mit-sass-teil2-2047.html#comments</comments>
		<pubDate>Fri, 20 Dec 2013 12:44:10 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[RWD]]></category>
		<category><![CDATA[Sass]]></category>
		<category><![CDATA[breakpoint]]></category>
		<category><![CDATA[fallback]]></category>
		<category><![CDATA[ie8]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[sass]]></category>
		<category><![CDATA[SCSS]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2047</guid>
		<description><![CDATA[<p>Im ersten Teil Mobile First &#038; IE8 Fallback mit Sass ging es darum, wie man mit dem IE8 umgeht, wenn man CSS und Media Querys nach dem „Mobile First“ Prinzip erstellt. Das Mixin-Plugin Sass-IE hilft dabei ein gesondertes Stylesheet für den IE8 ohne @media Angaben zu generieren. Die Lösung hat jedoch ein paar Schwächen, so &#8230; <a href="http://maddesigns.de/mobile-first-ie8-fallback-mit-sass-teil2-2047.html" class="more-link"><span class="screen-reader-text">Mobile First &#038; IE8 Fallback mit Sass (Teil2)</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/mobile-first-ie8-fallback-mit-sass-teil2-2047.html/" target="_blank">Mobile First & IE8 Fallback mit Sass (Teil2)</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Im ersten Teil <a href="http://maddesigns.de/mobile-first-ie8-fallback-sass-2008.html" title="Mobile First &#038; IE8 Fallback mit Sass">Mobile First &#038; IE8 Fallback mit Sass</a> ging es darum, wie man mit dem IE8 umgeht, wenn man CSS und Media Querys nach dem „Mobile First“ Prinzip erstellt. Das Mixin-Plugin <a href="http://jakearchibald.github.io/sass-ie/" title="Sass oldIE Media Querys Fallback Mixins">Sass-IE</a> hilft dabei ein gesondertes <span lang="en">Stylesheet</span> für den IE8 ohne @media Angaben zu generieren. Die Lösung hat jedoch ein paar Schwächen, so können z.B. Media Querys nur für einen Wert (min-width bzw. max-width) und ein Medium (@media screen &#8230;) generiert werden. Es ist also nicht möglich ein Media Query für zwei Werte zu schreiben. Leider geht <code class="language-css">@media screen and (min-width: 450px and max-width: 650px)</code> damit nicht.<br />
<span id="more-2047"></span></p>
<h2>Breakpoint Compass plugin</h2>
<p><a href="https://github.com/Team-Sass/breakpoint" title="Breakpoint - a Compass Plugin for Media Queries">Breakpoint</a> ist ein Compass Plugin, das IMO die universellste Lösung für das Schreiben von Media Querys in Sass ist. Breakpoint funktioniert grundsätzlich wie Sass-IE, wenn man ein Media Query schreiben möchte, ruft man ein Mixin auf. Ein einfaches Beispiel: </p>
<pre lang="sass" class="language-scss"><code>$basic-value: 543px;
$pair-value: 456px 794px;

.foo {
  content: 'No Media Queries';

  @include breakpoint($basic-value) {
    content: 'Basic Media Query';
  }

  @include breakpoint($pair-value) {
    content: 'Paired Media Query';
  }
}
</code></pre>
<p>Der Default-Wert für Media Querys ist <code>min-width</code>. Werden zwei Variablen übergeben wird eine UND-Verknüpfung von min- und max-width generiert.</p>
<pre lang="css" class="language-css"><code>.foo {
  content: 'No Media Queries';
}

@media (min-width: 543px) {
  .foo {
    content: 'Basic Media Query';
  }
}

@media (min-width: 456px) and (max-width: 794px) {
  .foo {
    content: 'Paired Media Query';
  }
}</code></pre>
<p>Breakpoint kann auch automatisch EM-Media-Querys generieren. Dazu einfach die globale Variable <code class="language-scss">$breakpoint-to-ems</code> auf <code class="language-scss">true</code> setzen. </p>
<pre lang="sass" class="language-scss"><code>$breakpoint-to-ems: true;
$media: 'screen' 700px;

#foo {
  @include breakpoint($media) {
    content: 'Media';
  }
}</code></pre>
<pre lang="css" class="language-css"><code>@media screen and (min-width: 43.75em) {
  #foo {
    content: 'Media';
  }
}</code></pre>
<p>Das Beispiel oben zeigt, dass man in Breakpoint das Medium (<code>screen</code>) für den der Media Query zutrifft optional angeben kann. Denkbar wäre auch eine Variable wie <code class="language-scss">$forprint: 'print';</code> für ein Druckstylsheet.</p>
<h3>IE8 Fallback in separate Dateien generieren</h3>
<p>Wie beim Mixin von Jake kann man in Breakpoint auch ein <span lang="en">Stylesheet</span> für IE8 in eine gesonderte generieren Datei lassen. </p>
<pre lang="sass" class="language-scss"><code>// _layout.scss
// global breakpoints
$small: 24em;
$middle: 34em;
$large: 65em, 'no-query' true;

.component {
  color: red;
  @include breakpoint($middle) {color: blue}
  @include breakpoint($large) {color: green;}
}</code></pre>
<p>In der Sass-Hauptdatei wird die _layout.scss importiert und die globalen Variablen aus Breakpoint <code class="language-scss">$breakpoint-no-queries</code> und <code class="language-scss">$breakpoint-no-query-fallbacks</code> auf <code class="language-scss">false</code> gesetzt.</p>
<pre lang="sass" class="language-scss"><code>// styles.scss
$breakpoint-no-queries: false;
$breakpoint-no-query-fallbacks: false;
@import 'layout';</code></pre>
<p>Für den IE8-Fallback wird eine eigene Datei angelegt, die ebenfalls </p>
<pre lang="sass" class="language-scss"><code>// fallback-ie8.scss
$breakpoint-no-queries: true;
@import 'layout';</code></pre>
<p><strong>styles.css</strong> </p>
<pre lang="css" class="language-css"><code>.component {
  color: red;
}
@media (min-width: 34em) {
  .component {
    color: blue;
  }
}
@media (min-width: 65em) {
  .component {
    color: green;
  }
}</code></pre>
<p><strong>fallback-ie8.css</strong></p>
<pre lang="css" class="language-css"><code>.component {
  color: red;
  color: green;
}</code></pre>
<h3>Fallback mit „.lt-ie9“ in der Hauptdatei</h3>
<p>Zusätzlich kann man Selektoren auch mit speziellen Root-Klassen erweitern lassen. Die Vorgehensweise kennt man sicherlich durch <a href="http://html5boilerplate.com/" title="HTML5 Boilerplate">HTML5 Boilerplate</a>. Durch Conditional Comments im &lt;head&gt; wird für den IE8 die Klasse <code>lt-ie9</code> im HTML hinzugefügt. Diesen Selektoren kann man nun verwenden um Styles für den IE8 zu generieren. </p>
<p>Mit Breakpoint kann man das wie folgt erreichen:</p>
<pre lang="sass" class="language-scss"><code>// style.scss
// use px values, convert them to EM
$breakpoint-to-ems: true; 
$breakpoint-no-query-fallbacks: true;
$large: 960px, 'no-query' '.lt-ie9';

.component {
  color: red;
  @include breakpoint($large) {
    color: green;
  }
}</code></pre>
<p><strong>style.css</strong></p>
<pre lang="css" class="language-css"><code>.component {
  color: red;
}
@media (min-width: 60em) {
  .component {
    color: green;
  }
}
.lt-ie9 .component {
  color: green;
}</code></pre>
<p>Letztlich kann man auch bei Mixin-Aufruf noch die nötigen Variablen mitgeben, z.b. könnte man </p>
<pre lang="sass" class="language-scss"><code>.component {
  color: red;
  @include breakpoint($large) {
    color: green;
  }
  @include breakpoint(1200px,'.no-mq') {
    color: yellow;
  }
}</code></pre>
<p>Das würde folgendes CSS als Fallback generieren:</p>
<pre lang="css" class="language-css"><code>.component {
  color: red;
}
.lt-ie9 .component {
  color: green;
}
.no-mq .component {
  color: yellow;
}</code></pre>
<p>Man kann separate Dateien generieren oder den Fallback direkt in die Datei einfügen, und und und. Das macht es für mich so flexibel und ich bin noch nicht an die Grenzen gestoßen. Habt ihr weitere Tipps zum Thema „Mobile First und IE8-Fallback“?  </p><p>Der Beitrag <a href="http://maddesigns.de/mobile-first-ie8-fallback-mit-sass-teil2-2047.html/" target="_blank">Mobile First & IE8 Fallback mit Sass (Teil2)</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/mobile-first-ie8-fallback-mit-sass-teil2-2047.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Mobile First &#038; IE8 Fallback mit Sass</title>
		<link>http://maddesigns.de/mobile-first-ie8-fallback-sass-2008.html</link>
		<comments>http://maddesigns.de/mobile-first-ie8-fallback-sass-2008.html#comments</comments>
		<pubDate>Fri, 20 Dec 2013 08:02:25 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[RWD]]></category>
		<category><![CDATA[Sass]]></category>
		<category><![CDATA[fallback]]></category>
		<category><![CDATA[ie8]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[sass]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=2008</guid>
		<description><![CDATA[<p>Um die Begriffsklärung „Mobile First“ soll es heute nicht gehen. Das ist teils eine philosophische Frage und viele behaupten zurecht, bevor man sich über Design und die Umsetzung Gedanken macht, sollte der Content, für den man gestaltet, vorliegen — also quasi „Content First“. Für viele hat aber „Coffee First“ am Morgen eines Arbeitstages die höchste &#8230; <a href="http://maddesigns.de/mobile-first-ie8-fallback-sass-2008.html" class="more-link"><span class="screen-reader-text">Mobile First &#038; IE8 Fallback mit Sass</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/mobile-first-ie8-fallback-sass-2008.html/" target="_blank">Mobile First & IE8 Fallback mit Sass</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Um die Begriffsklärung „Mobile First“ soll es heute nicht gehen. Das ist teils eine philosophische Frage und viele behaupten zurecht, bevor man sich über Design und die Umsetzung Gedanken macht, sollte der Content, für den man gestaltet, vorliegen — also quasi „Content First“. Für viele hat aber „Coffee First“ am Morgen eines Arbeitstages die höchste Priorität. ;) </p>
<p>In dem Artikel geht es um die technischen Möglichkeiten für den Internet Explorer 8 automatisiert eine <del datetime="2013-12-19T20:48:15+00:00">optimierte</del> <ins datetime="2013-12-19T20:48:38+00:00">ähnlich gute</ins> Ansicht der Responsive Website zu generieren.<br />
<span id="more-2008"></span><br />
Problem: der IE8 unterstützt keine Media Querys. </p>
<p>Wenn man technisch gesehen „Mobile First” entwickelt, bedeutet das, dass der erste Media Query kein Media Query ist und alle Geräte zuerst die „mobile Ansicht“ bekommen. Die Layout-Anpassungen mit Media Querys würden von klein zu groß gemacht, nicht umgekehrt. Da der IE8 keine Media Querys unterstützt, ignoriert er die Styles, die innerhalb diesen definiert sind, und macht die Anpassungen nicht mit. Demzufolge zeigt er die „Smartphone-Ansicht“. Oftmals wäre das nicht mal so schlimm, das Ergebnis ist oft übersichtlicher und performanter. ;)</p>
<p>Andererseits ist es natürlich auch nachvollziehbar, dass das Kunden nicht ausreicht und man den Usern mit IE8 eine „Desktop-Ansicht“ präsentieren möchte. </p>
<p><strong>IE8 Verbreitung in Deutschland</strong></p>
<figure>
<a href="http://gs.statcounter.com/#desktop-browser_version_partially_combined-DE-monthly-201211-201311" title="Statistik Browser Versionen Deutschland"><img src="http://maddesigns.de/wp-content/uploads/2013/12/StatCounter-browser_version_partially_combined-DE-monthly-201211-201311.jpeg" alt="StatCounter browser version DE-monthly 2012/11-2013/11" width="854" height="500" class="aligncenter size-full wp-image-2012" srcset="http://maddesigns.de/wp-content/uploads/2013/12/StatCounter-browser_version_partially_combined-DE-monthly-201211-201311.jpeg 854w, http://maddesigns.de/wp-content/uploads/2013/12/StatCounter-browser_version_partially_combined-DE-monthly-201211-201311-360x211.jpeg 360w, http://maddesigns.de/wp-content/uploads/2013/12/StatCounter-browser_version_partially_combined-DE-monthly-201211-201311-640x375.jpeg 640w" sizes="(max-width: 854px) 100vw, 854px" /></a><figcaption>Statistik über Browser-Versionen in Deutschland</figcaption></figure>
<p>Was ich grundsätzlich nie empfehle, dem IE8 über Scripte wie <a href="https://github.com/scottjehl/Respond" title="respond.js">respond.js</a> oder <a href="http://code.google.com/p/css3-mediaqueries-js/">CSS3-mediaqueries.js</a> ein responsives Verhalten zu implementieren. Den IE8 gibt es nicht auf mobilen Endgeräten, er ist fast ausschließlich auf Windows XP Rechnern, vereinzelt noch auf Vista Rechnern, installiert. Hier surfen die User sehr häufig mit dem IE über die volle Bildschirmbreite. Seiten, die bisher nicht ins Fenster gepasst haben, bekamen einen horizontalen Scrollbalken. Das ist der Ansatz, den ich immer empfehle: Der IE8 bekommt eine Desktop-Ansicht. Diese kann auch ein Stück weit flexibel (mit min- und max-width) sein, aber passt sich nicht „responsive“ an. Die zusätzlichen Scripte machen den IE8 nur noch langsamer, als er schon ist.</p>
<p><strong>responsive Hinweis</strong><br />
Die responsiven Frameworks <a href="http://foundation.zurb.com/" title="Foundation responsive Framework">Foundation</a> sowie <a href="http://getbootstrap.com/" title="Bootstrap responsive Framework">Bootstrap</a> sind technisch auch auf den „Mobile First” Ansatz umgestiegen und unterstützen somit den IE8 nicht mehr. Das sollte man beachten, wenn man diese Frameworks produktiv einsetzt. </p>
<h3>IE8-Fallback-Stylesheet mit Sass </h3>
<p>Oft werde ich gefragt, wie ich das mache und sage dann meist „ganz einfach &#8211; mit Sass“. ;)</p>
<p><a href="http://jakearchibald.github.io/sass-ie/" title="Sass oldIE Media Querys Fallback Mixins">Sass-IE</a> von Jake Archibald ist ein kleines Mixin-Plugin, mit dem man „Mobile First“ Media-Querys schreiben kann und gleichzeitig ein Stylesheet für IE < 9 ohne @media Angaben generiert wird. 

Grundsätzlich benötigt man zwei sog. Sass-Manifest-Dateien, im Beispiel von Sass-IE ist das <em>all.scss</em> und <em>all-old-oldie.scss</em>. In der <em>all.scss</em> werden all (haha) unsere Sass-Dateien importiert und eine Variable <code class="language-scss">$fix-mqs</code> auf <code class="language-scss">false</code> gesetzt.</p>
<pre lang="sass" class="language-scss"><code>// all.scss
$fix-mqs: false !default;
@import styles.scss;
</code></pre>
<p>In der Datei all-old-oldie.scss wird die Variable <code class="language-scss">$fix-mqs</code> auf den Wert gesetzt, der für den IE als „Desktop-Min-Width“ gelten soll. Hier im Beispiel <code class="language-scss">65em</code>. Zudem muss die Variable <code class="language-scss">$old-ie: true;</code> gesetzt sein und die <em>all.scss</em> importiert werden.</p>
<pre lang="sass" class="language-scss"><code>// all-old-oldie.scss
$old-ie: true;
$fix-mqs: 65em;
@import 'all';
</code></pre>
<p>Media Querys werden in Sass nun wie folgt benutzt:</p>
<pre lang="sass" class="language-scss"><code>.component {
  color: red;
  @include respond-min(32em) { color: green; }
  @include respond-min(65em) { color: blue; }
}</code></pre>
<p>Sass generiert daraus folgendes CSS.</p>
<pre lang="css" class="language-css"><code>/* all.scss */
.component {
  color: red;
}
@media screen and (min-width: 32em) {
  .component {
    color: green;
  }
}
@media screen and (min-width: 65em) {
  .component {
    color: blue;
  }
}</code></pre>
<pre lang="css" class="language-css"><code>/* all-old-ie.scss */
.component {
  color: red;
  color: blue;
}</code></pre>
<p>Das Mixin „respond-min“ im Detail:</p>
<pre lang="sass" class="language-scss"><code>$fix-mqs: false !default;
@mixin respond-min($width) {
  // wenn die Ausgabe an ein fixed Media Query erfolgen soll
  @if $fix-mqs {
    // wenn $fix-mqs einen Wert hat
    @if $fix-mqs >= $width {
      // und der Wert größer/gleich 
      // der übergebenen Breite ist
      // dann den übergebenen Inhalt parsen
      @content;
    }
  }
  @else {
    // andererseits ein Media Query Bereich generieren 
    // und Inhalt parsen
    @media screen and (min-width: $width) {
      @content;
    }
  }
}
// es gibt natürlich auch ein respond-max mixin, 
// das das macht, was man erwartet

$old-ie: false !default;
</code></pre>
<h3>CSS in die HTML-Datei integrieren</h3>
<p>Die beiden CSS-Dateien werden über Conditional Comments in die Seite eingebunden. Zuerst die oldIE-Datei, dann unsere CSS-Datei mit den Media Querys. Der IE8 erkennt das oldIE Stylesheet und ignoriert den zweiten Conditional Comment, da er anscheinend für den Internet Explorer größer IE8 gilt. Der IE9 merkt, dass der erste Conditional Comment nicht für ihn bestimmt ist und lädt das zweite Stylesheet. Der IE10/IE11 und alle anderen modernen Browser ignorieren Conditional Comments und laden das zweite Stylesheet. Das Besondere an dieser Stelle ist, dass der HTML-Kommentar hinter dem öffnenden Conditional Comment gleich wieder geschlossen wird: <code>&lt;!--></code>. Moderne Browser erkennen, dass der zweite Conditional Comment sofort wieder geschlossen wird und laden die verlinkte CSS-Datei.</p>
<pre lang="html" class="language-html"><code>&lt;!--[if lte IE 8]>
  &lt;link rel="stylesheet" href="css/all-old-ie.css">
&lt;![endif]-->

&lt;!--[if gt IE 8]>&lt;!-->
   &lt;link rel="stylesheet" href="css/all.css">
&lt;!--&lt;![endif]--></code></pre>
<p><strong>Einzelne Eigenschaften (Hacks) nur für oldIE</strong><br />
Die kleine Mixin-Library von Jack bringt noch ein kleines old-ie Mixin speziell für einzelne IE-Hacks mit. </p>
<pre lang="sass" class="language-scss"><code>@mixin old-ie {
    // Only use this content if we're dealing with old IE
    @if $old-ie {
        @content;
    }
}</code></pre>
<p>Man könnte hier z.B. eine Fallback-Lösung für RGBA-Farbwerte mitgeben.</p>
<p>So schön wie die Lösung funktioniert, hat sie doch ein paar Nachteile. Media Querys werden nur für einen Wert (min-width bzw. max-width) und ein Medium (@media screen &#8230;) ausgegeben. Es ist also nicht möglich ein Media Query für zwei Werte zu schreiben. <code class="language-css">@media screen and (min-width: 450px and max-width: 650px)</code> geht damit leider nicht. Dennoch ist es ein großer Gewinn ein Stylesheet, dass schon zum größten Teil für die Desktop-Darstellung im IE8 optimiert ist, automatisch bei der „Mobile First“ Entwicklung zu generieren. </p><p>Der Beitrag <a href="http://maddesigns.de/mobile-first-ie8-fallback-sass-2008.html/" target="_blank">Mobile First & IE8 Fallback mit Sass</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/mobile-first-ie8-fallback-sass-2008.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>IE-Debugging via VirtualBox mit modern.ie</title>
		<link>http://maddesigns.de/internet-explorer-debugging-mit-virtualbox-1967.html</link>
		<comments>http://maddesigns.de/internet-explorer-debugging-mit-virtualbox-1967.html#comments</comments>
		<pubDate>Thu, 12 Dec 2013 11:25:19 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[virtualbox]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=1967</guid>
		<description><![CDATA[<p>Alltag für Webentwickler dürfte das Testen der Webseiten im Internet Explorer sein. Wo hingegen bei Firefox oder Chrome es einen kürzeren Releasezyklus gibt, wurde der IE in den letzten Jahren sehr selten erneuert. Das Problem ist (wie beim Safari) dass das Browser-Upgrade ans Betriebssystem geknüpft ist. Hinderlich ist es auch, das man nicht mehrere IE-Versionen &#8230; <a href="http://maddesigns.de/internet-explorer-debugging-mit-virtualbox-1967.html" class="more-link"><span class="screen-reader-text">IE-Debugging via VirtualBox mit modern.ie</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/internet-explorer-debugging-mit-virtualbox-1967.html/" target="_blank">IE-Debugging via VirtualBox mit modern.ie</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Alltag für Webentwickler dürfte das Testen der Webseiten im Internet Explorer sein. Wo hingegen bei Firefox oder Chrome es einen kürzeren Releasezyklus gibt, wurde der IE in den letzten Jahren sehr selten erneuert. Das Problem ist (wie beim Safari) dass das Browser-Upgrade ans Betriebssystem geknüpft ist. Hinderlich ist es auch, das man nicht mehrere IE-Versionen parallel installieren kann. Früher<img src="https://s.w.org/images/core/emoji/11/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" /> hatte man sich mit <a href="http://www.my-debugbar.com/wiki/IETester/HomePage">IETester</a> beholfen um gleichzeitig mehrere IEs zu testen. Bereits seit IE8 kann man das Rendering in den IE-Developer-Tools umstellen und die Seite in einer älteren IE-Version gerendert betrachten. Das reicht auch oft für den ersten Eindruck, ist aber nicht so verlässlich wie eine isolierte Version von Browser und Betriebssystem. Zudem kann man am Mac keinen IE installieren. Im Netz gibt es zwar einige Tools wie <a href="http://netrenderer.de/">IE NetRenderer</a>, die Screenshots von IE-Versionen generieren. Das hilft aber nicht weiter wenn man einen Darstellungsfehler entdeckt, Debugging ist natürlich nicht möglich.</p>
<p><span id="more-1967"></span></p>
<h2>Internet Explorer via VirtualBox oder VMware Fusion</h2>
<p>Um sicher zu testen, sollte man auf virtuelle Maschinen zurück greifen. Prominente Tools sind <a href="http://www.vmware.com/de/products/fusion/" title="VMware Fusion">VMware Fusion</a>, <a href="http://www.parallels.com/de/products/desktop/">Parallels Desktop</a> oder <a href="https://www.virtualbox.org/">VirtualBox</a>. In VirtualBox kann man aber nicht nur Windows und IE installieren, sondern auch andere Systeme abbilden. VirtualBox wird aktuell sehr häufig mit <a href="http://www.vagrantup.com/">Vagrant</a> genutzt um z.B. eine Live-Server-Umgebung abzubilden.</p>
<p>Seit einiger Zeit gibt es eine Initiative von Microsoft um das Testen von Webseiten auf verschieden Internet Explorer zu erleichtern – <a href="http://modern.ie">modern.ie</a>. Mit dem Online-Tool kann man eine bestehende Seite im Netz überprüfen, ob z.B. die Möglichkeiten für Windows 8 ausgeschöpft werden ob proprietäre CSS-Eigenschaften verwendet werden. Zudem bietet Microsoft dedizierte virtuelle Maschinen für das lokale Testen zum Herunterladen an. Über modern.ie bekommt man zudem eine 3-monatige Testphase für Browserstack.</p>
<p>
<a href="http://maddesigns.de/internet-explorer-debugging-mit-virtualbox-1967.html/modern-ie-test" rel="attachment wp-att-1981"><img src="http://maddesigns.de/wp-content/uploads/2013/12/modern-ie-test-300x219.png" alt="modern-ie test" width="300" height="219" class="aligncenter size-medium wp-image-1981" /></a>
</p>
<p><strong>Testen mit Browserstack</strong><br />
<a href="http://www.browserstack.com/">Browserstack</a> ist ein Service, mit dem man nicht nur die IEs, sondern auch eine Vielzahl mobiler Devices testen kann. Browserstack stellt virtuelle Maschinen oder Emulatoren zur Verfügung auf denen man dann via Tunnel eine Webseite debuggen kann und besitzt zudem eine REST API zum automatisierten Testen. <a href="http://codepen.io/">Codepen</a>-Snippets können ebenfalls &#8222;on-the-fly&#8220; via <a href="http://blog.codepen.io/2013/01/16/new-feature-open-in-browserstack/">Browserstack getestet werden</a>.</p>
<h3>Internet Explorer als virtuelle Maschine mit VirtualBox installieren</h3>
<p>Ich benutze schon seit einiger Zeit VirtualBox und spezielle virtuelle Maschinen für das lokale Testen von IE8 &amp; Co. Bei der Installation der Boxen half mir ein Shell-Script von <a href="https://github.com/xdissent/ievms">ievms</a>. Beim Installieren kann man zudem angeben welche Versionen vom IE man installieren möchte, oder einfach alle verfügbaren Versionen installieren (IE6-IE11).</p>
<ol>
<li>
<p>Aktuelle Version von VirtualBox herunterladen:<br /><a href="https://www.virtualbox.org/wiki/Downloads">https://www.virtualbox.org/wiki/Downloads</a></p>
</li>
<li>
<p>ievms über die Konsole via Shell-Script installieren</p>
<pre><code>curl -s https://raw.githubusercontent.com/xdissent/ievms/master/ievms.sh bash
</code></pre>
</li>
<li>oder: spezielle IE-Versionen installieren (IE8 &#8211; IE10)
<pre><code>
curl -s https://raw.githubusercontent.com/xdissent/ievms/master/ievms.sh | env IEVMS_VERSIONS="8 9 10" bash
</code></pre>
</li>
<li>Warten<br />Das dauert je nach Verbindungsgeschwindigkeit und Rechnerleistung einige Zeit (bis zu mehreren Stunden) &#8211; am besten vielleicht nachts laufen lassen und sicher stellen, dass die Internetverbindung stabil ist und der Rechner nicht in den Ruhemodus geht. ;)
</li>
</ol>
<h2>IE VMs auf externem Speichermedium (SD-Card) installieren</h2>
<p>Bei der Installation von IE VMs werden sehr große Dateien im System hinterlegt (ist ja immer ein komplettes Windows-Betriebssystem mit Browser). Das kann natürlich den verfügbaren Speicherplatz einer Festplatte sehr stark dezimieren, besonders wenn man nur eine kleine SSD hat.</p>
<p>Da ich die VMs zwar sehr gern verwende, aber nicht mehr allzu häufig brauche und sie mir die Festplatte ein wenig zumüllen, habe ich mir die VMs auf einer externen Quelle installiert. Ich habe mir eine 64Gb Micro-SD-Karte und einen <a href="http://www.amazon.de/gp/product/B00DEP295W" title="microSD auf SD Adapter">kleinen SD-Karten-Adapter</a> zugelegt, da ich den SD-Karten-Slot am MacBook Air selten brauche.</p>
<p><img src="http://maddesigns.de/wp-content/uploads/2013/12/sccard-adapter.jpg" alt="SD-Card Adapter" width="800" height="600" class="aligncenter size-full wp-image-1984" srcset="http://maddesigns.de/wp-content/uploads/2013/12/sccard-adapter.jpg 800w, http://maddesigns.de/wp-content/uploads/2013/12/sccard-adapter-360x270.jpg 360w, http://maddesigns.de/wp-content/uploads/2013/12/sccard-adapter-640x480.jpg 640w" sizes="(max-width: 800px) 100vw, 800px" /></p>
<p>Bei der Installation über ievms muss dann ein anderer Pfad angegeben werden um die virtuelle Maschine auf der SD-Karte zu speichern. Das Script anwerfen und Kaffee trinken gehen oder so. Das Installieren dauert eine Weile, da extern speichern bekanntermaßen noch langsamer als intern speichern ist.</p>
<pre><code>curl -s https://raw.githubusercontent.com/xdissent/ievms/master/ievms.sh | env IEVMS_VERSIONS="7" INSTALL_PATH="/Volumes/SanDisk64/.ievms" bash</code></pre>
<p><strong>Installationspfad anpassen: &#8222;/Volumes/[YOUR_SDCARD_NAME]&#8220;</strong></p>
<p>Das ievms Shell-Script erstellt automatisch einen Sicherungspunkt, zu dem man nach Ablauf der 90-Tage-Windows-Testphase zurückkehren kann und die VMs nicht erneut herunterladen und installieren muss. Bis dahin kann man Windows völlig <strong>kostenlos</strong> nutzen.</p>
<p><a href="http://maddesigns.de/wp-content/uploads/2013/12/ievms-virtualbox.jpg"><img src="http://maddesigns.de/wp-content/uploads/2013/12/ievms-virtualbox.jpg" alt="IE VMs VirtualBox" width="770" height="637" class="aligncenter size-full wp-image-1987" srcset="http://maddesigns.de/wp-content/uploads/2013/12/ievms-virtualbox.jpg 770w, http://maddesigns.de/wp-content/uploads/2013/12/ievms-virtualbox-338x280.jpg 338w, http://maddesigns.de/wp-content/uploads/2013/12/ievms-virtualbox-580x480.jpg 580w" sizes="(max-width: 770px) 100vw, 770px" /></a></p>
<p>Wenn alles installiert ist, kann man die Maschinen starten (eine nach der anderen) und weitere Einstellungen machen. Die Maschinen werden per default mit englischer Tastatur installiert. Ich stelle diese immer auf deutsch um und erstelle dann nochmal einen Snapshot (Sicherungspunkt).</p>
<figure id="attachment_1986" style="width: 300px" class="wp-caption aligncenter"><a href="http://maddesigns.de/wp-content/uploads/2013/12/ie11-win7.png"><img src="http://maddesigns.de/wp-content/uploads/2013/12/ie11-win7-300x237.png" alt="maddesigns.de im IE11 auf Windows 7" width="300" height="237" class="size-medium wp-image-1986" /></a><figcaption class="wp-caption-text">Ansicht maddesigns.de im IE11 auf Windows 7</figcaption></figure><p>Der Beitrag <a href="http://maddesigns.de/internet-explorer-debugging-mit-virtualbox-1967.html/" target="_blank">IE-Debugging via VirtualBox mit modern.ie</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/internet-explorer-debugging-mit-virtualbox-1967.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Individuelle responsive Gridsysteme mit Sass</title>
		<link>http://maddesigns.de/responsive-grids-sass-1883.html</link>
		<comments>http://maddesigns.de/responsive-grids-sass-1883.html#comments</comments>
		<pubDate>Tue, 26 Nov 2013 08:00:19 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[RWD]]></category>
		<category><![CDATA[Sass]]></category>
		<category><![CDATA[Grids]]></category>
		<category><![CDATA[sass]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=1883</guid>
		<description><![CDATA[<p>Mit Sass kann man individuelle responsive Gridsysteme erstellen, die man im Responsive Webdesign für die Anpassung an die unterschiedliche Screengrößen benötigt.</p>
<p>Der Beitrag <a href="http://maddesigns.de/responsive-grids-sass-1883.html/" target="_blank">Individuelle responsive Gridsysteme mit Sass</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Für Responsive Webdesign ist ein Gridsystem der Grundstock um den Inhalt auf vielen verschiedenen Ausgabegeräten flexibel auszugeben. Gridsysteme sind mittlerweile unbedingt notwendig um ein Design zielgenau (nicht pixelgenau) umzusetzen. Um genau zu sein, sollte das Design bereits einem Raster folgen, das dann in der Entwicklung so umgesetzt wird.</p>
<p><span id="more-1883"></span></p>
<p>Als Einstieg in die Thematik eignet sich der Artikel <a title="Fluid Grids" href="http://alistapart.com/article/fluidgrids">„Fluid Grids“</a> (2009) von Ethan Marcotte himself. Dort beschreibt Ethan wie man ein fixes Layout in ein flexibles Layout umrechnet. Eine einfache Formel ist das Geheimnis der fluiden Grids:<br />
<strong>Ziel/Kontext = Ergebnis in Prozent</strong></p>
<p>Ein klassisches Beispiel:<br />
<strong>300px / 960px = 0.3125 * 100% = 31.25%</strong></p>
<p>Wer sich bereits mit Responsive Webdesign beschäftigt hat, kennt sicherlich diese Grundlagen.</p>
<p>Das responsive Frontend-Framework <a href="http://foundation.zurb.com/docs/components/grid.html">Foundation</a> bietet die Möglichkeit mit den Klassen-Präfixen &#8217;small-&#8218; und &#8218;large-&#8218; individuelle Breakpoints für die jeweilige Module zu vergeben. Dadurch kann man die prozentuale Spaltenbreite je Viewport anpassen. Im HTML fügt man dazu folgende Klassen hinzu:</p>
<div class="row">
<pre class="language-markup"><code>&lt;div class="small-2 large-4 columns"&gt;...&lt;/div&gt;
&lt;div class="small-4 large-4 columns"&gt;...&lt;/div&gt;
&lt;div class="small-6 large-4 columns"&gt;...&lt;/div&gt;</code></pre>
</div>
<p><a href="http://getbootstrap.com/css/#grid">Bootstrap</a> (formerly known as Twitter Bootstrap) hat einen ähnlichen Gridaufbau.</p>
<div class="row">
<pre class="language-markup"><code>&lt;div class="col-xs-12 col-md-8"&gt; .col-xs-12 .col-md-8 &lt;/div&gt;
&lt;div class="col-xs-6 col-md-4"&gt; .col-xs-6 .col-md-4 &lt;/div&gt;</code></pre>
</div>
<h2>Welche Vorteile bringt ein &#8222;individuelles Gridsystem&#8220; gegenüber den Gridsystemen von Bootstrap oder Foundation?</h2>
<p>Erst einmal sollte man sich bewusst sein, dass ein (Frontend-) Framework eine Reihe an Modulen und Features mitbringen, die beim Prototyping und bei der Entwicklung durchaus hilfreich sein können. Setzt man aber nur ein Modul davon ein (z.B. Grids) und achtet nicht darauf nur die verwendeten Dateien (die nötigen CSS-Stile) im HTML zu referenzieren, handelt man sich unter Umständen einen unnötigen Overhead ein.</p>
<p>Wer nur ein einfaches flexibles Gridsystem sucht, könnte auch das <a href="http://static.elliotjaystocks.com/responsive-grid/html-demo/">1000px Gridsystem</a> von Elliot Jay Stocks oder das Online-Tool <a href="http://gridpak.com/">Gridpak</a> nutzen.</p>
<p>Bei herkömmlichen Gridsystemen ist man an die vorgegebene Klassen-Logik des Gridsystem gebunden, um eine Änderung an der Spaltigkeit zu machen. Dazu müssten Änderungen am Markup gemacht werden. Zudem bieten die allermeisten responsiven Gridsysteme nur einen vorkonfigurierten Breakpoint (Foundation 5 hat jetzt auch zusätzlich ein <a href="http://foundation.zurb.com/docs/components/grid.html#medium-grid">„Medium-Grid“</a>) um Layoutänderungen zu machen.</p>
<h3>Sass Gridsysteme</h3>
<p>Mit Sass hat man die Möglichkeit Grids unabhängig vom Markup, bzw. auf das Markup angepasst, zu erstellen. Nicht vergessen ein anderes Border-Box-Modell für alle Elemente deklarieren.</p>
<pre class="language-scss" lang="sass"><code>*, *:before, *:after {
  @include box-sizing('border-box');
}</code></pre>
<p>Drei Gridsysteme möchte ich nachvolgend kurz vorstellen:</p>
<h3>Semantic GS</h3>
<p>Ein einfaches individuelles Gridsystem ist <a href="http://semantic.gs/">Semantic GS</a>. Letztlich ist die Berechnung der Spalten in 2-3 Funktionen hinterlegt, einfach die Grid-Variablen setzen und loslegen. Selbst die Unterscheidung ob das Grid feste Breiten hat oder fluide agiert, kann konfiguriert werden.</p>
<pre class="language-scss" lang="sass"><code>@import 'grid.scss';

$column-width: 60;
$gutter-width: 20;
$columns: 12;
$total-width: 100%;  // fluid grid

// 9 columns main article and 3 columns aside content
article {
   @include column(9);
}
aside {
   @include column(3);
}</code></pre>
<p>Subgrid-Logik:</p>
<pre class="language-scss" lang="sass"><code>article {
    @include column(9);

    ul {
      // include grid row 
      @include row(9);
      li {
        // include 3 columns of a 9 columns context (33.334%)
        @include column(3,9);
      }
   }
}</code></pre>
<p>Das Semantic.gs Gridsystem gibt es als LESS-, Stylus- und SCSS-Präprozessor-Variante.</p>
<h3>Susy – Responsive grids for Compass</h3>
<p><a href="http://susy.oddbird.net/">Susy</a> ist ein responsive Grid-Framework für Compass. Wer <a href="http://960.gs/">960.gs</a> kennt, kommt auch mit Susy schnell zurecht. Susy verwendet z.B. ebenfalls das Keyword &#8218;omega&#8216; um bei der letzte Spalte den Abstand (Gutter) nach rechts auf 0 zu setzen.</p>
<p><strong>Gem Installation über die Kommandozeile</strong></p>
<pre class="language-ruby"><code>gem install compass-susy-plugin</code></pre>
<p><strong>Susy zu einem bestehenden Projekt hinzufügen &#8211; Anpassung der Compass-Konfiguration (config.rb):</strong></p>
<pre class="language-ruby"><code>#config.rb
require "susy"</code></pre>
<p><strong>Susy in die Sass-Dateien importieren</strong></p>
<pre class="language-scss" lang="sass"><code>@import "susy";</code></pre>
<p><strong>Grid Konfiguratuion:</strong></p>
<pre class="language-scss" lang="sass"><code>// global variables
$total-columns: 12;            // a 12 column grid
$column-width:  4em;           // each column is 4em wide
$gutter-width:  1em;           // 1em gutters between columns
$grid-padding:  $gutter-width; // grid-padding equal to gutters

// usage 
.page {
  @include container;
  @include susy-grid-background; // visualize the grid as bg-img
}

article {
  // content spans 9 columns of 12
  @include span-columns(9,12);    
}
aside { 
  // aside content spans the final 3 (omega) of 12 columns
  @include span-columns(3 omega,12); 
}</code></pre>
<p>Susy bietet eine Vielzahl an Möglichkeiten wie Push oder Pull, sowie IE &lt;9 Support (.lt-ie9 Klasse) um ein eigenes Responsive Gridsystem aufzubauen, zudem eine umfangreiche Doku: <a href="http://susy.oddbird.net/guides/reference/">http://susy.oddbird.net/guides/reference/</a></p>
<p>An der nächsten Version von Susy wird schon fleißig gearbeitet, die Version 2.0 hat Sass 3.3 Support und brauch Compass nicht mehr unbedingt, siehe <a title="Susy Next Changelog on Github" href="https://github.com/ericam/susy/blob/susy-next/CHANGELOG-NEXT.md">Github Changelog</a>.</p>
<h3>Singularity – Grids without limits</h3>
<p><a href="http://singularity.gs/">Singularity</a> ist etwas mehr als ein Gridsystem wie man es häufig verwendet. Singularity kann neben den üblichen symmetrischen Grids (alle Spalten gleich breit) auch asymetrische Grids erstellen, d.h. nicht alle Spalten müssen immer gleich breit sein. Es lassen sich auch Spalten unterschiedlicher Breite anlegen. Zudem hat Singularity die sogenannte <a href="http://palantir.net/blog/responsive-design-s-dirty-little-secret">„Isolation-Methode“;</a> als standardmäßige Spalten-Positionierungslogik und umgeht damit Browserbugs durch fehlerhafte Prozentrechnung.</p>
<h4>Installation des Singularity Gridsystem</h4>
<p>Die Installation von Singularity erfolgt genau wie bei Susy.</p>
<pre class="language-ruby"><code>gem install singularitygs</code></pre>
<p><strong>Singularity in die Compass-Konfiguration hinzufügen:</strong></p>
<pre class="language-ruby"><code># config.rb
require "singularitygs"</code></pre>
<p><strong>Singularity in die Sass-Dateien importieren:</strong></p>
<pre class="language-scss" lang="sass"><code>@import "singularitygs";</code></pre>
<p>Globale Grid-Variablen festlegen:</p>
<pre class="language-scss" lang="sass"><code>// 12 columns á la 960gs:
$grids: 12;
$gutters: 1/3;
</code></pre>
<figure><img class="aligncenter size-full wp-image-1918" src="http://maddesigns.de/wp-content/uploads/2013/11/12columns.png" alt="12 columns grid " width="1440" height="100" srcset="http://maddesigns.de/wp-content/uploads/2013/11/12columns.png 1440w, http://maddesigns.de/wp-content/uploads/2013/11/12columns-360x25.png 360w, http://maddesigns.de/wp-content/uploads/2013/11/12columns-640x44.png 640w" sizes="(max-width: 1440px) 100vw, 1440px" /><figcaption>Symmetrisches Grid (12 Spalten)</figcaption><figcaption>
</figcaption></figure>
<p>Das SCSS Grid-Mixin:</p>
<pre class="language-scss" lang="sass"><code>@include grid-span($span, $position);</code></pre>
<p>$span = Spaltenlänge<br />
$position = Startposition</p>
<pre class="language-scss" lang="sass"><code>// usage 
article {
  // content spans 9 columns of 12 columns.
  @include grid-span(9,1);  
}
aside { 
  // aside content spans 3 of 12 columns.
  @include grid-span(3,10); 
}
</code></pre>
<p class="sassmeister" data-gist-id="8296852" data-height="300"><img class="aligncenter size-full wp-image-1960" title="" src="http://maddesigns.de/wp-content/uploads/2013/11/12columns1.png" alt="12 columns grid with article and aside" width="1440" height="100" srcset="http://maddesigns.de/wp-content/uploads/2013/11/12columns1.png 1440w, http://maddesigns.de/wp-content/uploads/2013/11/12columns1-360x25.png 360w, http://maddesigns.de/wp-content/uploads/2013/11/12columns1-640x44.png 640w" sizes="(max-width: 1440px) 100vw, 1440px" /><br />
<a href="http://sassmeister.com/gist/8296852">Play with this gist on SassMeister.</a></p>
<p><strong>Visuelle Positionierung (push und pull) – Der &#8218;$location&#8216; Parameter</strong><br />
Mit dem zweiten Parameter im @include Aufruf kann die Start-Position ($location) der Spalte festgelegt werden.</p>
<pre class="language-scss" lang="sass"><code>article {
  // content spans 9 columns begins at position 4.
  @include grid-span(9,4);  
}
aside { 
  // aside content spans 3 at position 1.
  @include grid-span(3,1); 
}</code></pre>
<p class="sassmeister" data-gist-id="8296720" data-height="300"><img class="aligncenter size-full wp-image-1961" title="" src="http://maddesigns.de/wp-content/uploads/2013/11/12columns2.png" alt="12 column grid with switched positions" width="1440" height="100" srcset="http://maddesigns.de/wp-content/uploads/2013/11/12columns2.png 1440w, http://maddesigns.de/wp-content/uploads/2013/11/12columns2-360x25.png 360w, http://maddesigns.de/wp-content/uploads/2013/11/12columns2-640x44.png 640w" sizes="(max-width: 1440px) 100vw, 1440px" /><br />
<a href="http://sassmeister.com/gist/8296720">Play with this gist on SassMeister.</a></p>
<h4>Asymetrische Grids mit Singularity</h4>
<p>Singularity kann in der <code class="language-scss">$grids</code> Variable nicht nur einfache Zahlen verarbeiten, sondern auch mehrere Zahlen, die dann zu einem Gesamtgrid zusammen gezählt werden.</p>
<pre class="language-scss" lang="sass"><code>$grids: 1 4 1; // grid of 6 columns
$gutters: 1/6;            // 1/6 gutter of 1 column
$gutter-style: split;     // split gutter - half gutter on each side
</code></pre>
<p>Oder unser Ausgangsbeispiel:</p>
<pre class="language-scss" lang="sass"><code>$grids: 2 8 2; // grid of 12 colums
$gutters: 1/3;

article {
  // article content spans 1 column (is in fact 2 columns wide)
  // begins at position 1
  @include grid-span(1,1);
}
aside { 
  // aside content spans 1 column (is in fact 8 columns wide)
  // begins at position 2
  @include grid-span(1,2); 
}
.ads {
  // article content spans 1 column (is in fact 2 columns wide)
  // begins at position 3
  @include grid-span(1,3);
}</code></pre>
<figure><img class="aligncenter size-full wp-image-1917" src="http://maddesigns.de/wp-content/uploads/2013/11/2-8-2colums.png" alt="2-8-2 colums grid" width="1440" height="100" srcset="http://maddesigns.de/wp-content/uploads/2013/11/2-8-2colums.png 1440w, http://maddesigns.de/wp-content/uploads/2013/11/2-8-2colums-360x25.png 360w, http://maddesigns.de/wp-content/uploads/2013/11/2-8-2colums-640x44.png 640w" sizes="(max-width: 1440px) 100vw, 1440px" /><figcaption>Asymmetrisches Grid (2-8-2)</figcaption></figure>
<p>Bei asymmetrischen Grids ist darauf zu achten, dass der ‘$grids’-Variable in Teile aufgeteilt wird, aus denen sich die Positionen (Start der Spalte) ergeben. Drei Teile ergeben dann die Positionen 1, 2 und 3. Die „Spaltenbreiten“ können demzufolge jeweils eine Spalte breit sein (im Beispiel eigentlich 2 Spalten von 12) oder zwei bzw. drei Spalten (100%) breit.</p>
<p>Singularity kann auch automatisiert responsive Grids erstellen, also dass sich die Spaltenanzahl je Breakpoint geändernt wird. Ein Beispiel:</p>
<pre class="language-scss" lang="sass"><code>$break-small:   450px;
$break-medium:  700px;
$break-large:   900px;
$break-xlarge: 1200px;

$grids: 3; // mobile first view - 3 columns
$grids: add-grid(6 at $break-small); // 6 equal columns from 450px 
$grids: add-grid(12 at $break-medium); // 12 equal columns
$grids: add-grid(2 8 2 at $break-large); // 3 columns (2|8|2)
$grids: add-grid(1 3 5 7 9 at $break-xlarge); // 5 columns (1|3|5|7|9) 

$gutters: 1/3;
$gutters: add-gutter(.25 at 900px);</code></pre>
<p>In dem <a title="Singularity Gridsystem Demo" href="http://maddesigns.de/sgs-demos/singularity-demo.html">Beispiel</a> sind im „Mobile First“ Viewport drei Spalten mit einem Gutter von ⅓ der Spalte deklariert. Ab dem Breakpoint „$break-small“ (450px) wird das Grid in ein 6 Spalten-Grid umgewandelt, ab „$break-medium“ (700px) in ein 12 Spalten-Grid. Diese Spalten sind alle gleich breit. Ab dem Breakpoint „$break-large“ (900px) wird das Grid in 3 Spalten (die insgesamt aus 12 Spalten bestehen) asymmetrisch aufgeteilt. Letztlich gibt es nochmal ein asymmetrisches Grid ab dem Breakpoint „$break-xlarge“ (1200px). Ich möchte darauf hinweisen, dass das nur ein Beispiel ist, was möglich ist, nicht ob das ein sinnvolles Grid ist.</p>
<p>Hier eine <a title="Singularity Gridsystem Live-Demo" href="http://maddesigns.de/sgs-demos/singularity-demo.html">Live-Demo</a> und von allen Views mal Screenshot:</p>
<figure><a href="http://maddesigns.de/wp-content/uploads/2013/11/480x320.png"><img class="alignleft size-thumbnail wp-image-1920" src="http://maddesigns.de/wp-content/uploads/2013/11/480x320-150x150.png" alt="Symetrisches Grid - 6 Spalten (480x320px)" width="150" height="150" /> </a> <a href="http://maddesigns.de/wp-content/uploads/2013/11/320x480.png"><img class="alignleft size-thumbnail wp-image-1919" src="http://maddesigns.de/wp-content/uploads/2013/11/320x480-150x150.png" alt="Symetrisches Grid - 3 Spalten (320x480px)" width="150" height="150" /> </a> <a href="http://maddesigns.de/wp-content/uploads/2013/11/768x1024.png"><img class="alignleft size-thumbnail wp-image-1921" src="http://maddesigns.de/wp-content/uploads/2013/11/768x1024-150x150.png" alt="Symmetrisches Grid - 12 Spalten (768x1024px)" width="150" height="150" /> </a> <a href="http://maddesigns.de/wp-content/uploads/2013/11/1280x800.png"><img class="alignleft size-thumbnail wp-image-1923" src="http://maddesigns.de/wp-content/uploads/2013/11/1280x800-150x150.png" alt="Asymmetrisches Grid bei 1280 x 800px" width="150" height="150" /> </a> <a href="http://maddesigns.de/wp-content/uploads/2013/11/1024x768.png"><img class="alignleft size-thumbnail wp-image-1922" src="http://maddesigns.de/wp-content/uploads/2013/11/1024x768-150x150.png" alt="Asymmetrisches Grid bei 1024 x 768px" width="150" height="150" /> </a><figcaption>Responsive Grids &#8211; unterschidliche Spalten je Breakpoint</figcaption></figure>
<h3>Relationale Grids &#8211; Singularity-Extras</h3>
<p>Mit der Erweiterung „Singularity-Extras“ können mit Singularity Grids auf Basis bestimmter Relationen erstellt werden. So z.B. ein Gridsystem nach „Goldenen Schnitt“ oder „Compound-Grid“, das die Spaltenbreiten überlagert, kombiniert und zu einer Einzelspalte nach dem <a title="Karl Gerstner Compound Grid" href="https://gridsetapp.com/specs/gerstner/?gridset=show">Vorbild von Karl Gerstner</a> zusammenfügt. Dadurch sind natürlich sehr individuelle Grids möglich. Das Zuweisen der Spalten wird dann teilweise etwas komplizierter und ist manchmal ganz schöner Brain-Fuck, aber funktioniert.</p>
<pre class="language-scss" lang="sass"><code>@import "singularitygs";
@import "singularity-extras";

$break-small:   450px;
$break-medium:  700px;
$break-large:   900px;
$break-xlarge: 1200px;

$grids: 3;
$grids: add-grid(1 2 3 at $break-small);
$grids: add-grid(ratio(golden(), 6) at $break-medium);
$grids: add-grid(compound(2, 3, 4) at $break-large);

$gutters: .25;</code></pre>
<p>Ein Beipiel mit Singularity-Extras: <a title="Mobile First Grid" href="http://maddesigns.de/sgs-demos/extras.html">Mobile First Grid</a></p>
<p>Aktuell wird auch an der Sass 3.3 Kompatibilität von Singularity gearbeitet, das viele Verbesserungen intern mit sich bringt.</p>
<p>Ich würde mich freuen, wenn ich mal ein asymmetrisches Design-Raster umsetzen könnte, die meisten Designs sind ja mit symmetrischen Spalten aufgeteilt, aber immerhin besser als gar kein Raster. Hatte ich erwähnt, dass man mit Singularity auch sowas machen kann:</p>
<pre class="language-scss" lang="sass"><code>$grids: 55px 55px 55px 55px 55px 55px 55px 55px 55px 55px 55px 55px 55px 55px 55px;</code></pre>
<p>Nicht? Jetzt aber. ;)</p>
<p>Nutzt ihr andere Grid-Systeme und welche Erfahrungen habt ihr damit?</p><p>Der Beitrag <a href="http://maddesigns.de/responsive-grids-sass-1883.html/" target="_blank">Individuelle responsive Gridsysteme mit Sass</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/responsive-grids-sass-1883.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Der Viewport — das unbekannte Wesen</title>
		<link>http://maddesigns.de/meta-viewport-1817.html</link>
		<comments>http://maddesigns.de/meta-viewport-1817.html#comments</comments>
		<pubDate>Fri, 23 Aug 2013 08:17:13 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[RWD]]></category>
		<category><![CDATA[@media]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[media-query]]></category>
		<category><![CDATA[meta]]></category>
		<category><![CDATA[viewport]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=1817</guid>
		<description><![CDATA[<p>Seit wir uns mit Responsive Webdesign „herumschlagen müssen“, begegnet uns immer wieder das Wesen der Post-PSD-Ära – der Viewport. Mittlerweile beherrscht er unser Tun und stellt uns immer wieder Fallen. Wir versuchen ihn zu beherrschen. Wir versuchen ihn einzugrenzen. Oft schlägt dies fehl. An dieser Stelle möchte ich meine Feldforschungsergebnisse der letzten Monate mit Euch &#8230; <a href="http://maddesigns.de/meta-viewport-1817.html" class="more-link"><span class="screen-reader-text">Der Viewport — das unbekannte Wesen</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/meta-viewport-1817.html/" target="_blank">Der Viewport — das unbekannte Wesen</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Seit wir uns mit Responsive Webdesign „herumschlagen müssen“, begegnet uns immer wieder das Wesen der Post-PSD-Ära – der Viewport.</p>
<p>Mittlerweile beherrscht er unser Tun und stellt uns immer wieder Fallen. Wir versuchen ihn zu beherrschen. Wir versuchen ihn einzugrenzen. Oft schlägt dies fehl. An dieser Stelle möchte ich meine Feldforschungsergebnisse der letzten Monate mit Euch teilen.<br />
<figure id="attachment_1856" style="width: 320px" class="wp-caption alignleft"><img src="http://maddesigns.de/wp-content/uploads/2013/08/lalmalani_fig01.gif" alt="Browser resizing – daily business (danke an @scheibo_ für das wiederfinden des GIFs)" width="320" height="240" class="size-full wp-image-1856" /><figcaption class="wp-caption-text">Browser resizing – daily business (danke an @scheibo_ für das wiederfinden des GIFs)</figcaption></figure><br />
<a href="http://www.responsinator.com/">Vielerorts</a> <a href="http://www.resizemybrowser.com/">findet</a> <a href="http://lab.maltewassermann.com/viewport-resizer/">man</a> <a href="http://agentur360.de/rm/view.php?url=agentur360.de&amp;lang=de&amp;d1=1&amp;d11=1&amp;d5=1">Anwendungen</a>, die über einen iframe die eingegebene Website „responsive“, also in einem bestimmten Viewport darstellen. Soweit so gut. Das ist durchaus nützlich, spiegelt aber oft nicht das Ergebnis auf den echten Geräten wieder. Man kann dabei lediglich sehen, ob die Layout-Container entsprechend umbrechen oder wie Texte laufen und Bilder sich anpassen, häufig reicht das ja auch. Vieles hängt aber bei der Darstellung auf den mobilen Endgeräten von den verwendeten Media-Queries und dem Viewport-Meta-Tag ab.<br />
<span id="more-1817"></span></p>
<h2>Warum ist das so?</h2>
<p>Ich möchte nicht zu technisch werden. <a title="Peter Paul Koch auf Twitter" href="https://twitter.com/ppk">PPK</a> erklärt den ganzen Zusammenhang zwischen CSS-Pixel und Device-Pixel <a title="Video and transcript of Peter Paul koch's Talk A Pixel is not a Pixel" href="http://fronteers.nl/congres/2012/sessions/a-pixel-is-not-a-pixel-peter-paul-koch">hier</a> und <a title="Blog Post – A Pixel is not a Pixel" href="http://www.quirksmode.org/blog/archives/2010/04/a_pixel_is_not.html">hier</a> exzellent. Auch bei <a title="Using the Viewport on apple.com" href="https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariWebContent/UsingtheViewport/UsingtheViewport.html">Apple</a> oder <a title="Introduction to meta viewport on Opera.com" href="http://dev.opera.com/articles/view/an-introduction-to-meta-viewport-and-viewport/">Opera</a> findet man auch gute Zusammenfassungen.</p>
<p>Zuersteinmal erinnern wir uns, dass der Meta-Viewport-Tag gesetzt werden muss, damit die Seite „responsive“ dargestellt wird. Ansonsten wird von den mobilen Browser die Seite auf eine Breite von 980px gezoomt dargestellt. In der <a title="HTML5 Boilerplate" href="http://html5boilerplate.com/">HTML5 Boilerplate</a> findet man diese Angabe:</p>
<pre class="language-markup">&lt;meta name="viewport" content="width=device-width"&gt;</pre>
<p>Das wisst Ihr ja sicherlich. Aber hier beginnen schon die Probleme. Nehmen wir an, der Entwickler hat im CSS einen Media-Query (für das iPad) wie folgt definiert:</p>
<pre class="language-css">@media only screen and (min-width: 768px) {
  body {
    color: red;
  }
}

@media only screen and (min-width: 1024px) {
  body {
    color: blue;
  }
}</pre>
<p><strong>Beispiel:</strong> <a href="http://codepen.io/maddesigns/full/ykJzC" title="iOS zooming viewport sample">http://codepen.io/maddesigns/full/ykJzC</a></p>
<p>In der Desktop-Simulation werden wir ab 1024px blaue Schrift sehen, auf einem Android-Device auch, nicht aber auf dem iPad. Das iPad suggeriert es sei ein Hochkant-Device und meldet hier dem Browser eine Breite von 768px. Auch wenn man das Gerät quer in den Landscape-Modus dreht, bleibt die Gerätebreite auf 768px und der Inhalt wird gezoomt dargestellt. Gleiches passiert auch auf dem iPhone bei 320px. Auf den iOS-Geräten wird man also nie die Landscape-Ansicht erhalten, wenn man nicht zusätzlich für die Viewport-Angabe im Media-Query „and (orientation: landscape)“ angibt. Jetzt könnte man schmollen und <a href="https://twitter.com/share?&amp;via=maddesigns&amp;text=Apple%20ist%20doof!&amp;url=http%3A%2F%2Fmaddesigns.de%2Fmeta-viewport-1817.html">twittern wie doof doch Apple ist</a>, aber es ist wie es ist.</p>
<p>Abhilfe für das Verhalten auf iOS ist die zusätzliche „initial-scale=1.0“ im Meta-Viewport. Dann wird auch bei 1024px der Media-Query aktiv. Ich nutzte also immer:</p>
<pre class="language-markup">&lt;meta name="viewport" content="width=device-width,initial-scale=1.0"&gt;</pre>
<p>Kleiner Nachteil: ab und zu kommt es dann zum sogenannte &#8222;iOS Zoom Bug&#8220; Verhalten, das aber in iOS6 gefixt ist. Ein Javascript-Bugfix für die älteren Betriebssysteme gibt es von <a title="iOS Orientationchange Fix - Bugfix for iOS Zoom Bug" href="https://github.com/scottjehl/iOS-Orientationchange-Fix">Scott Jehl</a>. Im aktuellen Master der HTML5-Boilerplate wurde das nun auch wieder so eingeführt. <a title="Github Commit for Add `initial-scale=1` to meta viewport " href="https://github.com/h5bp/html5-boilerplate/commit/ff37dba6bf025a00f58b2bb12f7c6a827e6643c5 ">https://github.com/h5bp/html5-boilerplate/commit/ff37dba6bf025a00f58b2bb12f7c6a827e6643c5</a></p>
<p>Apropos „orientation: landscape“ – einigen erzähle ich nichts Neues – aber orientation: landscape/portrait ist nur die Auswertung vom Seitenverhälnis des Browserfensters, und wird nicht anderweitig durch das Device geliefert. DAS kann man also auch auf dem Desktop simulieren.<br />
<strong>Beispiel:</strong> <a href="http://codepen.io/maddesigns/full/Blygt" title="orientation landscape / portrait sample">http://codepen.io/maddesigns/full/Blygt</a></p>
<h2>device-width Media-Querys</h2>
<p>Meiner Meinung nach ist es nicht optimal mit device-width Media-Querys zu arbeiten. Aus mehreren Gründen:</p>
<p>&#8211; man orientiert sich an bestimmten Devices<br />
&#8211; man kann es schlecht am Desktop nachvollziehen<br />
&#8211; bräuchte man noch einen dritten Punkt auf der Liste?</p>
<h3>Man orientiert sich an bestimmten Devices</h3>
<figure id="attachment_1840" style="width: 209px" class="wp-caption alignleft"><a href="http://blogs.which.co.uk/technology/tablets-2/does-samsung-make-too-many-phones-and-tablets/"><img src="http://maddesigns.de/wp-content/uploads/2013/08/2013-06-15-03.19.26-209x300.jpg" alt="Infografik Samsung smartphones und tablets" width="209" height="300" class="size-medium wp-image-1840" /></a><figcaption class="wp-caption-text">Infografik Samsung smartphones und tablets</figcaption></figure>
<p>Unter Umständen greifen die Anpassungen nur für ein Gerät, könnten aber für viele andere Geräte auch zutreffen, die nur geringfügig andere Werte haben. Viele Media-Query Anpassungen bedeutet also mehr Arbeit, unter Umständen mehr Pflegeaufwand. Zudem ist es bei dem rasanten Anstieg an neu veröffentlichten Geräten kaum noch möglich Schritt zu halten.</p>
<h3>Man kann es schlecht am Desktop nachvollziehen</h3>
<p>Noch einmal gefährliches Halbwissen vorausgesetzt dürfte bekannt sein, dass viele Geräte bereits ein hochauflösenden Display haben. Die Pixel sind kleiner und enger als bei herkömmlichen Displays. So werden – wie beim Klassiker unter den hochauflösenden Geräten dem iPhone 4 – auf der gleichen Fläche wie zuvor die 4-fache Menge an Pixel untergebracht. In der Breite nicht mehr nur 320 Pixel, sondern 640 Pixelchen. Würde die Website nun auf die Device-Pixel gematcht werden, wäre die Schrift mit Sicherheit zu klein. Deshalb bleibt der Viewport gleich und die Angaben für Schrift und Co. werden umgerechnet. Bildlich gesprochen: Eine Überschrift mit der Größenangabe 24px, wird beim iPhone 4 auf 48px hochgerechnet und erscheint uns dann auf dem hochauflösendem Display wie 24px und nebenbei noch sehr scharf. Für die Angabe der Schriftgröße nehmt ihr aber „rem“ oder „em“, klar oder? ;)</p>
<p>Um auf unseren &#8222;Viewport-Switcher&#8220; zurückzukommen, tritt dann natürlich folgendes Problem auf. Ich habe einen Media-Query folgendermaßen angegeben:</p>
<pre class="language-css">/* iPad Retina */
@media only screen and (min-device-width: 1536px) {
  body {
    color: red;
  }
}</pre>
<p>Diese Anpassung werde ich auf dem Desktop erst ab einer Bildschirmauflösung von min. 1536px sehen können. Selbst dann könnte man das noch nicht richtig überprüfen, weil u.U. noch ein Media-Query für „Große Desktop-Ansicht“ greift.<br />
<strong>Beispiel:</strong> <a href="http://codepen.io/maddesigns/full/njFcp" title="device-width media query sample">http://codepen.io/maddesigns/full/njFcp</a></p>
<p>Um es einfach und nachvollziehbar am Desktop zu haben, habe ich mir angewöhnt im Sinne von „Mobile first“ alle Media-Querys mit der Angabe „min-width“ zu machen. Falls Anpassungen für hochauflösende Displays zu machen sind, wird dann die Pixel-Ratio bzw. Resolution abgefragt.</p>
<pre class="language-css">@media (-webkit-min-device-pixel-ratio: 1.5),
       (min-resolution: 144dpi),
       (min-resolution: 1.5dppx) {
	/* hiDPI stuff */
}</pre>
<p>Diese Anpassungen greifen dann automatisch bei sehr vielen Geräten. Viele ältere Android-Geräte haben ein (laut Android) HiDPI-Display also eine Pixel-Dichte von 1.5.</p>
<p>Zum Beispiel:<br />
&#8211; Galaxy S<br />
&#8211; Galaxy S2<br />
&#8211; Motorola Milestone (Droid)<br />
&#8211; HTC Desire,<br />
&#8211; Samsung Nexus S</p>
<p>Diese Geräte haben alle einen Display mit 480x800px und einen Viewport im Browser von 320×533px. Ergo könnte man die Geräte mit</p>
<pre class="language-css">@media only screen and (min-device-width: 480px) {
  …
}</pre>
<p>ansprechen, bräuchte man aber nicht, sie bekommen automatisch die Anpassungen für „iPhone“ (falls man welche hat).</p>
<p>Zur Pixel-Density noch eine Geschichte: Ein paar Android-Geräte haben ein sehr kleines und schlechtes Display, z.B. das sehr verbreitete Galaxy Y, das Samsung Galaxy Mini oder das HTC Wildfire. Das Display ist 240×320px groß. In einigen „Responsive View“ Online-Tools kann man die Webseite mit einer Breite von 240px darstellen lassen. Das ist schön, aber diese Ansicht wird man auf diesen Geräten nicht bekommen. Zumindest, wenn man die Defaulteinstellungen so lässt. Klingt komisch, ist aber so. Diese genannten Geräte haben eine Pixel-Dichte von 0.75. Hier wird also der Viewport nicht verkleinert, sondern vergrößert und liegt bei unseren Beispielen demnach bei 320×427px, also etwa wie das iPhone 4. Es gibt auch zahlreiche Billig-Tablets, die das genauso so machen.</p>
<h2>Achso Tablets…</h2>
<p>Mein Lieblingsbeipiel das Nexus 7 macht total verrückte Sachen. Bei der Veröffentlichung des Nexus 7 (1. Generation) hatte es mit dem Chrome gemessen eine Viewport-Breite von 603px bei einem Display von 800×1280px. Einige Monate später wurde das durch irgendein Update (entweder OS oder Browser) korrigiert und der Chrome meldete 600px. Aber alle anderen Browser meldeten etwas anderes, Opera mobile (noch ohne Blink) meldete 800px, Firefox 533px und derUC-Browser 602px. Hier zu sagen „so sieht Ihre Website auf dem Nexus 7 aus“, ist schon fast fahrlässig.</p>
<figure>
<a href="http://maddesigns.de/wp-content/uploads/2013/08/Chrome-portrait.png"><img class="alignleft size-thumbnail wp-image-1835" alt="Chrome-portrait" src="http://maddesigns.de/wp-content/uploads/2013/08/Chrome-portrait-150x150.png" width="150" height="150" /></a><a href="http://maddesigns.de/wp-content/uploads/2013/08/Firefox-portrait.png"><img class="alignleft size-thumbnail wp-image-1837" alt="Firefox-portrait" src="http://maddesigns.de/wp-content/uploads/2013/08/Firefox-portrait-150x150.png" width="150" height="150" /></a><a href="http://maddesigns.de/wp-content/uploads/2013/08/Opera_mobile-portrait.png"><img class="alignleft size-thumbnail wp-image-1833" alt="Opera_mobile-portrait" src="http://maddesigns.de/wp-content/uploads/2013/08/Opera_mobile-portrait-150x150.png" width="150" height="150" /></a><a href="http://maddesigns.de/wp-content/uploads/2013/08/UC-BrowserHD-portrait.png"><img class="alignleft size-thumbnail wp-image-1829" alt="UC-BrowserHD-portrait" src="http://maddesigns.de/wp-content/uploads/2013/08/UC-BrowserHD-portrait-150x150.png" width="150" height="150" /></a><br />
</figure>
<p>Dann wäre da noch das iPad Mini, das so gar nicht nach den Regeln spielt. Das iPad Mini hat ein 7,9&#8243; Display mit einer Auflösung von 768×1024px, quasi genauso wie das iPad 2, nur eben 20% kleiner (aber leicht höhere Pixeldichte). Das Gerät meldet auch den Viewport und Pixel-Dichte genau wie das iPad 2, also zeigt exakt die gleiche Menge an Inhalten an wie das iPad 2, nur eben 20% kleiner. Es zeigt auch die gleiche Ansicht wie das iPad 3/4 nur nicht so scharf und 20% kleiner. Eine Ansicht „wie im iPad mini“ kann ich am Desktop also schlecht simulieren.</p>
<p>Na doch ich könnte folgendes machen:</p>
<pre class="language-css">iframe.ipadmini {
  transform: scale(0.8);
}</pre>
<figure id="attachment_1839" style="width: 604px" class="wp-caption aligncenter"><a href="http://maddesigns.de/wp-content/uploads/2013/08/ipad-mini-vergleich.jpg"><img class="size-large wp-image-1839" alt="iPad mini Vergleich" src="http://maddesigns.de/wp-content/uploads/2013/08/ipad-mini-vergleich-1024x763.jpg" width="604" height="450" /></a><figcaption class="wp-caption-text">simpler Vergleich iPad mini vs. Desktop mit 768×1024px</figcaption></figure>
<h2>Zu Guter Letzt</h2>
<p>Was die meisten* Viewport Resizer Tools (bzw. in dem Fall die Browser) falsch machen, sie beziehen die Scrollbar mit in die Anzeige der Größe ein. WebKit basierende Browsers sind die einzigen Browser, die die Scrollbar in der Berechnung des passenden Media-Query nicht mit einbeziehen. Das kann also je nach System und Browser ein falsche Ansicht ergeben. Mobile Browser haben ja keine richtige Scrollbar.</p>
<h2>Nur was tun?</h2>
<p>Nicht auf die Ansicht im Desktop-Browser verlassen! Auf echten Geräten testen, z.B. mit <a href="http://html.adobe.com/edge/inspect/" title="Edge Inspect – Testing on real devices">Adobe Edge Inspect</a>, <a href="http://vanamco.com/ghostlab/" title="Ghostlab – Synchronized testing for web and mobile">Ghostlab</a> oder <a href="http://www.iunbug.com/mihtool" title="MIHTool helps Front-End Engineers to debug and optimize their webpages on iPad and iPhone.">MIH-Tool</a>. <a href="http://opendevicelab.com/" title="Open Device labs near you">Open Device Labs</a> nutzen oder <a href="http://lab-up.org/" title="Lab-Up helps to open Open Device Labs">eröffnen</a>. Ich habe mir mittlerweile einen (klitzekleinen) Park an Devices angeschafft <a href="http://odl.maddesigns.de/" title="Devicelab from maddesigns.de">odl.maddesigns.de</a>. </p>
<p>Ein gutes Online-Tool ist Ish von (na klar) Brad Frost (auf <a title="Ish - Viewport Resize Tool" href="http://bradfrostweb.com/demo/ish/">http://bradfrostweb.com/demo/ish/</a> – mal http://roxik.com/cat/ links oben bei URL eingeben und dann rechts oben bei „size“ „Disco“ anschalten =&gt; Party! Hier kann man das Layout überprüfen, indem man auf die unterschiedlichen Größen (S, M, L, XL,…) klickt, klickt man mehrfach auf die Button wird der Viewport in dem gewählten Viewport-Bereich leicht angepasst. Eine Verbindung zu irgendwelchen Devicegrößen ist hier bewusst nicht gemacht worden. Persönlich finde ich auch die neue Responsive View im Firefox sehr gut gelungen (seit FF 15, also seit mehr als 6 Wochen drin ;)).</p>
<p>Was man auf dem Desktop auch nicht simulieren kann: Systemschriftarten, deren Fallbacks, und und und … aber das ist wieder eine ganz andere Geschichte.</p>
<p><small>*es gibt kein Sternchen</small></p><p>Der Beitrag <a href="http://maddesigns.de/meta-viewport-1817.html/" target="_blank">Der Viewport — das unbekannte Wesen</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/meta-viewport-1817.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Lange nix gehört von dir</title>
		<link>http://maddesigns.de/lange-nix-gehoert-1810.html</link>
		<pubDate>Thu, 22 Aug 2013 15:32:24 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=1810</guid>
		<description><![CDATA[<p>Es war lange ruhig gewesen hier im Blog und ich kann auch nicht versprechen, dass sich das jetzt wieder ändern wird. Themen über die man bloggen könnte gibt es genug, so ist es nicht, aber mir hat in den letzten Monaten absolut die Zeit gefehlt (sadpanda). Erschwerend kam noch hinzu, dass ich der Seite auch &#8230; <a href="http://maddesigns.de/lange-nix-gehoert-1810.html" class="more-link"><span class="screen-reader-text">Lange nix gehört von dir</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/lange-nix-gehoert-1810.html/" target="_blank">Lange nix gehört von dir</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Es war lange ruhig gewesen hier im Blog und ich kann auch nicht versprechen, dass sich das jetzt wieder ändern wird. Themen über die man bloggen könnte gibt es genug, so ist es nicht, aber mir hat in den letzten Monaten absolut die Zeit gefehlt (sadpanda). Erschwerend kam noch hinzu, dass ich der Seite auch längst einen neuen responsiven Anstrich verleihen wollte. Dazu bin ich leider auch noch nicht gekommen. Ich bin zu sehr mit Aufträgen und Schulungen beschäftigt, dass dafür Zeit blieb. Und Familie hab ich auch, die wollen mich auch ab und zu auch sehen. Ihr kennt das. Da ich aber an allen <a title="Responsive Images" href="http://www.youtube.com/watch?v=9T7eSyo7DRU">Ecken</a> und <a title="RESS - RWD " href="http://webtechcon.de/sessions/ress-rwd-and-server-side-components-0">Enden</a> was zu Responsive Webdesign erzähle, hat es mich umso mehr geärgert, dass mein Blog noch im 2008er Design war – ich wollte auch nix über Responsive Webdesign im alten, fixen Layout veröffentlichen.</p>
<p>Anfang der Woche hab ich dann ein WordPress-Update gemacht und dabei das neue responsive Default-Theme gesehen. Na klar, ich hätte das Theme lieber selbst erstellt, aber wie eingangs bereits erwähnt, fehlt mir aktuell absolut die Zeit. Deshalb hab ich das jetzt übergangsweise aktiviert (und werde es nach und nach noch ein wenig pimpen). Morgen wird es einen neuen Artikel geben, der mir schon länger unter den Nägeln brennt.</p>
<p>Heute hatte ich auch die neue <a title="T3N - Responsive Workflow" href="http://t3n.de/magazin/responsive-design-prozess-tools-ansaetze-responsive-234137/">T3N</a> im Briefkasten, da gibt es einen Artikel von mir über den &#8222;Responsive Workflow&#8220; zu lesen. Im Wesentlichen ist das inhaltlich der Vortrag &#8222;<a title="The Responsive Webdesign Process" href="http://maddesigns.de/responsive-workflow/">Responsive Webdesign Process</a>&#8222;.</p>
<p>Also, danke fürs dran bleiben und stay tuned!</p><p>Der Beitrag <a href="http://maddesigns.de/lange-nix-gehoert-1810.html/" target="_blank">Lange nix gehört von dir</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>The Responsive Webdesign Process</title>
		<link>http://maddesigns.de/the-responsive-webdesign-process-1735.html</link>
		<comments>http://maddesigns.de/the-responsive-webdesign-process-1735.html#comments</comments>
		<pubDate>Thu, 11 Oct 2012 09:51:41 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[RWD]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=1735</guid>
		<description><![CDATA[<p>Bei der TYPO3 Conference (T3CON12DE) in Stuttgart hatte ich die Gelegenheit einen Vortrag über den neuen Prozess in Responsive Webdesign Projekten zu sprechen. Meiner Meinung nach muss sich bei RWD Projekten der Workflow vom üblichen &#8222;Waterfall&#8220; Prinzip zu einem iterativen Prozess ändern. Einen Großteil der Arbeit in Responsive Webdesign Projekten sehe ich eher in konzeptionellem &#8230; <a href="http://maddesigns.de/the-responsive-webdesign-process-1735.html" class="more-link"><span class="screen-reader-text">The Responsive Webdesign Process</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/the-responsive-webdesign-process-1735.html/" target="_blank">The Responsive Webdesign Process</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Bei der TYPO3 Conference (T3CON12DE) in Stuttgart hatte ich die Gelegenheit einen Vortrag über den neuen Prozess in Responsive Webdesign Projekten zu sprechen. Meiner Meinung nach muss sich bei RWD Projekten der Workflow vom üblichen &#8222;Waterfall&#8220; Prinzip zu einem iterativen Prozess ändern. Einen Großteil der Arbeit in Responsive Webdesign Projekten sehe ich eher in konzeptionellem Bereich, als in der Programmierung selbst. Vielleicht ist auch mal ein ausführlicher Artikel zum Thema notwendig, hier aber erstmal die Slides: <a href="http://maddesigns.de/rwd-process/" title="The Responsive Webdesign Process">http://maddesigns.de/rwd-process/</a> </p><p>Der Beitrag <a href="http://maddesigns.de/the-responsive-webdesign-process-1735.html/" target="_blank">The Responsive Webdesign Process</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/the-responsive-webdesign-process-1735.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sass &#038; Compass Introduction</title>
		<link>http://maddesigns.de/sass-compass-introduction-1701.html</link>
		<comments>http://maddesigns.de/sass-compass-introduction-1701.html#comments</comments>
		<pubDate>Mon, 30 Apr 2012 06:59:46 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Sass]]></category>
		<category><![CDATA[compass]]></category>
		<category><![CDATA[intro]]></category>
		<category><![CDATA[sass]]></category>
		<category><![CDATA[slides]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=1701</guid>
		<description><![CDATA[<p>Meine Workshop-Slides &#8222;Modern Frontend Development with Sass &#038; Compass&#8220; sind nun online verfügbar. Der drei Stunden Workshop, den ich bei den TYPO3 Developer Days in München gegeben habe, habe ich am letzten Samstag auch nochmal beim TYPO3camp Stuttgart wiederholt. Im Workshop ging es um die ersten Schritte mit Sass &#038; Compass, sowie die hilfreichsten Features &#8230; <a href="http://maddesigns.de/sass-compass-introduction-1701.html" class="more-link"><span class="screen-reader-text">Sass &#038; Compass Introduction</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/sass-compass-introduction-1701.html/" target="_blank">Sass & Compass Introduction</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Meine Workshop-Slides &#8222;<a href="http://maddesigns.de/sass-compass-introduction/" title="Tutorial to start with Sass &#038; Compass">Modern Frontend Development with Sass &#038; Compass</a>&#8220; sind nun online verfügbar. </p>
<p>Der drei Stunden Workshop, den ich bei den <a href="http://t3dd12.typo3.org/sessions/" title="TYPO3 Developer Days Sessions">TYPO3 Developer Days</a> in München gegeben habe, habe ich am letzten Samstag auch nochmal beim <a href="http://www.typo3camp-stuttgart.de/programm/sessions.html" title="TYPO3camp Stuttgart Sessions">TYPO3camp Stuttgart</a> wiederholt. Im Workshop ging es um die ersten Schritte mit Sass &#038; Compass, sowie die hilfreichsten Features vorzustellen und einen Ausblick auf die neue Sass Version 3.2 zu geben.</p>
<p>Bei Fragen, pingt mich gern auf <a href="http://twitter.com/#!/maddesigns" title="maddesigns auf Twitter">Twitter</a> dazu an, kommentiert hier im Blog oder schreibt mir eine <a href="mailto:sven@maddesigns.de">E-Mail</a></p><p>Der Beitrag <a href="http://maddesigns.de/sass-compass-introduction-1701.html/" target="_blank">Sass & Compass Introduction</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/sass-compass-introduction-1701.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>IE9 border-radius right-to-left (direction: rtl) Bug</title>
		<link>http://maddesigns.de/ie9-border-radius-direction-rtl-bug-1657.html</link>
		<comments>http://maddesigns.de/ie9-border-radius-direction-rtl-bug-1657.html#comments</comments>
		<pubDate>Thu, 22 Mar 2012 10:30:57 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[border-radius]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[ie9]]></category>
		<category><![CDATA[right to left]]></category>
		<category><![CDATA[rtl]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=1657</guid>
		<description><![CDATA[<p>Wer schon mal Layouts für arabische Websites umgesetzt hat, kennt sicherlich das HTML-Attribut &#8222;dir&#8222;, das man z.B. im body-Tag einfügen kann um die Leserichtig des Dokuments von links-nach-rechts auf rechts-nach-links zu ändern. In CSS ist die Anweisung &#8222;direction&#8220; dafür zuständig. Für beide Möglichkeiten kann man die Werte &#8222;rtl&#8220; (right-to-left) oder &#8222;ltr&#8220; (left-to-right) sowie &#8222;auto&#8220; angeben. &#8230; <a href="http://maddesigns.de/ie9-border-radius-direction-rtl-bug-1657.html" class="more-link"><span class="screen-reader-text">IE9 border-radius right-to-left (direction: rtl) Bug</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/ie9-border-radius-direction-rtl-bug-1657.html/" target="_blank">IE9 border-radius right-to-left (direction: rtl) Bug</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Wer schon mal Layouts für arabische Websites umgesetzt hat, kennt sicherlich das HTML-Attribut &#8222;<a href="http://www.w3.org/TR/html5/elements.html#the-dir-attribute">dir</a>&#8222;, das man z.B. im body-Tag einfügen kann um die Leserichtig des Dokuments von links-nach-rechts auf rechts-nach-links zu ändern. In CSS ist die Anweisung &#8222;direction&#8220; dafür zuständig. Für beide Möglichkeiten kann man die Werte &#8222;rtl&#8220; (right-to-left) oder &#8222;ltr&#8220; (left-to-right) sowie &#8222;auto&#8220; angeben.</p>
<p>Hat man im Layout, runde Ecken (border-radius) nur an einer Seite, z.B. rechts abgerundet, dann sind im IE9 die Ecken allerdings links abgerundet. Der IE9 dreht von sich aus die runden Ecken im RTL-Modus um. Das ist zwar nett vom IE9, aber nicht richtig und auch nicht immer gewollt. Bei gleichmäßig abgerundeten Ecken kann man den Bug natürlich nicht nachvollziehen, deshalb fällt er selten auf. <span id="more-1657"></span></p>
<p>Hier mal ein jsFiddle-Beispiel:<br />
<iframe style="width: 100%; height: 350px" src="http://jsfiddle.net/maddesigns/HuDRp/embedded/result/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p>Im IE9 sieht das allerdings so aus (Screenshot):<br />
<a href="http://jsfiddle.net/maddesigns/HuDRp/embedded/result/"><img src="http://maddesigns.de/wp-content/uploads/2012/03/IE9_RTL_Bug.png" alt="" title="IE9_RTL_Bug" width="318" height="221" class="alignright size-full wp-image-1673" style="margin-right: 40px;" /></a><br />
<br style="clear: both" /><br />
<strong style="clear: both"><br />
Der simplifizierte HTML-Aufbau:</strong></p>
<pre>
&lt;body dir="rtl">
    &lt;div class="box"> right to left &lt;/div>
&lt;/body>
</pre>
<p><strong>CSS:</strong></p>
<pre>
.box {
    background-color: red;
    padding: 48px;
    height: 100px;
    width: 200px;
    margin: 40px;
    border-radius: 0 48px 48px 0;
}
</pre>
<p>Den Bug muss man nun per Conditional-Comments für den IE9 entgegnen und die angerundeten Ecken &#8222;umdrehen&#8220;:</p>
<pre>
&lt;!--[if IE 9]>
  &lt;style>
    body[dir="rtl"] .box  {
      border-radius: 48px 0 0 48px; /* switched from left to right */
    }
  &lt;/style>
&lt;![endif]-->
</pre>
<p>Im IE10 ist der Bug bis zum Build 8250 auch noch nachzuvollziehen.<br />
Den Bug hat <a href="http://twitter.com/#!/herzogkienast">Andrea Herzog-Kienast</a> entdeckt und ich kann das Verhalten leider nur bestätigen. </p><p>Der Beitrag <a href="http://maddesigns.de/ie9-border-radius-direction-rtl-bug-1657.html/" target="_blank">IE9 border-radius right-to-left (direction: rtl) Bug</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/ie9-border-radius-direction-rtl-bug-1657.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Livereload &#8211; ein Browser Refresh Tool</title>
		<link>http://maddesigns.de/livereload-browser-refresh-tool-1640.html</link>
		<comments>http://maddesigns.de/livereload-browser-refresh-tool-1640.html#comments</comments>
		<pubDate>Mon, 12 Mar 2012 14:08:59 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[livereload]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[refresh]]></category>
		<category><![CDATA[reload]]></category>
		<category><![CDATA[tool]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=1640</guid>
		<description><![CDATA[<p>Wer kennt es nicht… man entwickelt in der IDE oder noch besser geeignet für Frontend-Entwicklung im Texteditor Sublime Text 2 und switcht dann zum Browser um die Änderungen anschließend zu überprüfen. Dazu muss man im Browser ein Reload durchführen. Livereload ist ein kleines aber sehr hilfreiches Tool für Mac (Windows in Beta-Status) was diesen Prozess &#8230; <a href="http://maddesigns.de/livereload-browser-refresh-tool-1640.html" class="more-link"><span class="screen-reader-text">Livereload &#8211; ein Browser Refresh Tool</span> weiterlesen</a></p>
<p>Der Beitrag <a href="http://maddesigns.de/livereload-browser-refresh-tool-1640.html/" target="_blank">Livereload - ein Browser Refresh Tool</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Wer kennt es nicht… man entwickelt in der IDE oder noch besser geeignet für Frontend-Entwicklung im Texteditor <a href="http://www.sublimetext.com/2" title="Sublime Text 2">Sublime Text 2</a> und switcht dann zum Browser um die Änderungen anschließend zu überprüfen. Dazu muss man im Browser ein Reload durchführen. <a href="http://livereload.com/" title="Livereload">Livereload</a> ist ein kleines aber sehr hilfreiches Tool für Mac (Windows in Beta-Status) was diesen Prozess beschleunigt.</p>
<p><strong>Livereload</strong> erkennt Änderungen im Projektordner beim Speichern einer Datei. Ein Browser-Plugin für Chrome (oder Firefox, Safari, Mobile Safari) führt dann umgehend im Hintergrund den Refresh/Reload durch. Das erspart natürlich einige Tastenanschläge/Mausklicks. Auf größeren Bildschirmen ist es praktisch, wenn man die beiden Fenster parallel positioniert und dann die Änderung am HTML oder CSS direkt im Blick hat.<br />
<span id="more-1640"></span></p>
<p><a href="http://maddesigns.de/wp-content/uploads/2012/03/screenshot1.png"><img src="http://maddesigns.de/wp-content/uploads/2012/03/screenshot1-e1331561498181.png" alt="" title="screenshot" width="520" height="366" class="alignnone size-full wp-image-1652" srcset="http://maddesigns.de/wp-content/uploads/2012/03/screenshot1-e1331561498181.png 520w, http://maddesigns.de/wp-content/uploads/2012/03/screenshot1-e1331561498181-360x253.png 360w" sizes="(max-width: 520px) 100vw, 520px" /></a><br />
Das wäre schon schön genug, aber Livereload bietet noch mehr. Es kann auch Sass-, LESS- oder Stylus- sowie CoffeeScript-Dateien kompilieren und dann den Browser-Reload durchführen. Zudem können auch &#8222;Refresh-Pausen&#8220; eingestellt werden. Das ist hilfreich, wenn man z.B. die geänderten Dateien beim Speichern direkt auf den Webserver hochlädt und die Änderung dort betrachtet. Diesen Zeitinterval kann man als Wartezeit zum Live-Reload konfigurieren.</p>
<p>Das Mac-Tool ist nach der Beta-Phase nun im App-Store erhältlich und kostet $9.99. Ich kann das Tool nur jedem empfehlen und habe von <a href="https://twitter.com/#!/livereload/" title="Livereload Twitter">@livereload</a> 2 Promo-Codes für meine Leser erhalten. Um zu gewinnen einfach einen Kommentar abgeben!</p><p>Der Beitrag <a href="http://maddesigns.de/livereload-browser-refresh-tool-1640.html/" target="_blank">Livereload - ein Browser Refresh Tool</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://maddesigns.de/livereload-browser-refresh-tool-1640.html/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Das große Weihnachtsgewinnspiel &#8211; Tag 24 im CSS3 Adventskalender 2011</title>
		<link>http://maddesigns.de/das-grose-weihnachtsgewinnspiel-tag-24-im-css3-adventskalender-2011-1625.html</link>
		<pubDate>Sat, 24 Dec 2011 11:33:33 +0000</pubDate>
		<dc:creator><![CDATA[Sven Wolfermann]]></dc:creator>
				<category><![CDATA[Adventskalender]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[adventskalender]]></category>
		<category><![CDATA[css3]]></category>

		<guid isPermaLink="false">http://maddesigns.de/?p=1625</guid>
		<description><![CDATA[<p>…im Webstandard Blog. Großartige Preise haben uns www.galileo-videotrainings.de, www.galileo-press.de, www.addison-wesley.de, www.oreilly.de und www.webstandards-magazin.de zur Verlosung an die Leser des CSS3 Adventskalender zur Verfügung bestellt. Was man muss tun, um gewinnen zu können?! …wird im Webstandard-Blog erklärt: Das große Weihnachtsgewinnspiel Allen Teilnehmern viel Spaß, Glück &#038; natürlich auch Erfolg!</p>
<p>Der Beitrag <a href="http://maddesigns.de/das-grose-weihnachtsgewinnspiel-tag-24-im-css3-adventskalender-2011-1625.html/" target="_blank">Das große Weihnachtsgewinnspiel - Tag 24 im CSS3 Adventskalender 2011</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>…im <a href="http://webstandard.kulando.de/" title="Webstandard Blog">Webstandard Blog</a>.<br />
Großartige Preise haben uns <a href="http://www.galileo-videotrainings.de" title="Galileo Videotrainings">www.galileo-videotrainings.de</a>, <a href="http://www.galileo-press.de" title="Galileo Verlag">www.galileo-press.de</a>, <a href="http://www.addison-wesley.de" title="Addison-Wesley (Pearson)">www.addison-wesley.de</a>, <a href="http://www.oreilly.de/" title="O'Reilly Verlag">www.oreilly.de</a> und <a href="http://www.webstandards-magazin.de" title="Webstandards Magazin">www.webstandards-magazin.de</a> zur Verlosung an die Leser des CSS3 Adventskalender zur Verfügung bestellt.</p>
<h3>Was man muss tun, um gewinnen zu können?!</h3>
<p>…wird im Webstandard-Blog erklärt: <a href="http://webstandard.kulando.de/post/2011/12/23/das-grosse-weihnachtsgewinnspiel-tag-24-im-css3-adventskalender-2011" title="Weihnachtsgewinnspiel">Das große Weihnachtsgewinnspiel</a></p>
<p>Allen Teilnehmern viel Spaß, Glück &#038; natürlich auch Erfolg!</p><p>Der Beitrag <a href="http://maddesigns.de/das-grose-weihnachtsgewinnspiel-tag-24-im-css3-adventskalender-2011-1625.html/" target="_blank">Das große Weihnachtsgewinnspiel - Tag 24 im CSS3 Adventskalender 2011</a> erschien zuerst auf <a href="http://maddesigns.de/" target="_blank">maddesigns</a>.</p>]]></content:encoded>
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/


Served from: maddesigns.de @ 2026-05-17 13:27:24 by W3 Total Cache
-->