Ric*_*ing 22 css css-animations
我有一个带有文字旋转的div.如何获得文本深度以提供更好的3D效果?为了澄清,在90deg文本变得1px厚实,因为我们只能从侧面看到它 - 我如何制作它,例如,10px厚?此外,应显示适当的深度 - 即0deg我们看不到深度; 在45deg我们看到5px的深度; 在90deg我们看到完整的10px深度; 等等
我是一个CSS唯一的解决方案.
#spinner {
animation-name: spinner;
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-duration: 3s;
transform-style: preserve-3d;
text-align:center;
}
@keyframes spinner {
from {
transform: rotateY(0deg);
}
to {
transform: rotateY(-360deg);
}
}Run Code Online (Sandbox Code Playgroud)
<p id="spinner">Stop, I'm getting dizzy!</p>Run Code Online (Sandbox Code Playgroud)
ton*_*tar 27
简单text-shadow可以做到这一点:
body {
perspective: 500px;
}
#spinner {
text-align: center;
animation-name: spin, depth;
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-duration: 3s;
}
@keyframes spin {
from { transform: rotateY(0deg); }
to { transform: rotateY(-360deg); }
}
@keyframes depth {
0% { text-shadow: 0 0 black; }
25% { text-shadow: 1px 0 black, 2px 0 black, 3px 0 black, 4px 0 black, 5px 0 black; }
50% { text-shadow: 0 0 black; }
75% { text-shadow: -1px 0 black, -2px 0 black, -3px 0 black, -4px 0 black, -5px 0 black; }
100% { text-shadow: 0 0 black; }
}Run Code Online (Sandbox Code Playgroud)
<p id="spinner">Stop, I'm getting dizzy!</p>Run Code Online (Sandbox Code Playgroud)
另一个改进可能是使用::before和::after伪类克隆文本:
body {
perspective: 1000px;
}
#spinner {
font-size: 50px;
text-align: center;
animation-name: spin, depth;
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-duration: 3s;
transform-style: preserve-3d;
position: relative;
}
#spinner::before,
#spinner::after {
content: "Stop, I'm getting dizzy!";
display: block;
position: absolute;
width: 100%;
height: 100%;
top: 0;
transform: rotateY(0.5deg);
transform-origin: 0 50%;
}
#spinner::after {
transform: rotateY(-0.5deg);
transform-origin: 100% 50%;
}
@keyframes spin {
from { transform: rotateY(0deg); }
to { transform: rotateY(-360deg); }
}
@keyframes depth {
0% { text-shadow: 0 0 black; }
25% { text-shadow: 1px 0 black, 2px 0 black, 3px 0 black, 4px 0 black, 5px 0 black, 6px 0 black; }
50% { text-shadow: 0 0 black; }
75% { text-shadow: -1px 0 black, -2px 0 black, -3px 0 black, -4px 0 black, -5px 0 black, -6px 0 black; }
100% { text-shadow: 0 0 black; }
}Run Code Online (Sandbox Code Playgroud)
<p id="spinner">Stop, I'm getting dizzy!</p>Run Code Online (Sandbox Code Playgroud)
纯CSS解决方案看起来不太好.要获得真正的3D效果,请使用JS.我建议使用three.js,因为它包含一个相当容易使用的textGeometry功能.
我编写了一个脚本,用类替换元素的内容和rotatingTextwebGL场景,其中元素内的文本正在旋转.
你当然可以使用three.js做各种很酷的效果,以使你的文字看起来更好.有关文本格式,请参见textGeometry doc.查看three.js文档以获取更多详细信息.
我在代码的注释中添加了一些注释.
.rotatingText {
width: 100%;
height: 200px;
}Run Code Online (Sandbox Code Playgroud)
<!--your rotating text, just give it class rotatingText-->
<div class="rotatingText">Stop, I'm getting dizzy!</div>
<!--three.js library-->
<script src="https://ajax.googleapis.com/ajax/libs/threejs/r69/three.min.js"></script>
<!--the default font for three.js-->
<script src="http://threejs.org/examples/fonts/helvetiker_regular.typeface.js"></script>
<!--the script that converts each .rotatingText element into 3D -->
<script>
function rotateText(container,i){
var t = THREE;
var containerW = container.offsetWidth;
var containerH = container.offsetHeight;
var theText = container.innerHTML; //grab the text from the element...
container.innerHTML = ""; // ...and clear it
var renderer = new t.WebGLRenderer({
alpha: true,
antialiasing: true
});
renderer.setSize(containerW, containerH);
renderer.setClearColor(0x000000, 0);
container.appendChild(renderer.domElement);
var scene = new t.Scene();
var camera = new t.PerspectiveCamera(
75, //vertical field of view
containerW / containerH, //aspect ratio
0.1, //near plane
1000 //far plane
);
scene.add(camera);
camera.position.set(0, 0, 100);
// This is your 3D text:
var geometry = new t.TextGeometry(theText, { //insert the text we grabbed earlier here
size: 10, //your font size
height: 1 //your font depth
});
var material = new t.MeshLambertMaterial({
color: 0x000000 //your font color
});
var text = new t.Mesh(geometry, material); //this is your 3D text object
//I created a pivot object to act as the center point for rotation:
geometry.computeBoundingBox();
var textWidth = geometry.boundingBox.max.x - geometry.boundingBox.min.x;
text.position.set(-0.5 * textWidth, 0, 0);
scene.add(text);
var pivot = new t.Object3D();
pivot.add(text);
scene.add(pivot);
//Then just render your scene and request for new frames
this.render = function() {
pivot.rotation.y += .02; //how much you want your text to rotate per frame
requestAnimationFrame(render);
renderer.render(scene, camera);
}
render();
}
var rotatingTextElements = document.getElementsByClassName("rotatingText");
for (var i = 0; i < rotatingTextElements.length; i++) {
rotateText(rotatingTextElements[i]);
}
</script>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9822 次 |
| 最近记录: |