(Aunque la respuesta de Ana llegó meses después de la mía, probablemente usando la mía como base para "pensar desde", div
vale la pena promocionar el hecho de que pudo idear un método usando una sola , así que revisa su respuesta también, pero tenga en cuenta que el contenido en el hexadecimal es más limitado).
Esta fue una pregunta realmente asombrosa. Gracias por preguntar Lo bueno es el hecho de que:
Original Fiddle Used (modificado en la edición posterior del enlace de violín anterior): utilizó imágenes de imgur.com, que no parecían ser muy confiables en la carga, por lo que el nuevo violín está usando photobucket.com ( avíseme si hay imágenes persistentes problemas de carga de imágenes ). He mantenido el enlace original porque el código siguiente explicación va con eso (hay algunas diferencias en background-size
o position
al nuevo violín).
La idea se me ocurrió casi instantáneamente después de leer su pregunta, pero me tomó un tiempo implementarla. Originalmente intenté obtener un solo "hex" con un solo div
y solo pseudo elementos, pero lo mejor que pude ver, no había forma de simplemente rotar el background-image
(que necesitaba), así que tuve que agregar algunos div
elementos adicionales para obtener el correcto / lados izquierdos del hexágono, para que luego pudiera usar los pseudo elementos como un medio de background-image
rotación.
Probé en IE9, FF y Chrome. En teoría, cualquier navegador que admita CSS3 transform
debería funcionar.
Primera actualización principal (explicación agregada)
Ahora tengo algo de tiempo para publicar una explicación del código, así que aquí va:
Primero, los hexágonos se definen por relaciones de 30/60 grados y trigonometría, por lo que esos serán los ángulos clave involucrados. En segundo lugar, comenzamos con una "fila" para que resida la cuadrícula hexadecimal. El HTML se define como (los div
elementos adicionales ayudan a construir el hexadecimal):
<div class="hexrow">
<div>
<span>First Hex Text</span>
<div></div>
<div></div>
</div>
<div>
<span>Second Hex Text</span>
<div></div>
<div></div>
</div>
<div>
<span>Third Hex Text</span>
<div></div>
<div></div>
</div>
</div>
Vamos a usar inline-block
para el hexágono display
, pero no queremos que pasen accidentalmente a la siguiente línea y arruinen la cuadrícula, así white-space: nowrap
que resuelve ese problema. El margin
de esta fila dependerá de cuánto espacio desee entre los hexágonos, y es posible que se necesite algo de experimentación para obtener lo que desea.
.hexrow {
white-space: nowrap;
margin: 0 25px 3px;
}
Usando los hijos inmediatos de los .hexrow
que son solo div
elementos, formamos la base para la forma hexagonal. La width
conducirá el horizontal de la parte superior de la hexagonal, la height
deriva de ese número desde todos los lados son de igual longitud en un hexágono regular. Nuevamente, el margen dependerá del espaciado, pero aquí es donde se producirá la "superposición" de los hexágonos individuales para que se produzca el aspecto de la cuadrícula. Se background-image
define una vez, aquí mismo. El cambio a la izquierda es para acomodar al menos el ancho adicional para el lado izquierdo del hexágono. Suponiendo que desea texto centrado, el text-align
maneja el horizontal (por supuesto) pero el line-height
que coincide con el height
permitirá un centrado vertical.
.hexrow > div {
width: 100px;
height: 173.2px;
margin: 0 25px;
position: relative;
background-image: url(http://i.imgur.com/w5tV4.jpg);
background-position: -50px 0;
background-repeat: no-repeat;
color: #ffffff;
text-align: center;
line-height: 173.2px;
display: inline-block;
}
Cada extraña número hexadecimal que se va a desplazar hacia abajo en relación con la "fila" y cada incluso hacer el cambio. El cálculo de desplazamiento (ancho x cos (30) / 2) también es el mismo que (alto / 4).
.hexrow > div:nth-child(odd) {
top: 43.3px;
}
.hexrow > div:nth-child(even) {
top: -44.8px;
}
Estamos usando 2 div
elementos secundarios para crear las "alas" del hex. Tienen el mismo tamaño que el rectángulo hexagonal principal, y luego se giran y se empujan "debajo" del hexágono principal. Background-image
se hereda para que la imagen sea la misma (por supuesto), porque la imagen en las "alas" se "alineará" con la del rectángulo principal. Los pseudo elementos se utilizan para generar las imágenes, porque necesitan ser "rotados" de nuevo a la horizontal (ya que giramos el padre div
de ellos para crear las "alas").
El :before
del primero traducirá su fondo al ancho de la cantidad negativa igual a la parte principal del hexágono más el desplazamiento de fondo original del hexágono principal. El :before
del segundo cambiará el punto de origen de la traslación y cambiará el ancho principal en el eje xy la mitad de la altura en el eje y.
.hexrow > div > div:first-of-type {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
z-index: -1;
overflow: hidden;
background-image: inherit;
-ms-transform:rotate(60deg);
-moz-transform:rotate(60deg);
-webkit-transform:rotate(60deg);
-o-transform:rotate(60deg);
transform:rotate(60deg);
}
.hexrow > div > div:first-of-type:before {
content: '';
position: absolute;
width: 200px;
height: 100%;
background-image: inherit;
background-position: top left;
background-repeat: no-repeat;
bottom: 0;
left: 0;
z-index: 1;
-ms-transform:rotate(-60deg) translate(-150px, 0);
-moz-transform:rotate(-60deg) translate(-150px, 0);
-webkit-transform:rotate(-60deg) translate(-150px, 0);
-o-transform:rotate(-60deg) translate(-150px, 0);
transform:rotate(-60deg) translate(-150px, 0);
-ms-transform-origin: 0 0;
-webkit-transform-origin: 0 0;
-moz-transform-origin: 0 0;
-o-transform-origin: 0 0;
transform-origin: 0 0;
}
.hexrow > div > div:last-of-type {
content: '';
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
z-index: -2;
overflow: hidden;
background-image: inherit;
-ms-transform:rotate(-60deg);
-moz-transform:rotate(-60deg);
-webkit-transform:rotate(-60deg);
-o-transform:rotate(-60deg);
transform:rotate(-60deg);
}
.hexrow > div > div:last-of-type:before {
content: '';
position: absolute;
width: 200px;
height: 100%;
background-image: inherit;
background-position: top left;
background-repeat: no-repeat;
bottom: 0;
left: 0;
z-index: 1;
-ms-transform:rotate(60deg) translate(100px, 86.6px);
-moz-transform:rotate(60deg) translate(100px, 86.6px);
-webkit-transform:rotate(60deg) translate(100px, 86.6px);
-o-transform:rotate(60deg) translate(100px, 86.6px);
transform:rotate(60deg) translate(100px, 86.6px);
-ms-transform-origin: 100% 0;
-webkit-transform-origin: 100% 0;
-moz-transform-origin: 100% 0;
-o-transform-origin: 100% 0;
transform-origin: 100% 0;
}
Esto span
alberga su texto. Se line-height
restablece para que las líneas de texto sean normales, pero vertical-align: middle
funciona ya que line-height
era más grande en el padre. Se white-space
reinicia para que permita volver a envolver. El margen izquierdo / derecho se puede establecer en negativo para permitir que el texto entre en las "alas" del hex.
.hexrow > div > span {
display: inline-block;
margin: 0 -30px;
line-height: 1.1;
vertical-align: middle;
white-space: normal;
}
Puede seleccionar filas y celdas individualmente en esas filas para cambiar las imágenes, la span
configuración del texto o la opacidad, o acomodar una imagen más grande (para cambiarla al lugar que desee), etc. Eso es lo que hace lo siguiente para la segunda fila.
.hexrow:nth-child(2) > div:nth-child(1) {
background-image: url(http://i.imgur.com/7Un8Y.jpg);
}
.hexrow:nth-child(2) > div:nth-child(1) > span {
margin: 0 -20px;
color: black;
font-size: .8em;
font-weight: bold;
}
.hexrow:nth-child(2) > div:nth-child(2) {
background-image: url(http://i.imgur.com/jeSPg.jpg);
}
.hexrow:nth-child(2) > div:nth-child(3) {
background-image: url(http://i.imgur.com/Jwmxm.jpg);
background-position: -150px -120px;
opacity: .3;
color: black;
}
.hexrow:nth-child(2) > div:nth-child(3) > div:before {
background-position: -100px -120px;
}
.hexrow:nth-child(2) > div:nth-child(4) {
background-image: url(http://i.imgur.com/90EkV.jpg);
background-position: -350px -120px;
}
.hexrow:nth-child(2) > div:nth-child(4) > div:before {
background-position: -300px -120px;
}