Archiv für das Jahr: 2015

HTML: Sprungmarke mit abweichender Position vom Anker ansteuern

HTML Anker-Link springt zu weit - Sprungmarke verschieben

HTML Anker Position verschieben – Bild / Illustration 'HTML Anker' CC BY 3.0 DE T.Bortels/cpu20.de

HTML Anker („Sprungmarken“) sind ja so etwas wie das Urgestein des Webdesign. Damit lassen sich einfach direkt Positionen innerhalb eines HTML-Dokuments ansteuern. Klickt man auf einen Anker-Link, springt die geladene Seite direkt zum angesteuerten Bereich.

Seit einiger Zeit sind einseitige Layouts, sogn. One-Pager ja recht populär. Alle, oder zumindest die wichtigsten Inhalte werden dabei auf nur einer Seite dargestellt. Und mit den One-Pagern erleben Sprungmarken / Anker-Links gerade ein gewisses Comeback. Gerade für die Darstellung auf mobile Geräten (Smartphones) bietet die Kombination aus One-Pager und Anker-Navigation unter Umständen gewisse Vorteile. Vor allem: die Webseite muss nicht neu geladen werden.

Was aber, wenn man am oberen Fensterrand eine fixierte Navigationsleiste hat? Oder die Sprungmarke aus anderen Gründen verschoben werden soll? Dann muss der Sprung zum Anker gegebenenfalls korrigiert werden.

Wenn man nun direkt zum Anfang eines Absatzes oder einer Überschrift springt, kann das also etwas unschön aussehen, Die Seite springt direkt zum Anker, sodass der Anker, und der mit ihm verbundenen Inhalt dann direkt am oberen Ende des sichtbaren Bereichs sitzt. Ausserdem kann es bei fixierten Navigationsleisten zu Problemen kommen, Der angesprungene Inhalt ggf. von der fest positionierten Navigation überlagert wird. Mithilfe einer kleinen Anpassung ist das aber kein Problem.

Für ein Projekt musste ich neulich genau so eine Anpassung machen. Es gab nicht nur eine fixierte Navigationsleiste, sondern auch einen Weißraum oberhalb des Inhalts, der aus Design-Gründen nicht angeschnitten werden sollte. Der angesprungene Inhalte sollte also freistehend zu sehen sein und nicht am oberen Browserrand kleben. Insgesamt ging es um ein Offset von 100 Pixeln zwischen der Position der Sprungmarke und der eigentlich gewünschten Position.

Sprungmarke verschieben – Anchor-Offset in CSS

Mithilfe eines kleinen Tricks kann man sich da behelfen: der Anker-Punkt wird als freistehendes Element vor den Inhalt desetzt, den man eigentlich ansteuern möchte. Dann wird der Anker-Punkt innerhalb des angesteuerten Elements absolut positioniert (position: absolute;) und per CSS beliebig weit nach oben verschoben. Hier beispielhaft ein entsprechender Code-Schnippsel für ein Anchor-Offset von 100 Pixeln:

<div style="position:relative;">
    <div class="anchor" id="jump123" style="position:absolute; top:-100px;"></div>
    <div class = "mein_text">I should be 100px below where I currently am!</div>
</div>

HTML Anker in Masonry setzen

Ursprünglich benötigte ich die gute alte Sprungmarke für eine Bilder-Galerie, die die Bilder mithilfe des jQuery-Plugins Masonry organisiert. Die gute Nachricht: der oben beschrieben Trick funktioniert ganz reibungslos mit dem jQuery-Skript Masonry. Man setzt den Anker einfach in ein (leeres / unsichtbares) div-Element innerhalb des jeweiligen Containers (item) und verlagert die Position dann wie oben beschrieben um die gewünschte Pixelanzahl nach oben. Schon wird das angesteuerte Element beispielsweise ‚mittig‘ geladen. Die eigentliche Position kann je Bildschirmgröße und gewähltem Pixelabstand natürlich variieren.

PHP: Multidimensionalen Array beliebig umsortieren (array_multisort)

Um das Thema habe ich mich erfolgreich längere Zeit herumgedrückt – aber jetzt wollte ich es dann doch mal ganz genau wissen: Wie kann ich einen multidimentionalen Array beliebig umsortieren?

Häufig habe ich mit multidimentionalen Arrays zu tun – aber in den meisten Fällen reicht es, wenn ich schon bei der eigentlichen mySQL-Abfrage vorgebe, wie bzw. wonach der Array sortiert sein soll. Inzwischen sind ‚hier‘ aber auch ein paar komplexere geschichten am laufen, und ich will die mySQL-Abfrage nicht für jede abweichende Abfrage anpassen. Stattdessen will ich ‚lediglich‘ den Ergebnis-Array entsprechend bestimmter Vorgaben umsortieren.

Ein Beispiel: meine mySQL-Abfrage liefert mir folgendes Ergebnis:

Array
(
    [0] => Array
        (
            [id] => 369
            [name] => Peter
            [year] => 1969 
        )

    [1] => Array
        (
            [id] => 368
            [name] => Paul
            [year] => 1975
        )

    [2] => Array
        (
            [id] => 367
            [name] => Mary
            [year] => 1977
        )

)

Nun möchte ich den Array zum Beispiel nicht nach der ID, sondern alphabetisch nach dem Namen sortieren. Dafür kann man den Array folgendermaßen auseinandernehmen und dann mithilfe der PHP-Funktion array_multisort geziehlt umsortieren:

$sortArray = array();

        foreach($entryArray as $entry){
            foreach($entry as $key=>$value){
                if(!isset($sortArray[$key])){
                    $sortArray[$key] = array();
                }
                $sortArray[$key][] = $value;
            }
        } 
    $orderby = "name";
    array_multisort($sortArray[$orderby],SORT_ASC,$entryArray); 
    
return $entryArray;

in diesem Fall ist $entryArray mein ursprünglicher Array, der das Ergebnis der mySQL-Abfrage beinhaltet. Das sieht vielleicht erst mal etwas kryptisch aus, funktioniert letztendlich aber erstaunlich problemlos. Nach dem Umsortieren bekomme ich also folgenden Array:

Array
(
    [0] => Array
        (
            [id] => 367
            [name] => Mary
            [year] => 1977 
        )

    [1] => Array
        (
            [id] => 368
            [name] => Paul
            [year] => 1975
        )

    [2] => Array
        (
            [id] => 369
            [name] => Peter
            [year] => 1969
        )

)

Sehr praktisch.

Siehe auch:

  • PHP-Handbuch > Funktionsreferenz > … > Array Funktionen > array_multisort

Umlaut-Punkte Ä zu nah am Buchstaben (Mac-Firefox)

Das Problem tritt zunächst nur in Firefox (40 und 41) auf Mac OS auf: die Umlaut-Punkte des großen Ä sind zu nah am Buchstaben – die Punkte haben keine ‚Luft‘, keinen Abstand zum „A“, der Letter sieht ‚matschig‘ aus. In Chrome und Safari tritt das Problem nicht auf – die Umlaut-Punkte haben genug Abstand zum eigentlichen Buchstaben.

A-Umlaut-Punkte zu nah am A

Ich verwende die Webfont „MuseoSans“ – aber auch bei Verwendung der Webfont „Equip-Light“ tritt dasselbe Problem auf. Bei Verwendung von „Helvetica“ sieht hingegen alles normal aus.

Das Problem ist auch nicht wirklich bei den Umlauten Ö und Ü zu beobachten – das liegt aber ggf. nur an der ‚Architektur‘ der Lettern. Ausserdem tritt das Problem nur dann auf, wenn der Letter per CSS text-transform: uppercase; quasi künstlich zum Großbuchstaben gemacht wird. Bei natürlichen Großbuchstaben tritt das Problem nicht auf – der Buchstabe wird korrekt gerendert.

Meine Vermutung zur Ursache des Problems:

die Webfont und/oder Firefox sind nicht sauber programmiert (bzw. gebaut).

Vorübergehender Lösung des Problems:

Überschriften und Zwischenüberschriften, die eigentlich per CSS text-transform: uppercase; formatiert sein sollten, werden nun im CMS direkt in Großbuchstaben eingegeben. Im Code und im kopf ist das nicht wirklich die schönste Lösung,  aber auf der Webseite sieht es nun richtig aus.

Update:

Das Problem scheint (mal wieder) mit einem falsch formatierten PDF-Dokument zusammenzuhängen. Wenn man die Umlaute ‚einfach‘ neu schreibt, also die korrupten Umlaute ‚über-bügelt‘, ist das Problem behoben. Alternativ kann man den text über Text-Edit kopieren – allerdings scheint das nicht immer das Problem zu beheben.

Anmerkung: Dies ist eigentlich nur eine Notiz um das Problem und den dazu passenden Lösungsansatz festzuhalten. Im Laufe der Zeit werde ich diesen Beitrag dann hoffentlich auch wieder mit weiteren Lösungsansätzen vervollständigen können, so dass das ganze dann in Zukunft auch anderen bei der Problemlösung hilft.

WordPress: Bildgröße ändern, Bilder neu berechnen lassen

Wordpress: Bildgröße ändern

Bildgröße ändern in WordPress – Foto / Montage: T.Bortels/cpu20.de

Ein Klassiker: die in WordPress voreingestellte Bildgröße ist beispielsweise 1024 Pixel Breite. Zunächst ist das auch vollkommen ok so, man baut die neue Seite auf, Inhalte werden eingepflegt, Bilder hinzugefügt und mit der Voreinstellung automatisch auf 1024 Pixel Breite skaliert. Dann kommt aber zum Beispiel eine Bildergalerie hinzu und man möchte die Bilder größer darstellen, als es vom Theme vorgesehen ist. Die Bilder sollen zum Beispiel in einer Lightbox in 1200 Pixel Breite angezeigt werden – alle Bilder sind aber auf 1024 Pixel Breite skaliert. Was tun?

Unter Einstellungen > Medien läßt sich die Bildgröße in WordPress natürlich auch nachträglich sehr einfach neu festlegen. Dazu gibt man unter „groß“ (bzw. „large“) einfach die gewünschte neue Bildgröße ein. Im folgenden Beispiel habe ich die Bildgröße auf 1800 Pixel Breite geändert.

Bildgrösse ändern – WordPress Einstellungen

Allerdings ändert das zunächst nichts an der bestehenden Seite bzw. an den bereits eingebauten und fertig skalierten Bildern. Die bereits hochgeladenen Fotos liegen weiterhin in den zuvor eingestellten Größen vor. Und auch wenn man ein bereits vorhandenes Bild in der Medienübersicht aufruft, wird weiterhin nur die alte Breite angeboten. Dabei muss man verstehen, dass sich die Option zur Änderung der Bildgröße an dieser Stelle auf die bereits vorhandenen Bilder bezieht. Bei ‚alten Bildern‘ wird also weiterhin die ‚alte Größe‘ angeboten – bei ’neuen Bildern‘ hingegen wird die ’neue Größe‘ angeboten.

Wordpress Bild-Details – Bildgröße anpassen

Man könnte jetzt alternativ die neue Größe manuell auf ‚individuelle Größe („Custom Size“) umstellen. Damit wird aber nur die Darstellung des Bildes und nicht die eigentliche Größe des Bildes verändert. Kleine Bilder werden dementsprechend ‚aufgeblasen‘ und es kommt zu unschönen Unschärfe-Effekten. Stattdessen sollte man lieber alle bereits eingepflegten Bilder neu rendern lassen. Und mit einem passenden Plugin lässt sich das auch ganz einfach machen.

Bildgröße ändern, Bilder neu berechnen lassen

Mit dem (kostenlosen) Plugin Regenerate Thumbnails kann man schon ziemlich komfortabel alle Bilder auf einmal neu generieren lassen. Allerdings empfiehlt sich diese Methode nur, wenn man bislang noch nicht allzu viele Bilder im Bereich Medien angehäuft hat. Das Plugin berechnet meines Wissens nach nämlich alle Bilder auf einmal – die vermutlich schnellste Methode, aber auch ein wenig riskant, da diese Methode ziemlich Resourcen-Intensiv ist.

Ein bisschen langsamer aber dafür auch Resourcen-schonender ist das Plugin AJAX Thumbnail Rebuild. Wie der Name schon andeutet, verwendet dieses Plugin AJAX um die Bilder neu berechnen. Einfach zunächst wie oben beschrieben die Bildgröße ändern und anschliessend das Plugin die Bilder neu rendern lassen. Einmal gestartet wird ein Bild nach dem anderen in allen gewählten Größen neu skaliert. Das kann je nach Anzahl der zu berechnenden Bilder natürlich ein wenig dauern, läuft aber zuverlässig durch – und der Server wird geschont.

Silbentrennung mit CSS: Zeilenumbruch mit Hyphens regeln

Silbentrennung mit CSS

Silbentrennung mit CSS - Foto / Screenshot: T.Bortels/cpu20.de

Webdesign funktioniert zurzeit leider noch komplett anders, als Buchdruck: die Möglichkeiten den Schriftsatz zu kontrollieren und je nach Bedarf zu beeinflussen sind gering, um es mal vorsichtig auszudrücken. Aber so langsam kommt ein wenig Schwung in die Online-Typografie – inzwischen ist Silbentrennung nicht nur mit Desktop-Software möglich, sondern auch auf Webseiten. Man kann zwar insbesondere bei responsiven Layouts kaum regeln, an welcher Stelle ein Zeilenumbruch erfolgt – aber immerhin kann man einige Rahmenbedingungen definieren, nach denen umgebrochen wird. Manche Leute nennen das „HTML Silbentrennung“ aber eigentlich handelt es sich um „CSS Silbentrennung„.

Aktuelle Browser können inzwischen so einiges, was früher nur mithilfe von Bildern oder Skripten möglich war – zum Beispiel Webfonts anzeigen. Und HTML bzw. CSS bietet inzwischen eine Reihe von Möglichkeiten, das Schriftbild dieser Webfonts zu beeinflussen – zu gestalten. Relative Schriftgrößen (em / rem), Zeilenabstand (line-height) und die Laufweite ‚Kerning‘ (letter-spacing) sollten inzwischen selbstverständlich in die Werkzeugkiste jedes Webdesigners gehören.

In der Vergangenheit war es aber nach wie vor schwierig, den Zeilenumbruch bzw. die Silbentrennung zu kontrollieren. Man war halbwegs hilflos und mußte quasi zusehen, wie das schöne mit Blindtext gefüllte Design durch echte Inhalte ‚ruiniert‘ wurde. Lange Wörter sprengten mal das Layout oder führten zu langen ‚Einbrüchen‘ – Silbentrennung mit CSS war nicht oder nur in wenigen Browsern möglich.

Und für den Kunden war dieser Umstand dann häufig auch eine böse Überraschung, die in langen Email-Dialogen diskutiert werden musste – und auch heute noch diskutiert wird. Und gerade für Typografen und jeden, dem das Satzbild wichtig ist, dürfte das Internet nach wie vor wie ein Gruselkabinett der Typografie vorkommen. Trotz Besserung durch CSS und JavaScript hat man nach wie vor kaum Kontrolle darüber, wie und wo ein Text nun wirklich umbricht.

Silbentrennung  mit ‚hyphens‘

Genug der Einleitung. Es gibt inzwischen immerhin ein paar Möglichkeuten, Silbentrennung mit CSS zu regeln. Über die CSS-Eigenschaft ‚hyphens‚ läßt sich inzwischen in vielen aktuellen Browsern der Zeilenumbruch optimiern. Bei Chrome funktioniert das zurzeit (Srand August 2017) leider nur auf Android und Mac – und auch nur mit der Einstellung „auto“.

Im folgenden eine kurzer Einblick, wie ich zurzeit hyphens bzw. hyphenate in so gut wie jedem Web-Projekt verwende.

h1, h2, h3, h4 {
-webkit-hyphens: auto;
   -moz-hyphens: auto;
        hyphens: auto;
}

p {
-webkit-hyphens: auto;
   -moz-hyphens: auto;
        hyphens: auto;
-webkit-hyphenate-limit-lines: 2;
        hyphenate-limit-lines: 2;
-webkit-hyphenate-limit-chars: auto 3;
        hyphenate-limit-chars: auto 3;
}

Ich wende hier die CSS-Anweisung hyphens auf Überschriften und Absätze unterschiedlich an. Überschriften sollen generell umgebrochen werden – Absätze nur begrenzt. Warum? Naja – in der Regel ist die Schriftgröße von Überschriften größer, als die von Fließtext / Brottext / Absätzen. Da kann es schon mal vorkommen, dass ein einzelnes Wort (zB. Kaninchenzüchterverein“) das Layout bei mobiler Darstellung sprengt. Daher möchte ich, dass jedes Wort umgebrochen werden darf. Bei Absätzen ist dies in der Regel nicht nötig – hier reicht es, z.B. maximal zwei Zeilen in Folge umbrechen zu lassen – das können wir über „hyphenate-limit-lines“ einstellen. Die Länge der umgebrochenen Silben soll auch nicht beliebig sein. Hier ist sie mit „hyphenate-limit-chars: auto 3“ so eingestellt dass der Teil des Wortes vor dem Umbruch beliebig viele Lettern enthalten darf (‚auto‘) und der Teil nach dem Zeilenumbruch mind. 3 Lettern enthalten muß.

Silbentrennung über Parameter steuern

hyphens: auto; Die CSS-Eigenschaft hyphens ist also bei Überschriften und Absätzen zunächst auf ‚auto‚ gestellt. Damit wird bei Browsern, die hyphens unterstützen, die Silbentrennung aktiviert. Daneben gäbe es noch die Möglichkeit, hyphens auf ‚manual‚ zu setzen – dann müsste man aber die Silbentrennung bereits im Text vorsehen. Das erscheint mir in den meisten Fällen eher unpraktikabel.

hyphenate-limit-lines Die CSS-Eigenschaft hyphenate-limit-lines regelt, wieviele Zeilen hintereinander maximal per Silbentrennung umgebrochen werden können. Wenn man diese Eigenschaft nicht setzt, kann es dazu kommen, dass beliebing viele Zeilen hintereinander mit einem Trennstrich enden. Das möchte man aus gestalterischen Gründen ggf. vermeiden. Im Beispiel oben ist die maximale Anzahl auf 2 gesetzt.

hyphenate-limit-chars Die Eigenschaft hyphenate-limit-chars legt die Mindestlänge fest, die ein Wort haben muß, um getrennt werden zu dürfen. Im oben aufgeführen Beispiel ist die eigentliche Länge auf auto gesetzt – die Anzahl der Lettern vor und nach der Trennung muß aber wenigsten 3 sein, sonst wird das Wort nicht getrennt. Dadurch wird gewährleistet, dass nicht ständig die erste Silbe weggebrochen wird – das wäre un-verhältnismäßig, un-angebracht und un-schön.

Silbentrennung mit CSS – korrekte Sprache definieren

Wenn man sich dazu entscheidet, das Schriftbild mithilfe von hyphens zu optimieren, sollte man nicht vergessen, dass die Eigenschaft auf den Browser angewiesen ist. Und dem Browser muß wiederum mitgeteilt werden, in welcher Sprache der zu trennende Text geschrieben ist und nach welcher Gramatik er getrennt werden soll. Dazu baut man folgende Parameter in das HTML-Tag des Dokuments ein, wenn das nicht schon automatisch z.B. durch WordPress eingebunden wurde:

<html lang="de" dir="ltr"

Im oben angezeigten Code wird dem Browser also signalisiert, dass es sich um einen Deutschen Text handelt, der von links nach rechts läuft („ltr“ = „left to right“).

CSS Silbentrennung in WordPress-Themes

Wordpress Silbentrennung Zeilenumbruch SpracheWordPress-Nutzer können sich freuen: viele kostenlos verfügbare WordPress-Themes haben die Silbentrennung über hyphens bereits voreingestellt. Allerdings sollte man darauf achten, dass auch die richtige (ggf. Deutsche) Sprache eingestellt ist.

Sollte die Silbentrennung nicht funktionieren, obwohl man ein Theme aktiviert hat, das Silbentrennung bereits ‚eingebaut‘ hat, dann ist eventuell die Sprache falsch eingestellt. Das läßt sich schnell direkt im Quellcode der WorPress-Seite erkennen (siehe Abbildung). Die Sprachversion von WordPress sich inzwische relativ einfach wechseln – hier eine kleine Anleitung.

Browser-Unterstützung von hyphens

Zurzeit sieht die Liste der Browser, die hyphens unterstützen, noch ein wenig dünn aus. Immerhin können Nutzer des Internet Exporer ab Version 10 Texte mit hyphens sehen, Chrome scheint hyphens aber leider noch nicht zu unterstützen.

Es gibt durch aus Wege und Möglichkeuten, mithilfe von  JavaScript auch Chrome dazu zu bringen, Texte mit Silbentrennung anzuzeigen. David Newton hat dazu bereits 2011 eine recht ausführliche Anleitung geschrieben. Ich verzeichte wenn immer möglich darauf, CSS-Tricks per JavaScript zu ‚emulieren‘ – aber das ist vielleicht nicht immer möglich. Daher hier der Link zur Anleitung:

Siehe auch:

Textarea-Resize mit CSS einschränken

In den meisten Browsern lassen sich Texteingabefelder ‚textarea‘ (in HTML-Formularen) nach belieben vergrößern oder verkleinern. Das kann praktisch sein, wenn man zum Beispiel einen langen Text eingibt. In den meisten Fällen bietet diese Option aber ein bisschen zu viel Freiraum und man läuft Gefahr, dass das Layout der Webseite leidet.

Mithilfe von CSS kann man die Optionen einschränken, sodass sich die Größe eines Textfeldes entweder gar nicht mehr ändern läßt. Es lässt sich zum Beispiel festlegen, dass sich die Größe des Textfeldes sich ausschliesslich in horizontaler oder vertikaleler Richtung ändern lässt. Zusätzlich kann man auch Minimal- oder Maximalgrößen angeben und so Spielräume vorgeben, in dnen sich ein Textfeld ändern lässt.

Hier einige zur Verfügung stehende Einstellungsmöglichkeiten:

Resize-Option komplett ausschalten

textarea { resize: none; }

Mit resize: none; ist die Größe des Textfeldes für den Nutzer nicht mehr änderbar.

Nur vertikale Größenänderung zulassen

textarea { resize: vertical; }

Mit resize: vertical; lässt sich festlegen, dass das Textfeld nur noch in vertikaler Richtung vergrößert und verkleinert werden kann. Diese Einschränkung ist vermutlich die, die in den meisten Fällen SInn macht. So lässt sich zum Beispiel ein Kontaktformular oder auch ein Kommentarfeld in der Höhe ändern – die Breite bleibt aber immer gleich – das Layout wird in den meisten Fällen nicht beeinträchtigt.

Nur horizontale Größenänderung zulassen

textarea { resize: horizontal; } 

Die Einschränkung resize: horizontal;  macht vermutlich nur sehr selten Sinn. So lässt sich ein Textfeld vom Nutzer breiter oder schmaler ziehen,  aber die Höhe liesse sich nicht ändern. Die Einschränkung ist aber natürlich trotzdem genauso gültig, wie alle anderen auch.

Vertikale Änderung unterbinden, horizontale Änderung einschränken

textarea { resize:horizontal; max-width:480px; min-width:240px; }

Eine elegenate Variante – vermulich aber wenig sinnvoll: die Breite lässt sich zwar ändern, aber nur in einem Vorgegebenen Ramen – es lassen sich eine minimale und eine maximale Breite vorgeben.

Horizontale Änderung unterbinden, vertikale Änderung einschränken

textarea { resize:vertical; max-height:480px; min-height:240px; )

DIe letzte Variante ist mein persönlicher Favorit: die Höhe lässt sich zwar ändern, aber nur in einem Vorgegebenen Ramen – es lassen sich eine minimale und eine maximale Höhe vorgeben.