そのため、CSSを使用して、繰り返し六角形のパターンを作成する必要があります。画像が必要な場合はそこに行くことができますが、可能であればCSSを使用することを好みます。
ここに私が作成しようとしているもののアイデアがあります:
基本的に、六角形を作成し、その上にテキスト/画像をオーバーレイする方法が必要です。どこから始めればよいかわからないので、私はまだ多くのコードを持っていません。問題は、単に<div>
sは( http://css-tricks.com/examples/ShapesOfCSS/ )のような六角形の形ですが、その後は接続されません。繰り返しの六角形パターンを使用できますが、特定の形状で必要なテキストまたは画像の正確な場所を指定することはできません。事前に助けてくれてありがとう。
(アナの答えは私のものの数ヶ月後に来ましたが、おそらく「から考える」ためのベースとして私のものを使用していますが、単一のdiv
を使用する方法を考え出すことができたという事実は促進する価値があります- 彼女の答えもチェックしてください -しかし、ヘックスのコンテンツはより制限されていることに注意してください。)
これは本当に驚くべき質問でした。お問い合わせいただきありがとうございます。素晴らしいのは、次の事実です。
元のFiddle使用済み (上記のフィドルリンクへの編集で変更))-それはimgur.comイメージを利用しました。新しいフィドルはphotobucket.comを使用しています(永続的なイメージの読み込みの問題があるかどうかを教えてください)。以下の説明コードがそれに付随するため、元のリンクを保持しています( background-size
またはposition
の新しいフィドルとのいくつかの違いです)。
アイデアはあなたの質問を読んだ後すぐに私に来ましたが、実装するのに時間がかかりました。私はもともと、単一のdiv
と単なる擬似要素を持つ単一の "hex"を取得しようとしましたが、私が知る限り、background-image
(必要な)を回転させる方法はありませんでした。 background-image
回転の手段として擬似要素を使用できるように、ヘックスの右側/左側を取得するためにいくつかの余分なdiv
要素を追加する必要がありました。
IE9、FF、Chromeでテストしました。理論的には、CSS3 transform
をサポートするブラウザーは動作するはずです。
最初のメインアップデート(説明を追加)
コードの説明を投稿する時間があるので、ここに行きます:
まず、六角形は30/60度の関係と三角法によって定義されるため、これらが重要な角度になります。次に、16進グリッドの「行」から開始します。HTMLは次のように定義されます(追加のdiv
要素は、16進の構築に役立ちます)。
<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>
六角形display
にinline-block
を使用しますが、誤って次の行にラップしてグリッドを台無しにしたくないので、white-space: nowrap
はその問題を解決します。この行のmargin
は、16進数の間に必要なスペースに依存します。必要なものを取得するには、いくつかの実験が必要になる場合があります。
.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;
}
ただdiv
要素である.hexrow
の直接の子を使用して、16進数形状の基礎を形成します。 width
は、六角形の上部の水平方向を駆動します。height
は、すべての辺が通常の六角形で等しい長さであるため、その数値から導出されます。繰り返しになりますが、マージンは間隔に依存しますが、グリッドが見えるようにするために個々の六角形の「オーバーラップ」が発生する場所です。 background-image
は、ここで一度定義されます。左へのシフトは、少なくともヘックスの左側の追加幅に対応するためです。テキストを中央揃えにすると仮定すると、text-align
は(もちろん)水平方向を処理しますが、height
と一致するline-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;
}
各odd数字の16進数を「行」に関連してシフトダウンし、各evenシフトアップします。シフト計算(width x cos(30)/ 2)も(height/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
を回転させたため、「再回転」して水平に戻す必要があります。
最初の:before
は、その背景を、ヘクスのメイン部分に等しい負の量の幅に、メインヘックスの元の背景シフトを加えたものに変換します。 2番目の: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
テキスト設定、不透明度を変更したり、より大きな画像を(必要な場所に移動したり)調整したりできます。 2番目の行で行います。
.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;
}
実際には、六角形ごとに1つの要素と、背景画像とテキストの擬似要素を使用して実行できます。
基本[〜#〜] 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シェイプトリックを実装できる場合は、各divにposition:relative
(最初にtop
およびleft
を設定することにより、最初はすべてを1つずつ配置する必要があります)
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