0.5刻みで動的に星の数を変えていきます。
もくじ
基本のHTML
基本のHTMLは以下の通り。
reviewNumの中の数字が変わったら
その数字に合わせてグレーの星をオレンジの星に塗りつぶします。
<!-- 1~5までの数字を入れてね↓--> <p id="reviewNum" class="reviewNum">4.2</p> <div class="star"> <p class="star_grey">★★★★★</p> <p id="star_color" class="star_color">★★★★★</p> </div>
必要最低限のスタイルを書く
.star { position: relative; z-index: 0; display: inline-block; white-space: nowrap; } .star_grey { color: grey; } .star_color { position: absolute; z-index: 1; top: 0; left: 0; overflow: hidden; white-space: nowrap; color: orange; }
*sassで書いているので必要な方はscssに書き換えてください
.star position: relative z-index: 0 display: inline-block white-space: nowrap &_grey color: grey &_color position: absolute z-index: 1 top: 0 left: 0 overflow: hidden white-space: nowrap color: orange
cssで星を作る考え方
①positionプロパティを使って、グレーの星の上にぴったりオレンジ色の星を重ね合わせます。
②オレンジ色の星(.star_color)のwidthを指定することでグレーの星をオレンジ色にすることができます。動的にするためにJSを使っていきます。
星の数をJSで動的に変化させる
- レビューの評価点数が何点なのかを取得する
- オレンジの星のidを取得し、date属性(data-rate)の値を付与する
- 星は5点満点なので、widthに評価点数(reviewNum)*20%の計算式を入れてあげる
星を自在にオレンジ色に変える
<script> // レビューの点数を取得し、星の表示を調整 const reviewNum = parseFloat( document.getElementById("reviewNum").textContent ); const starColor = document.getElementById("star_color"); // 0.5刻みで点数を丸めてrateを設定 const roundedReviewNum = Math.floor(reviewNum * 2) / 2; starColor.dataset.rate = roundedReviewNum; // 星の幅をrateに応じて設定 starColor.style.width = roundedReviewNum * 20 + "%"; </script>
この書き方だと、動的に星1から星5まで(0%から100%まで)オレンジの星を自在に操ることができます。(すごい!)
parseFloat
parseFloat
の使用: textContent
で取得した数値を浮動小数点数として扱うためにparseFloat
を使用しました。
星の評価を0.5刻みにする
0.5刻みでの丸め: Math.floor(reviewNum * 2) / 2
で0.5刻みの丸め処理をします。
datasetの使用
datasetを使用するとhtmlにdata-◯◯
をセットすることができます。
今回はdataset.rateとしているのでhtml内ではdata-rate="◯"
になります。
<p id="star_color" class="star_color" data-rate="4">★★★★★</p>
オレンジの星の範囲をwidthで変える
<p id="star_color" class="star_color" style="width: 80%;">★★★★★</p>
—
最後にid=”reviewNum”の中の数字を手動で切り替えてみて、正常に動いているか確認しましょう!