Schlagschatten ohne Einschränkung

Um einen schönen Schlagschatten zu bekommen bedarf es mehr als nur einem CSS - Eintrages. In diesem Artikel möchte ich beschreiben, was ich alles zum Thema Schlagschatten gefunden hab und was meiner Meinung bisher die beste Lösung ist.

1. Die reine CSS-Lösung...

Diese Variante ist ein prima Sache, wenn man ein Template baut und den Kunden präsentieren möchte. Dazu hab ich folgende gut dokumentierte Seite gefunden:

http://www.thestyleworks.de/tut-art/shadow.shtmlV

Vorteil:

+ Schnell einsetzbar

Nachteil:

- die runden "Ecken" funktionieren nur im Firefox

- es gibt gelegtlich Probleme mit dem Layout, weil die Grafik gefloatet wird.

 

2. Typo3 - GIFBUILDER-Lösung

Als ich erfolglos oder besser gesagt nicht perfekt den CSS-Schlagschatten im Typo3 eingebaut hatte. Fiel mir ein, dass es ja einen leistungsstarken GIFBUILDER gibt, der den Schatten doch ohne Problemen hinbekommen sollte.

Dazu hab ich auch wieder eine wundervolle Webseite gefunden, die alles schön erklärt:

http://wiki.typo3.org/index.php/GIFBUILDER#Variant_2

Dieser Codeschnipsel funktioniert schon super. Aber auch dieser war nicht perfekt. Hier meine Bewertungsübersicht:


Vorteil:

+ funktioniert global in Typo3

+ Browserunabhängig

Nachteil:

- die Grafiken werden verzerrt

- der "Vergrößerungslink" geht nicht mehr! (GIFBUILDER und imageLinkWrap vertragen sich nicht: http://www.typo3.net/tsref/cobject/image/)

3. Meine Lösung...

Wie ich eben schon erwähnte, verträgt sich der GIFBUILDER und imageLinkWrap nicht. Das hat mich natürlich gewurmt. TS ist nun sehr mächtig, wäre doch gelacht, wenn es nicht gehen würde.

Der Lösungsansatz basiert auf folgender Idee: Ich nehme aus dem vorherigen Kapitel einfach den reinen Schatten und lege diesen via CSS hinter die eigentliche Grafik. So muss ich die Grafik nicht verzerren, der Vergrößerungslink geht weiterhin, weil ich das IMAGE ja nicht anrühre. 

Das einzige was Hack-Charakter hat, ist, dass ich die Bordereinstellung für den Abstand missbrauche. Typo3s IMG_TEXT benutzt die Bordereinstellung unter anderem, die Breiteneinstellung in dem umliegenden <dl>-Tag. Wenn ich den Border einschalte und auf die 15px ausdehne, sehe ich nix  von dem  Hntergrund-Schatten. Den eigentliche schwarzen Rahmen schalte ich zum Schluss einfach via CSS ab und sorge via CSS noch für eine ordentliche Positionierung des Bildes über dem Schatten (padding). 

Falls ich da einen Denkfehler haben sollte mir mailen.

PS: Nach ein paar Überarbeitungen ist mir auf gefallen, dass die Möglichkeit verschiedene Bilder zu rendern, die ja im IMGTEXT mit der IMAGE-Liste (1,2,3,..) vorhanden ist, durch die starre imgObjNum kaputt gemacht wird. Würde imgObjNum auch den stdWrap beinhalten, könnte man einfach anhand unterschiedlicher Zustandsabfragen underschiedliche Bilder "umrahmen". Ich hoffe auf die Zukunft.

 

Rahmen ausgeschaltet

Rahmen eingeschaltet

TypoScript - Contants

  1. lib.shadowIntensity = #999999

TypoScript - Setup

  1. # Orginal Bildkonfiguration retten
  2. shadowedImageTemp < tt_content.image.20.1
  3.  
  4. # Dann die normalen Einstellung kopieren
  5. tt_content.image.30 < tt_content.image.20
  6.  
  7. # Als nächstes die "normalen" Einstellung mit der Bedingung knüpfen,
  8. # dass sie nur angezeigt wird, ein KEIN Rahmen angeklickt
  9. # wurde.
  10. tt_content.image.20.stdWrap.if.isFalse.field = imageborder
  11.  
  12. # Jetzt in der Kopie die alte Bordereinstellung löschen und
  13. # auf 15px vergrößern. Aufgrund eines Typo3-BUG hat,
  14. # das keine Auswirkung, außer dass die Zelle um das Bild um
  15. # 2x15px vergrößert wird. Das kommt uns sehr entgegen.
  16. # Der eigentliche Rahmen wird später, via CSS abgeschaltet.
  17. tt_content.image.30.border >
  18. tt_content.image.30.border = 1
  19. tt_content.image.30.borderThick = 15
  20.  
  21.  
  22. # An die Kopie die Bedingung dran hängen, dass die DropShadow-
  23. # Variante nur angezeigt wird, wenn der Border angeklickt
  24. # wurde.
  25. tt_content.image.30.stdWrap.if.isTrue.field = imageborder
  26.  
  27. # Jetzt kommt noch die Änderungen für den DropShadow:
  28. # Ursprungsquelle: http://wiki.typo3.org/index.php/GIFBUILDER#Variant_2
  29. # Aber ich hab das IMAGE im IMG_TEXT etwas
  30. # umgebaut.
  31. tt_content.image.30.1.stdWrap.cObject = COA
  32. tt_content.image.30.1.stdWrap.cObject{
  33. 10 = TEXT
  34. 10.value = <div style="background-repeat: no-repeat;
  35. 20 = IMG_RESOURCE
  36. 20.stdWrap.wrap = background-image:url(|);
  37.  
  38. # jetzt der CodeSchnipsel aus dem Typo3-Wiki:
  39. 20.file = GIFBUILDER
  40. 20.file{
  41. XY = [10.w]+40,[10.h]+40
  42. # The background color of the image/content
  43. backColor = #ffffff
  44. transparentBackground = 1
  45. # Create a "dummy" image from the real image which is 20 pixel
  46. # smaller than the set width.
  47. 10 = IMAGE
  48. 10 {
  49. file.import.current = 1
  50. file.width.stdWrap = 1
  51. file.width.stdWrap.field = imagewidth
  52. file.width.prioriCalc = intval
  53. offset = 10,10
  54. }
  55.  
  56. # Draw a black/gray box over the dummy image
  57. 20 = BOX
  58. 20.dimensions = 10,10,[10.w],[10.h]
  59. # You have to set lib.shadowIntensity in your constants.
  60. 20.color = {$lib.shadowIntensity}
  61.  
  62. # Blur the black box
  63. 30 = EFFECT
  64. 30.value = blur=99 |
  65. # Hier würde normalerweise Das Bild wieder
  66. # drüber gelegt werden, dass lasse ich wech
  67. # so hab ich nur den Schatten
  68. }
  69. #Background-Tag wieder schließen...
  70. 30 = TEXT
  71. 30.value = " >
  72.  
  73. # in die 40 kommt das Orginalbild rein s.u.
  74.  
  75. #Background-Tag wieder schließen...
  76. 50 = TEXT
  77. 50.value = </div>
  78. }
  79.  
  80. # Jetzt noch die geretteten Bildeinstellungen übertragen...
  81. tt_content.image.30.1.stdWrap.cObject.40 < shadowedImageTemp
  82. tt_content.image.30.1.stdWrap.cObject.40 = IMAGE
  83. tt_content.image.30.1.stdWrap.cObject.40.file{
  84. import.current = 1
  85. field = imagewidth
  86. maxW = {$styles.content.imgtext.maxW}
  87. }
  88.  
  89. # Damit das ganze auch in der Text-Bild-Kombinationfunktioniert...
  90. tt_content.textpic.40 = < tt_content.image.30
  91. tt_content.textpic.40.text.10 = COA
  92. tt_content.textpic.40.text.10 {
  93. if.value = 24
  94. if.isGreaterThan.field = imageorient
  95. 10 = < lib.stdheader
  96. 10.stdWrap.dataWrap = <div class="csc-textpicHeader csc-textpicHeader-{field:imageorient}">|</div>
  97. }
  98. tt_content.textpic.40.text.20 = < tt_content.text.20
  99.  

CSS - Änderung

  1. DIV.csc-textpic-border DIV.csc-textpic-imagewrap .csc-textpic-image IMG {
  2. border:0;
  3. padding: 5px 15px 15px 5px;
  4. }
  5.