使用CSS、Javascript或SVG反转基础元素上的颜色
基本上,我想做一个空div,我可以把它放在页面的任何地方,它会反转它后面所有东西的颜色。这可能吗?(它不应该反转重叠的整个元素,只反转div覆盖的部分)也许这就是您需要的:使用CSS、Javascript或SVG反转基础元素上的颜色,javascript,html,svg,Javascript,Html,Svg,基本上,我想做一个空div,我可以把它放在页面的任何地方,它会反转它后面所有东西的颜色。这可能吗?(它不应该反转重叠的整个元素,只反转div覆盖的部分)也许这就是您需要的: 函数开始(){ var canvas1=document.getElementById(“canvas”); var ctx1=canvas1.getContext(“2d”); var canvas2=document.getElementById(“结束”); var ctx2=canvas2.getContext(“2
函数开始(){
var canvas1=document.getElementById(“canvas”);
var ctx1=canvas1.getContext(“2d”);
var canvas2=document.getElementById(“结束”);
var ctx2=canvas2.getContext(“2d”);
//只需放置一个彩色的随机背景即可。
随机填充(ctx1);
//镜头的动画。
var x=Math.random()*100;
var y=Math.random()*100;
var速度=.02;
var vx=.03+数学随机()*速度;
var vy=.03+数学.random()*速度;
var lastTime=0;
函数动画(时间){
window.requestAnimationFrame(动画);
如果(lastTime==0){
lastTime=时间;
}否则{
var延迟=时间-上次时间;
lastTime=时间;
x+=延迟*vx;
y+=延迟*vy;
if(x<0){
x=0;
vx=-vx;
}
如果(x>299),则为else{
x=299;
vx=-vx;
}
if(y<0){
y=0;
vy=-vy;
}
如果(y>299),则为else{
y=299;
vy=-vy;
}
canvas2.style.top=数学地板(y)+“px”;
canvas2.style.left=数学地板(x)+“px”;
}
应用过滤器(ctx1,ctx2,x,y);
}
window.requestAnimationFrame(动画);
}
函数随机填充(ctx){
变量i,x,y,w,h;
对于(i=0;i<1000;i++){
x=数学地板(数学随机()*400)-50;
y=数学地板(数学随机()*400)-50;
w=数学地板(数学随机()*100);
h=数学地板(数学随机()*100);
ctx.fillStyle='rgb('+Math.floor(Math.random()*256)+','
+Math.floor(Math.random()*256)+“,“+Math.floor(Math.random()*256)+');
ctx.fillRect(x,y,w,h);
}
}
函数应用过滤器(ctx1、ctx2、x、y){
var w=100,h=100;
var img=ctx1.getImageData(x,y,w,h);
var像素=img.data;
var-k;
对于(k=0;k
请注意applyFilter的功能。或在straight SVG中,您可以像在中一样使用feComponentTransfer反转过滤区域的频谱。最简单的方法是使用CSS3属性
混合模式
。这只是一行代码
。将后面的一切都颠倒过来{
混合模式:排除;
}
请参阅:您可以使用背景过滤器
css属性实现它(或任何)
.overlay{
/*反转效应*/
-webkit背景过滤器:倒置(100%);
背景过滤器:反转(100%);
位置:固定;
顶部:50px;
左:50px;
宽度:100px;
高度:50px;
边框:纯色1px蓝色;
过渡:所有0.3秒缓解;
}
.覆盖:悬停{
左:100px;
}
Lorem ipsum dolor sit amet,是一位杰出的献身者。马蒂斯元素的尊严。佩伦特斯·拉库斯·维利特(lacus velit)、索利西托(sollicitudin eget tincidunt)和达比(dapibus)都是侵权人。内耳前庭。罗恩·佩伦茨克·普鲁斯·鲁特鲁姆、普雷蒂姆·胡斯托·ac、权杖扫描电镜。潜力悬钩子。这是我的最爱。在tellus中的前庭相位于amet euismod。别告诉我福西布斯·莱克图斯。这是一个很好的例子。我是亨德雷特·莫莱斯蒂·亨德雷特。默比·康瓦利斯是一位杰出的医生。这是一个很好的例子。没有欧盟的利古拉和莫里斯·拉奥里特诅咒我们。不要相信狮子座,我是权杖。埃涅亚显贵酒店
同侧前庭。维尼那提万岁。埃蒂亚姆·莫利斯·里姆。不可能是自由之门或自由之门。非智者的梅塞纳斯(Maecenas non-sapien a tellus rutrum pellentesque)和非智者的梅塞纳斯(Maecenas non-nisi)。埃尼安·朗库斯和阿尔库·阿克西皮特。毛里斯在努克·奎斯·多洛·阿利奎特·法雷特拉。无耳,舌骨,前庭。马莱苏阿达·胡斯托·洛博蒂斯。毛里斯·埃利特·阿库,封建王朝的放纵者,效率和效率。以威严的姿态,威严的尤伊斯莫。同侧弧悬吊术。你的尊严和你的温柔。Nunc massa purus,hendrerit Qus lacinia non,erat的luctus。
不使用div,但如果html相对简单,可以使用canvas元素。@Pamblam啊,我实际上在画布上有一个div,我需要它来反转后面的画布。出于各种原因,我不能只在画布上做。如果有可能使用另一个画布元素,我也许可以做到。你可以。您必须查看mdn页面,该页面解释了如何在画布上绘制html,然后您必须通过谷歌找到如何循环画布上的像素并反转每个像素的颜色。很抱歉,这样的例子太多了。@Pamblam k我来看看。Thanks@dandavis这只适用于div的内容,不影响其后面的canvas元素(iirc)现在是2018年,是否仍然不可能应用倒置过滤器来倒置滤芯下方的内容?这个经常运行的代码对我来说是一个阻碍。。。
function start() {
var canvas1 = document.getElementById("canvas");
var ctx1 = canvas1.getContext("2d");
var canvas2 = document.getElementById("over");
var ctx2 = canvas2.getContext("2d");
// Just put a colorfull random background to play with.
randomFill( ctx1 );
// Animation of the lens.
var x = Math.random() * 100;
var y = Math.random() * 100;
var speed = .02;
var vx = .03 + Math.random() * speed;
var vy = .03 + Math.random() * speed;
var lastTime = 0;
function anim( time ) {
window.requestAnimationFrame( anim );
if (lastTime == 0) {
lastTime = time;
} else {
var delay = time - lastTime;
lastTime = time;
x += delay * vx;
y += delay * vy;
if (x < 0) {
x = 0;
vx = -vx;
}
else if (x > 299) {
x = 299;
vx = -vx;
}
if (y < 0) {
y = 0;
vy = -vy;
}
else if (y > 299) {
y = 299;
vy = -vy;
}
canvas2.style.top = Math.floor(y) + "px";
canvas2.style.left = Math.floor(x) + "px";
}
applyFilter( ctx1, ctx2, x, y );
}
window.requestAnimationFrame( anim );
}
function randomFill( ctx ) {
var i, x, y, w, h;
for (i = 0 ; i < 1000 ; i++) {
x = Math.floor( Math.random() * 400 ) - 50;
y = Math.floor( Math.random() * 400 ) - 50;
w = Math.floor( Math.random() * 100 );
h = Math.floor( Math.random() * 100 );
ctx.fillStyle = 'rgb(' + Math.floor(Math.random()*256) + ","
+ Math.floor(Math.random()*256) + "," + Math.floor(Math.random()*256) + ')';
ctx.fillRect( x, y, w, h );
}
}
function applyFilter( ctx1, ctx2, x, y ) {
var w = 100, h = 100;
var img = ctx1.getImageData(x, y, w, h);
var pixels = img.data;
var k;
for (k = 0 ; k < pixels.length ; k += 4) {
pixels[k + 0] = 255 - pixels[k + 0];
pixels[k + 1] = 255 - pixels[k + 1];
pixels[k + 2] = 255 - pixels[k + 2];
}
ctx2.putImageData(img, 0, 0);
}