(Хотя ответ Аны пришел через несколько месяцев после моего, вероятно, используя мой как основу для «размышлений», тот факт, что она смогла придумать метод с использованием сингла div
, заслуживает внимания, так что посмотрите и ее ответ - но обратите внимание, что содержимое в шестнадцатеричном формате более ограничено.)
Это был действительно потрясающий вопрос. Спасибо, что спросили. Самое замечательное в том, что:
Используемая оригинальная скрипка (измененная в более позднем редактировании ссылки на скрипку выше) - в ней использовались изображения imgur.com, которые не казались очень надежными при загрузке, поэтому новая скрипка использует photobucket.com ( дайте мне знать, есть ли постоянные проблемы с загрузкой изображений ). Я сохранил исходную ссылку, потому что приведенный ниже код объяснения идет с ней (есть несколько отличий в новой скрипке background-size
или position
от нее).
Идея пришла ко мне почти сразу после прочтения вашего вопроса, но на реализацию потребовалось время. Изначально я пытался получить один «шестигранник» с одним div
и только псевдоэлементами, но, насколько я могу судить, не было возможности просто повернуть background-image
(что мне было нужно), поэтому мне пришлось добавить несколько дополнительных div
элементов, чтобы получить правильные / левые стороны шестиугольника, чтобы затем я мог использовать псевдоэлементы как средство background-image
вращения.
Я тестировал IE9, FF и Chrome. Теоретически transform
он должен работать в любом браузере, поддерживающем CSS3 .
Первое основное обновление (добавлено объяснение)
У меня есть время, чтобы опубликовать объяснение кода, так что вот:
Во-первых, шестиугольники определяются отношениями 30/60 градусов и тригонометрией, поэтому это будут ключевые углы. Во-вторых, мы начинаем с «строки», в которой будет располагаться шестнадцатеричная сетка. HTML определяется как (дополнительные div
элементы помогают построить шестнадцатеричную сетку ):
<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>
Мы собираемся использовать inline-block
для шестиугольника display
, но мы не хотим, чтобы они случайно переносились на следующую строку и разрушали сетку, поэтому white-space: nowrap
эта проблема решается. Значение margin
в этой строке будет зависеть от того, сколько места вы хотите между шестигранниками, и могут потребоваться некоторые эксперименты, чтобы получить то, что вы хотите.
.hexrow {
white-space: nowrap;
margin: 0 25px 3px;
}
Используя непосредственных дочерних элементов, .hexrow
которые являются просто div
элементами, мы формируем основу для шестиугольной формы. Он width
будет перемещаться по горизонтали вершины height
шестиугольника, полученный из этого числа, поскольку все стороны равны по длине в правильном шестиугольнике. Опять же, поле будет зависеть от интервала, но именно здесь произойдет «перекрытие» отдельных шестиугольников, чтобы создать вид сетки. background-image
Определяется один раз, прямо здесь. Сдвиг влево на нем должен учесть как минимум добавленную ширину для левой стороны шестиугольника. Предполагая, что вам нужен центрированный текст, он text-align
обрабатывает горизонтальный (конечно), но тот, line-height
который соответствует, height
будет позволять вертикальное центрирование.
.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;
}
Каждый шестигранник с нечетным числом мы будем сдвигать вниз по отношению к «строке», а каждое четное - вверх. Расчет сдвига (ширина x cos (30) / 2) также такой же, как (высота / 4).
.hexrow > div:nth-child(odd) {
top: 43.3px;
}
.hexrow > div:nth-child(even) {
top: -44.8px;
}
Мы используем 2 дочерних div
элемента для создания «крыльев» шестиугольника. Их размер такой же, как у основного прямоугольника шестиугольника, а затем они вращаются и помещаются «под» основным шестиугольником. Background-image
наследуется, так что изображение остается таким же (конечно), потому что изображение в «крыльях» будет «выровнено» с изображением в основном прямоугольнике. Псевдоэлементы используются для генерации изображений, потому что их нужно «повернуть» обратно в горизонтальное положение (поскольку мы повернули их родительский элемент, div
чтобы создать «крылья»).
:before
Из первых будет переводить его фон ширину суммы отрицательной , равную основную часть гекса плюс исходного фонового сдвиг основного гекса. :before
Второй изменит исходную точку перевода и переложить основную ширину на оси х, а половина высоты по оси у.
.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;
}
Здесь span
находится ваш текст. line-height
Сбрасывается , чтобы строки текста нормально, но vertical-align: middle
работает с line-height
было больше на родителей. white-space
Сбрасывается , так что позволяет оборачивать снова. Для левого / правого поля можно установить отрицательное значение, чтобы текст мог попасть в «крылья» шестиугольника.
.hexrow > div > span {
display: inline-block;
margin: 0 -30px;
line-height: 1.1;
vertical-align: middle;
white-space: normal;
}
Вы можете выбрать отдельные целевые строки и ячейки в этих строках, чтобы изменить изображения, или span
настройки текста, или непрозрачность, или разместить изображение большего размера (чтобы переместить его в нужное место) и т. Д. Это то, что следующие действия делают для второй строки.
.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;
}