Hace ya un tiempo que no cuelgo ningún post, el proyecto en el que estoy inmerso me consume mucho tiempo, pero esto no evita que experimente un poco con algunas de las cosas que me apasionan.
He querido comprobar el rendimiento de los principales navegadores al usar transformaciones CSS3. En este pequeño experimento, se transforman en cada movimiento del ratón 300 elementos
ubicados en el documento. He utilizado un cálculo Fibonacci para crear una esfera formada por puntos equidistantes entre sí (conocida como esfera Fibonacci), intentando simular con la escala y la opacidad de los mismos cierta profundidad. Increíblemente el rendimiento es bastante bueno, pueden comprobarlo por vosotros mismos. A continuación dejo el código utilizado:
Para este experimento se ha usado el método querySelectorAll y transformaciones CSS3, por lo que si usas Internet Explorer, debes usar una versión a partir de la 9 en adelante.
HTML
<div id="canvas">
</div>
CSS (usando autoprefixer)
body, html{
height: 100%;
position: relative;
}
body{
background-color: #232B2B;
margin: 0;
padding: 0;
}
#canvas{
height: 250px;
margin: 0 auto;
perspective: 2000px;
perspective-origin: center center;
position: relative;
top: 50%;
transform: translateY(-50%);
width: 250px;
}
.point{
background: #E87A24;
border-radius: 50%;
height: 4px;
position: absolute;
transform-style: preserve-3d;
width: 4px;
}
JavaScript
var cant = 300;
var offset = 2 / cant;
var increment = Math.PI * (3 - Math.sqrt(5));
var canvas = document.getElementById("canvas");
var i;
var circle;
//---Build the elements
for(i = 0; i < cant; i++){
circle = document.createElement("div");
circle.className = "point";
circle.setAttribute("data-index", i);
canvas.appendChild(circle);
};
//---Apply transformations to points
function updatePoints(evt){
var x, y, z, r, a, scale, opacity, point, style;
var angle = (evt) ? (-evt.pageX / 4) * Math.PI / 180 : 0;
for(i = 0; i < cant; i++){
y = (i * offset - 1) + (offset / 2);
r = Math.sqrt(1 - Math.pow(y, 2));
a = ((i + 1) % cant) * increment + angle;
x = Math.cos(a) * r;
z = Math.sin(a) * r;
scale = Math.round(z * 20000) / 100;
opacity = (1 + z) / 1.5;
style = "translate3d(" + (125 + x * 100) + "px, " + (125 + y * 100) + "px, " + scale + "px)";
point = canvas.querySelectorAll("[data-index='" + i +"']");
point[0].style.WebkitTransform = style;
point[0].style.msTransform = style;
point[0].style.transform = style;
point[0].style.opacity = opacity;
}
}
//---Update the points at start
updatePoints();
//---Update the points on mouse move
document.addEventListener("mousemove", updatePoints);
A continuación pueden ver una muestra del resultado en CodePen. La esfera Fibonacci se conformará con un ángulo diferente si movemos el ratón por el documento.
Esfera Fibonacci, resultado final
See the Pen by (@elchininet) on CodePen.3
Maravilloso
Muchas gracias, Dani.
Un saludo
Hola!
Como harias para que en vez de que sean puntos, sean palabras??
Me gustaria hacer esta misma esfera 3d pero con palabras para dar un efecto muy lindo
Gracias!
Hola Alan:
Disculpa, tenía un problema con mi proveedor de correo y no estaba recibiendo notificaciones.
Con respecto a tu pregunta, los puntos son solo elementos de tipo `div`, puedes insertar dentro de ellos lo que quieras. Aquí te dejo un fork del pen anterior que inserta palabras aleatorias dentro de cada div:
https://codepen.io/elchininet/pen/abqxJpG