maki-o memo

制作に関する私的なメモです

ie6/7で、強引にdisplay:table-cell;風

画像が並ぶようなコンテンツで、サムネールが以下のように配置される可能性がある場合、

サンプル

とりあえず、cssでこう書きます。

li  a {
    display: table-cell;
    height: 150px;
    text-align: center;
    vertical-align: middle;
    width: 150px;
}

この場合、FireFox等のモダンブラウザでは横長のサムネールもbox(この場合ではaタグ)内で垂直方向にセンタリングして配置されるのですが、
なんちゃってモダンブラウザのie6/7ではtable-cellが効かないので、横長の方のサムネールが上方にくっついて配置されてしまいます。

ちょくちょくie6/7でも、table-cellを有効に〜みたいな記事は見るんですが、
個人的にあまりうまくいかないので、jQuery使ってこう書きました。

    //ua取得
    var ua = navigator.userAgent;
    
    if(ua.indexOf('IE 6') > -1 || ua.indexOf('IE 7') > -1){
        //サムネールを内包する、a内で、display:table-cell;vertical-align:middle;のように表示する
        $('ul a').each(function(){
            var x = $('img',this).width();
            var y = $('img',this).height();

            var flag = this.nodeName.match(/a/i); //対象ノードがaかどうか判断
            if(flag){
                x += 4; //何故かieはaに内包されている時4px少なく算出する為+4
                y += 4; //何故かieはaに内包されている時4px少なく算出する為+4
            }
            
            if(x > y){
                $(this).css({display:'block'});
                var boxY = $(this).height();
                if(boxY != y){
                    var rePadding = Math.floor((boxY - y) / 2);
                    var reHeight = boxY - rePadding;
                    $(this).css({paddingTop:rePadding+'px',height:reHeight+'px'});
                }else if(flag){
                    $(this).css({display:'inline'});
                }
            }
        });
    }

サムネールの、widthとheightを比べて、widthの方が大きい場合に、親box(この場合はaタグ)のheight - imgのheight /2 をして、aの上paddingにしてます。
更にそのままだと、親boxの高さがおかしくなるので、親boxのheight - 設定した上padding の値を、新たに親boxの高さに設定し直してます。

あと、何故かieはaタグに内包されている時には、imgの高さを4px少なく取得するみたいなので、それぞれ+4してます。
逆に適用する対象がaタグじゃない場合にはちゃんとimgの大きさを算出するみたいです。
よくわからん。

表題の通り、強引にtable-cell風です。


プロフィール

フロントエンドエンジニア

Tomokazu Makita

名古屋でフリーランスでWeb制作してます。 フロントエンドのことを主にやってます。
a-blog cmsを使用したサイト制作が得意です。
お仕事のご相談随時受付中。

雪山大すき。冬は雪山の合間に仕事します。
財布はいつも吹雪です。

エントリーリスト

タグ