ek

Beiträge zum Thema JS, HTML, CSS & anderem Kram

Postwurfsendungen gehören zum festen Marketing-Kanon von Kabel Deutschland. Die dafür nötigen Adressen werden (u.a.?!) von der AZ Direct GmbH aus Gütersloh gekauft, die sich auf das Handeln mit Adressen verlegt hat. Grundsätzlich kann man sich darüber streiten, welchen betriebswirtschaftlichen Nutzen das Belästigen unbescholtener Bürger mit Briefwerbung hat, aber das würde den Rahmen sprengen.

Kabel Deutschland

Interessanter ist, dass meine Daten bei der AZ Direct GmbH vorliegen (scheinbar habe ich irgendwann im Netz ein Häkchen zu wenig weg gemacht…) und ich deshalb in den Genuss regelmäßiger Postwurfsendungen durch Kabel Deutschland gekommen bin. Kuriose Angelegenheit, dachte ich bei mir. Wenn sie sicherstellen wollen, dass ich niemals Kunde bei ihnen werden, können sie sich wohl damit rühmen, die nötigen Schritte unternommen zu haben.

Und um dem Terror Einhalt zu gebieten, habe ich mich an den Kundenservice gewandt und darum gebeten, meine Daten zu löschen. Schließlich haben sie ausreichend sichergestellt, dass ich keinen Vertrag mehr bei ihnen unterschreiben werden - jede weitere Postwurfsendung wäre somit verschwendetes Geld. Außerdem interessierte mich, was hinter der markigen Ansage im Kleingedruckten der Werbebriefe steckte:

Wir bieten volle Transparenz über die Verarbeitung ihrer Daten und ihr Recht auf Werbewiederspruch: …

Dazu noch Internet- und Email-Adresse, sowie Telefonnummer des Kundenservice, wo man den Werbe-Schwachsinn zu beiderseitigem Vorteil beenden kann. Obendrein der Hinweis, wo die Daten erworben wurden und dass alles rechtmäßig und im Sinne des Datenschutzes stattgefunden hat.

Die Antwort kam auch keine 12 Stunden später um 7 Uhr in der Frühe: Meine genauen Daten würden fehlen und…

Unser Vorschlag: Bitte schicken Sie uns Ihre Anfrage noch einmal mit diesen Daten. Dann kümmern wir uns selbstverständlich sofort darum. Vielen Dank!

"Shame on me!" dachte ich mir, ich muss den guten Leuten natürlich auch was geben, womit sie arbeiten können. Also hurtig - zwei Stunden später - eine Antwort verfasst und meine genauen Daten hingeschickt. Etwas mulmig war mir zwar schon dabei zumute, da sie jetzt wissen würden, dass die Werbebriefe auch wirklich ankommen, aber ich beruhigte mich damit, dass ich an ein Unternehmen mit Sitz in Deutschland schreibe und nicht an das RBS oder an einen drittklassigen Spammer mit Sitz auf Honululu (No Offense!).

Es kam dann auch nichts mehr zurück, weshalb ich davon ausging, dass sie meine Daten zwar gelöscht hätten, aber aufgrund meines Unwillens eingeschnappt seien und deshalb auf eine abschließende Email verzichten und mich mit Ungnade und Nichtbeachtung strafen würden. Sind ja schließlich auch nur Menschen dort bei Kabel Deutschland.

Doch hatte ich mich zu früh gefreut. Heute kam wieder der Standard-Werbebrief reingeflattert:

Kabel Deutschland, bla bla, alles doppelt so schnell und gratis für 22,90 Euro, bla blub, Gratis-Installation, sülz, kostenloser Anruf, fasel, Sparen und Susanne May. Kundenkommunikation!

Man kann sich vorstellen, dass ich einigermaßen überrascht war. Ich muss auch zugeben, dass ich diesen Artikel schreibe, bevor ich mich ein drittes mal an den Kundenservice wende und höflichst um das klein gedruckte Bisschen Transparenz bitte. Ich muss zu meiner Verteidigung allerdings sagen, dass ich nicht davon ausgehe, dass Kabel Deutschland es dieses mal schaffen wird, der Bitte um Löschung meiner Daten nachzukommen. Von daher habe ich keine Eile.

Nur ein paar offene Worte an Frau Susanne May möchte ich an dieser Stelle loswerden:

Erschütternd schlechte Arbeit, die sie und ihr Team da leisten. Hängen sie von mir aus dem Luftschloss nach, mit Brief-Werbe-Terror könnte man Kunden gewinnen, aber vergraulen sie doch nicht so fahrlässig Neukundschaft. Oder ist mir entgangen, dass Kabel Deutschland längst mit Abstand Marktführer ist und sie durch diese Flut an sinnlosen Briefen lediglich versuchen ihre Stelle zu rechtfertigen und so der Arbeitslosigkeit zu entgehen?

Update (10.8.2012):

Heute erhielt ich einen Anruf von der von Kabel Deutschland beauftragten PR-Agentur. Die berüchtigte Postwurfsendung scheint nicht nur mir ein Dorn im Auge zu sein, sondern auch zahlreichen anderen Menschen. Diese wiederum haben dankbar zu den in den Kommentaren eingetragenen Telefonnummern der Kabel-Deutschland-Vorstände gegriffen und sich mal anständig den Ärger von der Seele telefoniert.

Daher wurde ich gebeten, die Nummern zu entfernen. Der Bitte bin ich selbstverständlich nachgekommen. An dieser Stelle gibt es also leider keinen “direkten Draht” mehr in die Vorstandsetage von Kabel Deutschland. Trotzdem weiterhin viel Glück beim Kampf gegen das sinnlose Versenden von Totholz!

Heute möchte ich kurz zeigen, wie man mit etwas HTML, CSS und ein paar kleinen GIF-Grafiken eine pixelige Seiten-Navigation im 8Bit-Stil baut. Außerdem benutzen wir etwas jQuery-Magic, um der Navigation noch Fly-Out-Menus zu spendieren.

8Bit-Style-Navigation mit Fly-Out-Menus

Beginnen wir wie gewohnt mit dem HTML-Teil:

HTML
<div id="nav">
  <ul>
    <li class="top">
      <a href="index.html">
        <strong>Home</strong>
      </a>
      <div class="sub">
        <div>
          <ul>
            <li>
              <a href="#">Sub-Item 1</a>
            </li>
            <li>
              <a href="#">Sub-Item 2</a>
            </li>
            <li>
              <a href="#">Sub-Item 3</a>
            </li>
            <li>
              <a href="#">Sub-Item 4</a>
            </li>
            <li>
              <a href="#">Sub-Item 5</a>
            </li>
          </ul>
        </div>
      </div>
    </li>
    <li class="top">
      <a href="#">
        <strong>About</strong>
      </a>
      <div class="sub">
        <div>
          <ul>
            <li>
              <a href="#">One Sub-Item</a>
            </li>
            <li>
              <a href="#">Another Sub-Item</a>
            </li>
            <li>
              <a href="#">Still a Sub-Item</a>
            </li>
          </ul>
        </div>
      </div>
    </li>
    <li>
      <a href="#">
        <strong>Contact</strong>
      </a>
    </li>
  </ul>
</div>

Wie gewohnt eine ungeordnete Liste für die Haupt-Navigation und jeweils eine für die Sub-Navigationen. Um die charakteristischen Ecken hinzubekommen, müssen zwei Elemente ineinander verschachtelt und gegeneinander verschoben werden. Das macht den Quelltext Tag-intensiver. In meinen Augen jedoch noch in einem vertretbaren Rahmen und weit entfernt von klassischer "Diveritis".

Als nächstes kommen wir zum CSS:

CSS
@font-face {
  font-family: 'SilkscreenNormal';
  src: url('slkscr-webfont.eot');
  src: local('☺'), url('slkscr-webfont.woff') format('woff'), url('slkscr-webfont.ttf') format('truetype'), url('slkscr-webfont.svg#webfontUx1SMfhe') format('svg');
  font-weight: normal;
  font-style: normal;
}

ul {
  list-style: none;
}

body {
  background-color: #FFF;
  color: #333;
  font: normal 13px SilkscreenNormal, sans-serif;
}

#nav,
#nav > ul,
#nav > ul > li {
  float: left;
  display: inline;
}

#nav,
#nav > ul {
  width: auto;
  _width: 1%; /* IE6 Hack */
  height: 32px;
}

#nav {
  margin: 50px;
  position: relative;
  border-width: 2px 0;
  border-style: solid;
  border-color: #666;
}

#nav > ul {
  position: relative;
  left: -2px;
  margin-right: -4px;
  padding: 0 10px;
  border-width: 0 2px;
  border-style: solid;
  border-color: #666;
  background: url('data:image/gif;base64,R0lGODlhBAAEAIAAAP///73n/yH5BAAAAAAALAAAAAAEAAQAAAIGTACGqBkFADs=') 0 0 repeat;
  *background: url('img/tile1.gif') 0 0 repeat; /* IE6 and IE7 can't handle data uris */
}
		
#nav > ul > li {
  _width: 1%; /* IE6 Hack */
  margin: 3px 5px;
  position: relative;
}
			
#nav > ul > li > a {
  display: block;
  position: relative;
  width: auto;
  height: 22px;
  border-width: 2px 0;
  border-style: solid;
  border-color: #999;
  background-color: #FFF;
}
				
#nav > ul > li > a:link,
#nav > ul > li > a:visited {
  color: #999;
  text-decoration: none;
  background: url('data:image/gif;base64,R0lGODlhBAAEAIAAAP/////fvSH5BAAAAAAALAAAAAAEAAQAAAIGTACGqBkFADs=') 0 0 repeat;
  *background: url('img/tile2.gif') 0 0 repeat; /* IE6 and IE7 can't handle data uris */
}
				
#nav > ul > li > a:hover,
#nav > ul > li > a:focus,
#nav > ul > li > a:active {
  color: #666;
  background-image: url('data:image/gif;base64,R0lGODlhBAAEAIAAAP/////MmSH5BAAAAAAALAAAAAAEAAQAAAIGTACGqBkFADs=');
  *background-image: url('img/tile3.gif'); /* IE6 and IE7 can't handle data uris */
				}
				
#nav > ul > li > a strong {
  display: block;
  position: relative;
  width: auto;
  height: 22px;
  padding: 0 10px;
  line-height: 22px;
  left: -2px;
  margin-right: -4px;
  border-width: 0 2px;
  border-style: solid;
  border-color: #999;
}
					
#nav > ul > li.top > a > strong {
  padding-left: 21px;
  background: url('data:image/gif;base64,R0lGODlhBgAEAIABAJmZmf///yH5BAEAAAEALAAAAAAGAAQAAAIHhI8WocuwCgA7') 5px center no-repeat;
  *background: url('img/arrow.gif') 5px center no-repeat; /* IE6 and IE7 can't handle data uris */
}
					
#nav > ul > li > a:hover,
#nav > ul > li > a:hover strong,
#nav > ul > li > a:focus,
#nav > ul > li > a:focus strong {
  border-color: #666;
}
				
#nav > ul > li.top > a:hover strong,
#nav > ul > li.top > a:focus strong {
  background-image: url('data:image/gif;base64,R0lGODlhBgAEAIABAGZmZv///yH5BAEAAAEALAAAAAAGAAQAAAIHhI8WocuwCgA7');
  *background-image: url('img/arrow_hv.gif'); /* IE6 and IE7 can't handle data uris */
}
				
#nav > ul > li > a:active {
  top: 1px;
}
				
.sub {
  position: absolute;
  width: auto;
  top: 24px;
  left: 0;
  padding-top: 9px;
  display: none;
}
				
.sub div {
  position: relative;
  border-top: 2px solid #666;
  border-bottom: 2px solid #666;
}
					
.sub div ul {
  position: relative;
  left: -2px;
  margin-right: -4px;
  border-left: 2px solid #666;
  border-right: 2px solid #666;
  background: url('data:image/gif;base64,R0lGODlhBAAEAIAAAP///+7u7iH5BAAAAAAALAAAAAAEAAQAAAIGTACGqBkFADs=') 0 0 repeat;
  *background: url('img/tile4.gif') 0 0 repeat; /* IE6 and IE7 can't handle data uris */
}
						
.sub div ul li {
 border-top: 2px solid #666;
}
							
.sub div ul li:first-child {
  border-top: none;
}
						
.sub div ul li a {
  display: block;
  padding: 0 10px;
  line-height: 22px;
  font-size: 12px;
  white-space: nowrap;
}
								
.sub div ul li a:link,
.sub div ul li a:visited {
  color: #666;
}
								
.sub div ul li a:hover,´
.sub div ul li a:focus {
  background: url('data:image/gif;base64,R0lGODlhBAAEAIAAAP///93d3SH5BAAAAAAALAAAAAAEAAQAAAIGTACGqBkFADs=') 0 0 repeat;
  *background: url('img/tile5.gif') 0 0 repeat; /* IE6 and IE7 can't handle data uris */
}
								
.sub div ul li a:active {
  background: url('data:image/gif;base64,R0lGODlhBAAEAIAAAP///8zMzCH5BAAAAAAALAAAAAAEAAQAAAIGTACGqBkFADs=') 0 0 repeat;
  *background: url('img/tile6.gif') 0 0 repeat; /* IE6 and IE7 can't handle data uris */
}

Als erstes binde ich den Pixel-Font "SilkScreen von Jason Kottke ein. Danach folgen die Angaben für die Navigation.

Interessant ist dabei, dass selbst das äußere Element <div id="nav"> die Angabe float: left hat, damit es sich der Breite des Inhalts anpasst. Das kann zu Layout-Problemen führen, weshalb man im praktischen Einsatz darauf achten muss, das Element direkt unterhalb der Navigation mit einem clear: left zu versehen.

Des weiteren kann man sehen, wie die charakteristischen Ecken zustande kommen: Das äußere Element hat jeweils unten und oben eine zwei-Pixel-starke border und das innere jeweils links und rechts. Das innere Element wird dann per left: -2px und margin-righ: -4px um jeweils zwei Pixel nach links und rechts aus dem umgebenden Element hinaus gezogen. Schon ist der gewünschte Effekt da.

Ebenfalls erwähnenswert sind die Grafiken. Da diese nur 4x4 Pixel bzw. 4x6 Pixel groß sind, lohnt es sich, sie in Form von Data URIs einzubinden und so unnötige HTTP Requests zu sparen. Blöderweise können IE6 und IE7 damit nicht umgehen, weshalb die richtigen Grafiken ebenfalls eingebunden werden müssen. Diese werden dann mithilfe des Star-Hack den beiden Browsern zugewiesen.

Bilder in Data URIs umwandeln könnt ihr übrigens mit diesem Online-Tool.

Zum Schluss noch etwas jQuery um die Fly-Out-Menu-Funktionalität zu realisieren:

JavaScript
$(document).ready( function() {
  $('#nav li.top').hover( function() {
    $(this).find('div').stop(true, true).fadeIn('slow');
  }, function() {
    $(this).find('div').stop(true, true).fadeOut('slow');
  });
});

Ich denke, das ist die spartanischste Lösung und bedarf keiner weiteren Erläuterung.

Das war es auch schon. Die Navigation ist beliebig per Copy&Paste erweiterbar, denkt nur daran, den li-Elementen, die eine Sub-Navigation beinhalten, die Klasse top zu verpassen, damit die Fly-Out-Menu-Funktionalität gewährleistet ist.

Ansonsten wünsche ich viel Spaß mit der Navigation. Bei Fragen bitte wie immer die Kommentar-Funktion nutzen. Und bei Gefallen fleißig via Twitter und Facebook verbreiten. Vielen Dank :-)

Herr Cario hat es ja schon vor einiger Zeit vorgemacht und mich spontan überzeugt - am besten kürzt man URLs selbst. Ich hatte mir deshalb gleich die Domain klg.bz besorgt, aber erst hinterher festgestellt, dass ich diese gar nicht per DNS-Eintrag mit meinem goneo-Webspace verknüpfen kann.

Zwar bietet goneo einen DNS-Editor, doch der ist relativ nutzlos, da man keine neuen Domains anlegen kann und deshalb auf die beschränkt ist, die man in seinem goneo-Paket hat. Da stand ich also mit der schönen, kurzen Domain und hatte keinen Platz, um den URL-Shortener zu installieren.

Geholfen hat mir dann zum Glück Robert, der mir Platz auf seinem HostEurope-Webspace freigeschaufelt hat. Dafür nochmal vielen Dank!

Was die technischen Details anbelangt, habe ich mich ganz an Herrn Cario gehalten und yourls genutzt. Dazu kann ich allerdings noch nicht viel sagen, da ich es erst heute morgen aufgespielt habe. Das wiederum hat aber gut funktioniert und auch sonst bin ich guter Dinge, dass das Tool seinen Dienst verrichten wird.

Momentan werden überall stolz die Flattr-Einnahmen des Monats Juni präsentiert. Das sind mitunter recht beeindruckende Zahlen, bei denen mir wieder eingefallen ist, dass ich vor einiger Zeit einen Flattr-Invite bekommen habe. Blöderweise habe ich momentan eine Menge um die Ohren, weshalb hier gerade auch nicht viel läuft, aber diese Flattr-Geschichte wollte ich dann doch mal ausprobieren. So viel Zeit muss sein.

Flattr-Button

Also habe ich das Anmelde-Prozedere hinter mich gebracht, einen lächerlich geringen Betrag auf mein Flattr-"Konto" überwiesen, den HTML5-Search-Input-Beitrag von Peter Kroener geFlattr't und daraufhin die drei besucherstärksten Beiträge dieses Blogs bei Flattr gepostet. Den Button habe ich mithilfe von Frank Bueltges Anleitung in die Einzelansicht der Beiträge eingebaut und jetzt warte ich, was bei der ganzen Nummer rumkommt.

Mit den dreistelligen Beträgen vom lawblog oder von netzpolitik.org werde ich ganz sicherlich nicht mithalten können, aber Kleinvieh macht bekanntlich ja auch Mist. Und der Teufel scheißt sowieso nur auf die größten Haufen. Und hätt' der Hund nicht, hätt' er den Hasen…