Произведите повторяя шестиугольную картину с CSS3
Итак, мне нужно сделать повторяющийся шестиугольный узор, используя CSS. Если нужны изображения, я могу пойти туда, но я бы предпочел просто использовать CSS, если это возможно.
вот идея того, что я пытаюсь создать:

в принципе, мне просто нужен способ создать шестиугольные фигуры, а затем наложить текст/изображения поверх них. У меня пока мало кода, потому что я не совсем уверен, с чего начать. Проблема в том, что я мог бы просто использовать <div>s в форме a шестиугольник, как показано в (http://css-tricks.com/examples/ShapesOfCSS/), но тогда они не будут соединяться. Я мог бы использовать повторяющийся шаблон шестиугольника, но тогда я не смог бы указать точное местоположение текста или изображений, которые мне нужны в определенных формах. Спасибо за любую помощь заранее.
7 ответов:
(хотя ответ Аны пришел через несколько месяцев после моего, вероятно, используя мой в качестве основы для "мышления", тот факт, что она смогла придумать метод, используя один
divстоит продвигать, так проверьте ее ответ тоже--но, обратите внимание, что содержание в шестигранной более ограничен.)это был действительно удивительный вопрос. Спасибо, что спросили. Самое замечательное то, что:
Эта Скрипка Доказывает, Что Вы Можете Сделать Это!
Оригинальная Скрипка Используется (изменено в более позднем редактировании, чтобы скрипка ссылка выше)--он используется imgur.com изображения, которые не казались очень надежными при загрузке, поэтому новая скрипка использует photobucket.com (дайте мне знать, если есть постоянные проблемы с загрузкой изображения). Я сохранил исходную ссылку, потому что код объяснения ниже идет с этим (есть несколько различий в
background-sizeилиpositionновый скрипка).в идея пришла ко мне почти мгновенно после прочтения вашего вопроса, но потребовалось некоторое время для реализации. Я изначально пытался получить один " hex " с одним
divи просто псевдо-элементы, но, насколько я мог судить, не было никакого способа просто повернутьbackground-image(что мне было нужно), поэтому мне пришлось добавить некоторые дополнительныеdivэлементы, чтобы получить правую/левую стороны от наговора, так что я мог бы использовать псевдо-элементы в качестве средстваbackground-imageповорот.я тестировал в IE9, FF и Chrome. Теоретически любой браузер поддерживает CSS3
transformон должен работать.первое основное обновление (добавлено объяснение)
у меня есть некоторое время, чтобы опубликовать некоторые пояснения код, так вот:
во-первых, шестиугольники определяются отношениями 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в этой строке будет зависеть от того, сколько места вы хотите между hex, и некоторые эксперименты могут потребоваться, чтобы получить то, что вы хотите..hexrow { white-space: nowrap; /*right/left margin set at (( width of child div x sin(30) ) / 2) makes a fairly tight fit; a 3px bottom seems to match*/ margin: 0 25px 3px; }используя непосредственных детей
.hexrowкоторые простоdivэлементы, мы формируем основу для шестигранной формы. Элементwidthбудет управлять горизонталью верхней части шестигранника,heightявляется производным от этого числа, так как все стороны имеют одинаковую длину на регулярном шестиугольнике. Опять же, маржа будет зависеть от расстояния, но именно здесь будет происходить "перекрытие" отдельных шестиугольников, чтобы заставить сетку выглядеть. Элементbackground-imageопределяется один раз, прямо здесь. Сдвиг влево на нем должен соответствовать, по крайней мере, добавленной ширине для левой стороны шестигранника. Если вы хотите центрировать текстtext-alignобрабатывает горизонтальные (конечно), ноline-heightчто соответствуетheightбудет учитывать вертикальное центрирование..hexrow > div { width: 100px; height: 173.2px; /* ( width x cos(30) ) x 2 */ /* For margin: right/left = ( width x sin(30) ) makes no overlap right/left = (( width x sin(30) ) / 2) leaves a narrow separation */ margin: 0 25px; position: relative; background-image: url(http://i.imgur.com/w5tV4.jpg); background-position: -50px 0; /* -left position -1 x width x sin(30) */ background-repeat: no-repeat; color: #ffffff; text-align: center; line-height: 173.2px; /*equals height*/ display: inline-block; }каждого странно число hex мы собираемся сдвинуть вниз по отношению к "строке" и каждому даже перейти. Расчет сдвига ( ширина x cos(30) / 2 ) также совпадает с (высота / 4).
.hexrow > div:nth-child(odd) { top: 43.3px; /* ( width x cos(30) / 2 ) */ } .hexrow > div:nth-child(even) { top: -44.8px; /* -1 x( ( width x cos(30) / 2) + (hexrow bottom margin / 2)) */ }мы используем 2 ребенка
divэлементы для создания "крыльев" шестигранника. Они имеют размер то же самое, что и основной шестигранный прямоугольник, а затем поворачивается и нажимается "ниже" основного шестигранника.Background-imageнаследуется так, что изображение одно и то же (конечно), потому что изображение в "крыльях" будет "выровнено" до этого в главном прямоугольнике. Псевдо элементы используются для создания изображений, потому что они должны быть" перемотаны " обратно в горизонтальное положение (так как мы повернули Родительскийdivиз них создать "крылья").The
:beforeиз первых переведет свой фон ширина отрицательной величины равна основной части шестигранника плюс исходный сдвиг фона основного шестигранника. Элемент:beforeвторой изменит исходную точку перевода и сдвинет основную ширину по оси x, а половину высоты по оси 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); /* IE 9 */ -moz-transform:rotate(60deg); /* Firefox */ -webkit-transform:rotate(60deg); /* Safari and Chrome */ -o-transform:rotate(60deg); /* Opera */ transform:rotate(60deg); } .hexrow > div > div:first-of-type:before { content: ''; position: absolute; width: 200px; /* width of main + margin sizing */ 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); /* IE 9 */ -moz-transform:rotate(-60deg) translate(-150px, 0); /* Firefox */ -webkit-transform:rotate(-60deg) translate(-150px, 0); /* Safari and Chrome */ -o-transform:rotate(-60deg) translate(-150px, 0); /* Opera */ transform:rotate(-60deg) translate(-150px, 0); -ms-transform-origin: 0 0; /* IE 9 */ -webkit-transform-origin: 0 0; /* Safari and Chrome */ -moz-transform-origin: 0 0; /* Firefox */ -o-transform-origin: 0 0; /* Opera */ 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); /* IE 9 */ -moz-transform:rotate(-60deg); /* Firefox */ -webkit-transform:rotate(-60deg); /* Safari and Chrome */ -o-transform:rotate(-60deg); /* Opera */ transform:rotate(-60deg); } .hexrow > div > div:last-of-type:before { content: ''; position: absolute; width: 200px; /* starting width + margin sizing */ height: 100%; background-image: inherit; background-position: top left; background-repeat: no-repeat; bottom: 0; left: 0; z-index: 1; /*translate properties are initial width (100px) and half height (173.2 / 2 = 86.6) */ -ms-transform:rotate(60deg) translate(100px, 86.6px); /* IE 9 */ -moz-transform:rotate(60deg) translate(100px, 86.6px); /* Firefox */ -webkit-transform:rotate(60deg) translate(100px, 86.6px); /* Safari and Chrome */ -o-transform:rotate(60deg) translate(100px, 86.6px); /* Opera */ transform:rotate(60deg) translate(100px, 86.6px); -ms-transform-origin: 100% 0; /* IE 9 */ -webkit-transform-origin: 100% 0; /* Safari and Chrome */ -moz-transform-origin: 100% 0; /* Firefox */ -o-transform-origin: 100% 0; /* Opera */ 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 { /*change some other settings*/ 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); /*you can shift a large background image, but it can get complicated best to keep the image as the total width (200px) and height (174px) that the hex would be. */ background-position: -150px -120px; opacity: .3; color: black; } .hexrow:nth-child(2) > div:nth-child(3) > div:before { /*you can shift a large background image, but it can get complicated best to keep the image as the total width (200px) and height (174px) that the hex would be. */ background-position: -100px -120px; /* the left shift is always less in the pseudo elements by the amount of the base shift */ } .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; }
это на самом деле может быть сделано только с одним элементом на шестиугольник и псевдо-элементы для фонового изображения и текста.
демо
Basic HTML структура:
<div class='row'> <div class='hexagon'></div> </div> <div class='row'> <div class='hexagon content ribbon' data-content='This is a test!!! 9/10'></div><!-- --><div class='hexagon content longtext' data-content='Some longer text here. Bla bla bla bla bla bla bla bla bla bla blaaaah...'></div> </div>у вас может быть больше строк, вам просто нужно иметь
nшестигранники на нечетных строках иn+/-1шестиугольники на четных рядах.соответствующей CSS:
* { box-sizing: border-box; margin: 0; padding: 0; } .row { margin: -18.5% 0; text-align: center; } .row:first-child { margin-top: 7%; } .hexagon { position: relative; display: inline-block; overflow: hidden; margin: 0 8.5%; padding: 16%; transform: rotate(30deg) skewY(30deg) scaleX(.866); /* .866 = sqrt(3)/2 */ } .hexagon:before, .content:after { display: block; position: absolute; /* 86.6% = (sqrt(3)/2)*100% = .866*100% */ top: 6.7%; right: 0; bottom: 6.7%; left: 0; /* 6.7% = (100% -86.6%)/2 */ transform: scaleX(1.155) /* 1.155 = 2/sqrt(3) */ skewY(-30deg) rotate(-30deg); background-color: rgba(30,144,255,.56); background-size: cover; content: ''; } .content:after { content: attr(data-content); } /* add background images to :before pseudo-elements */ .row:nth-child(n) .hexagon:nth-child(m):before { background-image: url(background-image-mxn.jpg); }
я приведу простой пример, как создать шестиугольную форму.
.hex { width: 40px; height: 70px; margin: 20px; overflow: hidden; } .hex:before { content: ""; transform: rotate(45deg); background: #f00; width: 50px; height: 50px; display: inline-block; margin: 10px -5px 10px -5px; }<div class="hex"> </div>
вот еще один подход с использованием COMPASS / SCSS, который позволяет легко установить размер и расположение шестиугольников:
Если вы можете реализовать трюк div shapes, то просто дайте каждому div a
position:relative(вы должны были бы сначала расположить их все по одному, также установивtopиleft)
вы можете создать полностью отзывчивую шестиугольную сетку, используя только CSS. Идея состоит в том, чтобы создать родительскую форму в качестве маски с помощью CSS2.1 overflow:hidden, который совместим практически со всеми браузерами, даже internet explorer 6.
Это удивительно простой метод, который может быть использован для создания отзывчивой сетки всех видов форм, он просто требует мышления вне коробки, чтобы решить эту проблему.
У меня есть подробная пошаговая инструкция, как это сделать техника здесь: https://www.codesmite.com/article/how-to-create-pure-css-hexagonal-grids
Это лучший способ, который я нашел до сих пор, не требует javascript и является одновременно текучим и отзывчивым.
Я также использовал технику в бесплатном шаблоне HTML, который включает изображения внутри шестиугольников, которые вы можете демо и скачать здесь:https://www.codesmite.com/freebie/hexa-free-responsive-portfolio-template
AFAIK, нет никакого способа сделать в чистом CSS. Лучше всего было бы использовать обрезку маски для фона, как описано здесь:http://www.cssbakery.com/2009/06/background-image.html (это будет работать только в том случае, если фон страницы является сплошным цветом или вы можете установить и расположить маску в соответствии с фоном страницы.
тогда вы можете использовать csstextwrap, чтобы вписаться в текст: http://www.csstextwrap.com/examples.php
там была куча похожие вопросы на так. Е. Г. есть текст в div заполнить форму треугольника?
Comments