<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">

    <title type="text">pixelfans &#45; Leidenschaft in RGB</title>
    <subtitle type="text">pixelfans &#45; Leidenschaft in RGB:Website über php, svg, css und html</subtitle>
    <link rel="alternate" type="text/html" href="http://www.pixelfans.de/" />
    <link rel="self" type="application/atom+xml" href="http://www.pixelfans.de/atom/" />
    <updated>2012-02-03T13:05:31Z</updated>
    <rights>Copyright (c) 2012, Pawel</rights>
    <generator uri="http://expressionengine.com/" version="1.6.6">ExpressionEngine</generator>
    <id>tag:pixelfans.de,2012:02:03</id>


    <entry>
      <title>Realistische Vektorgrafiken f&#252;r das Web</title>
      <link rel="alternate" type="text/html" href="http://www.pixelfans.de/realistische-vektorgrafiken-fuer-das-web/" />
      <id>tag:pixelfans.de,2012:/1.66</id>
      <published>2012-02-03T09:51:30Z</published>
      <updated>2012-02-03T13:05:31Z</updated>
      <author>
            <name>Pawel</name>
            <email>pawel@pixelfans.de</email>
                  </author>

      <category term="Ideen"
        scheme="http://www.pixelfans.de/category/ideen/"
        label="Ideen" />
      <category term="SVG"
        scheme="http://www.pixelfans.de/category/svg/"
        label="SVG" />
      <content type="html"><![CDATA[
        <p>Im Internet finden sich beeindruckende Zeugnisse digitaler Grafik. Einige sind mit Photoshop entstanden und nahezu folgerichtig in einem Pixelformat abgespeichert. Es gibt aber auch <a href="http://www.crisvector.com/">unz&#228;hlige Grafiken</a>, denen man anmerkt, dass sie als Vektorgrafik entstanden sind. Daf&#252;r, dass alle modernen Browser Scalable Vector Graphics interpretieren, finden sich noch wenige Seiten, die auf die direkte Integration setzen.</p>

<h3>Gr&#252;nde</h3> 

<p>Im professionellen Umfeld spielt die Verbreitung des Internet Explorers eine wichtige Rolle. Da dieser erst ab Version 9 die Darstellung ohne Plugin erlauben und zudem nicht mehr auf Windows XP laufen, sind hier Workarounds n&#246;tig. 
Texte f&#252;r Webseiten werden typischerweise mit einem Content Management System erstellt, die zudem auf einer Javascript Wysiwyg-Editor setzen. Wenn &#252;berhaupt, l&#228;sst sich ein SVG-Bild meist nur in der Quelltextansicht einf&#252;gen.
Die besten Grafikdesigner wissen wenig &#252;ber das Format und erstellen ihre Grafiken in Vektorgrafikprogramme. Im professionellen Umfeld wird dabei besonders auf Illustrator gesetzt, der in Adobes Creative Suite enthalten ist und Farbpaletten unterst&#252;tzt. Da die meisten Auftr&#228;ge anhaltend f&#252;r den Druck entstehen, ist das besonders wichtig. Meist wird zus&#228;tzlich ein Grafiktablett verwendet. Im Ergebnis entstehen Vektorgrafiken, die 2 Mbyte gro&#223; sind &#8211; und sich so im Web nicht verwenden lassen.</p>
 <h3>Vor&#252;berlegungen</h3>

<p>Damit SVG verwendet werden k&#246;nnen, darf die Dateigr&#246;&#223;e nicht &#252;ber 100 KByte liegen. &#196;hnlich wie bei Texten, muss man sich auch bei Vektorgrafiken &#252;berlegen, diese direkt f&#252;r das Web zu erstellen. Der Sprung ist &#228;hnlich hoch, wie von der Langspielplatte zur Compact Disc und muss zun&#228;chst die Frage beantworten, welche Elemente weggelassen werden k&#246;nnen.</p>
<p>Die Gr&#246;&#223;e von SVG-Dateien wird &#252;berwiegend von der Anzahl der Objekte und deren Komplexit&#228;t bestimmt. Durch mehrere Schichten (Layer), &#228;hnlich der Lasurtechnik in der &#214;lmalerei entsteht ein realistisches Bild. Die Objekte selbst werden durch Punktkoordinaten (Knoten, Nodes) beschrieben. Diese kann erheblich sein. Die typische Arbeitsweise des Designers mit dem Kalligraphiewerkzeug und dem Grafiktablett produziert erhebliche Nodes und ist ein Grund f&#252;r riesige Dateien. Einige Techniken sind somit bei der Produktion f&#252;r das Web nicht verwendbar. Es macht Sinn sich zu &#220;berlegen, welche Objekte, Farbdefinitionen, Filter usw. mehrfach verwendet werden k&#246;nnen.</p>

<h3>Selbstportr&#228;t - ein Beispiel</h3>

<p>Wer nicht warten will, schaut sich gleich das <a href="http://www.batik-gbr.de/svg/self-portrait.svg" title="Selbstportrait">Ergebnis</a> an. Ausgangspunkt f&#252;r das Portr&#228;t ist ein Foto, in dem ich zun&#228;chst Helligkeit und Kontrast in Gimp verst&#228;rkt habe. Dadurch f&#228;llt es mir leichter, mich auf die wesentlichen Bereiche zu konzentrieren und nicht jede Falte zu beachten.</p>

<p>Bei meiner Arbeit mit Inkscape &#246;ffne ich zun&#228;chst immer das Ebenenfenster. Das Foto wird dann in Inkscape in die angedeutete A4-Seite hineingezogen und wie gew&#252;nscht platziert. Die Ebene sollte einen  aussagekr&#228;ftigen Namen erhalten und direkt im Men&#252; umbenannt werden. Danach wird mit einem Klick auf das Schlo&#223;symbol die Ebene vor versehentlicher Arbeit verschlossen und es k&#246;nnen weitere Ebenen dar&#252;ber angelegt werden. Ebenen sind gruppierte Elemente, die ein spezielles Label erhalten. Die Zuordnung gelingt daher nur, wenn die  SVG-Dateien im Format Inkscape-SVG abgespeichert werden, was f&#252;r die erste Phase unbedingt empfohlen wird. Beim Mischmodus wird auf Filtereffekte gesetzt, hier sollte also <code>Normal</code> bevorzugt bleiben.</p>
<p>Ich habe zun&#228;chst ein Ebene <code>head</code> hinzugef&#252;gt und nutze &#252;berwiegend englischsprachige Bezeichner, um Umlautprobleme in der SVG zu umgehen. Als Basis f&#252;r meinen Kopf dient zun&#228;chst eine Ellipse, die ich mit Pfad &#8594; Objekt in Pfad umwandeln und mit dem Knotenwerkzeug um weitere Knoten erg&#228;nzen kann und mit der Maus so zurecht ziehe, das sie der Kopfform entspricht. Mit der Pipette kann ich die F&#252;llfarbe direkt aus dem Ursprungsbild &#252;bernehmen. </p>

<p>Den Gesichtsschatten habe ich mit dem Bezier-Werkzeug nachgemalt. Durch Farbverl&#228;ufe und Transparenz kann mit diesen zwei Objekten schon ein erheblicher r&#228;umlicher Effekt erzeugt werden. Ich lasse den &#8222;F&#252;llen und Kontur&#8220;-Dialog eingeblendet. Die Verwendung von Unsch&#228;rfe sollte an dieser Stelle noch vermieden werden. Damit wird ein Filter angelegt. Unsch&#228;rfe wird recht h&#228;ufig ben&#246;tigt und damit w&#252;rde f&#252;r jedes Element ein neuer Filter angelegt werden. Filter k&#246;nnen die Rechenzeit signifikant beeinflussen und besser am Schluss hinzugef&#252;gt werden. Da Safari und der Internet Explorer <code>filter</code> ohnehin (noch) nicht verstehen, sollte die Grafik auch ohne Filter vorzeigbar sein.</p>

<p><a href="http://flic.kr/p/bnSK14" title="Screenshot Auge in Inkscape"><img src="http://farm8.staticflickr.com/7031/6811114351_2696f43351_m.jpg" alt="Screenshot Auge in Inkscape" /></a> Danach wird auch diese Ebene gesperrt und unsichtbar geschaltet. Ich habe mich dann den Augen gewidmet. Die Augen bestehen aus der Augenh&#246;hle, dem Hintergrund, der Iris und der Pupille &#8211; insgesamt 6 &#8211; 10 Objekte, wenn diverse Leuchtflecken mitgez&#228;hlt werden. Ich habe sp&#228;ter Elemente gel&#246;scht, um die Komplexit&#228;t zu reduzieren, da die Augen ohnehin hinter den Brillengl&#228;sern liegen. Basis f&#252;r alle Objekte sind auch wieder Kreise/ Ellipsen. Die Elementen, welche ein  Auge repr&#228;sentieren, sollten gruppiert und damit logisch strukturiert werden. Besonders hier bietet es sich an, die Objekte aussagekr&#228;ftig zu benennen.  Inkscape bietet dazu einen Dialog, der mit der rechten Maustaste erreicht wird. Der Dialog zeigt deutlich, das jedes Element in Inkscape einen Titel und eine Beschreibung haben kann, welche man auch nutzen sollte, um auch sehbehinderten Nutzern eine Beschreibung zu liefern.</p>

<p>So entstehen alle Bereiche des Portr&#228;ts. Die Haare habe ich mit einem Grafiktablett und dem Kalligraphie-Werkzeug (&#8222;Klecksig&#8220;) gezeichnet. Danach habe ich alle Elemente markiert und mit "Pfad &#8594; Vereinigung" zu einem Pfad zusammengefasst, das Objekt dann eindeutig benannt. Mit "Strg + L" ist zun&#228;chst die Anzahl der Knoten reduziert worden. Die Haare wurden zun&#228;chst dupliziert und mit verschiedenen Farben und Transparenzen etwas verschoben und geschichtet. Diese werden sp&#228;ter durch mehrere Instanzen von use ausgetauscht. Zwar bietet auch Inkscape das &#8222;Klonen&#8220; an, l&#228;sst es aber nicht zu ein Objekt ohne F&#252;llung und ohne Rand zu erzeugen. Das ist aber die Voraussetzung, um allen geklonten Objekten (use) unterschiedliche Farben zu geben. Nachdem alle Bestandteile des Portr&#228;ts entstanden sind, kann das Bild mit der untersten Ebene entfernt werden. </p>

<p>Nun kann der Einsatz von Filtern erfolgen. Alle verwendeten Filter sieht man, wenn das Men&#252; Filter bearbeiten ge&#246;ffnet ist. Diese Filter k&#246;nnen den gew&#252;nschten Objekten zugeordnet werden. Meiner Meinung nach, reichen 4-5 Unsch&#228;rfefilter aus. Der Filter f&#252;r die Haare ist etwas komplexer, l&#228;sst sich mit dem m&#228;chtigen Werkzeug aber wie gew&#252;nscht zusammenstellen. Inkscape bringt bereits einige Filter mit, die sich als Basis f&#252;r eigene Experimente verwenden lassen.</p>

<p>Die Nachproduktion beginnt mit dem Abspeichern als optimiertes SVG. Hier werden ungenutzte Farbverl&#228;ufe u.a. bereits aus dem Dokument entfernt. Der <a href="http://vimeo.com/34706772">SVG-Cleaner</a>, den es bislang nur f&#252;r Ubuntu gibt, verkleinert die Datei noch weiter. Ich konnte allein mit diesen Tools meiner Datei, die urspr&#252;nglich ca. 400 KByte gro&#223; war um etwa die H&#228;lfte verkleinern. Der Rest l&#228;sst sich dann leider bislang nur in einem Editor und per Hand machen. Hier hilft ein eindeutiger Name und das Ausprobieren.</p>
<p>Ein bereinigter Code ist dann auch eine gute Ausgangsbasis, um eine gewisse Interaktivit&#228;t hinzuzuf&#252;gen.</p><p class="attention"><a href="http://www.batik-gbr.de/svg/self-portrait.svg" title="Selbstportrait">Selbstportr&#228;t mit Interaktion</a></p>
<p>Im Beispiel k&#246;nnen die einzelnen Elemente ein- und ausgeblendet werden, so dass man sich einen &#220;berblick verschaffen kann, wie diese gestaltet ist.</p>
      ]]></content>
    </entry>

    <entry>
      <title>Eine Seite f&#252;r alle F&#228;lle</title>
      <link rel="alternate" type="text/html" href="http://www.pixelfans.de/eine-seite-fuer-alle-faelle/" />
      <id>tag:pixelfans.de,2011:/1.65</id>
      <published>2011-12-20T12:25:45Z</published>
      <updated>2012-01-29T16:43:46Z</updated>
      <author>
            <name>Pawel</name>
            <email>pawel@pixelfans.de</email>
                  </author>

      <category term="CSS"
        scheme="http://www.pixelfans.de/category/css/"
        label="CSS" />
      <category term="Ideen"
        scheme="http://www.pixelfans.de/category/ideen/"
        label="Ideen" />
      <category term="JS"
        scheme="http://www.pixelfans.de/category/js/"
        label="JS" />
      <category term="Layout"
        scheme="http://www.pixelfans.de/category/layout/"
        label="Layout" />
      <content type="html"><![CDATA[
        <p>Es gab Zeiten, da durften &#196;rzte nicht f&#252;r sich werben. Heute hat sogar mein Zahnarzt eine Website. Er hat mir versichert, dass ihn dar&#252;ber zunehmend auch neue Patienten finden. Es gibt also anhaltend Anwendungsf&#228;lle mit relativ konstanten Inhalt. Dazu habe ich ja auch schon mal <a href="http://www.pixelfans.de/Alles-in-einer-Seite/">im Blog geschrieben</a>. Hier reicht eine Seite (<span lang="en">Onepager</span>), die aber mit Javascript in Kleinteile "zers&#228;gt" wird, um die Inhalte ein bisschen abzusetzen und die gesamte Seite lesbarer zu gestalten.</p>
<p>Wenn ich die (momentane) HTML5-Spezifikation nicht v&#246;llig falsch verstanden habe, kann man jeden Inhaltszusammenhang in eine <code>section</code> packen. Da Javascript daf&#252;r sorgt, dass jeweils nur ein Bereich angezeigt wird, mutet es wie eine mehrseitige Pr&#228;senz an. Damit werden Ressourcen gespart, da insgesamt weniger Daten &#252;bertragen werden. Es gibt keine zus&#228;tzlichen Requests, da das <abbr title="Cascading Style Sheet">CSS</abbr> und Javscript im <code>head</code> des Dokuments stehen. Bei kleinen Dateien lohnt die Auslagerung in seperate Dateien nicht.</p>
<p>Diese Vorteile kommen noch mehr zur Geltung, wenn die Seite mit einem Smartphone genutzt wird. Das coole an Smartphones ist, dass sie sp&#228;testens alle 2 Jahre erneuert werden und Javascript immer l&#228;uft.</p><p>Desktoprechner werden steuerlich in 4-5 Jahren abgeschrieben und noch l&#228;nger genutzt. Daher finden sich dort noch ein paar Uraltbrowser, deren Zeit aber abl&#228;uft. Netscape 4.6 ist ja auch verschwunden.</p><p>Auf mobilen Ger&#228;ten kann man CSS <code>@media</code>-queries voraussetzen. Selbst wer unbedingt Windows Mobile benutzt und nicht reflexartig Opera Mobile installiert hat, findet nach dem Mango-Update jetzt den IE9 vor, der dies auch versteht. F&#252;r mich sind damit <code>handheld</code>-Angaben obsolet.</p>
<p>F&#252;r meinen konkreten Anwendungsfall ist es wichtiger auf den Fall zu reagieren, wann die Navigation nicht mehr ins <code>portrait</code>-Format passt. Seltsamerweise gibt es im Netz nicht viele Tipps, die sich mit der Navigation auf kleinen Screens auseinandersetzen. Ich habe nur ein Tutorial auf <a href="http://css-tricks.com/convert-menu-to-dropdown/">CSS-Tricks</a> gefunden, das mir aber nicht gefiel. Ich wollte ein Men&#252;, das ich auch noch treffe, nachdem ich meiner Mutter den Garten umgegraben habe.</p> <p>Ich habe die Navigation gestaltet und brauchte nur noch einen Button, um die Navigation sichtbar bzw. unsichtbar zu machen. Der Button sollte gut sichtbar und erreichbar sein. Die zun&#228;chst <a href="http://labs.pixelfans.de/mobile/onepager/transitions.html">naheliegende Variante</a>, den <code>button</code> mit Pseudoelementen zu kreeiren habe ich wieder verworfen. Einerseits ist ein solcher Button im Firefox Mobile schwer bedienbar und andererseits f&#228;llt sofort auf, dass <code>touch</code>- und <code>hover</code>-Events sich deutlich unterscheiden. Das Mobiltelefon bemerkt nat&#252;rlich nicht, dass der Finger weg ist und die Navigation bleibt solange sichtbar, bis der Finger irgendwo auf den Screen tippt. Unsch&#246;n.</p>
<p>Bei meiner L&#246;sung galt es sicherzustellen, dass der mit Javscript erzeugte <code>button</code> nur bei der Verwendung der mobilen <code>@media</code>-queries gezeigt wird, . Empfohlen sei hier die Angabe <code>max-device-width</code>. Angaben ohne <code>-device-</code> interpretieren manche Mobilbrowser nicht. Das Unget&#252;m</p>
<code><pre>mobile = window.getComputedStyle($t('html')[0], null).getPropertyValue('border-top-style') === 'dashed' ? 'true' : 'false';
</pre></code>
<p>fragt nach einen bestimmten Stilmerkmal des <code>html</code>-Elements, dem ich f&#252;r kleine Screens, oben eine gestrichelte Linie zugewiesen habe. <a href="http://www.flickr.com/photos/75063083@N00/6543200765/" title="Screenshot Win 7.5 mit Mangoupdate"><img src="http://farm8.staticflickr.com/7169/6543200765_2c3b44875a.jpg" alt="Screenshot der Seite mit Windows Mobile" /></a> Einige mobile Browser habe diese tats&#228;chlich angezeigt, weswegen ich die Liniest&#228;rke auf 0 gesetzt habe. Wenn das Stilmerkmal vorhanden ist, muss also die <code>@media</code>-query funktionieren. Gl&#252;cklicherweise beherrschen auch alle diese Browser <code>.getComputedStyle</code>. Es gibt neuere Smartphones, die im <code>landscape</code>-Modus mehr Pixel anzeigen, als die hier angesetzten 600px. Daher wird bei jedem <code>resize</code>-Event, also auch beim Drehen, die Funktion <code>checkScreen()</code> aufgerufen. Damit bei kleineren Displays nicht st&#228;ndig neue Buttons entstehen, muss &#252;berpr&#252;ft werden, ob er noch nicht erzeugt wurde. Mit <code>.removeChild(button)</code>  ist er nur aus dem <abbr title="Document Object Model">DOM</abbr> entfernt, aber noch vorhanden. Diesen Fall galt es zu ber&#252;cksichtigen. Die Mobilvariante ist jetzt fertig.</p>
<p>Die allgemeinen Stilregeln verhelfen auch alten IE's zu einer bedienbaren Seite. Moderne Browser zeigen mehrere Spalten sowie CSS-Muster. Letztere k&#246;nnen erheblich Performance kosten.</p>
<p class="attention"><a href="http://labs.pixelfans.de/mobile/onepager/einseitig.html" title="Eine f&#252;r alles">Demo eines Onepagers f&#252;r alle Displaygr&#246;&#223;en</a></p>

      ]]></content>
    </entry>

    <entry>
      <title>SVG in the eyes of a webdesigner</title>
      <link rel="alternate" type="text/html" href="http://www.pixelfans.de/svg-in-the-eyes-of-a-webdesigner/" />
      <id>tag:pixelfans.de,2011:/1.64</id>
      <published>2011-09-05T19:16:47Z</published>
      <updated>2011-09-05T19:33:49Z</updated>
      <author>
            <name>Pawel</name>
            <email>pawel@pixelfans.de</email>
                  </author>

      <category term="CSS"
        scheme="http://www.pixelfans.de/category/css/"
        label="CSS" />
      <category term="Ideen"
        scheme="http://www.pixelfans.de/category/ideen/"
        label="Ideen" />
      <category term="SVG"
        scheme="http://www.pixelfans.de/category/svg/"
        label="SVG" />
      <content type="html"><![CDATA[
        <h3>Introduction</h3>
<p>With all the hype about brand-new XML formats in 2001, like the 
newborn SVG, it progressively became quiet. Sure,  Adobe  had published 
their plug-in, but the Flash plug-in was also on the rise. These days 
however,a decade later, no modern Desktop browser needs a plug-in to 
display SVG anymore. It&#8217;s  time to use SVG in web-design.</p>

<h3>Preparations</h3>
<p>There are a lot of well-known programs in the design business. But 
most of these products were originally made for printing purposes, even 
though they were later improved to support the writing of  SVG-files. In
 my opinion a file of 150 to 200kbyte is no issue if you want to print 
it, but it&#8217;s way too big for the web. In conclusion to that and because 
of the existing idea of the semantic web, <i>I advise to specifically consider creating an SVG for the use in web-design</i>.
My tool of choice is <i>Inkscape</i>.</p>

<h3>Inkscape</h3>
<p>Inkscape is made for creating SVG.  It&#8217;s the native format and it may
 seem like it might not be completely ready yet. Don&#8217;t let yourself be 
fooled by the version number. A number like 0.48 is the understatement 
by GPL, but there are some limitations you should know and work around 
that.</p>
 <h4>The Swiss knife - always a path</h4>
<p>
Inkscape mostly saves simple forms as paths, but a person can grasp the 
command to create of circle better than understand the exact same shape 
as a couple of points in a path. Change the markup at the end again in 
the simple form. On top of that, the size of the file becomes smaller.</p>
<h4>Use gradients and filters twice or more</h4>
<p>
An object gets properties. As an standard in Inkscape any filter or 
gradient is bound to one object. The blur-filter is often used. To 
change the standard behaviour open the filter dialog which contains a 
powerful filter editor. You can use all of the filters on more than one 
object, the process will also reduce the size of the SVG-file.The same 
feature would be nice for gradients, but unfortunately I only know to 
code this per hand.</p>
<h4>No clone wars</h4>
<p>
In a lot of cases you will take the same shape. Inkscape offers a way to
 duplicate the shape, but it is  mostly better to use the clone tool. A 
clone is a <i>use</i>-element and will make rendering faster and the size of the file becomes even  smaller, because a <i>use</i> is only a reference and not a couple of points.</p>
<h4>Use name which are describing the objects</h4>
<p>
For further work with your editor, you should get a describing name for 
the objects or groups. By a right click on the object, you will get a 
dialog box and be able to do this.</p>
<h4>Save the file as optimized SVG</h4>
<p>With the version 0.48 Inkscape offers this. In this case unused 
gradients or filters  will be removed from the file and saved in a 
compact way.</p>
<h3>Optimized your code in a editor</h3>
<h4>Clean up the doctype</h4>
<p>First of all, you can clean up the doctype. The rdf-declaration and 
the meta-tags are not really needed. I advise to you a compact version.</p>
<code><pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="myID" version="1.1"&gt;
</pre></code>

<h4>Check any kind of abstraction</h4>
<p>Find out  which gradients you can use for a couple of objects. Use styles, if it&#8217;s possible.</p>

<h4>Round floats</h4>
<p>In my experience, such a high accuracy is not really needed. You can 
reduce the size of a file enormously by rounding floats. In some cases 
you can round the point from float to integer, sometimes you need 1-2 
Decimal, e.g. in the matrix-Attribute. I use some needful bash-scripts 
to do that.</p>

<h4>Use the title element</h4>
<p>One of the advantages of the format is that each element can be 
equipped with a title. Because of that, you can describe the content 
further and maybe Google likes that, too. </p>
<h4>Put it together</h4>
<p>With the upcoming HTML5 specifiation we get a simple way the use a SVG inline in a HTML.
Personally, I prefer a way to use a <i>switch</i> in combination with <i>foreign objects</i>.</p>

<p>
The <i>switch</i>-element is very powerful. If the browser understands 
the path command, like all modern browsers, the foreign object will not 
be displayed. Browsers, like Konqueror or old Internet Explorers display
 the content within the <i>foreign object</i>. You can combine this with conditional comments.
</p>
<h3>That sounds great but...</h3>
<p>Yes I know, what you are going to say. There is a workaround for the Internet Explore up to version 8, you can use a VML. </p>
<strong>Links:</strong>
<ul>
<li><a href="http://www.batik-gbr.de/">My personal site - Inline SVG in HTML</a></li>
<li><a href="http://www.pixelfans.de/svg-in-vml-konvertieren/">Convert SVG in VML in 4 Steps (Language: German)</a></li>
<li><a href="http://datenverdrahten.de/xslt2/svg_reduce.xsl">XSLT 2.0 stylesheet to reduce lenght  attribute-values  by Dr. Thomas Meinike</a></li>
<li><a href="http://www.openclipart.org/people/pawelf/mailbox.svg">Weboptimized german mailbox (&lt; 4kbyte)</a></li>
</ul>

      ]]></content>
    </entry>

    <entry>
      <title>DropBox und PHP</title>
      <link rel="alternate" type="text/html" href="http://www.pixelfans.de/dropbox-und-php/" />
      <id>tag:pixelfans.de,2011:/1.63</id>
      <published>2011-06-30T19:30:10Z</published>
      <updated>2012-01-29T16:51:53Z</updated>
      <author>
            <name>Pawel</name>
            <email>pawel@pixelfans.de</email>
                  </author>

      <category term="Ideen"
        scheme="http://www.pixelfans.de/category/ideen/"
        label="Ideen" />
      <category term="PHP"
        scheme="http://www.pixelfans.de/category/php/"
        label="PHP" />
      <content type="html"><![CDATA[
        <p>Als ich eine Einladung f&#252;r die <a href="http://www.dropbox.com/">DropBox</a> bekommen hatte,  fand ich das zun&#228;chst nicht spektakul&#228;r. Unter Linux bin ich es gewohnt, nahezu jedes Laufwerk mounten zu k&#246;nnen.  Komfortable Programme f&#252;r Mobiles und jedes Betriebssytem und das automatische und schnelle Synchronisieren haben mich &#252;berzeugt. Daten in die DropBox zu schieben ist so einfach, dass es jeder kann, der sich mit einem Smartphone oder Computer ein wenig auskennt.</p>
<p>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"  id="DropBox" version="1.1">
<title>DropBox Logo</title>
   <defs>
      <linearGradient id="lGbl" xlink:href="#lGbr" gradientTransform="rotate(120)" />
      <linearGradient id="lGbr">
         <stop stop-color="#C1E0F6" offset="0"/>
         <stop stop-color="#64B3E3" offset="1"/>
      </linearGradient>
      <linearGradient id="lGtop">
         <stop stop-color="#ECF8FE" offset="0"/>
         <stop stop-color="#C7EAFA" offset="1"/>
      </linearGradient>
   </defs>
<g transform="scale(2) translate(-70,-10)" aria-label="DropBox-Logo">
   <polygon opacity="0.8" stroke="#79c3ec"
            points="125,71,125,102,100,86,100,57"
            stroke-miterlimit="10"
            fill="url(#lGbl)"/>
   <polygon opacity="0.8" stroke="#79c3ec"
            points="150,57,125,72,125,102,150,86"
            stroke-miterlimit="10"
            fill="url(#lGbr)"/>
   <polygon opacity="0.9" stroke="#79c3ec"
            points="142,85,125,72,108,85,82,70,100,56,82,43,108,26,125,40,142,26,167,42,151,56,167,70"
            stroke-miterlimit="10"
            fill="url(#lGbr)"/>
   <polygon opacity="0.7" 
            points="125,72,100,56,125,41"
            fill="url(#lGtop)"/>
   <polygon opacity="0.7" 
            points="125,72,125,41,149,55"
            fill="url(#lGtop)"/>
</g>
</svg>

Seit Mai 2010 steht auch eine API zur Verf&#252;gung, die aber W&#252;nsche offen l&#228;sst. Es gibt nur eine <a href="https://www.dropbox.com/developers/docs">Handvoll Methoden</a>. Irritierend ist dabei auch die Begrifflichkeit. Nat&#252;rlich ist der Zugriff nicht nur vom Smartphone m&#246;glich.</p>
<p>Die f&#252;r mich naheliegende Anwendung per PHP Daten aus der DropBox in das CMS seiner Wahl zu kopieren, scheint niemand bisher realisiert zu haben. PHP scheint von den Entwicklern ohnehin nicht Sprache der Wahl zu sein, obwohl es eine Klasse bei Google Code gibt, die aber sehr viele Abh&#228;ngigkeiten mitbringt.</p>
<p>Gl&#252;cklicherweise hat sich Tijs Verkoyen dieses Problem angenommen und eine <a href="http://classes.verkoyen.eu/dropbox">kompakte Klasse</a> entwickelt, die sich auch der OAuth-Problematik annimmt. Damit lassen sich alle Methoden der API aufrufen. Tijs hat eine <a href="http://sumocoders.be/nl/blog/detail/dropbox-wrapper-class">Dokumentation</a> zur Verf&#252;gung gestellt.</p> <p>Zur Nutzung ben&#246;tigt man neben der E-Mailadresse und seinem Passwort die zwei Keys, die man bei der Registrierung einer APP in der DropBox erh&#228;lt.Die API erh&#228;lt keine Methode, um Dateien auf den eigenen Webspace zu verschieben. Deshalb muss dort die Datei neu anlegt werden und den Inhalt des Response hinein schreiben.</p>
<code><pre>$dest = 'test';//folder on your pc
if (isset($_GET['file'])) {
//kleine Pfadverschleierung
$dbfile = x0rdecrypt($_GET['file'], $secretxorkey) ;
$response = $dropbox->filesGet($dbfile);
//sichere Dateinamen
$filename = array_pop(explode('/', $dbfile));
$file = base64_decode($response['data']);
//Datei neu im Zielverzeichnis anlegen
$file_copy = fopen( './'.$dest.'/'.$filename,"wb");
//schreiben und schlie&#223;en
fwrite($file_copy, $file);
fclose($file_copy);
}</pre></code>

<p>Da der Beispielcode diesmal deutlich umfangreicher geworden ist, habe ich bei Github einen <a href="https://github.com/pawelf/Dropbox">Fork</a> der Klasse angelegt und die Beispieldateien erg&#228;nzt.
Das Ergebnis ist eine &#252;bersichtliche Oberfl&#228;che, die es erm&#246;glicht Dateien anzuschauen oder zu verschieben. <a href="http://www.flickr.com/photos/75063083@N00/5888212265/" title="DroBox mit PHP"><img src="http://farm6.static.flickr.com/5261/5888212265_e0fe49a2d3.jpg" alt="Screenshot des Webzugriffs auf die DropBox" /></a></p>
      ]]></content>
    </entry>

    <entry>
      <title>Box Reflection mit CSS f&#252;r Webkit und Fox</title>
      <link rel="alternate" type="text/html" href="http://www.pixelfans.de/box-reflection-mit-css-fuer-webkit-und-fox/" />
      <id>tag:pixelfans.de,2011:/1.62</id>
      <published>2011-06-08T17:09:10Z</published>
      <updated>2011-07-02T11:33:35Z</updated>
      <author>
            <name>Pawel</name>
            <email>pawel@pixelfans.de</email>
                  </author>

      <category term="CSS"
        scheme="http://www.pixelfans.de/category/css/"
        label="CSS" />
      <content type="html"><![CDATA[
        <p>Im letzten Blogbeitrag habe ich eine einfache M&#246;glichkeit f&#252;r die Simulation einer Textreflektion gezeigt. Bisher gelingt aber die Spiegelung eines gesamten Containers nur mit <code> -webkit-box-reflect</code>, wie es im <a href="http://webstandard.kulando.de/post/2010/03/19/css-box-reflect-spiegelung-ohne-javascript-und-photoshop" title="Zum Blogartikel">Webstandardblog</a> f&#252;r die Webkitbrowser beschrieben ist.</p>

<p>Da mein Lieblingsbrowser der Firefox bleibt, habe ich nach einer M&#246;glichkeit gesucht, diesen Effekt auch dort nur mit <abbr title="Cascading Style Sheets">CSS</abbr> verf&#252;gbar zu machen. Firefox unterst&#252;tzt zwar die <abbr title="oben genannten">o.g.</abbr> Eigenschaft nicht, bringt aber mit dem <a href="https://developer.mozilla.org/en/CSS/-moz-element" title="Zur MDC-Seite"><code>-moz-element</code></a> eine eigene Eigenschaft mit, jedes beliebige HTML-Element als CSS-Hintergrund verwenden zu k&#246;nnen. Erwartet wird lediglich eine <code>id</code> eines Elements.</p>
<p>Ich habe das Beispiel dahingehend ver&#228;ndert, dass es einen zus&#228;tzlichen Container enth&#228;lt, der die Reflektion f&#252;r den Firefox anzeigt. Der Container <code>vcard</code> wird nun statt mit einer Klasse mit einer <code>id</code> gekennzeichnet.</p>
<p>Die eigentliche Arbeit wird durch folgende CSS-Anweisung geleistet:</p>
 <code><pre>background: 
-moz-linear-gradient(top, rgba(255,255,255,1) 55%, rgba(255,255,255,0) 80%),
 -moz-element(#vcard) no-repeat;
-moz-transform: scale(1,-1);
</pre></code>
<p>Es werden mehrere Hintergr&#252;nde genutzt. Ein Farbverlauf von Transparent zu weiss, die aber aber "umgedacht" werden muss, da <code>transform</code> den gesamten Container und damit auch den Farbverlauf kippt.Der zweite Hintergrund ist der Inhalt von <code>#vcard</code>. <span style="text-decoration:line-through;">Eine Besonderheit gibt es im Unterschied zu den Webkitbrowsern, es wird tats&#228;chlich nur der Inhalt verwendet der innerhalb des Containers steht. Sollen CSS-Anweisungen mit &#252;bertragen werden, m&#252;ssen sie als Inlinestyles geschrieben werden.</span> </p>
<p>Das erweiterete Beispiel f&#252;r Webkit und Firefox:</p>
<p class="attention"><a href="http://labs.pixelfans.de/reflections/css3-boxReflect.html" title="f&#252;r Webkit und Firefox">Box Reflection mit CSS</a></p>
<p>Zum Vergleich das Original des Webstandardsblog:</p>
<p class="attention"><a href="http://webstandard.kulando.de/static/css3-boxReflect" title="zum Blog">Beispiel des Webstandardsblog</a></p>
<h4>Nachtrag (02.07.2011)</h4>
<p><a href="http://leaverou.me/2011/06/css-reflections-for-firefox-with-moz-element-and-svg-masks/">Lea Verou</a> hat sich auch mit dem Thema besch&#228;ftigt. Ich habe ihr Beispiel genutzt, um mein Beispiel weiterzuentwickeln.</p>
<p class="attention"><a href="http://labs.pixelfans.de/reflections/boxReflect.html" title="f&#252;r Webkit und Firefox">das verbesserte Beispiel</a></p>
      ]]></content>
    </entry>

    <entry>
      <title>Generated Content</title>
      <link rel="alternate" type="text/html" href="http://www.pixelfans.de/generated-content/" />
      <id>tag:pixelfans.de,2011:/1.61</id>
      <published>2011-03-31T19:52:10Z</published>
      <updated>2011-04-02T12:06:34Z</updated>
      <author>
            <name>Pawel</name>
            <email>pawel@pixelfans.de</email>
                  </author>

      <category term="CSS"
        scheme="http://www.pixelfans.de/category/css/"
        label="CSS" />
      <content type="html"><![CDATA[
        <p>Eine der Highlights der <abbr title="Cascading Style Sheets">CSS</abbr>-Spezifikation ist f&#252;r mich <a href="http://www.w3.org/TR/CSS2/generate.html#propdef-content">generated content</a>. Damit wird es m&#246;glich Text aber auch Bilder hinzuzuf&#252;gen, die eher Design, der Lesbarkeit u.&#228;. dienen, aber keinen inhaltlichen Charakter haben und daher auch nicht ins Markup geh&#246;ren. Alle modernen Browser beherrschen diesen Standard, der Internet Explorer seit der Version 8.</p>
<p>Nat&#252;rlich lassen sich dar&#252;ber auch die beliebten Liststyle-Symbole einf&#252;gen, kleine Grafiken, h&#228;ufig auch via Sprites. Wenig bekannt und genutzt sind Unicode-Charakter. So f&#252;gt</p>
<code><pre>a.email:before{position:absolute; top:0; left:-25px; content:"\002709 \0000A0"}</pre></code>
<p>einen &#9993; (envelope) vor die E-Mail-Adresse ein. Das Unicodezeichen 2709 (Suchtipp: <code>U+2709</code>) ist der Umschlag, das Zeichen danach ein Leerzeichen.</p> <p>Es gibt <a href="http://en.wikipedia.org/wiki/Unicode_Symbols">Wikipediaseiten</a>, die einen guten Einstieg erm&#246;glichen. Ein bisschen Vorsicht ist bei der Entwicklung f&#252;r mobile Seiten geboten. Einige Androidfonts unterst&#252;tzen den Briefumschlag nicht.</p>
<p>Die Unicode-Symbole haben gegen&#252;ber den Bildern nicht nur den Vorteil, dass kein Request n&#246;tig ist, sondern das sie auch bei der Skalierung der Seiten ihre Wirkung nicht verlieren.</p>
<p>Viel Spass, bei eigenen Experimenten. Wie w&#228;re es z.B. mit <code>U+2263</code> in Verbindung mit einer <code>border</code>?</p>
<p> Eine gewisse Dynamik beim eingef&#252;gten Content erm&#246;glicht die Nutzung von Attributen. </p>
<code><pre>h1:after{content: ""attr(title)"";}</pre></code>
<p> In diesem Fall wird davon ausgegangen, dass das <code>h1</code>-Element einen <code>title</code> hat. In HTML5 k&#246;nnte man auch <code>data-text</code> als Attribute verwenden. Was damit m&#246;glich ist, zeigt folgendes Beispiel einer</p> <p class="attention"><a href="http://labs.pixelfans.de/reflections/reflection.html" title="Textreflexion nur mit CSS">Textreflexion nur mit CSS</a></p>
      ]]></content>
    </entry>

    <entry>
      <title>SVG in VML konvertieren</title>
      <link rel="alternate" type="text/html" href="http://www.pixelfans.de/svg-in-vml-konvertieren/" />
      <id>tag:pixelfans.de,2011:/1.60</id>
      <published>2011-02-24T20:26:10Z</published>
      <updated>2011-03-31T20:27:45Z</updated>
      <author>
            <name>Pawel</name>
            <email>pawel@pixelfans.de</email>
                  </author>

      <category term="Ideen"
        scheme="http://www.pixelfans.de/category/ideen/"
        label="Ideen" />
      <category term="Layout"
        scheme="http://www.pixelfans.de/category/layout/"
        label="Layout" />
      <category term="SVG"
        scheme="http://www.pixelfans.de/category/svg/"
        label="SVG" />
      <content type="html"><![CDATA[
        <p>Thomas Magnum w&#252;rde sagen:</p><blockquote>Ich weiss was Sie jetzt denken und Sie haben recht.</blockquote><p>VML ist das diese steinzeitliche, <abbr title="Herstellerspezifische Entwicklung, nicht standardisiert">propriet&#228;re</abbr> Vektorsprache von Microsoft, die von den Browsern nur der Internet Explorer interpretiert?</p><p>Im Gegensatz dazu ist SVG doch leistungsf&#228;higer und wird auch vom kommenden IE9 nativ unterst&#252;tzt. Zudem kann das Format direkt aus g&#228;ngigen Vektorprogrammen erzeugt werden.</p>
<p>Wenn SVG heute auf einer gro&#223;en Seite verwendet wird, dann meist mit der Javascriptbibliothek <a href="http://raphaeljs.com/">Rapha&#235;l</a>, um f&#252;r die IE eine VML-Grafik zu erzeugen. Das ist solange n&#246;tig, bis die IE-Familie sich v&#246;llig erneuert hat, was noch 2-3 Jahre dauern wird.</p><p>Jede L&#246;sung bleibt begrenzt, da das Format Filter, Animation u.v.m. nicht unterst&#252;tzt. Statische Grafiken k&#246;nnen aber auch ohne Javascript recht einfach halbautomatisch konvertiert werden.</p> <p><a rel="shadowbox" href="http://farm6.static.flickr.com/5018/5474360872_cfe486acf8_z.jpg" title="SVG2VML"><img src="http://farm6.static.flickr.com/5018/5474360872_cfe486acf8.jpg" alt="Konvertieren von SVG zu VML" /></a> Innerhalb von Inkscape sollten alle Farbverl&#228;ufe durch gut abgrenzbare Vollfarben ersetzt werden. </p><p>Die Grafik wird dann im <code>odg</code>-Format gespeichert, welches OpenOffice versteht. Dieses Format ist so armselig, da es keine Farbverl&#228;ufe anzeigtt. Die Grafik kann jetzt mit OO Draw ge&#246;ffnet und per Kopieren und Einf&#252;gen in eine OpenOffice Textdokument kopiert werden, um es als <code>doc</code> (Word)-Datei abzuspeichern. </p><p>Wenn diese Datei jetzt mit dem Microsoftprodukt ge&#246;ffnet wird, ist die Vektorkonvertierung bereits geschehen. Ab Word 2007 kann sogar die Grafik editiert werden und bestimmte Farbverl&#228;ufe wieder hinzugef&#252;gt werden.</p>

<p>Ich empfehle die zu erstellende <code>html</code>-Datei als <code>iframe</code> in einen <code>switch</code> einzubinden, wie ich es im <a href="http://www.pixelfans.de/Moderne-Zeiten/">Blog</a> schon erl&#228;utert habe. Nur Klugschei&#223;er optimieren die niemals valide Datei per Hand weiter.</p>
<p>Wie das aussieht, kann man sich bei den Alternativgrafiken von meiner <a href="http://www.batik-gbr.de">Batik-Seite</a> abschauen.</p>
      ]]></content>
    </entry>

    <entry>
      <title>Wordpress Datenbankfehler abfangen</title>
      <link rel="alternate" type="text/html" href="http://www.pixelfans.de/wordpress-datenbankfehler-abfangen/" />
      <id>tag:pixelfans.de,2011:/1.59</id>
      <published>2011-02-23T09:12:10Z</published>
      <updated>2011-02-24T21:10:46Z</updated>
      <author>
            <name>carsten</name>
            <email>carsten@medienstadt.info</email>
                  </author>

      <category term="PHP"
        scheme="http://www.pixelfans.de/category/php/"
        label="PHP" />
      <content type="html"><![CDATA[
        <p>Im Falle einer falschen Konfiguration ist das Problem sicher schnell behoben. Leidet aber die Maschine kurzzeitig oder dauerhaft an einer &#220;berlastung m&#252;ssen die Nutzer immer wieder mit dieser Meldung Vorlieb nehmen, was nun wahrlich unsch&#246;n ist.</p> <p>Eben dieses zweite Szenario hat mich gestern den ganzen Tag &#252;ber auf <a href="http://christianrach.de" title="Webseite von Christian Rach">christianrach.de</a> besch&#228;ftigt. Nachdem diese <a href="http://rtl-now.rtl.de/extrakompakt.php?film_id=35295&amp;player=1&amp;season=0&amp;na=1" title="Rach getestet EXTRA bei RTL">Sendung bei RTL</a> lief, ging der Server schon am Ausstrahlungsabend zeitweise in die Knie und kriegte sich auch am Folgetag gestern nicht wieder ein.</p>
<p>Meine erste Aktion war es, eine <code>index.html</code> im DocumentRoot zu hinterlegen, die alle ankommenden Nutzer &#252;ber die aktuelle &#220;berlastung und unser Engagement, etwas dagegen zu tun, informiert. Die Aktion war n&#246;tig, brachte mich aber auch in die verzwicklte Lage immer wieder nachsehen zu m&#252;ssen, ob der Server schon wieder so stabil l&#228;uft, dass es Sinn machen w&#252;rde die Datei wieder zu entfernen.</p>
<p>Viel kl&#252;ger ist es da, wordpress selber entscheiden zu lassen, wann es keine Puste mehr hat und entsprechend meine Abfang-Datei auszuliefern.</p>
<p>Wie das funktioniert, ist im <a href="http://codex.wordpress.org/FAQ_Working_with_WordPress#Can_I_change_the_.22Error_establishing_database_connection.22_message_to_something_more_descriptive.3F" title="FAQ: Can I change the Error establishing database connection message to something more descriptive?">Codex</a> erkl&#228;rt und brachte mich dazu einfach den gesamten Inhalt meiner <code>index.html</code> in eine neu anzulegende Datei namens <code>db-error.php</code> zu packen, die im Verzeichnis <code>/wp-content</code> hinterlegt wird.</p>
<p>Jetzt kann ich mich getrost zur&#252;cklegen und abwarten, bis der Server das n&#228;chste Mal in die Knie geht. Sch&#246;n, dass es jetzt mindestens so aussieht als sei noch alles in Ordnung.</p>
      ]]></content>
    </entry>

    <entry>
      <title>@media in SVG</title>
      <link rel="alternate" type="text/html" href="http://www.pixelfans.de/at-media-in-svg/" />
      <id>tag:pixelfans.de,2011:/1.58</id>
      <published>2011-02-20T09:01:10Z</published>
      <updated>2011-02-20T18:04:14Z</updated>
      <author>
            <name>Pawel</name>
            <email>pawel@pixelfans.de</email>
                  </author>

      <category term="CSS"
        scheme="http://www.pixelfans.de/category/css/"
        label="CSS" />
      <category term="SVG"
        scheme="http://www.pixelfans.de/category/svg/"
        label="SVG" />
      <content type="html"><![CDATA[
        <p>Immer mehr Seiten nutzen <abbr title="Scalable Vector Graphic">SVG</abbr> zur Darstellung von Diagrammen. Das hat einen gro&#223;en Vorteil, lassen sich doch SVG's direkt aus Datenbanken erzeugen. Das ist zwar nach meiner Meinung bisher nur ein Bruchteil, was damit machbar ist, aber ein typisches Problem wird jetzt schon deutlich: Die Ausgabe der Grafik an verschiedene Ausgabeger&#228;te.</p>
<p>Hier zeigt sich ein weiterer Vorteil des Formates - <code>@media</code>-Regeln werden interpretiert.</p> <p>Ebenso, wie bei <abbr title="Hypertext Markup Language">HTML</abbr> ist es dazu n&#246;tig, innerhalb des <abbr title="Cascading Style Sheet">CSS</abbr> z.B <code>@media print</code> zu formulieren. Verwirrend ist es vielleicht, das <abbr title="Cascading Style Sheet">CSS</abbr> in <abbr title="Scalable Vector Graphic">SVG</abbr> nicht ganz so m&#228;chtig ist. Viele Stile lassen sich auch als Atrribute formulieren, was typischerweise die &#228;lteren Programme zur Erstellung von SVG-Grafiken nutzen. Ein <code>fill="red"</code> &#228;hnelt <code>style="fill:red"</code>. Stile &#252;berschreiben die Attribute, wie </p><p class="attention"><a href="http://labs.pixelfans.de/mediasvg/attribute_css.svg">dieses Beispiel</a></p><p>illustriert. Filter, Farben usw. lassen sich bequem &#252;ber Styles zuweisen und damit zwischen Druckansicht und Bildschirmansicht differenzieren.</p><p class="attention"><a href="http://labs.pixelfans.de/mediasvg/giftbox.svg">Diese Geschenkebox</a></p><p>zeigt,  wie so etwas aussehen k&#246;nnte.  In Verbindung mit <code>media-queries</code> sind hier auch unterschiedliche Gr&#246;&#223;en der Grafik in Abh&#228;ngigkeit vom Endger&#228;t vorstellbar.</p>
      ]]></content>
    </entry>

    <entry>
      <title>CreativeCommons Icon mit CSS</title>
      <link rel="alternate" type="text/html" href="http://www.pixelfans.de/creativecommons-icon-mit-css/" />
      <id>tag:pixelfans.de,2011:/1.57</id>
      <published>2011-02-16T07:12:10Z</published>
      <updated>2011-02-16T07:17:15Z</updated>
      <author>
            <name>carsten</name>
            <email>carsten@medienstadt.info</email>
                  </author>

      <content type="html"><![CDATA[
        <p>Weil mir sowohl beim Ideengeber <a href="http://nicolasgallagher.com/pure-css-gui-icons/" title="CSS GUI Icons">Nicolas Gallagher</a> als auch bei <a href="http://www.pixelfans.de/weniger-bilder-durch-css-icons/">Pawels</a> Experimenten mit den puren CSS Icons bisher ein Symbol zur Auszeichnung von CreativeCommons Lizenzen gefehlt hat, habe ich heute noch eines nachgeschoben.</p> <p>Es ist sozusagen das copyleft-Pendant zum oft verwendeten <code>&#169;</code>.</p>
<p>Mein Beispiel basiert auf einem einfachen Link-Tag mit rel-Attribut "license".</p>
<code><pre>&lt;a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/de/"&gt;Creative Commons&lt;/a&gt;</pre></code>
<p class="attention"><a href="http://labs.pixelfans.de/css-gui-icons/cc.html" title="CreativeCommons Icon ohne Bilder, nur mit CSS 3">Demo des CreativeCommons Icon</a></p>
<p>Mit den paar Zeilen in den eigenen CSS ist es getan.</p>
<code><pre>
a[rel~='license']:link, 
a[rel~='license']:visited {
    padding-left:28px;
    color:#272727;
    position:relative;
    z-index:1;    
    text-decoration: none;
}
a[rel~='license']:before, 
a[rel~='license']:after {
    content:"c";
    position:absolute;
    top:50%;
    left:0;
    margin:-8px 0 0;
    -webkit-border-radius:16px; 
    -moz-border-radius:16px; 
    border-radius:16px;    
    line-height:11px;
    color:transparent;
    color:rgba(0,0,0,0);
    text-align:left;    
}
a[rel~='license']:before {
    left:8px; 
    background:#272727;
    width:1em; 
    height:1em;   
    text-shadow:8px 0 0 #fff;
    border:1px solid #272727;
}
a[rel~='license']:after {
    left:9px;
    margin-top:-7px;
    z-index:10;  
    text-shadow:1px 0 0 #fff;
}
a[rel~='license']:hover:before,
a[rel~='license']:focus:before,
a[rel~='license']:active:before {
    background:#fff;
    text-shadow:8px 0 0 #272727;
}
a[rel~='license']:hover:after, 
a[rel~='license']:focus:after,
a[rel~='license']:active:after {
    text-shadow:1px 0 0 #272727;
}
</pre></code>
<p>Das sch&#246;ne ist, dass mein Konstrukt - im Gegensatz zum Original - mit einem einzigen HTML-Element auskommt. Damit l&#228;sst sich das Icon an nahezu beliebiger Stelle einsetzen, ohne zus&#228;tzliches Markup zu erfordern.</p>
<p>Ist nat&#252;rlich auch hier wieder voll der CSS3-Horror und sollte nicht immer und &#252;berall live verwendet werden. Nebenan auf <a href="http://medienstadt.info">medienstadt.info</a> hab ich's aber schon eingebaut.</p>
      ]]></content>
    </entry>

    <entry>
      <title>crossbrowser CSS color: transparent;</title>
      <link rel="alternate" type="text/html" href="http://www.pixelfans.de/crossbrowser-css-color-transparent/" />
      <id>tag:pixelfans.de,2011:/1.56</id>
      <published>2011-02-14T15:58:10Z</published>
      <updated>2011-02-14T16:01:03Z</updated>
      <author>
            <name>carsten</name>
            <email>carsten@medienstadt.info</email>
                  </author>

      <content type="html"><![CDATA[
        Beispeil im labs <p>In Verbindung mit <code>opacity</code> verliert Chrome die F&#228;higkeit zur Darstellung von multiplen Textschatten. Er zeigt dann nur noch den zuletzt definierten an.</p>
      ]]></content>
    </entry>

    <entry>
      <title>localhost via virtualbox &#45; auch mit Domainaufl&#246;sung</title>
      <link rel="alternate" type="text/html" href="http://www.pixelfans.de/localhost-via-virtualbox-auch-mit-domainaufloesung/" />
      <id>tag:pixelfans.de,2011:/1.55</id>
      <published>2011-02-14T12:31:10Z</published>
      <updated>2011-02-15T20:36:32Z</updated>
      <author>
            <name>carsten</name>
            <email>carsten@medienstadt.info</email>
                  </author>

      <category term="News"
        scheme="http://www.pixelfans.de/category/News/"
        label="News" />
      <content type="html"><![CDATA[
        <p>Die <a href="http://www.virtualbox.org/" title="Virtualbox von Oracle">Virtualbox</a> ist da schon recht komfortabel und &#252;ber ein <abbr title="graphical user interface">GUI</abbr> zu administrieren, was ich sehr bevorzuge. In wenigen Minuten ist ein neues System installiert, mit einem Netzwerkadapter ausgestattet und im www unterwegs. </p>
<p>Damit bin ich also genauso weit wie mit o.g. Browsershots. Ich kann Webseiten testen, die sich bereits auf einem Liveserver befinden.
Leider ist das nur die halbe Miete.</p> <p>Gebe ich aber nun z.B. <kbd>http://localhost/pixelfans/</kbd> im Browser meiner virtuellen Maschine ein, bekomme ich eine Fehlermeldung, weil mein virtueller Freund innerhalb seiner eigenen Grenzen nach dem Verzeichnis /pixelfans sucht und das logischerweise dort nicht existiert. Die VM sollte also auf meinem echten - physischen - Rechner nach dem Verzeichniss suchen, das wei&#223; sie nur leider noch nicht.</p>

<p>Ein kurzer Blick in die aktuelle virtuelle Konfiguration verr&#228;t mir, dass mein Gateway - also der echte Rechner - die <strong>IP 10.0.2.2</strong> besitzt. Folglich f&#252;hrt mich der Aufruf <kbd>http://10.0.2.2/pixelfans/</kbd> zum Ziel und meine lokale Webseite wird angezeigt. Soweit so gut.</p>

<p>Um beim Entwicklen und Testen nah am Livesystem zu sein, bietet sich h&#228;ufig an, auch unter xampp bzw. wampp vermeintliche Domainnamen oder sogar Subdomains zu etablieren. In meinem Fall bekomme ich nun zwar mein Verzeichniss /pixelfans mit allen Inhalten ausgeliefert, es sieht aber total zerhackt aus weil jegliche referenzierten Daten, wie Stylesheets, Scripte und Bilder fehlen. Die sucht mein virtueller Browser n&#228;mlich unter <a href="http://pixelfans.dev/">http://pixelfans.dev/</a>... und findet nix, weil er noch nicht wei&#223;, wohin er diese Anfrage routen soll.</p>

<p>Helfen wir ihm, indem wir in der hosts-Datei der virtuellen Maschine einige Zeilen erg&#228;nzen, die wir aus der eigenen hosts-Datei der physischen Maschine fast vollst&#228;ndig kopieren k&#246;nnen.</p>

<p>In der physischen hosts-datei steht also</p>

<code><pre>
127.0.0.1 pixelfans.dev
127.0.0.1 <a href="http://www.pixelfans.dev">http://www.pixelfans.dev</a>
127.0.0.1 labs.pixelfans.dev
</pre></code>

<p>und in die virtuelle hosts-Datei tragen wir also Folgendes ein:</p>

<code><pre>
10.0.2.2 pixelfans.dev
10.0.2.2 <a href="http://www.pixelfans.dev">http://www.pixelfans.dev</a>
10.0.2.2 labs.pixelfans.dev
</pre></code>
<p>Speichern, Browser aktualisieren, Bingo fertig!</p>
<p>Im &#220;brigen wei&#223; wikipedia sehr gut, wo sich die <a href="http://de.wikipedia.org/wiki/Hosts-Datei" title="Erl&#228;uterungen zur und Lokaliserung der hosts-Datei">hosts-Datei auf unterschiedlichsten Systemen</a> befindet.</p>

<p> Nach <a href="http://stackoverflow.com/questions/1261975/addressing-localhost-from-a-virtualbox-virtual-machine/1262143#1262143" title="die gleiche L&#246;sung via stackoverflow">einer kurzen Recherchen</a> dazu, habe ich erfahren, dass die IP <strong>10.0.2.2</strong> der Standard ist. Man kann sich also den Blick in die Konfiguration sparen und sie analog verwenden. Unter Umst&#228;nden muss in der VM noch das Virtualbox-Paket "Guest Additions" nachinstalliert werden, das macht virtualbox aber auf Wunsch von alleine und man hat damit keine Nervereien</p>


      ]]></content>
    </entry>

    <entry>
      <title>Weniger Bilder durch CSS Icons</title>
      <link rel="alternate" type="text/html" href="http://www.pixelfans.de/weniger-bilder-durch-css-icons/" />
      <id>tag:pixelfans.de,2011:/1.54</id>
      <published>2011-01-23T11:18:10Z</published>
      <updated>2011-02-20T09:39:09Z</updated>
      <author>
            <name>Pawel</name>
            <email>pawel@pixelfans.de</email>
                  </author>

      <category term="CSS"
        scheme="http://www.pixelfans.de/category/css/"
        label="CSS" />
      <category term="Ideen"
        scheme="http://www.pixelfans.de/category/ideen/"
        label="Ideen" />
      <category term="Layout"
        scheme="http://www.pixelfans.de/category/layout/"
        label="Layout" />
      <content type="html"><![CDATA[
        <p>Vor langer Zeit gab es eine Arbeitsgruppe, die sich mit der Zukunft besch&#228;ftigte, die XHTML2 hei&#223;en sollte. In den Entw&#252;rfen war auch mal die Abschaffung des <code>img</code>-Tags angedacht. Zun&#228;chst mutet es skurril an, sich eine Website ohne Bilder auszudenken. Stellt man jedoch den Inhalt in den Vordergrund, dann ist es nicht mehr so absurd. Der Entwurf sah ja ohnehin vor, Medieninhalte &#252;ber das <code>object</code>-Tag einzubinden, wozu dann auch ausgew&#228;hlte Bilder geh&#246;ren k&#246;nnen. Schmuckbilder im Markup sollten der Vergangenheit angeh&#246;ren.</p>
<p>Die Zeiten haben sich ge&#228;ndert und jeder Gestalter nutzt Schmuckbilder nur innerhalb der CSS. Damit diese nicht zuviel Ladezeit kosten, werden sie fachgerecht in eine einzige Bilddatei zusammengesetzt und an verschiedenen Stellen mit verschieden Teilen eingeblendet. Diese sogenannten Sprites erleichtern die optische Hervorhebung von Zitaten, Aufz&#228;hlungen, Loginfeldern usw. .
Damit schienen alle M&#246;glichkeiten des modernen Webdesigns ausgereizt, bis <a href="http://nicolasgallagher.com/">Nicolas Gallagher</a> mit seinen <a href="http://nicolasgallagher.com/pure-css-gui-icons/">CSS-GUI-Icons</a> nachwies, dass moderne Seiten anscheinend doch ohne Bilder auskommen k&#246;nnen, ohne nach digitaler Steinzeit anzumuten.</p>
<p>
<a href="http://twitter.com/necolas">Nicolas</a> Idee beruht darauf, dass er bis zu 4 Pseudoelemente erzeugt, die er innerhalb der Liste absolut positioniert. Haupts&#228;chlich werden die R&#228;nder der neuen Elemente gebogen und gedreht, um typische Icons damit zu erzeugen. Es geht nicht in alten Internet Explorern, funktioniert aber problemlos in der kommenden Version 9, die mittels <code>-ms</code> auch CSS-Transformationen beherrscht.</p><p> Bei der Konzeption einer heutigen Website muss noch ber&#252;cksichtigt werden, dass mit Opera einer der wichtigsten Mobilbrowser <code>border-radius</code> noch nicht interpretiert. Wohl deshalb kennzeichnet der Erfinder seinem Vorschlag noch als experimentell.</p>


  <p>Wer in der beeindruckenden Vielfalt noch etwas vermisst, findet gen&#252;gend Anregungen f&#252;r eigene Experimente:</p>
<code><pre>/* PAGE CURL */
/* a rectangle, border-radius should hide the topright corner */
.page a:before {
    left:5px;
    width:8px;
    height:12px;
    border:2px solid #c55500;
    -moz-border-radius-topright:7px
    -webkit-border-top-right-radius:7px;
    border-top-right-radius:7px;
    background:transparent;
}

/* a triangle with position on the top right corner of the rectangle */
.page a:after {
    left:11px;
    border-width:3.5px;
    border-style:solid;
    border-color:transparent transparent #c55500 #c55500 ;
    margin-top:-10px;
    background:transparent;
}

/* lines on the page*/
.page:after {
    left:8px;
    width:5px;
    height:1px;
    margin-top:-2px;
    border-top:2px double;
    border-bottom: 2px double;
    border-color:#c55500;
    background:transparent;
}

.page a:hover:before,
.page a:focus:before,
.page:hover:after,
.page a:active:before {
    border-color:#730800;
    background:transparent;
}

.page a:hover:after,
.page a:focus:after,
.page a:active:after {
    border-color:transparent transparent #730800 #730800;
}
</pre></code>
<p>Mein Icon stellt ein stilisiertes Blatt mit umgeknickter Ecke dar. Nicolas Idee l&#228;sst sich auch auf andere HTML-Elemente &#252;bertragen, wie die </p>
<p class="attention"><a href="http://labs.pixelfans.de/css-gui-icons/login.html">Demo einer Loginbox</a></p>
<p>ohne Bilder zeigt. Seine Idee ist damit ein Meilenstein, der das Weblayout &#228;hnlich voranbringen wird, wie 2003 die <a href="http://www.alistapart.com/articles/slidingdoors/">"Sliding Doors"</a>.</p>
      ]]></content>
    </entry>

    <entry>
      <title>Pack die CSS Datei ein</title>
      <link rel="alternate" type="text/html" href="http://www.pixelfans.de/pack-die-css-datei-ein/" />
      <id>tag:pixelfans.de,2010:/1.53</id>
      <published>2010-12-23T16:34:10Z</published>
      <updated>2010-12-23T17:42:30Z</updated>
      <author>
            <name>Pawel</name>
            <email>pawel@pixelfans.de</email>
                  </author>

      <category term="CSS"
        scheme="http://www.pixelfans.de/category/css/"
        label="CSS" />
      <content type="html"><![CDATA[
        <p>Bei einem <abbr title="Content Managment system">CMS</abbr> ist <a href="http://turbine.peterkroener.de">Turbine</a> ein viel versprechender Ansatz, die Arbeit mit <abbr title="Cascading Style Sheets">CSS</abbr>-Dateien zu optimieren. F&#252;r eine kleine Seite ist diese Variante ein bisschen "<span lang="en">oversized</span>". 
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>SVG Present</title>
  <defs>
    <g id="giftbox" transform="scale(2)"><title>Das Paket verkleinert sich bei einem Klick!</title><animateTransform begin="click" attributeName="transform" attributeType="XML"
      type="scale" from="2" to=".6" dur="5s" fill="freeze" />
      <path fill="#e33" d="m0,0 36,12 48,-12 -36,-12z"/>
      <path fill="#c22" d="m36,12 48,-12 0,48 -48,12z"/>
      <path fill="#a11" d="m0,0 36,12 0,48 -36,-12z"/>
      <path fill="#1a1" d="m15,5 6,2 0,48 -6,-2z"/>
      <path fill="#3e3" d="m15,5 48,-12 6,2 -48,12z"/>
      <path fill="#3e3" d="m20,-5 36,12 8,-2 -36,-12z"/>
      <path fill="#2c2" d="m56,7 0,48 8,-2 0,-48z"/>
    </g>
  </defs>
  <use xlink:href="#giftbox" x="30" y="40" />
 </svg>
Um eine Optimierung kommt man aber auch hier nicht herum, wenn einem die Performance der Seite nicht v&#246;llig egal ist.</p>
<p>Eine einfache Variante ist das Komprimieren der Datei(en). Diese Variante verwende ich bei meiner <a href="http://www.batik-gbr.de">Batik</a>-Seite.</p>
 <p>Die Javascriptdatei und das Stylesheet liegen auf einer Subdomain gemeinsam mit folgender .htaccess:</p>
<p><strong>.htaccess (Auszug)</strong>
<pre><code>RewriteCond %{HTTP:Accept-Encoding} .*gzip.*
RewriteRule ^js/(.*)\.js$ /js/$1.js.gz [L]
RewriteRule ^css/(.*)\.css$ /css/$1.css.gz [L]
</code></pre>
Im Verzeichnis <strong>css</strong> befinden sich 2 Dateien, Die unkomprimierte Variante enth&#228;lt die bekannte Endung <code>*.css</code> und die komprimierte Datei <code>*.css.gz</code>. Diese sind unter Linuxsystemen recht schnell erzeugt. Die Anweisungen in der <code>.htaccess</code> sorgen daf&#252;r, dass nur Browser die <a href="http://de.wikipedia.org/wiki/Gzip">gzip</a> verstehen, die komprimierte Variante ausgeliefert bekommen.</p>
<p>Das gleiche gilt analog auch f&#252;r die Javascriptdateien.</p>
      ]]></content>
    </entry>

    <entry>
      <title>Feature detection f&#252;r SVG</title>
      <link rel="alternate" type="text/html" href="http://www.pixelfans.de/feature-detection-fuer-svg/" />
      <id>tag:pixelfans.de,2010:/1.52</id>
      <published>2010-11-28T10:04:10Z</published>
      <updated>2010-12-27T08:59:34Z</updated>
      <author>
            <name>Pawel</name>
            <email>pawel@pixelfans.de</email>
                  </author>

      <category term="Ideen"
        scheme="http://www.pixelfans.de/category/ideen/"
        label="Ideen" />
      <category term="JS"
        scheme="http://www.pixelfans.de/category/js/"
        label="JS" />
      <content type="html"><![CDATA[
        <p>F&#252;r den letzten Blogeintrag &#252;ber Twitter habe ich auf die Grafik des Vogels bei openclipart.org verlinkt. Sieht man sich diese Grafik mit Safari oder dem IE9 an, sieht sie ziemlich schlecht aus.<a rel="shadowbox" href="http://farm5.static.flickr.com/4088/5214129312_9254a76181_b.jpg" title="Twitterbird ohne Filter"><img src="http://farm5.static.flickr.com/4088/5214129312_9254a76181.jpg" alt="Twitterbird without Filter" /></a> Das liegt daran, dass diese Browser bisher <code>filter</code> &#252;berhaupt nicht interpretieren. Dadurch sparen sie erhebliche Rechenzeit, erschweren damit aber selbst einfachste grafische Effekte. Das es besser geht zeigt, wieder einmal Chrome, der schnell bleibt und in der Interpretation von <code>filter</code> jetzt zu Opera und Firefox aufschlie&#223;t.</p>
<p>F&#252;r die Grafik bei openclipart.org ist das ohne Belang, da Inkscape und andere Programme selbstverst&#228;ndlich diese F&#228;higkeiten haben und langfristig (bis Ende 2011) Safari und der Internet Explorer darum nicht herum kommen. Will man die Grafik heute im Web einsetzen, kann man nat&#252;rlich diese Pfade weglassen, was ich auch getan habe. Eine andere M&#246;glichkeit ist eine Browserweiche, welcher die Pfade nur dann  ausblendet, wenn die Eigenschaft vom Browser nicht unterst&#252;tzt wird. (feature detection)</p> <p> Es soll nicht darum gehen, bestimmte Browser &#252;ber ihren <abbr title="User Agent">UA</abbr>-String zu erkennen, sondern zu testen, ob sie die gew&#252;nschten <em>F&#228;higkeiten</em> haben. Daf&#252;r scheint ein in das Dokument  integriertes Script, welches <code>.hasFeature()</code> nutzt, wie geschaffen. Das klappt auch recht gut, um Animationen zu erkennen, wie das <a href="http://www.heise.de/ct/Redaktion/heb/svg/svg-auge_js.svg">c't-Beispiel</a> zeigt.</p>
<p>Leider funktioniert das bei der Erkennung von SVG-Filtern, bisher nur in Opera. Folgende L&#246;sung ist durch Anregung der <a href="http://tech.groups.yahoo.com/group/svg-developers/">SVG-Developer-Liste</a> und von <a href="http://datenverdrahten.de">Thomas Meinike</a> entstanden:</p>
<code><pre>function noFilter() {
  document.getElementById("highlight").setAttribute("opacity",0);
  document.getElementById("highlightwing").setAttribute("opacity",0)
}
function init() {
var fsupport = ((document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Filter", "1.1")) || (!!document.createElementNS &amp;&amp; /SVGFE/.test(toString.call(document.createElementNS('http://www.w3.org/2000/svg','feGaussianBlur')))))? true : false; 
if (!fsupport) noFilter();
}
document.addEventListener("DOMContentLoaded", init, false);
</pre></code>

<p>Das Script wird beim Laden der Seite aufgerufen und setzt die Sichtbarkeit der "verwischten" Bereiche auf 0. Den kryptische Teil der init-Funktion, der von <a href="http://my.opera.com/MacDev_ed/blog/">Erik Dahlstr&#246;m</a> stammt, will ich kurz erkl&#228;ren:</p>
<p><code>(toString.call(document.createElementNS('http://www.w3.org/2000/svg','feGaussianBlur')))</code></p>
<p>Call ruft eine Funktion auf, die ein Objekt erstellt, die den Verwischen-Filter enth&#228;lt. Das gelingt nat&#252;rlich nur, wenn der Browser das auch unterst&#252;tzt. Deshalb kann mit dem regul&#228;ren Ausdruck</p>
<p><code>/SVGFE/</code></p>
<p>&#252;berpr&#252;ft werden, ob dieser enthalten ist. Dies erledigt <code>.test</code>. Wenn es keine &#220;bereinstimmung gibt, wird die Funktion <code>noFilter()</code> aufgerufen. </p>
<p class="attention"><a href="http://labs.pixelfans.de/featuredetect/Twitterbird3_withJS.svg">Demo des Twittervogels mit Featureerkennung</a></p>
<p>Da sich Otto Normalnutzer eine Seite nicht mit unterschiedlichen Browsern ansieht, wird die <em>feature detection</em> nur auf den Verwischen-Filter angewandt, um eine St&#246;rung des grafischen Effekts zu verhindern. Nat&#252;rlich wird der Effekt, der die Federn simulieren soll, auch nicht angewandt.</p>
<p><strong>Erg&#228;nzung</strong> (01.12.2010:)</p>
<p> Die <a href="http://www.pixelfans.de/comments/feature-detection-fuer-svg/">Anregung</a> von <a href="http://twitter.com/molily">@molily</a> habe ich aufgegriffen:</p>
<code><pre>function init() {
var fsupport = ((document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Filter", "1.1")) || (typeof document.createElementNS('http://www.w3.org/2000/svg','feGaussianBlur').setStdDeviation == 'function'))? true : false; 
if (!fsupport) noFilter();
</pre></code>
<p>Hier liegt der Clou darin, dass das erzeugte Obkekt daraufhin &#252;berpr&#252;ft wird, ob eine bestimmte Funktion existiert. F&#252;r den <code>blur</code>-Filter muss es eine Standardabweichung geben.</p>
<p class="attention"><a href="http://labs.pixelfans.de/featuredetect/Twitterbird4_withJS.svg">verbesserte Demo des Twittervogels</a></p>
      ]]></content>
    </entry>


</feed>
