// Foggy, v1.02
//
// Description: jQuery plugin for blurring page elements
// Homepage: http://nbartlomiej.github.com/foggy
// Author: [email protected]
(function( $ ){
$.fn.foggy = function( options ) {
var settings = $.extend( {
opacity: 0.8,
blurRadius: 2,
quality: 16,
cssFilterSupport: true
}, options);
var BlurPass = function(content, position, offset, opacity){
this.content = content;
this.position = position;
this.offset = offset;
this.opacity = opacity;
};
BlurPass.prototype.render = function(target){
$('<div/>', { html: this.content }).css({
position: this.position,
opacity: this.opacity,
top: this.offset[0],
left: this.offset[1]
}).appendTo(target);
};
var Circle = function(radius){
this.radius = radius;
};
Circle.prototype.includes = function(x,y){
if (Math.pow(x,2) + Math.pow(y,2) <= Math.pow(this.radius, 2)){
return true;
} else {
return false;
}
};
Circle.prototype.points = function(){
var results = [];
for (var x = -this.radius; x<=this.radius; x++){
for (var y = -this.radius; y<=this.radius; y++){
if (this.includes(x,y)){
results.push([x,y]);
}
}
}
return results;
};
var ManualFog = function(element, settings){
this.element = element;
this.settings = settings;
};
ManualFog.prototype.calculateOffsets = function(radius, quality){
var all_offsets = $.grep(
new Circle(radius+1).points(),
function(element){ return (element[0] != 0) || (element[1] != 0) }
);
var offsets;
if (all_offsets.length <= quality){
offsets = all_offsets;
} else {
var overhead = all_offsets.length - quality;
var targets = [];
for (var i = 0; i < overhead; i++){
targets.push(Math.round(i * (all_offsets.length / overhead)));
}
offsets = $.grep( all_offsets, function(element, index){
if ($.inArray(index, targets) >= 0){
return false;
} else {
return true;
}
});
}
return offsets;
};
ManualFog.prototype.render = function(){
var content = $(this.element).html();
$(this.element).empty();
var wrapper = $('<div/>').css({ position: 'relative' });
var offsets = this.calculateOffsets(
this.settings.blurRadius, this.settings.quality
);
var opacity = (this.settings.opacity * 1.2) / (offsets.length + 1);
new BlurPass(content, 'relative', [0,0], opacity).render(wrapper);
$(offsets).each(function(index, offset){
new BlurPass(content, 'absolute', offset, opacity).render(wrapper);
});
wrapper.appendTo(this.element);
};
var FilterFog = function(element, settings){
this.element = element;
this.settings = settings;
}
FilterFog.prototype.render = function(){
var opacityPercent = (''+settings.opacity).slice(2,4);
$(this.element).css({
'-webkit-filter': 'blur('+this.settings.blurRadius+'px)',
opacity: settings.opacity
});
}
return this.each(function(index, element) {
if (settings.cssFilterSupport && '-webkit-filter' in document.body.style){
new FilterFog(element, settings).render();
} else {
new ManualFog(element, settings).render();
}
});
};
})( jQuery );
$(document).ready( function(){
$('.foggy-demo').foggy();
});
$(document).ready( function(){
$('.foggy-demo-manual').foggy({
cssFilterSupport: false
});
});
.foggy-comparison-wrapper { position: relative; }
.foggy-comparison {
position: absolute;
z-index: 2;
width: 350px;
background: #eee;
padding: 20px;
top: 80px;
left: 150px;
box-shadow: rgba(0,0,0,0.5) 0px 0px 15px;
}
.section{margin:25px;}
p{width:450px;}
img{padding-right:20px;}
<div class='section span-24'>
<div class='span-24'>
<div class='foggy-comparison-wrapper'>
<div class='foggy-comparison'>
下のレイヤーはブラエフェクトがかかってます。
</div>
</div>
</div>
<div class='foggy-demo'>
<div class='span-15 append-1'>
<img src='http://placekitten.com/200/300' style='float:left;'>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Duis commodo massa viverra diam pharetra quis
dictum mauris bibendum. In eget tortor id risus
suscipit facilisis. Duis luctus tortor non sem mollis
sodales. Cras et cursus justo. Phasellus vel libero
erat, vel mattis justo. Aenean tempor bibendum
euismod. Vivamus erat justo, lacinia vitae facilisis
quis, luctus sed mauris. Suspendisse lectus dolor,
accumsan eu lacinia in, dapibus vitae nunc.
</p>
</div>
</div>
</div>