Ez egy Kecs.es blog webfejlesztési ötletek, tanácsok, észrevételek

1jan/120

IE6 float és a margin bug

Tudom, hogy az IE6 halott és már el is temették. Sőt a jelenlegi kereskedelmi honlapokon amelyeket üzemeltetünk az IE6 előfordulása aránya kisebb mint 1%, de akkor is előfordulhat, hogy valaki egy olyan speciális környezetre kell, hogy optimalizáljon ahol még mindig IE6 a menő.

Ha ilyennel feladattal találkozol, akkor ez a post igen hasznos lesz számodra. Ismeretes ugyanis, ha IE6 alatt egy elemet float:left tulajdonsággal látunk el, akkor valami miatt a margint megduplázza a böngésző. Ezt nevezzük IE6 floating bug-nak. Ennek kivédésére a régebbi és általam ismert módszer az IE6-ra optimalizált CSS volt (minden úsztatott elem margin értéke az eredeti fele), azaz feltételhez kötött stíluslapot használtunk:

<!--[if IE 6]>
<style type="text/css" rel="stylesheet" media="screen" href="theme.ie6.css" />
<![endif]-->

Ezzel szemben ma egy új és sokkal egyszerűbb megoldást találtam. Egyszerűn az úsztatandó elemnek meg kell adni, hogy innentől legyen inline elem. A modern böngészőkben ennek semmi hatása, viszont IE6 esetén megjavítja a box modellt!
.float {
  float: left;
  display: inline;
}

9szept/090

Az a fránya vertical-align az őrületbe kerget!!!

Tegnap szerettem volna egy szép megoldást találni arra a problémára, hogy van egy div, amibe szöveget fogok írni. A div mérete adott (35px magas és 200px széles). A probléma az, hogy a beleírt tartalmat szeretném mindenhogy középre igazítani. vízszintesen nincs is semmi gond. Ott van a text-align: center... De mi van ha függőlegesen szeretnénk valamit középre (szabbvány szerint: middle) igazítani? Hát azt értelmesen nem lehet...

Ugyanis valakinek az a nagyon okos ötlete támadt, hogy a vertical-align csak inline elemkre lehessen használni. Így egy blokk elemmel meg vagy lőve. Léteznek különböző css hack-ek, mint pl.: line-heigh értékét beállítjuk akkorára mint amekkora az őt tartalmazó div, de ez használhatatlan azonnal ha több sort kell beleírni. Vagy ott van a játék a display tulajdonsággal, hogy 3 divet használunk, és akkor kívülről befelé a display tulajdonságot table-re, table-row-ra, és végül table-cel-re állítjuk. De ez megint nem megy IE6 alatt... Szóval nem lesz böngészőfüggetlen...

Ha valaki olyan mint én, miszerint tableless megszállott, akkor nem szívesen használ table-t... de sajnos nincs más választásunk... ott van egyedül normálisan valign='middle' megoldva...

VAGY:
jQuery őrült is egyben mint én, és megoldja azzal. Igen tudom ez sem a legjobb megoldás, mert akinek nincs JAVAja... Az kapja be :D

JavaScript kód:

(function ($) {
  $.fn.vAlign = function(container){
    return this.each(function(i){
      if(container == null) {
        container = 'div';
      }
      //írd át ha kell (Ez az extra magassága a szülő objektumnak)
      var paddingPx = 10;
      $(this).html("<" + container + ">" + $(this).html() + "</" + container + ">");
      var el = $(this).children(container + ":first");
      //az új elem magassága
      var elh = $(el).height();
      //a szülő elem magassága
      var ph = $(this).height();
      if(elh > ph) {
        //Ha az új elem magasabb mint a szülő akkor átméretezi
        $(this).height(elh + paddingPx);
        ph = elh + paddingPx;
      }
      var nh = (ph - elh) / 2; 
      //Új margint beállítja
      $(el).css('margin-top', nh);
    });
  };
})(jQuery);

És a használata:

$(document).ready(function(){
  $("p.special").vAlign();
  //A diven belűl létrehoz egy p elemet
  $("div.info").vAlign("p");
  //A diven belűl létrehoz egy span elemet
  $("p.warn").vAlign("span");
  //És használható további fv is utána :)
  $("p.warn").vAlign().css("color","red");
});

Forrás oldal: http://cool-javascripts.com/
Demó oldal: http://demos.cool-javascripts.com/