以前にborderを使った三角形やSassのmixinの記事を投稿しましたが、今回はclip-pathを使った三角形の作成方法と、そのmixin化について試してみます。
サンプルコード
まずはclip-pathで三角形を作ってみます。
clip-pathについては以前に記事を投稿していますので、詳しくはそちらもご確認ください。
<div class="triangle-top"></div> <div class="triangle-bottom"></div> <div class="triangle-left"></div> <div class="triangle-right"></div>
底辺と高さがそれぞれ100pxの三角形を作成します。
.triangle-top,
.triangle-bottom,
.triangle-left,
.triangle-right {
width: 100px;
height: 100px;
background: red;
margin-block: 20px;
}
.triangle-top {
clip-path: polygon(
50% 0%,
100% 100%,
0% 100%
);
}
.triangle-bottom {
clip-path: polygon(
50% 100%,
100% 0%,
0% 0%
);
}
.triangle-left {
clip-path: polygon(
0% 50%,
100% 0%,
100% 100%
);
}
.triangle-right {
clip-path: polygon(
100% 50%,
0% 0%,
0% 100%
);
}
clip-pathの座標の指定を%にして、対象要素の幅高さに合わせて三角形を作成するようにしています。
三角形を作成するデモページ
次にSassのmixinで三角形を作成できるようにしてみます。
// ----------------------------------------
// 三角形の作成
//
// $direction: 三角形の方向(top, bottom, left, right から選択)
// $base: 三角形の底辺
// $height: 三角形の高さ
// $color: 三角形の色
// ----------------------------------------
@mixin triangle($direction, $base, $height, $color) {
background-color: $color;
@if $direction == top {
width: $base;
height: $height;
clip-path: polygon(
50% 0%,
100% 100%,
0% 100%
);
} @else if $direction == bottom {
width: $base;
height: $height;
clip-path: polygon(
50% 100%,
100% 0%,
0% 0%
);
} @else if $direction == left {
width: $height;
height: $base;
clip-path: polygon(
0% 50%,
100% 0%,
100% 100%
);
} @else if $direction == right {
width: $height;
height: $base;
clip-path: polygon(
100% 50%,
0% 0%,
0% 100%
);
} @else {
@error "#{$direction}は未定義のdirectionです。top, bottom, left, right から指定してください。";
}
}
実際に使ってみます。
.test-top {
@include triangle(top, 10px, 20px, red);
}
.test-bottom {
@include triangle(bottom, 30px, 40px, blue);
}
.test-left {
@include triangle(left, 50px, 60px, green);
}
.test-right {
@include triangle(right, 70px, 80px, yellow);
}
以下のように生成されました。
.test-top {
background-color: red;
width: 10px;
height: 20px;
clip-path: polygon(50% 0%, 100% 100%, 0% 100%);
}
.test-bottom {
background-color: blue;
width: 30px;
height: 40px;
clip-path: polygon(50% 100%, 100% 0%, 0% 0%);
}
.test-left {
background-color: green;
width: 60px;
height: 50px;
clip-path: polygon(0% 50%, 100% 0%, 100% 100%);
}
.test-right {
background-color: yellow;
width: 80px;
height: 70px;
clip-path: polygon(100% 50%, 0% 0%, 0% 100%);
}
コメントが承認されるまで時間がかかります。