web-dev-qa-db-ja.com

パーセント幅のレスポンシブCSS三角形

以下のコードは、<a>要素のすぐ下に矢印を作成します。

JSFiddle

.btn {
    position: relative;
    display: inline-block;
    width: 100px;
    height: 50px;
    text-align: center;
    color: white;
    background: gray;
    line-height: 50px;
    text-decoration: none;
}
.btn:after {
    content: "";
    position: absolute;
    bottom: -10px;
    left: 0;
    width: 0;
    height: 0;
    border-width: 10px 50px 0 50px;
    border-style: solid;
    border-color: gray transparent transparent transparent;   
}
<a href="#" class="btn">Hello!</a>

問題は、適切なサイズの矢印を得るためにリンクの幅を指定する必要があることです。ピクセル単位で境界線の幅を指定できないからです。

レスポンシブトライアングルをパーセントベースにする方法は?

29
sdvnksv

リンクの下にレスポンシブトライアングルを作成するために、斜めに回転した擬似要素を使用できます:

[〜#〜] demo [〜#〜](結果ウィンドウのサイズを変更して、反応を確認します)

三角形は、padding-bottomプロパティでアスペクト比を維持します。

形状がコンテンツに応じてサイズを調整するようにする場合は、.btnクラスの幅を削除できます

.btn {
  position: relative;
  display: inline-block;
  height: 50px; width: 50%;
  text-align: center;
  color: white;
  background: gray;
  line-height: 50px;
  text-decoration: none;
  padding-bottom: 15%;
  background-clip: content-box;
  overflow: hidden;
}
.btn:after {
  content: "";
  position: absolute;
  top:50px;  left: 0;
  background-color: inherit;
  padding-bottom: 50%;
  width: 57.7%;
  z-index: -1;
  transform-Origin: 0 0;
  transform: rotate(-30deg) skewX(30deg);
}
/** FOR THE DEMO **/

body {
  background: url('http://i.imgur.com/qi5FGET.jpg');
  background-size: cover;
}
<a href="#" class="btn">Hello!</a>

レスポンシブトライアングルとその作成方法の詳細については、Transform Rotateのトライアングル(シンプルでファンシーレスポンシブトライアングル)

49
web-tiki

これに対する別の解決策は、CSSクリップパスを使用して、色付きブロックから三角形をクリップすることです。いいえIEサポート。ただし、内部ツールなどに使用できます。

[〜#〜] demo [〜#〜]

SCSSで簡単に書かれています。

.outer {
  background: orange;
  width: 25%;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  padding: 1em;

  p {
    margin: 0;
    text-align: center;
    color: #fff;
  }

  &:after {
    content: '';
    position: absolute;
    top: 100%;
    left: 0; 
    right: 0;
    padding-bottom: 10%;
    background: orange;
    -webkit-clip-path: polygon(0% 0%, 100% 0%, 50% 100%);
    clip-path: polygon(0% 0%, 100% 0%, 50% 100%);
  }

}
12
Probocop

任意の幅/高さで動作するソリューションを見つけました。次のように、linear-gradientバックグラウンドで2つの擬似要素を使用できます( fiddle ):

.btn {
    position: relative;
    display: inline-block;
    width: 100px;
    height: 50px;
    text-align: center;
    color: white;
    background: gray;
    line-height: 50px;
    text-decoration: none;
}
.btn:before {
    content: "";
    position: absolute;
    top: 100%;
    right: 0;
    width: 50%;
    height: 10px;
    background: linear-gradient(to right bottom, gray 50%, transparent 50%)
}

.btn:after {
    content: "";
    position: absolute;
    top: 100%;
    left: 0;
    width: 50%;
    height: 10px;
    background: linear-gradient(to left bottom, gray 50%, transparent 50%)
}
5

以下のコードの修正版は、これを達成するのに役立ちます

HTML

<div class="triangle-down"></div>

CSS

.triangle-down {
    width: 10%;
    height: 0;
    padding-left:10%;
    padding-top: 10%;
    overflow: hidden;
}
.triangle-down:after {
    content: "";
    display: block;
    width: 0;
    height: 0;
    margin-left:-500px;
    margin-top:-500px;

    border-left: 500px solid transparent;
    border-right: 500px solid transparent;
    border-top: 500px solid #4679BD;
}

レスポンシブトライアングルの詳細については、 レスポンシブCSSトライアングル

4
lessismore

私は他の答えを試してみましたが、三角形の形状を操作するには複雑すぎたり、扱いにくいと感じました。代わりに、svgとして単純な三角形を作成することにしました。

三角形の高さは、絶対値に設定するか、必要に応じて両方向に応答できるように長方形のパーセンテージとして設定できます。

html, body{
  height:100%;
  width:100%;
}
.outer{
  width:20%;
  height:25%;
  background:red;
  position:relative;
  
}
.inner{
  height:100%;
  width:100%;
  background-color:red;
}
.triangle-down{
  height:25%;
  width:100%;
  position:relative;
}
.triangle-down svg{
  height:100%;
  width:100%;
  position:absolute;
  top:0;
}
svg .triangle-path{
  fill:red;
}
<div class="outer">
<div class="inner"></div>
  <div class="triangle-down">
<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="none" viewBox="0 0 2 1">
 <g>
  <path class="triangle-path" d="M0,0 l2,0 l-1,1 z" />
 </g>
</svg>
</div>

テスト済みのFF、Chrome、IE、Edge、Mob Safari、Mob Chrome

2
Will Jenkins

私は@Probocopの答えを取り、以下を思いつきました:

<style>
    .btn {
        background-color: orange;
        color: white;
        margin-bottom: 50px;
        padding: 15px;
        position: relative;
        text-align: center;
        text-decoration: none;
    }

    .btn:after {
        background-color: inherit;
        clip-path: url('data:image/svg+xml;utf8,%3Csvg xmlns="http://www.w3.org/2000/svg"%3E%3Cdefs%3E%3CclipPath id="p" clipPathUnits="objectBoundingBox"%3E%3Cpolygon points="0 0, 1 0, 0.5 1" /%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E#p'); /* fix for firefox (tested in version 52) */
        clip-path: polygon(0% 0%, 100% 0%, 50% 100%);
        content: '';
        height: 50px;
        left: 0;
        position: absolute;
        right: 0;
        top: 100%;
    }
</style>

<a href="#" class="btn">Hello!</a>

これはChromeで動作します。Firefoxの修正を追加しました。Edgeでは動作しませんが、下向き矢印の高さを下げてもそれほど悪く見えません。

bootstrap=を使用している場合は、名前を変更するか、適用するスタイルの一部をオーバーライドする必要があります。名前を変更する場合は、以下を追加する必要があります。 .btnスタイル:

box-sizing: content-box;
0
nfplee