テキストが回転する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);
}
}
_
_<p id="spinner">Stop, I'm getting dizzy!</p>
_
単純な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; }
}
<p id="spinner">Stop, I'm getting dizzy!</p>
もう1つの改善は、::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; }
}
<p id="spinner">Stop, I'm getting dizzy!</p>
純粋なCSSソリューションは見栄えがよくありません。真の3D効果を得るには、JSを使用します。かなり使いやすいtextGeometry
関数が含まれているため、three.js
の使用をお勧めします。
要素のコンテンツをクラスrotatingText
で置き換える要素を、要素内にあったテキストが回転するwebGLシーンで置き換えるスクリプトを作成しました。
もちろん、three.jsを使用してあらゆる種類のクールなエフェクトを実行し、テキストを 見栄えよくする にすることもできます。テキストのフォーマットについては textGeometry doc を参照してください。詳細は three.js docs を参照してください。
コードのコメントにいくつかメモを入れました。
.rotatingText {
width: 100%;
height: 200px;
}
<!--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>
:before
要素と:after
要素を使用してテキストのレイヤーを追加し、Y軸をそれぞれ-3度と3度オフセットしました。その結果、テキストは「一種の」深さを持っています。短い文字列(「RPK」など)を使用すると、オフセットを約7degに増やしても、見栄えは良いです。ただし、これは外側のエッジに余分な「深さ」を与えるだけです。
#spinner {
animation-name: spinner;
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-duration: 3s;
transform-style: preserve-3d;
text-align:center;
font-size:2em;
}
#spinner:after,
#spinner:before {
content:"Stop, I'm getting dizzy!";
position:absolute;
top:0;
left:0;
width:100%;
text-align:center;
transform: rotateY(2deg);
}
#spinner:before {
transform: rotateY(-2deg);
}
#spinner,
#spinner:after,
#spinner:before {
font-weight:narrow;
}
@keyframes spinner {
from {
transform: rotateY(0deg);
}
to {
transform: rotateY(-360deg);
}
}
<p id="spinner">Stop, I'm getting dizzy!</p>
このバージョンでは、rotate
のtranslateZ
プロパティを変更しました。繰り返しますが、この効果は文字列が短いほどよく見えます。
#spinner {
animation-name: spinner;
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-duration: 3s;
transform-style: preserve-3d;
text-align: center;
font-size: 2em;
}
#spinner:after,
#spinner:before {
content: "Stop, I'm getting dizzy!";
position: absolute;
top: 0;
left: 0;
width: 100%;
text-align: center;
transform: translateZ(3px);
}
#spinner:before {
transform:translateZ(-3px);
}
@keyframes spinner {
from {
transform: rotateY(0deg);
}
to {
transform: rotateY(-360deg);
}
}
<p id="spinner">Stop, I'm getting dizzy!</p>
私が求めている正確な効果が得られないため、これを答えとして受け入れるつもりはありません。私は誰かが完璧な方法を見つけると確信しています:o)
元の要素の複数のクローンを追加し、それぞれを1px後ろに移動し、3Dの外観を与えるためにそれらの色に取り組んでいることは、それほど悪いことではありません。
ペンを確認してください(Chromeでのみテスト済み)
[〜#〜] html [〜#〜]
<section>
<p >Stop, I'm getting dizzy!</p>
</section>
[〜#〜] scss [〜#〜]
section{
animation-name: spinner;
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-duration: 4s;
transform-style: preserve-3d;
}
p {
text-align: center;
font-size: 2em;
position:absolute;
width:100%;
letter-spacing: 0.2em;
}
@keyframes spinner {
from {
transform: rotateY(0deg);
}
to {
transform: rotateY(-360deg);
}
}
$colors: #000,#111,#222,#333,#444,#555,#666,#777,#888,#999,#aaa,#bbb;
@for $i from 1 through length($colors) {
p:nth-child( #{$i} ){
transform: translateZ(- $i+px);
color: (nth($colors, $i));
}
}
[〜#〜] js [〜#〜]
var p = document.querySelector('p');
for(var i = 0 ; i<13 ; i++){
var node = document.createElement('p');
var child = "Stop, I'm getting dizzy!";
child = document.createTextNode(child);
node.appendChild(child);
p.parentNode.appendChild(node);
}
section {
animation-name: spinner;
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-duration: 4s;
transform-style: preserve-3d;
}
p {
text-align: center;
font-size: 2em;
position: absolute;
width: 100%;
letter-spacing: 0.2em;
}
p:last-child {
-webkit-text-fill-color: silver;
}
@keyframes spinner {
from {
transform: rotateY(0deg);
}
to {
transform: rotateY(-360deg);
}
}
p:nth-child(1) {
transform: translateZ(-1px);
color: #000;
}
p:nth-child(2) {
transform: translateZ(-2px);
color: #111;
}
p:nth-child(3) {
transform: translateZ(-3px);
color: #222;
}
p:nth-child(4) {
transform: translateZ(-4px);
color: #333;
}
p:nth-child(5) {
transform: translateZ(-5px);
color: #444;
}
p:nth-child(6) {
transform: translateZ(-6px);
color: #555;
}
p:nth-child(7) {
transform: translateZ(-7px);
color: #666;
}
p:nth-child(8) {
transform: translateZ(-8px);
color: #777;
}
p:nth-child(9) {
transform: translateZ(-9px);
color: #888;
}
p:nth-child(10) {
transform: translateZ(-10px);
color: #999;
}
p:nth-child(11) {
transform: translateZ(-11px);
color: #aaa;
}
p:nth-child(12) {
transform: translateZ(-12px);
color: #bbb;
}
<section>
<p>Stop, I'm getting dizzy!</p>
<p>Stop, I'm getting dizzy!</p>
<p>Stop, I'm getting dizzy!</p>
<p>Stop, I'm getting dizzy!</p>
<p>Stop, I'm getting dizzy!</p>
<p>Stop, I'm getting dizzy!</p>
<p>Stop, I'm getting dizzy!</p>
<p>Stop, I'm getting dizzy!</p>
<p>Stop, I'm getting dizzy!</p>
<p>Stop, I'm getting dizzy!</p>
<p>Stop, I'm getting dizzy!</p>
<p>Stop, I'm getting dizzy!</p>
</section>