2011-06-16 16 views
1

我有'这是否可能在画布上'的问题。假设我在页面上有一个固定的div元素,并且它的背景颜色设置为不透明。现在,当另一个元素(图像)在后面滚动时,可以通过顶部的固定div看到。当在元素后面滚动时去饱和图像

现在,我想这样做,除了后面的全彩色图像会去饱和(即变成不透明,灰度)顶部div覆盖它。我无法找到任何可以用CSS3完成的方式,也没有可能直接使用JavaScript处理像素。

所以我想我想知道如果canvas元素可以检测标准重叠的DOM元素,并在表面上重绘它们。还是有其他方法可以解决这个问题吗?我不想让整个页面成为一个画布(对于非HTML5浏览器),并且闪光灯不是一个选项。

您的想法非常感谢。

+0

所以,如果我有一个半透明的白色格,图像会去色后。你想要做的是让图像不会变得不饱和? – Bojangles 2011-06-16 22:18:11

+0

这是一个“一次性图像”,您可以事先使用Photoshop手动去饱和度?还是它需要能够处理任何图像? – thirtydot 2011-06-16 22:23:44

+0

@JamWaffles,我的歉意,我应该更清楚这一点。我确实希望它去饱和。通过去饱和我的意思是“转向灰度”。一个不透明的顶部元素也会流血。 – Adrian 2011-06-16 22:29:39

回答

3

这对我很有意思,所以我实现了一个解决方案。

参见:http://jsfiddle.net/3eHmD/show/edit

的JavaScript:(有待改进)

var $fixed = $('.fixed'); 
var $source = $('.content'); 

var $fixedCopy = $('<div class="fixedDimensions"></div>').appendTo('body').css('zIndex', 99); 
var $contentCopy = $source.clone().appendTo($fixedCopy); 


$contentCopy.find(':not(.magic)').css('visibility', 'hidden'); 
$contentCopy.find('.magic').each(function() { 
    $(this).css('backgroundPosition', $(this).width() + 'px 0'); 
}); 

$(window).scroll(function(e) { 
    $contentCopy.css('margin-top',-$(window).scrollTop()); 
}).scroll(); 

CSS:

html, body { 
    margin: 0; 
    padding: 0 
} 
body { 
    background: #eee 
} 

.content { 
    width: 300px; 
    margin: 0 auto 
} 
#fixed { 
    background: url(http://i.stack.imgur.com/GKWv7.png); 
    color: red; 
    font: 36px sans-serif; 
    text-align: center 
} 
.fixedDimensions { 
    height: 200px; 
    position: fixed; 
    top: 0; 
    left: 0; 
    right: 0; 
    overflow: hidden; 
    z-index: 100; 
} 

HTML:

<div id="fixed" class="fixedDimensions">Hello</div> 

<div id="container"> 
    <div class="content"> 
     <p><div class="magic" style="width:200px;height:300px;background:url(http://i.stack.imgur.com/b3LRY.jpg)"></div></p> 
     <p>Lorem ipsum dolor...</p> 
     <p><div class="magic" style="width:225px;height:300px;background:url(http://i.stack.imgur.com/6D8gh.jpg)"></div></p> 
     <p>Aenean et diam dui..</p> 
     .. 
    </div> 
</div> 
+1

夏日格劳的+1。 – 2011-06-17 00:46:50

+0

天才。我正要把这个扔进太硬的篮子里。非常感谢你十三岁! – Adrian 2011-06-17 06:01:58

0

如果你愿意使用jQuery,你可能想看看jQuery Desaturate plugin。我意识到它不会做你想做的所有事情(它只是使图像饱和或去饱和),但它可以让你在那里获得一些。

+0

感谢您的提示nrabinowitz,我想我可以轮询图像的位置,覆盖两个图像,并使用css剪辑动画上覆盖,去饱和的图像来揭示它。这个插件至少允许我创建图像而不是存储两个服务器端。对于结果而言,听起来还是很费劲,但这可能奏效! – Adrian 2011-06-16 23:20:42

1

其他人提供的解决方案可能会或可能不会更好,您想要做什么。为了完整起见,要回答你的问题:“这是否可能在画布上?”

是的,可以用画布进行去饱和。方法如下:

var imageData = ctx.getImageData(0,0,can.width, can.height); 
var pixels = imageData.data; 
var numPixels = pixels.length; 

ctx.clearRect(0, 0, can.width, can.height); 

for (var i = 0; i < numPixels; i++) { 
    var average = (pixels[i*4] + pixels[i*4+1] + pixels[i*4+2]) /3; 
    // set red green and blue pixels to the average value 
    pixels[i*4] = average; 
    pixels[i*4+1] = average; 
    pixels[i*4+2] = average; 
} 
ctx.putImageData(imageData, 0, 0); 

您将三种现有颜色的颜色取平均值以获得平均颜色亮度。然后,您将所有三种颜色设置为相同的值,以平均亮度变为灰色。合理?

例子:

http://jsfiddle.net/DZmyB/4/

+0

感谢提示西蒙。我想我最初的问题有点误导,也许我应该问是否可以用某种方式使用画布来操纵图像的某些部分。如果加载了两个版本的图像(至少在答案中),则不需要画布。 – Adrian 2011-06-17 06:05:01

相关问题