Größer. Schneller. Weiter.
Best Practices in JavaScript und CSS

 EB RAUTS | Dirk Jesse und Nicolai Schwarz
Kommentierte Fassung
Best Practices in JavaScript und CSS
Vortrag auf der WebTech 2009 in Karlruhe

In diesem Vortrag präs...
http://www.webkrauts.de
CSS-Reset
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,
blockquote,th,td { margin:0; padding:0; }...
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p,
blockquote, pre, a, abbr, acronym, address, big,...
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p,
blockquote, pre, a, abbr, acronym, address, big,...
http://people.opera.com/patrickl/experiments/keyboard/test
{ overflow: hidden; } verhindert den langen Rahmen links heraus.
Prüfen, ob die Reset-Anweisungen sinnvoll sind


:focus { outline: 0; }

unterdrückt die Outline für alle User; sowohl bei...
CSS-Reset
Worum geht‘s?

Reset-Style-Sheets sind ein guter Start für das eigene Design. Dabei sollten wir die Anweisungen ...
Border für die Navigation
http://www.webkrauts.de/2008/07/08/sonnenseiten-barrierefreiheit/
/* Hauptnavigation 2. Level */

#hauptnavigation ul li ul li a {
border-left: 5px solid #FFF;
padding-left: 40px;
}

#haup...
Border für die Navigation
Worum geht‘s?

Es gibt einige Nutzer, die ihren Browser so einstellen, dass die Farbeinstellunge...
Inhalte verstecken
CSS für versteckte Inhalte


 position:absolute;
 left: -10000px;
 top: auto;
 width: 1px;
 height: 1px;
 overflow: hidden...
Inhalte verstecken
Worum geht‘s?

Manchmal werden Inhalte für Screeneader auf der Webseite für sehende Nutzer versteckt. S...
Skiplinks einblenden
<body id=”top”>
  <div id=”skip”>
    <p class=”skiplink”><a href=”#textsprung”>Sprung zum Inhalt</a>.</p>
  </div>
.skiplink a:link, .skiplink a:visited {
    position: absolute;
    width: 1px; height: 1px;
    left: -100px; top: -100px...
Skiplinks einblenden
Worum geht‘s?

Skiplinks für Screenreader sollten auch für Tastatur-Nutzer zumindest kurz eingeblende...
Bessere Skiplinks
Skiplinks
Techniques for WCAG 2.0
G1: Adding a link at the top of each page that goes directly to the main
content area

T...
Skiplinks – Integriert
Skiplinks – Overlay
Skiplinks – Overlay




<body>
<!--skiplink navigation-->
<ul id=”skiplinks”>
 <li><a class=”skip” href=”#nav”>Skip tonavi...
Skiplinks & Webkit-Browser
Problem: Tastaturfocus wird nicht verschoben.
Lösung: Korrektur per JavaScript

var webkitFocus...
Bessere Skiplinks
Worum geht‘s?

Nicht immer lässt sich für die einzublendenden Skiplinks ein geeigneter Platz finden. Ins...
Margin Collapsing
Margin Collapsing


Beschreibung
• Betrifft Elemente im normalen Elementfluss
• Betrifft nur vertikale Randabstände
• „Der...
Heading
                                                                        20px
Lorem ipsum dolor sit amet, consetetu...
Heading
                                                                        40px

Lorem ipsum dolor sit amet, consetet...
Heading
                                                                         40px

                                   ...
Margin Collapsing
Worum geht‘s?

Das Margin Collapsing ist eine der Verhaltensweisen von CSS, mit denen insbesondere Anfän...
Alphatransparenz
Alphatranzparenz: Lösungen
Variante: rgba()                        Variante: opacity




Eric Eggert - Cross-Browser rgba(...
Alphatransparente Hintergründe


CSS 3: rgba()

• Moderne Browser (FF3+, Safari 4+, Opera 10+)
  background-color: rgb(255...
Alphatransparenz
Worum geht‘s?

Alphatransparente Hintergründe sind immer öfter gefragt in modernen Layouts. Bisher waren ...
Bilder mit Unterzeilen
<dl class=”bildUnterschrift right-
Float clear”>

   <dt><a href=”http://ais.
badische-zeitung.de/pi-
ece/01/56/f5/d1/2247...
<div class=”photo right”>

   <img src=”http://pix.sueddeut-
sche.de/politik/173/494508/spd80-
1258300472.jpg” width=”180”...
<div>
    <img />
    <p>Untertitel</p>
 </div>


Noch nicht ideal: Ein Screenreader würde Bild und Untertitel hier als zw...
[caption id=”attachment_637” align=”alignnone” width=”307”
caption=”WebTech-Logo”]<img src=”http://www.webkrauts.de/wp-con...
[caption id=”attachment_637” align=”alignnone” width=”307”
caption=”WebTech-Logo”]<img src=”http://www.webkrauts.de/wp-con...
Bilder mit Unterzeilen
Worum geht‘s?

Die derzeit beste Lösung für Bilder mit Unterzeilen steht auf Seite 51. Die Frage is...
HTML Purifier
Zum Beispiel: Import aus Word
<h1 class=”MsoNormal” style=”text-align: center; line-height: normal;
margin: 0cm 0cm 0pt;”>...
http://htmlpurifier.org
<h1 class=””MsoNormal””>
    <span>Patientensymposium Netzhautdegenerationen</span>
 </h1>
 <h1 class=””MsoNormal””>
    <...
<h1>
   <span>Patientensymposium Netzhautdegenerationen</span>
</h1>
<h1>
   <span>Einblicke - Ausblicke</span>
</h1>
<h2>...
HTML Purifier


• beseitigt bösartigen Code
• fehlende End-Tags werden geschlossen
• falsch verschachtelte Elemente werden...
HTML Purifier
Worum geht‘s?

Einige CMS und WYSIWYG-Editoren bemühen sich bereits, den Quellcode, den die Redakteure ein-
...
Ein Suchformular
Die Basis


<form action=”/”>
  <div>
    <input type=”text” />
    <input type=”submit” value=”Suchen” />
  </div>
</form...
Mehr Semantik


<form action=”/”>
  <fieldset>
    <legend>Volltextsuche</legend>
    <label for=”suchbegriff”>Suchbegriff...
Interaktiv mit Pseudoklassen


input[type=text]:focus {
  border-color: #000 #444 #444 #000;
  background-position: 0 0;
}...
Interaktiv mit JavaScript


<input type=”text” id=”suchbegriff” value=”Suchbegriff” />




myTextfeld = document.getElemen...
Interaktiv mit JavaScript II
myTextfeld = document.getElementById(‘suchbegriff’);
if (document.addEventListener) {
  myTex...
Das finale Suchfeld




• Markup nach Standards
• legend und label helfen in erster Linie Screenreadern, für sehende Nutze...
Ein Suchformular
Worum geht‘s?

Das steht im Grunde alles schon gut erklärt in dem Artikel von Gerrit van Aaken:
http://ww...
Formulare effektiv gestalten
Standardmarkup für Formulare
Zielsetzung
• Einheitliches Markup für
  alle Formularbausteine
• Visuelle Gestaltungsfreihei...
Textfeld
Standardmarkup für Formulare
 <div class=”type-text”>
    <label for=”your-id”>your label</label>
Zielsetzung
• E...
Textfeld
Standardmarkup für Formulare
 <div class=”type-text”>
    <label for=”your-id”>your label</label>
Zielsetzung
• E...
Textarea
Standardmarkup für Formulare
 <div class=”type-text”>
    <label for=”your-id”>your label</label>
Zielsetzung
• E...
Textarea
Standardmarkup für Formulare
 <div class=”type-text”>
    <label for=”your-id”>your label</label>
Zielsetzung
• E...
Textarea
Standardmarkup für Formulare
 <div class=”type-text”>
    <label for=”your-id”>your label</label>
Zielsetzung
• E...
Präsentationsmöglichkeiten


Lineare Abfolge              Spalten links-/rechtsbündig
Präsentationsmöglichkeiten


Mehrspaltige Formulare       Feedbackmöglichkeiten




                              <div cla...
„Formularbaukasten“


Implementation
CSS Framework YAML, Version 3.2




• Dokumentation
  http://www.yaml.de/de/dokumenta...
Formulare effektiv gestalten
Worum geht‘s?

Je nach Platzangebot im Layout oder der Komplexität der vom Nutzer erfragten D...
Inhalte in Tab-Reitern
Erwarten Sie das Unerwartete


Mit JavaScript                 Ohne JavaScript
Erwarten Sie das Unerwartete


Mit JavaScript                           Ohne JavaScript


                                ...
Zugängliche Tabinhalte


Zielvorgaben

• Zugänglichkeit und ansprechende Präsentationder Inhalte
  mit und ohne JavaScript...
Ziel: Zugängliche Tabinhalte


Mit JavaScript                 Ohne JavaScript
Ausgangspunkt: Linearer Inhalt
Identifikation Tabreiter/Inhalt
                                  H3 Heading




                                  H3 Head...
Identifikation Tabreiter/Inhalt
                                         H3 Heading

                                  DIV...
Aktives JavaScript: DOM-Scripting
                                           H3 Heading

                                 ...
„AccessibleTabs“ für jQuery


Autor: Dirk Ginader
AccessibleTabs (jQueryPlugin)
• Projekthomepage
• Dokumentation (deutsch...
Inhalte in Tab-Reitern
Worum geht‘s?

Wann sind Tabreiter wirklich zugänglich für Screenreader? Wie gestalte ich Tab-Inhal...
Danke. Und schönen Abend noch...
Oder hat etwa jemand eine Frage?
Die Referenten


Dirk Jesse                              Nicolai Schwarz
twitter.com/djesse                      twitter.c...
WebTech 2009: Best Practices in JavaScript und CSS (kommentiert)
WebTech 2009: Best Practices in JavaScript und CSS (kommentiert)
WebTech 2009: Best Practices in JavaScript und CSS (kommentiert)
WebTech 2009: Best Practices in JavaScript und CSS (kommentiert)
WebTech 2009: Best Practices in JavaScript und CSS (kommentiert)
WebTech 2009: Best Practices in JavaScript und CSS (kommentiert)
WebTech 2009: Best Practices in JavaScript und CSS (kommentiert)
WebTech 2009: Best Practices in JavaScript und CSS (kommentiert)
WebTech 2009: Best Practices in JavaScript und CSS (kommentiert)
WebTech 2009: Best Practices in JavaScript und CSS (kommentiert)
Nächste SlideShare
Wird geladen in …5
×

WebTech 2009: Best Practices in JavaScript und CSS (kommentiert)

4.866 Aufrufe

Veröffentlicht am

Professionelles Arbeiten bedeutet auch, effektiv zu arbeiten. Effektivität bedeutet für Webentwickler, nicht immer das Rad neu erfinden zu wollen oder müssen. Nicolai Schwarz und Dirk Jesse zeigen Best Practices, die bei der Entwicklung eigener Seiten helfen, schneller und besser mit der Aufgabe fertig zu werden.
Vortrag auf der WebTech 2009 in Karlsruhe

Veröffentlicht in: Technologie
0 Kommentare
6 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

Keine Downloads
Aufrufe
Aufrufe insgesamt
4.866
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
106
Aktionen
Geteilt
0
Downloads
55
Kommentare
0
Gefällt mir
6
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

WebTech 2009: Best Practices in JavaScript und CSS (kommentiert)

  1. 1. Größer. Schneller. Weiter. Best Practices in JavaScript und CSS EB RAUTS | Dirk Jesse und Nicolai Schwarz
  2. 2. Kommentierte Fassung Best Practices in JavaScript und CSS Vortrag auf der WebTech 2009 in Karlruhe In diesem Vortrag präsentieren wir ein paar kleine Tipps und Tricks, die vielleicht noch nicht alle Leute kennen. Oft geht es darum, die Inhalte für Screenreader oder Tastaturnutzer sinnvoll aufzubereiten. Viele der Kapitel lassen sich recht einfach bei allen Projekten umsetzen. Alle Links sind gesammelt auf delicious zu finden: www.delicious.com/textformer/webtech09 Wer den Vortrag gehört hat, kann ihn gerne hier kommentieren: http://joind.in/talk/view/1120
  3. 3. http://www.webkrauts.de
  4. 4. CSS-Reset
  5. 5. body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p, blockquote,th,td { margin:0; padding:0; } table { border-collapse:collapse; border-spacing:0; } fieldset,img { border:0; } address,caption,cite,code,dfn,em,strong,th,var { font-style:normal; font-weight:normal; } ol,ul { list-style:none; } caption,th { text-align:left; } h1,h2,h3,h4,h5,h6 { font-size:100%; font-weight:normal; } q:before,q:after { content:’’; } abbr,acronym { border:0; } http://developer.yahoo.com/yui/reset/
  6. 6. html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { margin: 0; padding: 0; border: 0; outline: 0; font-weight: inherit; font-style: inherit; font-size: 100%; font-family: inherit; vertical-align: baseline; } /* remember to define focus styles! */ :focus { outline: 0; } body { line-height: 1; color: black; background: white; } ol, ul { list-style: none; } /* tables still need ‘cellspacing=”0”’ in the markup */ table { border-collapse: separate; border-spacing: 0; } caption, th, td { text-align: left; font-weight: normal; } blockquote:before, blockquote:after, q:before, q:after { content: “”; } blockquote, q { quotes: “” “”; } http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/
  7. 7. html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { margin: 0; padding: 0; border: 0; outline: 0; font-weight: inherit; font-style: inherit; font-size: 100%; font-family: inherit; vertical-align: baseline; } /* remember to define focus styles! */ :focus { outline: 0; } body { line-height: 1; color: black; background: white; } ol, ul { list-style: none; } /* tables still need ‘cellspacing=”0”’ in the markup */ table { border-collapse: separate; border-spacing: 0; } caption, th, td { text-align: left; font-weight: normal; } blockquote:before, blockquote:after, q:before, q:after { content: “”; } blockquote, q { quotes: “” “”; }
  8. 8. http://people.opera.com/patrickl/experiments/keyboard/test
  9. 9. { overflow: hidden; } verhindert den langen Rahmen links heraus.
  10. 10. Prüfen, ob die Reset-Anweisungen sinnvoll sind :focus { outline: 0; } unterdrückt die Outline für alle User; sowohl beim Draufklicken mit der Maus als auch bei Nutzung der Tastatur :active { outline: 0; } unterdrückt die Outline beim Draufklicken mit der Maus Nutzer mit Tastatur sehen nun aber den fokussierten Link mit Outline
  11. 11. CSS-Reset Worum geht‘s? Reset-Style-Sheets sind ein guter Start für das eigene Design. Dabei sollten wir die Anweisungen aber nicht alle unreflektiert übernehmen. Das Style-Sheet von Eric Meyer setzt zum Beispiel die outline beim focus auf Null. Designer mögen es nicht unbedingt, wenn beim Klick auf einen grafischen Link diese Outline erscheint, die Anweisung verhindert das. Aber die Outline ist dann hilfreich, wenn Besucher die Webseite per Tastatur navigieren. Wenn ein Webworker vergisst, die Zustände für den :focus anzulegen und durch das Reset die outline auf Null steht, bekommt der Tastatur-Nutzer gar keine Rückmeldung auf welchem Link der Fokus gerade steht. Statt den :focus auf Null zu setzen, ist es besser, nur :active auf Null zu setzen. Maus-Nutzer sehen dann keine Outline, aber Tastatur-Nutzer sehen die Outline.
  12. 12. Border für die Navigation
  13. 13. http://www.webkrauts.de/2008/07/08/sonnenseiten-barrierefreiheit/
  14. 14. /* Hauptnavigation 2. Level */ #hauptnavigation ul li ul li a { border-left: 5px solid #FFF; padding-left: 40px; } #hauptnavigation ul li ul li a:hover, #hauptnavigation ul li ul li a:focus, #hauptnavigation ul li ul li a:active { border-left: 10px solid #FFF; padding-left: 35px; background: url(‘http://www.landtag.nrw.de/portal/CPMO/images/ icon_ebene2_pfeil.gif’) no-repeat 18px 2px #F4F8FB; }
  15. 15. Border für die Navigation Worum geht‘s? Es gibt einige Nutzer, die ihren Browser so einstellen, dass die Farbeinstellungen von Webseiten igno- riert werden. Es werden nur rudimentäre Farben, in diesem Beispiel schwarz, weiß und blau, genutzt. Normale Farbänderungen bei :hover und :focus werden hier nicht mehr angezeigt. Ein einfacher Trick sorgt dafür, dass auch Nutzer mit diesen Einstellungen :hover und :focus nutzen können. Der Rand (border) ist hier zunächst 5px breit, bei :hover und :focus aber 10px breit. Da der Rand die Farbe des Links annimmt, kann der Nutzer auch bei diesen Einstellungen :hover und :focus wahrnehmen.
  16. 16. Inhalte verstecken
  17. 17. CSS für versteckte Inhalte position:absolute; left: -10000px; top: auto; width: 1px; height: 1px; overflow: hidden; Für fokusierbare Elemente wie Links oder Formulare http://webaim.org/blog/hiding-content-for-screen-readers/
  18. 18. Inhalte verstecken Worum geht‘s? Manchmal werden Inhalte für Screeneader auf der Webseite für sehende Nutzer versteckt. Sie werden einfach aus dem sichtbaren Feld verschoben. Wer die Seite per Tatstatur navigiert, kommt aber den- noch an diese Inhalte (wenn sie fokusierbar sind). Ist der Inhalt dabei nach oben verschoben, springt die Ansicht auch ganz nach oben. Besser ist es, solche Inhalte nur nach links zu verschieben. Der Bild- schirm bleibt dann auf derselben Höhe stehen – und springt nicht mehr wild nach oben und unten.
  19. 19. Skiplinks einblenden
  20. 20. <body id=”top”> <div id=”skip”> <p class=”skiplink”><a href=”#textsprung”>Sprung zum Inhalt</a>.</p> </div>
  21. 21. .skiplink a:link, .skiplink a:visited { position: absolute; width: 1px; height: 1px; left: -100px; top: -100px; } .skiplink a:hover, .skiplink a:focus, .skiplink a:active { display: block; position: absolute; left: 290px; top: 3px; width: 200px; height: auto !important; }
  22. 22. Skiplinks einblenden Worum geht‘s? Skiplinks für Screenreader sollten auch für Tastatur-Nutzer zumindest kurz eingeblendet werden. Nämlich dann, wenn die Skiplinks auch den Fokus haben. Dazu am besten eine geeignete Stelle im Design vorsehen, um die Skipinks einzublenden.
  23. 23. Bessere Skiplinks
  24. 24. Skiplinks Techniques for WCAG 2.0 G1: Adding a link at the top of each page that goes directly to the main content area Test Procedure • Check that a link is the first focusable control on the Web page. • Check that the description of the link communicates that it links to the main content. • Check that the link is either always visible or visible when it has keyboard focus. • Check that activating the link moves the focus to the main content. • Check that after activating the link, the keyboard focus has moved to the main content. Expected Results •All checks above are true. http://www.w3.org/TR/2008/NOTE-WCAG20-TECHS-20081211/G1
  25. 25. Skiplinks – Integriert
  26. 26. Skiplinks – Overlay
  27. 27. Skiplinks – Overlay <body> <!--skiplink navigation--> <ul id=”skiplinks”> <li><a class=”skip” href=”#nav”>Skip tonavigation(Press Enter).</a></li> <li><a class=”skip” href=”#content”>Skip tomaincontent(Press Enter).</a></li> </ul> ... </body>
  28. 28. Skiplinks & Webkit-Browser Problem: Tastaturfocus wird nicht verschoben. Lösung: Korrektur per JavaScript var webkitFocusfix= { init: function() { var is_webkit = navigator.userAgent.toLowerCase().indexOf(‘webkit’) > -1; var i = 0; var skiplinks = [ ]; if (is_webkit) { if (document.getElementsByClassName!== undefined) { skiplinks = document.getElementsByClassName(‘skip’); for (i=0; i<skiplinks.length; i++) { var target= skiplinks[i].href.substr(skiplinks[i].href.indexOf(‘#’)+1); var targetElement= document.getElementById(target); targetElement.href= ‘#’+target; targetElement.setAttribute(“tabindex”, “0”); skiplinks[i].setAttribute(“onclick”,”document.getElementById(‘”+target+”’).focus();”); } } } } }; webkitFocusfix.init();
  29. 29. Bessere Skiplinks Worum geht‘s? Nicht immer lässt sich für die einzublendenden Skiplinks ein geeigneter Platz finden. Insbesondere bei grafisch anspruchsvollen Layouts kann daneben auch schwierig sein, Skiplinks gut sichtbar in Szene zu setzen. Eine Alternative ist daher, die Skiplinks per Overlay über dem Layout einzublenden. Auf diese Weise kann man Größe, Form und Farbe relativ unabhängig festlegen und somit absichern, dass diese von Nutzern auch wahrgenommen werden. Ein weiterer Punkt betrifft den Tabfocus. Dieser sollte beim Benutzen eines Skiplinks ebenfalls dem Ziel folgen (siehe WCAG 2.0 Testkriterien). In Webkit-Browsern (Safari, Chrome) passiert jedoch genau das nicht. Diesem Problem kann mit etwas JavaScript begegnet werden.
  30. 30. Margin Collapsing
  31. 31. Margin Collapsing Beschreibung • Betrifft Elemente im normalen Elementfluss • Betrifft nur vertikale Randabstände • „Der größere gewinnt …“ Unterbrechung durch: • Containing Float Techniken: float, overflow:auto|hidden, display:table • CSS-Eigenschaft: border • Internet Explorer: hasLayout+ padding/border
  32. 32. Heading 20px Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam no- numy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam <h1>HeadingContent</h1> h1 { <p>Paragraph content</p> margin: 0 0 20px 0; background: #0335; } p{ margin: 10px 0 0 0; background: #0335; }
  33. 33. Heading 40px Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam no- numy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam <h1>HeadingContent</h1> h1 { <div> margin: 0; <p>Paragraph content</p> background: #335; } </div> div { margin: 40px 0 25px 0; background: #335; } p{ margin: 10px 0 0 0; }
  34. 34. Heading 40px 10px Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam no- numy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam <h1>HeadingContent</h1> h1 { <div> margin: 0; <p>Paragraph content</p> background: #335; } </div> div { margin: 40px 0 25px 0; background: #335; border-top: 1px solid #ccf; } p { margin: 10px 0 0 0; }
  35. 35. Margin Collapsing Worum geht‘s? Das Margin Collapsing ist eine der Verhaltensweisen von CSS, mit denen insbesondere Anfänger zunächst so ihre Schwierigkeiten haben. Vertikale Margins aufeinander folgender Elemente werden nicht einfach addiert, sondern überlagern sich. Kurz gesagt, gilt die Regel: „Der Größere gewinnt!”. Speziell bei verschachtelten Elementen ist der Überblick und die Ursache für ungewöhnliche Abstände im Layout nicht immer einfach zu erkennen. Hier werden deshalb kurz einige CSS-Methoden vorgestellt, mit denen das Margin-Collapsing unterbunden werden kann.
  36. 36. Alphatransparenz
  37. 37. Alphatranzparenz: Lösungen Variante: rgba() Variante: opacity Eric Eggert - Cross-Browser rgba() Transparente Hintergründe mit CSS http://yatil.de/Weblog/cross-browser- http://www.highresolution.info/web- rgba log/entry/transparente_hintergruen- de_mit_css/
  38. 38. Alphatransparente Hintergründe CSS 3: rgba() • Moderne Browser (FF3+, Safari 4+, Opera 10+) background-color: rgb(255,255,255); /* Fallback */ background-color: rgba(255,255,255,.3); • Internet Explorer 6+ background-color: transparent9; /* Fallback Reset */ filter:progid:DXImageTransform.Microsoft.gradient( startColorstr=#4CFFFFFF,end Colorstr=#4CFFFFFF); zoom:1; /* activatehasLayout*/
  39. 39. Alphatransparenz Worum geht‘s? Alphatransparente Hintergründe sind immer öfter gefragt in modernen Layouts. Bisher waren diese Effekte crossbrowser nur über alphatransparente PNG-Grafiken oder verschachtelte Elemente und der CSS-Eigenschaft opacity möglich. Diese CSS-Lösung bedingt jedoch zusätzliche Elemente rein zu Präsentationszwecken. Mit der Ankunft von Opera 10 und dessen erweiterter CSS3-Unterstützung eröffnet sich mit der CSS3- Eigenschaft rgba() eine weitere, sehr einfach anzuwendende Methode, um diesen Transparenz-Effekt zu erzeugen. Und auch im Internet-Explorer kann mit einem kleinen Workaround ein identischer Effekt - rein auf CSS-Basis - erzeugt werden. Die rgba() Methode funktioniert crossbrowser und ist eine echte Alternative zum Einsatz von PNG-Grafiken.
  40. 40. Bilder mit Unterzeilen
  41. 41. <dl class=”bildUnterschrift right- Float clear”> <dt><a href=”http://ais. badische-zeitung.de/pi- ece/01/56/f5/d1/22476241.jpg” class=”nyroModal” target=”_ blank” title=”„Er heißt Big Mac, ...”><img src=”http://ais.ba- dische-zeitung.de/piece/01/56/f5/ d1/22476241-p-349_261.jpg” alt=”” /></a></dt> <dd>„Er heißt Big Mac, ...</dd> </dl>
  42. 42. <div class=”photo right”> <img src=”http://pix.sueddeut- sche.de/politik/173/494508/spd80- 1258300472.jpg” width=”180” height=”180” alt=”SPD Parteitag in Dresden” title=”SPD Parteitag in Dresden” border=”0”> <p>Will seiner Partei das Den- ken in veralteten Kategorien ab- gewöhnen: Sigmar Gabriel, der ebenso sprachmächtige wie schil- lernde Vorsitzende. (<cite>Foto: AP</cite>)</p> </div>
  43. 43. <div> <img /> <p>Untertitel</p> </div> Noch nicht ideal: Ein Screenreader würde Bild und Untertitel hier als zwei unterschiedliche Blöcke behandeln. <div> <p> <img /> <span>Untertitel</span> </p> </div> Best Practice: Ein Screenreader sieht Bild und Untertitel nun als Einheit an.
  44. 44. [caption id=”attachment_637” align=”alignnone” width=”307” caption=”WebTech-Logo”]<img src=”http://www.webkrauts.de/wp-con- tent/uploads/2009/10/webtech.png” alt=”WebTech-Logo” title=”webtech” width=”307” height=”81” class=”size-full wp-image-637” />[/caption]
  45. 45. [caption id=”attachment_637” align=”alignnone” width=”307” caption=”WebTech-Logo”]<img src=”http://www.webkrauts.de/wp-con- tent/uploads/2009/10/webtech.png” alt=”WebTech-Logo” title=”webtech” width=”307” height=”81” class=”size-full wp-image-637” />[/caption] <div id=”attachment_637” class=”wp-caption alignnone” style=”width: 317px”> <img src=”http://www.webkrauts.de/wp-content/uploads/2009/10/ webtech.png” alt=”WebTech-Logo” title=”webtech” width=”307” height=”81” class=”size-full wp-image-637” /> <p class=”wp-caption-text”>WebTech-Logo</p> </div>
  46. 46. Bilder mit Unterzeilen Worum geht‘s? Die derzeit beste Lösung für Bilder mit Unterzeilen steht auf Seite 51. Die Frage ist, wie einfach der WYSIWYG-Editor eingerichtet werden kann, um diese Struktur zu erzeugen. Alternativ kann man statt des span auch <em> oder <strong> nutzen, wenn diese Elemente einfacher per Editor handhabbar sind. Noch besser ist vielleicht ein Zwischen-Code wie er etwa bei WordPress erzeugt wird. Bei der Ausgabe kann dieser Code dann durch den gewünschten HTMl-Code ersetzt werden. Solch ein Filter hat Vor- teile, wenn sich irgendwann mal ein besserer Code für Bilder mit Unterzeile ergibt. Zum Beispiel falls in HTML5 ein eigenes Element (figure) dafür vorgesehen sein wollte. In diesem Fall müsste der Admin nur den Ausgabe-Filter umschreiben, schon werden alle Bilder mit Unterzeile im neuen Code darge- stellt.
  47. 47. HTML Purifier
  48. 48. Zum Beispiel: Import aus Word <h1 class=”MsoNormal” style=”text-align: center; line-height: normal; margin: 0cm 0cm 0pt;”><span style=”font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-ansi-language: DE;”>Patientensymposium Netzhautdegenerationen</span></h1><h1 class=”MsoNormal” style=”text-align: center; line-height: normal; margin: 0cm 0cm 0pt;”><span style=”font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-ansi-language: DE;”>&nbsp;</span><span style=”font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-ansi-language: DE;”>Einblicke - Ausblicke</span></h1><p class=”MsoNormal” style=”line-height: normal; margin: 0cm 0cm 0pt;”><span style=”font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-ansi-language: DE;”>&nbsp;</span></p><h2 class=”MsoNormal” style=”line-height: normal; margin: 0cm 0cm 0pt;”><span style=”font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-ansi-language: DE;”>Moderation</span> ...
  49. 49. http://htmlpurifier.org
  50. 50. <h1 class=””MsoNormal””> <span>Patientensymposium Netzhautdegenerationen</span> </h1> <h1 class=””MsoNormal””> <span> </span> <span>Einblicke - Ausblicke</span> </h1> <p class=””MsoNormal””> <span> </span> </p> <h2 class=””MsoNormal””> <span>Moderation</span> </h2> Ergebnis ohne weitere Einstellungen. (die „doppelten“ Anführungszeichen sind nicht wirklich doppelt, das liegt an der gewählten Schrift)
  51. 51. <h1> <span>Patientensymposium Netzhautdegenerationen</span> </h1> <h1> <span>Einblicke - Ausblicke</span> </h1> <h2> <span>Moderation</span> </h2>
  52. 52. HTML Purifier • beseitigt bösartigen Code • fehlende End-Tags werden geschlossen • falsch verschachtelte Elemente werden repariert • veraltetete Tags werden konvertiert • CSS wird validiert • Leere Elemente können ausgefiltert werden • Es lässt sich konfigurieren, welche Elemente und Attribute erlaubt sind • Ebenso lassen sich etwa ids festlegen, die nicht erlaubt sind
  53. 53. HTML Purifier Worum geht‘s? Einige CMS und WYSIWYG-Editoren bemühen sich bereits, den Quellcode, den die Redakteure ein- geben, beim Speichern oder bei der Ausgabe zu bereinigen. Nach meinen Tests stoßen beide recht schnell an ihre Grenzen und können auch nur in bestimmten Grenzen konfiguriert werden. Der beste Filter, um HTML-Code sauber auszugeben, ist für mich bisher der HTML Purifier. Er kann auch nicht verhindern, dass Redaktere eine Zwischenüberschrift falsch auszeichnen oder eine Liste nicht als HTML-Liste eingeben. Aber der Purifier repariert fehlerhaften Code viel besser als WYSIWYG-Editoren oder CMS-eigene Filter. Einfach mal testen.
  54. 54. Ein Suchformular
  55. 55. Die Basis <form action=”/”> <div> <input type=”text” /> <input type=”submit” value=”Suchen” /> </div> </form> XMHTL 1.0 Code - Laut Spezifikation dürfen die input-Elemente keine direkten Kindelemente von form sein, daher das div. http://www.webkrauts.de/2008/12/09/der-perfekte-suchschlitz/
  56. 56. Mehr Semantik <form action=”/”> <fieldset> <legend>Volltextsuche</legend> <label for=”suchbegriff”>Suchbegriff</label> <input type=”text” id=”suchbegriff” /> <input type=”submit” value=”Suchen” /> </fieldset> </form> Mit etwas CSS auch:
  57. 57. Interaktiv mit Pseudoklassen input[type=text]:focus { border-color: #000 #444 #444 #000; background-position: 0 0; } input[type=submit]:hover { cursor: pointer; } input[type=submit]:focus, input[type=submit]:active { background: #6c0000; } Der Internet Explorer 6 versteht diese Anweisungen nicht!
  58. 58. Interaktiv mit JavaScript <input type=”text” id=”suchbegriff” value=”Suchbegriff” /> myTextfeld = document.getElementById(‘suchbegriff’); if (document.addEventListener) { myTextfeld.addEventListener(‘focus’, textLeeren, false); } function textLeeren() { myTextfeld.value = “”; } Leert das Suchfeld, wenn ein Nutzer reinklickt
  59. 59. Interaktiv mit JavaScript II myTextfeld = document.getElementById(‘suchbegriff’); if (document.addEventListener) { myTextfeld.addEventListener(‘focus’, textLeeren, false); myTextfeld.addEventListener(‘blur’, textFuellen, false); } function textLeeren() { mySuchspeicher = myTextfeld.value; myTextfeld.value = “”; } function textFuellen() { if (myTextfeld.value == “”) { myTextfeld.value = mySuchspeicher; } } Merkt sich das Wort im Eingabefeld.
  60. 60. Das finale Suchfeld • Markup nach Standards • legend und label helfen in erster Linie Screenreadern, für sehende Nutzer werden die Elemente versteckt • Es gibt interaktive Pseudoklassen für :hover, :focus, :active • Das Wort „Suchbegriff“ hilft dem Nutzer statt eines sichtbaren labels, die Funktion des Feldes zu erklären • Per JavaScript wird das Wort „Suchbegriff“ beim Klick ins Feld ausgeblendet. • Schreibt der Nutzer ein neues Wort hinein, wird dieses beibehalten, andernfalls schreibt JavaScript wieder „Suchbegriff“ ins Feld.
  61. 61. Ein Suchformular Worum geht‘s? Das steht im Grunde alles schon gut erklärt in dem Artikel von Gerrit van Aaken: http://www.webkrauts.de/2008/12/09/der-perfekte-suchschlitz/ (Dabei auch die Kommentare beachten)
  62. 62. Formulare effektiv gestalten
  63. 63. Standardmarkup für Formulare Zielsetzung • Einheitliches Markup für alle Formularbausteine • Visuelle Gestaltungsfreiheit • Berücksichtigung von Feedback-Informationen • Unterstützung für fixe & flexible Breiten Grundgedanke Formularelement und Label bilden eine Einheit und werden kontextabhängig formatiert.
  64. 64. Textfeld Standardmarkup für Formulare <div class=”type-text”> <label for=”your-id”>your label</label> Zielsetzung • Einheitliches Markup name=”your-id” id=”your-id” size=”20” /> <input type=”text” für </div> alle Formularbausteine • Visuelle Gestaltungsfreiheit • Berücksichtigung von Feedback-Informationen • Unterstützung für fixe & flexible Breiten Grundgedanke Formularelement und Label bilden eine Einheit und werden kontextabhängig formatiert.
  65. 65. Textfeld Standardmarkup für Formulare <div class=”type-text”> <label for=”your-id”>your label</label> Zielsetzung • Einheitliches Markup name=”your-id” id=”your-id” size=”20” /> <input type=”text” für </div> alle Formularbausteine • Visuelle Gestaltungsfreiheit Selectfeld • <div class=”type-select”> Berücksichtigung von Feedback-Informationen Options</label> <label for=”your-id”>More <select name=”your-id” id=”your-id” size=”1”> • Unterstützung für fixe <option value=”0” selected=”selected” disabled=”disabled”> & flexible Breiten Please choose</option> <optgrouplabel=”First options to choose from”> Grundgedanke value=”value #1”>Option 1</option> <option Formularelement value=”value #2”>Option 2</option> <option und Label </optgroup> bilden<optgrouplabel=”Yet more options to choose from”> eine Einheit und werden kontextabhängig formatiert. #3”>Option 3</option> <option value=”value <option value=”value #4”>Option 4</option> <option value=”value #5”>Option 5</option> </optgroup> </select> </div>
  66. 66. Textarea Standardmarkup für Formulare <div class=”type-text”> <label for=”your-id”>your label</label> Zielsetzung • Einheitliches Markup für id=”your-id” cols=”30” rows=”7”></textarea> <textareaname=”your-id” </div> alle Formularbausteine • Visuelle Gestaltungsfreiheit • Berücksichtigung von Feedback-Informationen • Unterstützung für fixe & flexible Breiten Grundgedanke Formularelement und Label bilden eine Einheit und werden kontextabhängig formatiert.
  67. 67. Textarea Standardmarkup für Formulare <div class=”type-text”> <label for=”your-id”>your label</label> Zielsetzung • Einheitliches Markup für id=”your-id” cols=”30” rows=”7”></textarea> <textareaname=”your-id” </div> alle Formularbausteine • Visuelle Gestaltungsfreiheit Checkboxen & Radiobuttons • <div class=”type-check”> Berücksichtigung von Feedback-Informationenname=”your-id” id=”your-id” /> <input type=”checkbox” <label for=”your-id”>Your checkbox label</label> • Unterstützung für </div> fixe & flexible Breiten <div class=”type-check”> <input type=”radio” name=”your-id” value=”value #1” id=”your-id” /> Grundgedanke <label for=”your-id”>Your radio-button label</label> </div> Formularelement und Label bilden eine Einheit und werden kontextabhängig formatiert.
  68. 68. Textarea Standardmarkup für Formulare <div class=”type-text”> <label for=”your-id”>your label</label> Zielsetzung • Einheitliches Markup für id=”your-id” cols=”30” rows=”7”></textarea> <textareaname=”your-id” </div> alle Formularbausteine • Visuelle Gestaltungsfreiheit Checkboxen & Radiobuttons • <div class=”type-check”> Berücksichtigung von Feedback-Informationenname=”your-id” id=”your-id” /> <input type=”checkbox” <label for=”your-id”>Your checkbox label</label> • Unterstützung für </div> fixe & flexible Breiten <div class=”type-check”> <input type=”radio” name=”your-id” value=”value #1” id=”your-id” /> Grundgedanke <label for=”your-id”>Your radio-button label</label> </div> Formularelement und Label bilden eine Einheit und werden Buttons kontextabhängig formatiert. <divclass=”type-button”> <inputtype=”button” value=”button” id=”button1” name=”button1” /> <inputtype=”reset” value=”reset” id=”reset” name=”reset” /> <inputtype=”submit” value=”submit” id=”submit” name=”submit” /> </div>
  69. 69. Präsentationsmöglichkeiten Lineare Abfolge Spalten links-/rechtsbündig
  70. 70. Präsentationsmöglichkeiten Mehrspaltige Formulare Feedbackmöglichkeiten <div class=”type-text error”> <strong >Field «Last name» not properly filled.</strong> … </div>
  71. 71. „Formularbaukasten“ Implementation CSS Framework YAML, Version 3.2 • Dokumentation http://www.yaml.de/de/dokumentation/css-bausteine/formularbaukasten.html • Beispiel: Grundelemente http://www.yaml.de/fileadmin/examples/01_layouts_basics/building_forms.html • Beispiel: Mehrspaltige Formulare http://www.yaml.de/fileadmin/examples/01_layouts_basics/multicolumnar_ forms.html
  72. 72. Formulare effektiv gestalten Worum geht‘s? Je nach Platzangebot im Layout oder der Komplexität der vom Nutzer erfragten Daten haben sich unterschiedliche Darstellungsformen als vorteilhaft erwiesen. Die Herausforderung besteht nun darin, ein möglichst sinnvolles Basismarkup für Formulare zu entwickeln, das all diese verschiedenen Anforderungen abdeckt. Gleichzeitig soll der Pflegeaufwand für das dazugehörige CSS möglichst gering gehalten werden. Im Rahmen des Vortrages stelle ich die Lösung vor, die ich im Rahmen des CSS-Frameworks YAML als „Formularbaukasten” implementiert habe.
  73. 73. Inhalte in Tab-Reitern
  74. 74. Erwarten Sie das Unerwartete Mit JavaScript Ohne JavaScript
  75. 75. Erwarten Sie das Unerwartete Mit JavaScript Ohne JavaScript Tabs ohne Funktion! <a onfocus=”blur()” onclick=”spToggleMPC(‘topbox’,1)” href=”javascript:void(0);”>Gelesen</a>
  76. 76. Zugängliche Tabinhalte Zielvorgaben • Zugänglichkeit und ansprechende Präsentationder Inhalte mit und ohne JavaScript • Vollständige Tastatursteuerung • Feedback für Screenreaderbeim Tabwechsel • Synchronisation der Tabreiter(gleiche Höhen)
  77. 77. Ziel: Zugängliche Tabinhalte Mit JavaScript Ohne JavaScript
  78. 78. Ausgangspunkt: Linearer Inhalt
  79. 79. Identifikation Tabreiter/Inhalt H3 Heading H3 Heading H3 Heading
  80. 80. Identifikation Tabreiter/Inhalt H3 Heading DIV class=“content“ H3 Heading DIV class=“content“ H3 Heading DIV class=“content“
  81. 81. Aktives JavaScript: DOM-Scripting H3 Heading DIV class=“content“ H3 Heading DIV class=“content“ H3 Heading DIV class=“content“
  82. 82. „AccessibleTabs“ für jQuery Autor: Dirk Ginader AccessibleTabs (jQueryPlugin) • Projekthomepage • Dokumentation (deutsch/ englisch) Implementation CSS Framework YAML, Version 3.2 • Optional mit Tab-Synchronisation http://www.yaml.de/fileadmin/examples/ 09_add-ons/accessible_tabs.html
  83. 83. Inhalte in Tab-Reitern Worum geht‘s? Wann sind Tabreiter wirklich zugänglich für Screenreader? Wie gestalte ich Tab-Inhalte sinnvoll, falls JavaScript beim Nutzer deaktiviert ist? Diese Fragen werden anhand des „Accessible Tabs” Plugins von Dirk Ginader beantwortet.
  84. 84. Danke. Und schönen Abend noch...
  85. 85. Oder hat etwa jemand eine Frage?
  86. 86. Die Referenten Dirk Jesse Nicolai Schwarz twitter.com/djesse twitter.com/textformer • Bauingenieur aus Dresden • freier Designer und Webentwickler • Freiberuflicher Softwareentwickler: aus Dortmund – CSS Framework „Yet Another • Autor für t3n, PHP User, Multicolumn Layout“ (YAML) Create or Die – JavaScript-Applikationen • Redaktionelle Mitarbeit beim – CSSDOC Webstandards-Magazin • Autor • Redaktion Webkrauts – T3N Magazin, • Redaktion pisto-magazin.de Webstandards-Magazin – Fachbuch „CSS-Layouts, Praxislösungen mit YAML 3.0“ • Redaktion Webkrauts

×