2007-03-16
■[JavaScript][css]IEにおいてfilter:alpha(opacity)を設定しても、currentStyle.hasLayout=falseだとが透明にならない。
IEで不透明度を変更するために下記のようなコードを書いたのですが、対象のエレメントのスタイルによって、不透明度が変わらない場合があることに気がつきました。(IE6、7共に)
element.style.filter = 'alpha(opacity=50)';
だめだったのは、div要素に対して background-colorだけを指定したもので、これに対してwidthまたはheightを追加指定すると、ちゃんと不透明度が効いてきます。
なお、JavaScriptではなくcss上でfilterの指定を行っても同様でした。(width,heigthがないと効かない)
script.aculo.us(v1.7.0)ではどうしているんだろうと、ソース(effects.js)を眺めてみたところ、Element.setOpacityでは特に考慮しているような処理は見当たりませんでした。(その先のprotptype.jsでも)
が、Effect.Opacity の initialize をみると下記のような処理があり、どうもこれで上記の現象を回避しているようです。(ためしに同じスタイルの要素に対してEffect.Fadeを実行してみたところ、ちゃんとフェードアウトしました)
if(/MSIE/.test(navigator.userAgent) &&
!window.opera && (!this.element.currentStyle.hasLayout))
this.element.setStyle({zoom: 1});
currentStyle.hasLayout が false だと、filter: alpha(opacity=xx)は効かないようです。
で、currentStyle.hasLayoutがtrueになるのは、
MSDN hasLayout Propertyによると、下記のようになっており、script.aculo.usでは一番影響のないzoom:1を使って回避しているようです。
| CSS property | Value |
| display | inline-block |
| height | any value |
| float | left or right |
| position | absolute |
| width | any value |
| writing-mode | tb-rl |
| zoom | any value |
トラックバック - http://d.hatena.ne.jp/onozaty/20070316/p1
リンク元
- 8 http://b.hatena.ne.jp/entrylist?sort=hot
- 8 http://reader.livedoor.com/reader/
- 6 http://b.hatena.ne.jp/
- 4 http://www.enjoyxstudy.com/javascript/suggest/
- 4 http://www.google.com/reader/view/
- 3 http://www.enjoyxstudy.com/javascript/glayer/
- 2 http://b.hatena.ne.jp/add?mode=confirm&title=Enjoy*Study - IE%u306B%u304A%u3044%u3066filter:alpha(opacity)%u3092%u8A2D%u5B9A%u3057%u3066%u3082%u3001currentStyle.hasLayout=false%u3060%u3068%u304C%u900F%u660E%u306B%u306A%u3089%u306A%u3044%u3002&
- 2 http://b.hatena.ne.jp/add?mode=confirm&url=http://d.hatena.ne.jp/onozaty/20070316/p1
- 2 http://b.hatena.ne.jp/entrylist?url=http://&threshold=3
- 2 http://blog.yappo.jp/yappo/archives/000376.html

