CSS text shadows are a great way to add depth and dimension to your text. It can be used for a variety of purposes, from subtle shine to bold lines. But what if you want to create a dynamic and ever-changing text shadow?
This is where CSS animations come in. CSS animations allow you to create effects that change over time, such as fading, rotation, and scaling. By combining CSS text shadows and animations you can create really dynamic and eye-catching effects.
In this blog post, we will discuss some advanced techniques for creating dynamic text shadow CSS animations. We will discuss topics e.g.
By the end of this blog post, you will have the skills to create your own dynamic text shadow CSS animations.
Text shadows are a great way to add depth and dimension to your text, but they can also be used to create sharp and eye-catching effects. To combine CSS text shadows and animations, you can create effects that change over time, such as fading, rotation, and scaling.
One of the most common ways to create dynamic text shadow animations is to use CSS variables. CSS variables allow you to set values that can be used throughout your CSS code. This means that you can easily control the animation by changing the value of one variable.
window.onload = init;
function init() {
var root = new THREERoot({
createCameraControls: !true,
antialias: (window.devicePixelRatio
|| 1) == 1,
fov: 90,
});
root.renderer.setClearColor(0x000000);
root.renderer.setPixelRatio
(window.devicePixelRatio || 1);
root.camera.position.set(0, 0, 300);
var textAnimation = createText
Animation();
root.scene.add(textAnimation);
var light = new THREE.Directiona
lLight();
light.position.set(0, 0, 1);
root.scene.add(light);
var tl = new TimelineMax({
repeat: -1,
repeatDelay: 0.25,
yoyo: true,
});
tl.fromTo(
textAnimation,
8,
{ animationProgress: 0.0 },
{ animationProgress: 0.8, ease:
Power1.easeInOut },
0
);
tl.to(root.camera.position, 8, { z:
-350, ease: Power1.easeInOut }, 0);
createTweenScrubber(tl);
}
function createTextAnimation() {
var geometry = generateTextGeometry
("Jai Shri Ram", {
size: 14,
height: 4,
font: "droid sans",
weight: "bold",
style: "normal",
curveSegments: 24,
bevelSize: 1,
bevelThickness: 1,
bevelEnabled: true,
anchor: { x: 0.5, y: 0.5, z: 0.5 },
});
THREE.BAS.Utils.separateFaces(geometry);
return new TextAnimation(geometry);
}
function generateTextGeometry(text,
params) {
var geometry = new THREE.TextGeometry
(text, params);
geometry.computeBoundingBox();
geometry.userData = {};
geometry.userData.size = {
width: geometry.boundingBox.max.x -
geometry.boundingBox.min.x,
height: geometry.boundingBox.max.y -
geometry.boundingBox.min.y,
depth: geometry.boundingBox.max.z -
geometry.boundingBox.min.z,
};
var anchorX = geometry.userData.size.
width * -params.anchor.x;
var anchorY = geometry.userData.size.
height * -params.anchor.y;
var anchorZ = geometry.userData.size.
depth * -params.anchor.z;
var matrix = new THREE.Matrix4().make
Translation(anchorX, anchorY, anchorZ);
geometry.applyMatrix(matrix);
return geometry;
}
function TextAnimation(textGeometry){
var bufferGeometry = new THREE.BAS
ModelBufferGeometry(textGeometry);
var aAnimation = bufferGeometry.
createAttribute("aAnimation", 2);
var aCentroid = bufferGeometry.
createAttribute("aCentroid", 3);
var aControl0 = bufferGeometry.
createAttribute("aControl0", 3);
var aControl1 = bufferGeometry.
createAttribute("aControl1", 3);
var aEndPosition = bufferGeometry.
createAttribute("aEndPosition", 3);
var aAxisAngle = bufferGeometry.
createAttribute("aAxisAngle", 4);
var faceCount = bufferGeometry.faceCount;
var i, i2, i3, i4, v;
var keys = ["a", "b", "c"];
var vDelay = new THREE.Vector3();
var maxDelay = 0.0;
var minDuration = 1.0;
var maxDuration = 1.0;
var stretch = 0.0125;
var lengthFactor = 0.01;
var maxLength = textGeometry.
boundingBox.max.length();
this.animationDuration =
maxDuration + maxDelay + stretch
+ lengthFactor * maxLength;
this._animationProgress = 0;
var distanceZ = -400;
var axis = new THREE.Vector3();
var angle;
for (
i = 0, i2 = 0, i3 = 0, i4 = 0;
i < faceCount;
i++, i2 += 6, i3 += 9, i4 += 12
) {
var face = textGeometry.faces[i];
var centroid = THREE.BAS.Utils.
computeCentroid(textGeometry, face);
// animation
var delay = centroid.length() *
lengthFactor + Math.random() * maxDelay;
var duration = THREE.Math.randFloat
(minDuration, maxDuration);
for (v = 0; v < 6; v += 2) {
var vertex = textGeometry.vertices
[face[keys[v * 0.5]]];
var vertexDelay = vDelay.subVectors
(centroid, vertex).length() * 0.0001;
aAnimation.array[i2 + v] = delay +
vertexDelay + stretch * Math.random();
aAnimation.array[i2 + v + 1] = duration;
}
// centroid
for (v = 0; v < 9; v += 3) {
aCentroid.array[i3 + v] = centroid.x;
aCentroid.array[i3 + v + 1] = centroid.y;
aCentroid.array[i3 + v + 2] = centroid.z;
}
// ctrl
var c0x = centroid.x * THREE.Math.
randFloat(0.75, 1.0);
var c0y = centroid.y * THREE.Math.
randFloat(0.75, 1.0);
var c0z = distanceZ * THREE.Math.
randFloat(0.5, 0.75);
var c1x = centroid.x * THREE.Math.
randFloat(0.25, 0.5);
var c1y = centroid.y * THREE.Math.
randFloat(0.25, 0.5);
var c1z = distanceZ * THREE.Math.
randFloat(0.75, 1.0);
for (v = 0; v < 9; v += 3) {
aControl0.array[i3 + v] = c0x;
aControl0.array[i3 + v + 1] = c0y;
aControl0.array[i3 + v + 2] = c0z;
aControl1.array[i3 + v] = c1x;
aControl1.array[i3 + v + 1] = c1y;
aControl1.array[i3 + v + 2] = c1z;
}
// end position
var x, y, z;
x = 0;
y = 0;
z = distanceZ;
for (v = 0; v < 9; v += 3) {
aEndPosition.array[i3 + v] = x;
aEndPosition.array[i3 + v + 1] = y;
aEndPosition.array[i3 + v + 2] = z;
}
axis.x = 0;
axis.y = 0;
axis.z = 1;
axis.normalize();
angle = Math.PI * THREE.Math.
randFloat(4, 6);
for (v = 0; v < 12; v += 4) {
aAxisAngle.array[i4 + v] = axis.x;
aAxisAngle.array[i4 + v + 1] = axis.y;
aAxisAngle.array[i4 + v + 2] = axis.z;
aAxisAngle.array[i4 + v + 3] = angle;
}
}
THREERoot.prototype = {
tick: function () {
this.update();
this.render();
requestAnimationFrame(this.tick);
},
update: function () {
this.controls && this.controls.
update();
},
render: function () {
this.renderer.render(this.scene,
this.camera);
},
resize: function () {
this.camera.aspect = window.innerWidth
/ window.innerHeight;
this.camera.updateProjectionMatrix();
this.renderer.setSize(window.innerWidth,
window.innerHeight);
},
};
// desktop
var mouseDown = false;
document.body.style.cursor = "pointer";
window.addEventListener("mousedown",
function (e) {
mouseDown = true;
document.body.style.cursor = "ew-resize";
_cx = e.clientX;
stop();
});
window.addEventListener("mouseup",
function (e) {
mouseDown = false;
document.body.style.cursor = "pointer";
resume();
});
window.addEventListener("mousemove",
function (e) {
if (mouseDown === true) {
var cx = e.clientX;
var dx = cx - _cx;
_cx = cx;
seek(dx);
}
});
// mobile
window.addEventListener("touchstart",
function (e) {
_cx = e.touches[0].clientX;
stop();
e.preventDefault();
});
window.addEventListener("touchend",
function (e) {
resume();
e.preventDefault();
});
window.addEventListener("touchmove",
function (e) {
var cx = e.touches[0].clientX;
var dx = cx - _cx;
_cx = cx;
seek(dx);
e.preventDefault();
});
}
Post a Comment