CSSでピラミッドチャートを作る機会があったので作成してみました。
棒グラフや折れ線グラフなどはchart.jsなどで作成可能かと思いますが、
ピラミッドチャートだけは人気がない(?)のか、JS使わなくてもそもそもCSSでそれぐらい作れ!ということなのか
作れませんでした。
参考文献がめちゃくちゃあるわけでもないのでせっかくならばと!
今回つくってみたので、皆さんの参考になればいいなと思います。
(あ!レスポンシブには対応してませんので悪しからず…)
ではさっそくデモから!
See the Pen ピラミッドチャート by sayuri (@giraffeweb) on CodePen.light
HTMLソースです。
コメントでここからがピラミッドチャートと記載しているところが
純粋なピラミッドチャートのソースです。
横の表がいらない方はここだけコピペしてくださいませ!
<div class="flexBox serif">
<!-- ここからがピラミッドチャート -->
<div class="pyramid">
<div class="pyramid-row">
<div class="level one">
<p>レベルS</p>
<span>超上級者</span> <em>10名</em> </div>
<div class="pickupText"> <i class="fas fa-crown" aria-hidden="true"></i>
<p>ここのみ合格</p>
</div>
</div>
<div class="pyramid-row">
<div class="level two">
<p>レベルA</p>
<span>上級者</span><em>100名</em> </div>
</div>
<div class="pyramid-row">
<div class="level three">
<p>レベルB</p>
<span>中級者</span><em>800名</em> </div>
</div>
</div>
<!-- ここまでがピラミッドチャート -->
<div class="levelList">
<div>
<ul class="flexBox">
<li>戦闘</li>
<li>防御</li>
<li>財力</li>
</ul>
<ul class="flexBox">
<li><i class="fas fa-bullseye" aria-hidden="true"></i></li>
<li><i class="fas fa-bullseye" aria-hidden="true"></i></li>
<li><i class="fas fa-bullseye" aria-hidden="true"></i></li>
</ul>
<ul class="flexBox">
<li><i class="far fa-circle" aria-hidden="true"></i></li>
<li><i class="far fa-circle" aria-hidden="true"></i></li>
<li><i class="far fa-circle" aria-hidden="true"></i></li>
</ul>
<ul class="flexBox">
<li><i class="far fa-circle" aria-hidden="true"></i></li>
<li><i class="far fa-triangle" aria-hidden="true"></i></li>
<li><i class="far fa-triangle" aria-hidden="true"></i></li>
</ul>
</div>
</div>
</div>
ピラミッドチャートだけのCSSです。
div.pyramid {
max-width: 400px;
width: 50%;
margin: 0 auto;
text-align: center;
box-sizing: inherit;
.pyramid-row {
display: block;
position: relative;
box-sizing: inherit;
&:before {
content: "";
position: absolute;
bottom: 0;
right: -110%;
width: 150%;
height: 1px;
background-color: #ddd;
}
.level {
display: inline-block;
vertical-align: middle;
margin: 1px auto;
color: #fff;
box-sizing: inherit;
p,span,em {
position: absolute;
left: 50%;
@include PropertySetPrefix(transform, translate(-50%, 0));
width: auto;
white-space: nowrap;
}
p {
font-size: 1.2em;
font-weight: 600;
top: -2%;
}
span {
font-size: 0.8em;
top: 45%;
}
em {
font-size: 1em;
top: 60%;
}
}
.one {
width: 0;
height: 0;
border-left: 90px solid #fff;
border-right: 90px solid #fff;
border-bottom: 150px solid $red;
p {
top: 25%;
}
span {
top: 62%;
}
em {
top: 75%;
}
}
.two {
border-bottom: 85px solid lighten($black , 20);
border-left: 50px solid transparent;
border-right: 50px solid transparent;
height: 0;
width: 185px;
}
.three {
border-bottom: 85px solid lighten($black , 10);
border-left: 50px solid transparent;
border-right: 50px solid transparent;
height: 0;
width:285px;
}
}
}
全体のCSS(SCSS)です。
一応貼っておきます。
.flexBox {
div.pyramid {
max-width: 400px;
width: 50%;
margin: 0 auto;
text-align: center;
box-sizing: inherit;
.pyramid-row {
display: block;
position: relative;
box-sizing: inherit;
&:before {
content: "";
position: absolute;
bottom: 0;
right: -110%;
width: 150%;
height: 1px;
background-color: #ddd;
}
.level {
display: inline-block;
vertical-align: middle;
margin: 1px auto;
color: #fff;
box-sizing: inherit;
p,span,em {
position: absolute;
left: 50%;
@include PropertySetPrefix(transform, translate(-50%, 0));
width: auto;
white-space: nowrap;
}
p {
font-size: 1.2em;
font-weight: 600;
top: -2%;
}
span {
font-size: 0.8em;
top: 45%;
}
em {
font-size: 1em;
top: 60%;
}
}
.one {
width: 0;
height: 0;
border-left: 90px solid #fff;
border-right: 90px solid #fff;
border-bottom: 150px solid $red;
p {
top: 25%;
}
span {
top: 62%;
}
em {
top: 75%;
}
}
.two {
border-bottom: 85px solid lighten($black , 20);
border-left: 50px solid transparent;
border-right: 50px solid transparent;
height: 0;
width: 185px;
}
.three {
border-bottom: 85px solid lighten($black , 10);
border-left: 50px solid transparent;
border-right: 50px solid transparent;
height: 0;
width:285px;
}
.pickupText {
position: absolute;
right: 5%;
top: 25%;
p {
font-weight: bold;
letter-spacing: .1em;
font-size: 0.8em;
color: $red;
}
i {
text-align: center;
color: #FBD200;
font-size: 2em;
}
}
}
}
.levelList {
width: 50%;
ul {
li {
width: calc(100% / 3);
text-align: center;
margin-right: 0;
padding: 1em 0;
font-size: 14px;
border-left: 1px dotted #ddd;
position: relative;
i {
display: block;
font-size: 2em;
position: relative;
}
.fa-bullseye {
color: $red;
}
.fa-triangle {
position: absolute;
margin: auto;
top: 0;
left: 0;
right: 0;
bottom: 0;
width: 30px;
height: 30px;
&:before {
content: " ";
border-left: 18px solid transparent;
border-right: 18px solid transparent;
border-bottom: 30px solid #000;
display: block;
height: 0;
width: 0;
position: absolute;
top: 0;
}
&:after {
content: " ";
border-left: 13px solid transparent;
border-right: 13px solid transparent;
border-bottom: 22px solid #fff;
display: block;
height: 0;
width: 0;
position: absolute;
left: 5px;
top: 5px;
}
}
}
&:nth-child(n + 2) {
li {
padding: 2.4em 0;
border-bottom: 0;
}
}
}
}
}