Raphaël (SVG/VML)でも試してみたのでいちおう記録しておく。実用するのは 前回 の実装でよいと思うが。IE8での動作負荷も前回のやつの方が軽い気がする。
<img class="hoverTransBorderSVG" src="img.jpg">
<script>
$.fn.hoverTransBorderSVG = function( arg ){
var opt = $.extend(true,{
width : 30
,color :'#fff'
,opacity: 0.6
},arg);
opt.width *= 2;
return this.each(function(){
var img = this;
var onload = function(){
var W = img.width;
var H = img.height;
var $paper = $('<div/>').css({
position:'absolute'
,left : 0
,top : 0
,width : W
,height : H
});
var paper = Raphael( $paper[0] ,W ,H );
var image = paper.image( img.src ,0 ,0 ,W ,H ).attr({
'fill' :'rgb(255,255,255)'
,'fill-opacity' : 0.01
});
var border = paper.rect( 0 ,0 ,W ,H ).attr({
'stroke-opacity': opt.opacity
});
var $wrap = $('<div/>')
.attr('style',$(img).attr('style'))
.attr('class',$(img).attr('class'))
.css({
position :'relative'
,width : W
,height : H
})
.hover(function(){
border.stop().animate({
'stroke' : opt.color
,'stroke-width': opt.width
} ,80 ,'>');
},function(){
border.stop().animate({ 'stroke-width':0 } ,20 ,'>');
});
$(img).wrap( $wrap ).before( $paper );
};
if( img.height >0 ) onload();
else $(img).on('load',onload);
});
};
$('.hoverTransBorderSVG').hoverTransBorderSVG();
</script>
Raphaël(SVG/VML)版
気になったけどスルーした現象。
- Raphaël版はIE8でなぜか上下左右ボーダー幅が微妙に同じではない感じ。
- 全てに共通して、Firefoxでhover対象の<img>がブラウザにより拡大縮小されていた時に、枠が1pxほどズレてしまうことがあった。