(アナの回答は私の回答から数か月後に出たもので、おそらく私の回答を基に「考える」ためのベースとして使用されていますが、彼女がシングルを使用した方法を思いつくことができたという事実div
は宣伝する価値があるので、彼女の回答もチェックしてください-- しかし、 16 進数の内容はより制限されていることに注意してください。)
これは本当に驚くべき質問でした。お尋ねいただきありがとうございます。素晴らしいことは、次の事実です。
オリジナルのフィドルを使用(上記のフィドルへのリンクを後で編集して変更) - imgur.com の画像を使用していましたが、読み込みの信頼性があまり高くないようでした。そのため、新しいフィドルは photobucket.com を使用しています (永続的な画像の読み込みの問題)。以下の説明コードがそれに沿っているため、元のリンクを保持しました(新しいフィドルにはいくつbackground-size
かの違いがあります)。position
あなたの質問を読んだ直後にアイデアが思い浮かびましたが、実装には時間がかかりました。私はもともと、単一の疑似要素を持つ単一の「hex」を取得しようとしましたdiv
が、私が知る限り、(必要な) を回転させる方法はなかったため、適切な要素をbackground-image
追加する必要がありました。 div
/六角形の左側。これにより、疑似要素をbackground-image
回転の手段として使用できます。
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>
inline-block
六角形に使用しますdisplay
が、誤って次の行に折り返してグリッドを台無しにしたくないので、white-space: nowrap
その問題を解決します。このmargin
行の は、六角形の間にどれだけのスペースが必要かによって異なります。必要なものを得るには、いくつかの実験が必要になる場合があります。
.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
で 1 回定義されます。その左へのシフトは、少なくともヘクスの左側に追加された幅に対応することです。中央揃えのテキストが必要であると仮定すると、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;
}
奇数の各ヘックスは「行」に対してシフトダウンし、偶数の各ヘックスは上にシフトします。シフト計算 ( width 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
「翼」を作成するためにそれらの親を回転させたため)。
最初の: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;
}