body {
overflow: hidden;
background: #000;
font-family: 'Courier New', monospace;
height: 100vh;
width: 100vw;
}
.matrix-container {
position: relative;
width: 100%;
height: 100%;
background: linear-gradient(180deg, #000 0%, #001100 50%, #002200 100%);
}
.liquid-stream {
position: absolute;
width: 2px;
opacity: 0;
transform-origin: top;
filter: blur(0.5px);
}
.liquid-drop {
position: absolute;
width: 8px;
height: 8px;
border-radius: 50%;
background: radial-gradient(circle, #00ff41 0%, #00cc33 50%, #008822 100%);
box-shadow: 0 0 15px #00ff41, 0 0 25px #00ff41, 0 0 35px #00aa22;
animation: ripple 0.8s ease-out forwards;
}
.chrome-trail {
background: linear-gradient(180deg,
transparent 0%,
rgba(192, 192, 192, 0.3) 10%,
rgba(255, 255, 255, 0.8) 30%,
rgba(0, 255, 65, 0.9) 50%,
rgba(0, 255, 65, 1) 80%,
rgba(0, 200, 50, 1) 100%);
filter: blur(1px);
box-shadow: 0 0 10px rgba(0, 255, 65, 0.5);
}
.mercury-trail {
background: linear-gradient(180deg,
transparent 0%,
rgba(128, 128, 128, 0.4) 20%,
rgba(0, 255, 65, 0.6) 40%,
rgba(0, 255, 65, 0.8) 60%,
rgba(0, 255, 65, 1) 100%);
filter: blur(0.8px);
box-shadow: 0 0 15px rgba(0, 255, 65, 0.7), inset 0 0 5px rgba(255, 255, 255, 0.3);
}
.viscous-trail {
background: linear-gradient(180deg,
transparent 0%,
rgba(0, 255, 65, 0.2) 30%,
rgba(0, 255, 65, 0.6) 60%,
rgba(0, 255, 65, 0.9) 85%,
rgba(0, 255, 65, 1) 100%);
width: 4px;
filter: blur(1.2px);
border-radius: 2px;
animation: viscous-drip 3s ease-in-out infinite;
}
@keyframes viscous-drip {
0%, 100% { transform: scaleY(1) scaleX(1); }
50% { transform: scaleY(1.2) scaleX(1.5); }
}
@keyframes ripple {
0% {
transform: scale(1);
opacity: 1;
}
100% {
transform: scale(8);
opacity: 0;
}
}
.glow-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: radial-gradient(ellipse at center,
transparent 60%,
rgba(0, 255, 65, 0.1) 80%,
rgba(0, 255, 65, 0.2) 100%);
pointer-events: none;
mix-blend-mode: screen;
}
.distortion-field {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background:
radial-gradient(circle at 20% 30%, rgba(0, 255, 65, 0.1) 0%, transparent 50%),
radial-gradient(circle at 80% 70%, rgba(0, 255, 65, 0.1) 0%, transparent 50%),
radial-gradient(circle at 50% 50%, rgba(0, 255, 65, 0.05) 0%, transparent 70%);
filter: blur(2px);
animation: distort 4s ease-in-out infinite alternate;
pointer-events: none;
}
@keyframes distort {
0% { filter: blur(2px) hue-rotate(0deg); }
100% { filter: blur(3px) hue-rotate(10deg); }
}
.character {
color: #00ff41;
text-shadow: 0 0 5px #00ff41, 0 0 10px #00ff41;
font-size: 12px;
line-height: 1;
opacity: 0;
position: absolute;
}
.splash-pool {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 20px;
background: linear-gradient(180deg,
transparent 0%,
rgba(0, 255, 65, 0.3) 50%,
rgba(0, 255, 65, 0.6) 100%);
filter: blur(2px);
box-shadow: 0 -5px 15px rgba(0, 255, 65, 0.4);
}
</style>
body {
overflow: hidden;
background: #000;
font-family: 'Courier New', monospace;
height: 100vh;
width: 100vw;
}
.matrix-container {
position: relative;
width: 100%;
height: 100%;
background: linear-gradient(180deg, #000 0%, #001100 50%, #002200 100%);
}
.liquid-stream {
position: absolute;
width: 2px;
opacity: 0;
transform-origin: top;
filter: blur(0.5px);
}
.liquid-drop {
position: absolute;
width: 8px;
height: 8px;
border-radius: 50%;
background: radial-gradient(circle, #00ff41 0%, #00cc33 50%, #008822 100%);
box-shadow: 0 0 15px #00ff41, 0 0 25px #00ff41, 0 0 35px #00aa22;
animation: ripple 0.8s ease-out forwards;
}
.chrome-trail {
background: linear-gradient(180deg,
transparent 0%,
rgba(192, 192, 192, 0.3) 10%,
rgba(255, 255, 255, 0.8) 30%,
rgba(0, 255, 65, 0.9) 50%,
rgba(0, 255, 65, 1) 80%,
rgba(0, 200, 50, 1) 100%);
filter: blur(1px);
box-shadow: 0 0 10px rgba(0, 255, 65, 0.5);
}
.mercury-trail {
background: linear-gradient(180deg,
transparent 0%,
rgba(128, 128, 128, 0.4) 20%,
rgba(0, 255, 65, 0.6) 40%,
rgba(0, 255, 65, 0.8) 60%,
rgba(0, 255, 65, 1) 100%);
filter: blur(0.8px);
box-shadow: 0 0 15px rgba(0, 255, 65, 0.7), inset 0 0 5px rgba(255, 255, 255, 0.3);
}
.viscous-trail {
background: linear-gradient(180deg,
transparent 0%,
rgba(0, 255, 65, 0.2) 30%,
rgba(0, 255, 65, 0.6) 60%,
rgba(0, 255, 65, 0.9) 85%,
rgba(0, 255, 65, 1) 100%);
width: 4px;
filter: blur(1.2px);
border-radius: 2px;
animation: viscous-drip 3s ease-in-out infinite;
}
@keyframes viscous-drip {
0%, 100% { transform: scaleY(1) scaleX(1); }
50% { transform: scaleY(1.2) scaleX(1.5); }
}
@keyframes ripple {
0% {
transform: scale(1);
opacity: 1;
}
100% {
transform: scale(8);
opacity: 0;
}
}
.glow-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: radial-gradient(ellipse at center,
transparent 60%,
rgba(0, 255, 65, 0.1) 80%,
rgba(0, 255, 65, 0.2) 100%);
pointer-events: none;
mix-blend-mode: screen;
}
.distortion-field {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background:
radial-gradient(circle at 20% 30%, rgba(0, 255, 65, 0.1) 0%, transparent 50%),
radial-gradient(circle at 80% 70%, rgba(0, 255, 65, 0.1) 0%, transparent 50%),
radial-gradient(circle at 50% 50%, rgba(0, 255, 65, 0.05) 0%, transparent 70%);
filter: blur(2px);
animation: distort 4s ease-in-out infinite alternate;
pointer-events: none;
}
@keyframes distort {
0% { filter: blur(2px) hue-rotate(0deg); }
100% { filter: blur(3px) hue-rotate(10deg); }
}
.character {
color: #00ff41;
text-shadow: 0 0 5px #00ff41, 0 0 10px #00ff41;
font-size: 12px;
line-height: 1;
opacity: 0;
position: absolute;
}
.splash-pool {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 20px;
background: linear-gradient(180deg,
transparent 0%,
rgba(0, 255, 65, 0.3) 50%,
rgba(0, 255, 65, 0.6) 100%);
filter: blur(2px);
box-shadow: 0 -5px 15px rgba(0, 255, 65, 0.4);
}
</style>
<script>
const canvas = document.getElementById('liquidCanvas');
const ctx = canvas.getContext('2d');
const container = document.querySelector('.matrix-container');
function resizeCanvas() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
}
resizeCanvas();
window.addEventListener('resize', resizeCanvas);
const streams = [];
const drops = [];
const characters = '01アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン';
class LiquidStream {
constructor(x) {
this.x = x;
this.y = -Math.random() * canvas.height;
this.speed = Math.random() * 3 + 2;
this.length = Math.random() * 100 + 50;
this.opacity = Math.random() * 0.8 + 0.2;
this.type = Math.random() < 0.3 ? 'chrome' : Math.random() < 0.6 ? 'mercury' : 'viscous';
this.width = this.type === 'viscous' ? Math.random() * 4 + 2 : Math.random() * 2 + 1;
this.chars = [];
this.viscosity = Math.random() * 0.5 + 0.5;
for (let i = 0; i < this.length / 15; i++) {
this.chars.push({
char: characters[Math.floor(Math.random() * characters.length)],
offset: i * 15,
opacity: Math.random()
});
}
}
update() {
this.y += this.speed;
if (this.type === 'viscous') {
this.speed *= this.viscosity;
this.width += Math.sin(Date.now() * 0.01 + this.x * 0.1) * 0.1;
}
// Create splash when hitting bottom
if (this.y > canvas.height - 20 && Math.random() < 0.3) {
this.createSplash();
}
return this.y < canvas.height + this.length;
}
createSplash() {
for (let i = 0; i < 3; i++) {
drops.push(new SplashDrop(
this.x + (Math.random() - 0.5) * 20,
canvas.height - 10
));
}
}
draw() {
// Draw liquid trail
const gradient = ctx.createLinearGradient(0, this.y - this.length, 0, this.y);
if (this.type === 'chrome') {
gradient.addColorStop(0, 'rgba(192, 192, 192, 0)');
gradient.addColorStop(0.3, 'rgba(255, 255, 255, 0.8)');
gradient.addColorStop(0.7, 'rgba(0, 255, 65, 0.9)');
gradient.addColorStop(1, 'rgba(0, 255, 65, 1)');
} else if (this.type === 'mercury') {
gradient.addColorStop(0, 'rgba(128, 128, 128, 0)');
gradient.addColorStop(0.4, 'rgba(0, 255, 65, 0.6)');
gradient.addColorStop(1, 'rgba(0, 255, 65, 1)');
} else {
gradient.addColorStop(0, 'rgba(0, 255, 65, 0)');
gradient.addColorStop(0.6, 'rgba(0, 255, 65, 0.6)');
gradient.addColorStop(1, 'rgba(0, 255, 65, 1)');
}
ctx.save();
ctx.globalAlpha = this.opacity;
ctx.fillStyle = gradient;
ctx.filter = 'blur(1px)';
if (this.type === 'viscous') {
// Draw viscous drip shape
ctx.beginPath();
ctx.ellipse(this.x, this.y - this.length / 2, this.width / 2, this.length / 2, 0, 0, Math.PI * 2);
ctx.fill();
} else {
ctx.fillRect(this.x - this.width / 2, this.y - this.length, this.width, this.length);
}
ctx.restore();
// Draw characters
ctx.save();
ctx.font = '12px Courier New';
ctx.textAlign = 'center';
this.chars.forEach((charObj, i) => {
const charY = this.y - charObj.offset;
if (charY > 0 && charY < canvas.height) {
ctx.globalAlpha = charObj.opacity * this.opacity;
ctx.fillStyle = '#00ff41';
ctx.shadowColor = '#00ff41';
ctx.shadowBlur = 5;
ctx.fillText(charObj.char, this.x, charY);
}
});
ctx.restore();
}
}
class SplashDrop {
constructor(x, y) {
this.x = x;
this.y = y;
this.scale = 0;
this.maxScale = Math.random() * 6 + 2;
this.opacity = 1;
this.life = 0;
this.maxLife = 60;
}
update() {
this.life++;
this.scale = (this.life / this.maxLife) * this.maxScale;
this.opacity = 1 - (this.life / this.maxLife);
return this.life < this.maxLife;
}
draw() {
ctx.save();
ctx.globalAlpha = this.opacity;
ctx.strokeStyle = '#00ff41';
ctx.lineWidth = 2;
ctx.shadowColor = '#00ff41';
ctx.shadowBlur = 10;
ctx.beginPath();
ctx.arc(this.x, this.y, this.scale, 0, Math.PI * 2);
ctx.stroke();
ctx.restore();
}
}
function animate() {
ctx.fillStyle = 'rgba(0, 0, 0, 0.1)';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// Create new streams
if (Math.random() < 0.3) {
streams.push(new LiquidStream(Math.random() * canvas.width));
}
// Update and draw streams
for (let i = streams.length - 1; i >= 0; i--) {
if (!streams[i].update()) {
streams.splice(i, 1);
} else {
streams[i].draw();
}
}
// Update and draw drops
for (let i = drops.length - 1; i >= 0; i--) {
if (!drops[i].update()) {
drops.splice(i, 1);
} else {
drops[i].draw();
}
}
requestAnimationFrame(animate);
}
animate();
</script>
<script>
const canvas = document.getElementById('liquidCanvas');
const ctx = canvas.getContext('2d');
const container = document.querySelector('.matrix-container');
function resizeCanvas() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
}
resizeCanvas();
window.addEventListener('resize', resizeCanvas);
const streams = [];
const drops = [];
const characters = '01アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン';
class LiquidStream {
constructor(x) {
this.x = x;
this.y = -Math.random() * canvas.height;
this.speed = Math.random() * 3 + 2;
this.length = Math.random() * 100 + 50;
this.opacity = Math.random() * 0.8 + 0.2;
this.type = Math.random() < 0.3 ? 'chrome' : Math.random() < 0.6 ? 'mercury' : 'viscous';
this.width = this.type === 'viscous' ? Math.random() * 4 + 2 : Math.random() * 2 + 1;
this.chars = [];
this.viscosity = Math.random() * 0.5 + 0.5;
for (let i = 0; i < this.length / 15; i++) {
this.chars.push({
char: characters[Math.floor(Math.random() * characters.length)],
offset: i * 15,
opacity: Math.random()
});
}
}
update() {
this.y += this.speed;
if (this.type === 'viscous') {
this.speed *= this.viscosity;
this.width += Math.sin(Date.now() * 0.01 + this.x * 0.1) * 0.1;
}
// Create splash when hitting bottom
if (this.y > canvas.height - 20 && Math.random() < 0.3) {
this.createSplash();
}
return this.y < canvas.height + this.length;
}
createSplash() {
for (let i = 0; i < 3; i++) {
drops.push(new SplashDrop(
this.x + (Math.random() - 0.5) * 20,
canvas.height - 10
));
}
}
draw() {
// Draw liquid trail
const gradient = ctx.createLinearGradient(0, this.y - this.length, 0, this.y);
if (this.type === 'chrome') {
gradient.addColorStop(0, 'rgba(192, 192, 192, 0)');
gradient.addColorStop(0.3, 'rgba(255, 255, 255, 0.8)');
gradient.addColorStop(0.7, 'rgba(0, 255, 65, 0.9)');
gradient.addColorStop(1, 'rgba(0, 255, 65, 1)');
} else if (this.type === 'mercury') {
gradient.addColorStop(0, 'rgba(128, 128, 128, 0)');
gradient.addColorStop(0.4, 'rgba(0, 255, 65, 0.6)');
gradient.addColorStop(1, 'rgba(0, 255, 65, 1)');
} else {
gradient.addColorStop(0, 'rgba(0, 255, 65, 0)');
gradient.addColorStop(0.6, 'rgba(0, 255, 65, 0.6)');
gradient.addColorStop(1, 'rgba(0, 255, 65, 1)');
}
ctx.save();
ctx.globalAlpha = this.opacity;
ctx.fillStyle = gradient;
ctx.filter = 'blur(1px)';
if (this.type === 'viscous') {
// Draw viscous drip shape
ctx.beginPath();
ctx.ellipse(this.x, this.y - this.length / 2, this.width / 2, this.length / 2, 0, 0, Math.PI * 2);
ctx.fill();
} else {
ctx.fillRect(this.x - this.width / 2, this.y - this.length, this.width, this.length);
}
ctx.restore();
// Draw characters
ctx.save();
ctx.font = '12px Courier New';
ctx.textAlign = 'center';
this.chars.forEach((charObj, i) => {
const charY = this.y - charObj.offset;
if (charY > 0 && charY < canvas.height) {
ctx.globalAlpha = charObj.opacity * this.opacity;
ctx.fillStyle = '#00ff41';
ctx.shadowColor = '#00ff41';
ctx.shadowBlur = 5;
ctx.fillText(charObj.char, this.x, charY);
}
});
ctx.restore();
}
}
class SplashDrop {
constructor(x, y) {
this.x = x;
this.y = y;
this.scale = 0;
this.maxScale = Math.random() * 6 + 2;
this.opacity = 1;
this.life = 0;
this.maxLife = 60;
}
update() {
this.life++;
this.scale = (this.life / this.maxLife) * this.maxScale;
this.opacity = 1 - (this.life / this.maxLife);
return this.life < this.maxLife;
}
draw() {
ctx.save();
ctx.globalAlpha = this.opacity;
ctx.strokeStyle = '#00ff41';
ctx.lineWidth = 2;
ctx.shadowColor = '#00ff41';
ctx.shadowBlur = 10;
ctx.beginPath();
ctx.arc(this.x, this.y, this.scale, 0, Math.PI * 2);
ctx.stroke();
ctx.restore();
}
}
function animate() {
ctx.fillStyle = 'rgba(0, 0, 0, 0.1)';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// Create new streams
if (Math.random() < 0.3) {
streams.push(new LiquidStream(Math.random() * canvas.width));
}
// Update and draw streams
for (let i = streams.length - 1; i >= 0; i--) {
if (!streams[i].update()) {
streams.splice(i, 1);
} else {
streams[i].draw();
}
}
// Update and draw drops
for (let i = drops.length - 1; i >= 0; i--) {
if (!drops[i].update()) {
drops.splice(i, 1);
} else {
drops[i].draw();
}
}
requestAnimationFrame(animate);
}
animate();
</script>