(Obwohl Anas Antwort Monate nach meiner kam und wahrscheinlich meine als Grundlage zum "Nachdenken" verwendete, div
lohnt es sich , die Tatsache zu fördern, dass sie eine Methode mit einer einzigen entwickeln konnte. Schauen Sie sich also auch ihre Antwort an - aber Beachten Sie, dass der Inhalt im Hex eingeschränkter ist.)
Dies war eine wirklich erstaunliche Frage. Danke, dass Sie es gefragt haben. Das Tolle ist die Tatsache, dass:
Ursprüngliche Geige verwendet (in der späteren Bearbeitung geändert, um den obigen Geigen-Link zu verwenden) - es wurden Bilder von imgur.com verwendet, die beim Laden nicht sehr zuverlässig zu sein schienen, daher verwendet die neue Geige photobucket.com ( lassen Sie mich wissen, wenn es dauerhafte gibt) Probleme beim Laden von Bildern ). Ich habe den ursprünglichen Link beibehalten, da der unten stehende Erklärungscode dazu gehört (es gibt einige Unterschiede in background-size
oder position
zur neuen Geige).
Die Idee kam mir fast sofort nach dem Lesen Ihrer Frage, aber die Umsetzung dauerte einige Zeit. Ich habe ursprünglich versucht, ein einzelnes "Hex" mit einem einzelnen div
und nur Pseudoelementen zu erhalten, aber wie ich am besten beurteilen konnte, gab es keine Möglichkeit, nur das background-image
(was ich brauchte) zu drehen , also musste ich einige zusätzliche div
Elemente hinzufügen , um das richtige zu erhalten / linke Seiten des Hex, so dass ich dann die Pseudoelemente als background-image
Rotationsmittel verwenden konnte.
Ich habe in IE9, FF und Chrome getestet. Theoretisch sollte jeder Browser, der CSS3 unterstützt transform
, funktionieren.
Erstes Hauptupdate (Erklärung hinzugefügt)
Ich habe jetzt etwas Zeit, um eine Code-Erklärung zu veröffentlichen.
Erstens werden Sechsecke durch 30/60-Grad-Beziehungen und Trigonometrie definiert, sodass dies die Schlüsselwinkel sind. Zweitens beginnen wir mit einer "Zeile", in der sich das Hex-Raster befinden soll. Der HTML-Code ist definiert als (die zusätzlichen div
Elemente helfen beim Erstellen des Hex):
<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>
Wir werden inline-block
für das Sechseck verwenden display
, aber wir möchten nicht, dass sie versehentlich in die nächste Zeile umbrechen und das Gitter ruinieren, also white-space: nowrap
lösen Sie dieses Problem. Der margin
Wert in dieser Zeile hängt davon ab, wie viel Platz zwischen den Feldern benötigt wird. Möglicherweise sind einige Experimente erforderlich, um das zu erhalten, was Sie möchten.
.hexrow {
white-space: nowrap;
margin: 0 25px 3px;
}
Mit den unmittelbaren Kindern der Elemente, .hexrow
die nur div
Elemente sind, bilden wir die Grundlage für die Hex-Form. Das width
treibt die Horizontale der Oberseite des Sechsecks an, das height
wird von dieser Zahl abgeleitet, da alle Seiten auf einem regulären Sechseck gleich lang sind. Auch hier wird der Rand vom Abstand abhängen, aber hier wird die "Überlappung" der einzelnen Sechsecke auftreten, damit das Gitter aussieht. Das background-image
wird hier einmal definiert. Die Verschiebung nach links dient dazu, mindestens die hinzugefügte Breite für die linke Seite des Sechsecks aufzunehmen. Angenommen, Sie möchten zentrierten Text, text-align
behandelt der (natürlich) den horizontalen, aber der line-height
, der mit dem übereinstimmt height
, ermöglicht eine vertikale Zentrierung.
.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;
}
Jedes ungerade Hex-Feld wird in Bezug auf die "Reihe" nach unten und jedes gerade nach oben verschoben. Die Verschiebungsberechnung (Breite x cos (30) / 2) ist ebenfalls dieselbe wie (Höhe / 4).
.hexrow > div:nth-child(odd) {
top: 43.3px;
}
.hexrow > div:nth-child(even) {
top: -44.8px;
}
Wir verwenden 2 untergeordnete div
Elemente, um die "Flügel" des Hex zu erstellen. Sie haben die gleiche Größe wie das Haupthex-Rechteck, werden dann gedreht und "unter" das Haupthex geschoben. Background-image
wird vererbt, so dass das Bild (natürlich) das gleiche ist, da das Bild in den "Flügeln" mit dem im Hauptrechteck "ausgerichtet" wird. Die Pseudoelemente werden verwendet, um die Bilder zu erzeugen, da sie wieder in die Horizontale "umgedreht" werden müssen (da wir die übergeordneten Elemente gedreht div
haben, um die "Flügel" zu erstellen).
Der :before
erste übersetzt seinen Hintergrund um die Breite des negativen Betrags, der dem Hauptteil des Hexfelds plus der ursprünglichen Hintergrundverschiebung des Haupthexfelds entspricht. Der :before
zweite ändert den Ursprungspunkt der Translation und verschiebt die Hauptbreite auf der x-Achse und die halbe Höhe auf der y-Achse.
.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;
}
Hier befindet span
sich Ihr Text. Das line-height
wird zurückgesetzt, um die Textzeilen normal zu machen, aber das vertical-align: middle
funktioniert, da das line-height
auf dem übergeordneten Text größer war. Das white-space
wird zurückgesetzt, damit es wieder umbrochen werden kann. Der linke / rechte Rand kann auf negativ gesetzt werden, damit der Text in die "Flügel" des Hexfelds gelangen kann.
.hexrow > div > span {
display: inline-block;
margin: 0 -30px;
line-height: 1.1;
vertical-align: middle;
white-space: normal;
}
Sie können einzelne Zielzeilen und -zellen in diesen Zeilen einzeln ändern, um Bilder, span
Texteinstellungen oder Deckkraft zu ändern oder ein größeres Bild aufzunehmen (um es an die gewünschte Stelle zu verschieben) usw. Dies geschieht im Folgenden für die zweite Zeile.
.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;
}