(Chociaż odpowiedź Any nadeszła kilka miesięcy po mojej, prawdopodobnie wykorzystując moją jako podstawę do „myślenia”, fakt, że była w stanie wymyślić metodę wykorzystującą singiel, div
jest wart promowania, więc sprawdź też jej odpowiedź - ale Zwróć uwagę, że zawartość na heksie jest bardziej ograniczona.)
To było naprawdę niesamowite pytanie. Dziękuję, że o to zapytałeś. Wspaniałe jest to, że:
Oryginalne skrzypce używane (zmodyfikowane w późniejszej edycji do linku skrzypcowego powyżej) - wykorzystywały obrazy imgur.com, które nie wydawały się bardzo niezawodne w ładowaniu, więc nowe skrzypce używają photobucket.com ( daj mi znać, jeśli są trwałe problemy z ładowaniem obrazu ). Mam zachował pierwotną więź, ponieważ poniżej kod który idzie z wyjaśnieniem (istnieje kilka różnic background-size
lub position
do nowego skrzypce).
Pomysł przyszedł mi do głowy niemal natychmiast po przeczytaniu twojego pytania, ale jego wdrożenie zajęło trochę czasu. Początkowo próbowałem uzyskać pojedynczy „hex” z jednym div
i tylko pseudoelementami, ale najlepiej, jak mogłem powiedzieć, nie było sposobu, aby po prostu obrócić background-image
(czego potrzebowałem), więc musiałem dodać kilka dodatkowych div
elementów, aby uzyskać właściwą / lewe boki hexa, abym mógł wtedy użyć pseudoelementów jako środka background-image
obrotu.
Testowałem w IE9, FF i Chrome. Teoretycznie każda przeglądarka obsługująca CSS3, w transform
której powinna działać.
Pierwsza główna aktualizacja (dodano wyjaśnienie)
Mam teraz trochę czasu, aby opublikować wyjaśnienie kodu, więc oto:
Po pierwsze, sześciokąty są definiowane przez relacje 30/60 stopni i trygonometrię, więc będą to kluczowe kąty. Po drugie, zaczynamy od „wiersza”, w którym ma się znajdować siatka szesnastkowa. Kod HTML jest zdefiniowany jako (dodatkowe div
elementy pomagają zbudować 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>
Będziemy używać inline-block
sześciokąta display
, ale nie chcemy, aby przypadkowo zawinął do następnej linii i zrujnował siatkę, więc white-space: nowrap
rozwiązujemy ten problem. Wartość margin
w tym wierszu będzie zależeć od tego, ile chcesz odstępu między heksami, i może być potrzebne trochę eksperymentów, aby uzyskać to, czego chcesz.
.hexrow {
white-space: nowrap;
margin: 0 25px 3px;
}
Używając bezpośrednich elementów potomnych, .hexrow
które są tylko div
elementami, tworzymy podstawę dla kształtu heksadecymalnego. width
Pojedzie poziomy z góry hex The height
pochodzi od tej liczby, ponieważ wszystkie boki są równej długości na sześciokąta foremnego. Ponownie, margines będzie zależał od odstępów, ale w tym miejscu wystąpi „nakładanie się” poszczególnych sześciokątów, aby uzyskać wygląd siatki. To background-image
jest zdefiniowane raz, właśnie tutaj. Przesunięcie z lewej strony ma na celu uwzględnienie co najmniej dodanej szerokości lewej strony heksa. Zakładając, że chcesz wyśrodkować tekst, text-align
uchwyt obsługuje położenie poziome (oczywiście), ale to, line-height
co pasuje height
do, pozwoli na wyśrodkowanie w pionie.
.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;
}
Każde szesnastkowe liczby nieparzyste przesuniemy w dół w stosunku do „rzędu”, a każda parzysta zmiana w górę. Obliczenie przesunięcia (szerokość x cos (30) / 2) jest również takie samo jak (wysokość / 4).
.hexrow > div:nth-child(odd) {
top: 43.3px;
}
.hexrow > div:nth-child(even) {
top: -44.8px;
}
Używamy 2 div
elementów potomnych do stworzenia „skrzydeł” heksa. Mają taki sam rozmiar jak główny sześciokątny prostokąt, a następnie są obracane i wypychane „poniżej” głównego heksa. Background-image
jest dziedziczona, więc obraz jest taki sam (oczywiście), ponieważ obraz w "skrzydłach" będzie "wyrównany" do tego w głównym prostokącie. Pseudoelementy są używane do generowania obrazów, ponieważ należy je „ponownie obrócić” z powrotem do poziomu (ponieważ obróciliśmy div
ich rodziców, aby utworzyć „skrzydła”).
Pierwsza :before
z nich przetłumaczy swoje tło na szerokość ujemnej wartości równej głównej części szesnastki plus oryginalne przesunięcie tła głównego szesnastki. :before
Z drugiego zmienia punkt początkowy translacji i przesuwa główną szerokość na osi x, a w połowie wysokości na osi 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;
}
To span
mieści twój tekst. line-height
Jest resetowany, aby linie tekstu normalne, ale vertical-align: middle
prace Ponieważ line-height
był większy od rodzica. white-space
Jest resetowany co pozwala zawijanie ponownie. Marginesy lewy / prawy można ustawić na wartość ujemną, aby umożliwić umieszczenie tekstu w „skrzydłach” heksa.
.hexrow > div > span {
display: inline-block;
margin: 0 -30px;
line-height: 1.1;
vertical-align: middle;
white-space: normal;
}
Możesz wybrać poszczególne wiersze i komórki w tych wierszach, aby zmienić obrazy, span
ustawienia tekstu lub krycie, lub pomieścić większy obraz (aby przesunąć go w wybrane miejsce) itd. Oto, co zrobisz w drugim wierszu.
.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;
}