web-dev-qa-db-ja.com

内部に画像があるhtml / css六角形

六角形の内側に画像を配置する機会はありますか?私は htmlの六角形のセル に慣れていますが、(背景?)画像で塗りつぶすことができませんでした。

ここに私が試したものがあります:

.top {
  height: 0;
  width: 0;
  display: block;
  border: 20px solid red;
  border-top-color: transparent;
  border-right-color: transparent;
  border-bottom-color: red;
  border-left-color: transparent;
}
.middle {
  height: 20px;
  background: red;
  width: 40px;
  display: block;
}
.bottom {
  height: 0;
  width: 0;
  display: block;
  border: 20px solid red;
  border-top-color: red;
  border-right-color: transparent;
  border-bottom-color: transparent;
  border-left-color: transparent;
}
<div class="hexagon pic">
  <span class="top" style="background: url(http://placekitten.com/400/400/)"></span>
  <span class="middle" style="background: url(http://placekitten.com/400/400/)"></span>
  <span class="bottom" style="background: url(http://placekitten.com/400/400/)"></span>
</div>


<div class="hexagon">
  <span class="top" style="overflow: hidden;"><img src="http://placekitten.com/400/400/" /></span>
  <span class="middle" style="overflow: hidden;"><img src="http://placekitten.com/400/400/" /></span>
  <span class="bottom" style="overflow: hidden;"><img src="http://placekitten.com/400/400/" /></span>
</div>

<div class="hexagon">
  <span class="top"><img src="http://placekitten.com/400/400/" /></span>
  <span class="middle"><img src="http://placekitten.com/400/400/" /></span>
  <span class="bottom"><img src="http://placekitten.com/400/400/" /></span>
</div>

ここにフィドルがあります: http://jsfiddle.net/jnz31/kGSCA/

25
honk31

CSS3ではほとんどすべてが可能です: http://jsfiddle.net/kizu/bhGn4/

そこで、overflow: hiddenでさまざまな回転を使用したため、クロスブラウザ(まあ、modernクロスブラウザ)マスクを取得できます。マスクされた領域でカバー可能およびクリック可能にします。

67
kizu

画像で六角形を実現する最も柔軟な方法は、インラインSVGを使用することです:

svg{
  width:30%;
}
<svg viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg">
  <defs>
    <pattern id="img" patternUnits="userSpaceOnUse" width="100" height="100">
      <image xlink:href="https://farm4.staticflickr.com/3165/5733278274_2626612c70.jpg" x="-25" width="150" height="100" />
    </pattern>
  </defs>
  <polygon points="50 1 95 25 95 75 50 99 5 75 5 25" fill="url(#img)"/>
</svg>

SVGで六角形の画像を実現するには、少なくとも2つの方法があります。

  • 六角形のポリゴンを作成し、ポリゴンを画像とpattern要素で埋めます(前のスニペットで使用したアプローチ)
  • 六角形の多角形で画像を切り取る(次のスニペットを参照)
svg{width:30%}
<svg viewbox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg">
  <defs>
    <clipPath id="hexClip">
      <polygon points="50 1 99 25 99 75 50 99 1 75 1 25"/>
    </clipPath>
  </defs>  
  <image xlink:href="https://farm4.staticflickr.com/3165/5733278274_2626612c70.jpg" x="-25" width="150" height="100" clip-path="url(#hexClip)"/>
</svg>

SVGアプローチにより、六角形の形状と画像の多くの側面を制御できます。また、CSSでスタイルを設定できます。以下に例を示します。

svg{
  width:30%;
  margin:0 auto;
}
#hex{
  stroke-width:2;
  stroke: teal;
  fill-opacity:0.6;
  transition:fill-opacity .8s;
}
#hex:hover{
  fill-opacity:1;
}
#text{
  stroke-width:0.5;
  stroke:teal;
  fill-opacity:0.4;
  fill:teal;
  transition:fill-opacity .8s;
}
#hex:hover + #text{
  fill-opacity:1;
}
<svg viewbox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg">
  <defs>
    <pattern id="img" patternUnits="userSpaceOnUse" width="100" height="100">
      <image xlink:href="https://farm4.staticflickr.com/3165/5733278274_2626612c70.jpg" x="-25" width="150" height="100" />
    </pattern>
  </defs>
  <polygon id="hex" points="50 1 95 25 95 75 50 99 5 75 5 25" fill="url(#img)"/>
  <text id="text" font-size="20" x="50" y="50" text-anchor="middle">Some text</text>
</svg>

画像が内部にある六角形を作成する別の方法については、この質問を確認してください。 応答性のある六角形のグリッド

20
web-tiki

新しい簡単なアプローチは、css3 clip-pathプロパティ。

From ドキュメント

Clip-path CSSプロパティは、表示するクリッピング領域を定義することにより、要素の一部が表示されないようにします。つまり、要素の特定の領域のみが表示されます。

次のcssは、六角形の長方形要素を示します。

div.hexagon {
  clip-path: polygon(50% 0, 100% 25%, 100% 75%, 50% 100%, 0 75%, 0 25%);
}

出力画像:

Output Image shows image in hexagon shape

body {
  background: linear-gradient(orange, yellow);
  min-height: 100vh;
  margin: 0;
}
.hexagon {
  clip-path: polygon(50% 0, 100% 25%, 100% 75%, 50% 100%, 0 75%, 0 25%);
  background: url("https://i.imgur.com/waDgcnc.jpg") no-repeat;
  background-size: cover;
  margin: 10px auto;
  height: 200px;
  width: 200px;      
}
<div class="hexagon">
  
</div>

このプロパティを使用して、必要な形状を描画できます。以下にいくつかの例を示します。

div.pentagon {
  clip-path: polygon(50% 0, 100% 45%, 80% 100%, 20% 100%, 0 45%);
}
div.octagon {
  clip-path: polygon(33.33% 0%, 66.66% 0%, 100% 33.33%, 100% 66.66%, 66.66% 100%, 33.33% 100%, 0 66.66%, 0 33.33%);
}

出力画像:

Output Image showing other examples of clip path

body {
  background: linear-gradient(orange, yellow);
  min-height: 100vh;
  margin: 0;
}
div {
  background: url("https://i.imgur.com/waDgcnc.jpg") no-repeat;
  background-size: cover;
  margin: 10px 20px;
  height: 170px;
  width: 170px;
  float: left;
}

.pentagon {
  clip-path: polygon(50% 0, 100% 45%, 80% 100%, 20% 100%, 0 45%);
}

.octagon {
  clip-path: polygon(33.33% 0%, 66.66% 0%, 100% 33.33%, 100% 66.66%, 66.66% 100%, 33.33% 100%, 0 66.66%, 0 33.33%);
}
<div class="pentagon">
  
</div>
<div class="octagon">
  
</div>

注:clip-path cssプロパティは、IEおよびEdgeではサポートされていません。ただし、Edgeの将来のバージョンでは、このプロパティがサポートされる予定です。

8
Mohammad Usman

次のように角を重ねることでできます:

http://jsfiddle.net/Eric/kGSCA/3/

HTML:

<div class="hexagon pic">
    <span class="top"></span>
    <span class="bottom"></span>
</div>

CSS:

.hexagon {
    background: url(http://placekitten.com/400/400/);
    width: 400px;
    height: 346px;
    position: relative;
}

.hexagon span {
    position: absolute;
    display: block;
    border-left: 100px solid red;
    border-right: 100px solid red;
    width: 200px;
}

.top {
    top: 0;
    border-bottom: 173px solid transparent;
}

.bottom {
    bottom: 0;
    border-top: 173px solid transparent;
}
6
Eric

配置する写真が1つだけ必要な場合の簡単な方法です。

<style>
.hex{
    width:80px;
    height:80px;
    background-image: url(http://placekitten.com/400/400/);
    background-size: cover;
    position:relative;
    margin:10px;
}
.hex:before, .hex:after{
    content:"";
    position:absolute;
    top:0px;height:40px;width:0px; /* 40 = height/2 */
    z-index:1;
    border:20px solid #FFF; /*change #FFF to your bg color*/
}
.hex:before{
    left:-20px; /* -1*borderWidth */
    border-right:40px solid transparent;/* width/2 */
}
.hex:after{
    left:40px; /* width/2 */
    border-left:40px solid transparent;/* width/2 */
}
</style>
<div class="hex"></div>

ボーダーが必要ですか?バックグラウンドimgはより簡単で高速になります。

<div class="hex">
    <div style="position:absolute;top:-20px;left:-20px;bottom:-20px;right:-20px;
        z-index:2;background-image:url(/images/hexagon.png);">
    </div>
</div>
2
Soyoes

それがあなたが探している答えであるかどうかはわかりませんが、六角形にしたい画像の上に六角形の透明な.pngを置き、マスクのように振る舞うことができます。

Z-indexを使用して画像の上に透明なpngを置くだけです

0
Ricardo

外部グラフィックなしで純粋なHTML/CSSでそれを行う方法はないと思います。あなたが質問でリンクしたテクニックを使った巧妙なハックがあるかもしれませんが、それはまさにそれでしょう-巧妙なハック-おそらくライブウェブサイトでの使用には最適ではありません(そしてほとんどの「巧妙なハック」と同様に、おそらく少なくともいくつかのブラウザ間の互換性の問題があります)。

CanvasまたはSVGでできます。

Canvasはビットマップグラフィック機能であり、HTML5仕様の一部です。 SVGは、HTMLページ内で使用できるベクターグラフィックス言語です。

これらはどちらも最新のブラウザーの機能であるため、Internet Explorerのほとんどのバージョン(IE8以前)では残念ながら欠けています。

ただし、幸いなことに、IEはVMLと呼ばれるSVGに類似した言語をサポートしており、CanvasとSVGの両方をIEそれらをVMLに変換します。

こちらもご覧ください:

上記のリンクされたツールのいずれかを使用して、CanvasまたはSVGを使用して六角形(またはその他の)図形を描画し、グラフィックで塗りつぶすことができます。

それが役に立てば幸いです。

0
Spudley