次のように、CSS で content:after プロパティを使用して、灰色の星の上に 2 つ目の金の星を表示することで、これを行うことができます。
<style type="text/css">
.star {
display: inline-block;
width: 20px;
text-align: center;
}
.star.gold { color: gold; }
.star.gold-gray { color: gray; }
.star.gold-gray:after {
display: inline-block;
color: gold;
content: '\2605';
position: absolute;
margin-left: -16px;
width: 8px;
overflow: hidden;
}
.star.gray { color: gray; }
</style>
<div class="star gold">★</div>
<div class="star gold-gray">★</div>
<div class="star gray">★</div>
これが適切に機能するためには、サイズを具体的に指定する必要があります。これにより、ハーフスターに負のマージンを正しく設定し、overflow:hidden を使用して半分の幅で切り取ることができますが、目的は実行されます。
(この例では font-size を指定していません。指定したい場合もあります)
この手法の利点は、ハーフスター用に html に追加のマークアップを必要とせず、正しいクラスだけを追加する必要があることです。
編集
どういうわけか、jsFiddle への間違ったリンクを貼り付けました。以前のバージョンから、まだソリューションをハッキングしていました。
ここで動作することを確認してください。
編集2
シマノンは星が「実際にはコンテンツではない」と述べましたが、これはまったく真実ですが、質問が問題のCSSソリューションを求めていたため、考えられるすべての組み合わせでスプライトマップを必要としないソリューションを作成しました.
スプライト マップに対して何かを持っているからではありません。
各星の要素も<span>
含まれていますが (避けるのは難しい)、それ以外はすべて優れたマークアップであり、スクリーン リーダーにはかなりうまく機能すると思います。
ここでチェックしてください。
<style type="text/css">
.stars .label {
width: 1px;
color: transparent;
overflow: hidden;
position: absolute;
}
.star {
display: inline-block;
width: 20px;
text-align: center;
}
.star:before {
display: inline-block;
content: '\2605';
}
.star.on { color: gold; }
.star.half { color: gray; }
.star.half:after {
display: inline-block;
color: gold;
content: '\2605';
position: absolute;
margin-left: -16px;
width: 8px;
overflow: hidden;
}
.star.off { color: gray; }
</style>
<div class="stars">
<span class="label">One and a half start (out of three)</span>
<span class="star on"></span>
<span class="star half"></span>
<span class="star off"></span>
</div>