填充一半的svg多边形形状-星形 [英] fill half of svg polygon shape - star

查看:132
本文介绍了填充一半的svg多边形形状-星形的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用此函数,并希望将新的css类"half"添加到选定的星形类中,以仅用背景颜色填充星形的一半:#e54800

I am using this and was looking to add a new css class 'half' to the star selected class, to only fill half the star shape with the background color: #e54800

https://foundation.zurb.com/building-blocks /blocks/star-rating.html

因此它将是:<div class="star selected half">

<div class="rating-block">
    <div class="rating-block-rating" data-rating>
        <div class="star selected">
            <svg xmlns="http://www.w3.org/2000/svg" width="40" height="37" viewBox="0 0 40 37">
                <polygon fill="none" points="272 30 260.244 36.18 262.489 23.09 252.979 13.82 266.122 11.91 272 0 277.878 11.91 291.021 13.82 281.511 23.09 283.756 36.18" transform="translate(-252)" />
            </svg>
        </div>
        <div class="star">
            <svg xmlns="http://www.w3.org/2000/svg" width="40" height="37" viewBox="0 0 40 37">
                <polygon fill="none" points="272 30 260.244 36.18 262.489 23.09 252.979 13.82 266.122 11.91 272 0 277.878 11.91 291.021 13.82 281.511 23.09 283.756 36.18" transform="translate(-252)" />
            </svg>
        </div>
        <div class="star">
            <svg xmlns="http://www.w3.org/2000/svg" width="40" height="37" viewBox="0 0 40 37">
                <polygon fill="none" points="272 30 260.244 36.18 262.489 23.09 252.979 13.82 266.122 11.91 272 0 277.878 11.91 291.021 13.82 281.511 23.09 283.756 36.18" transform="translate(-252)" />
            </svg>
        </div>
        <div class="star">
            <svg xmlns="http://www.w3.org/2000/svg" width="40" height="37" viewBox="0 0 40 37">
                <polygon fill="none" points="272 30 260.244 36.18 262.489 23.09 252.979 13.82 266.122 11.91 272 0 277.878 11.91 291.021 13.82 281.511 23.09 283.756 36.18" transform="translate(-252)" />
            </svg>
        </div>
        <div class="star">
            <svg xmlns="http://www.w3.org/2000/svg" width="40" height="37" viewBox="0 0 40 37">
                <polygon fill="none" points="272 30 260.244 36.18 262.489 23.09 252.979 13.82 266.122 11.91 272 0 277.878 11.91 291.021 13.82 281.511 23.09 283.756 36.18" transform="translate(-252)" />
            </svg>
        </div>
    </div>
</div>

CSS:

.rating-block {
  padding: 2px 5px;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  -webkit-justify-content: space-between;
      -ms-flex-pack: justify;
          justify-content: space-between;
}

.rating-block .ratings-type {
  margin-right: 1rem;
  margin-bottom: 0;
}

.rating-block .rating-block {
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  margin-bottom: 2rem;
}

.rating-block .rating-block-rating {
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
}

.rating-block .star {
  cursor: pointer;
  stroke: #cc4b37;
}

.rating-block .rating-block-rating .star.selected polygon {
  fill: #cc4b37;
}

.rating-block .rating-block-rating.is-voted .star polygon {
  fill: #cc4b37;
}

.rating-block .rating-block-rating.is-voted .star.selected ~ .star polygon {
  fill: transparent;
}

推荐答案

您可以使用另一个svg定义渐变(以避免在每个svg中重复该渐变),并将渐变与fill结合使用.如果需要其他fill

You can define a gradient using another svg (to avoid repeating it inside each one) and use the gradient with fill. You can easily adjust the % values or create more gradient if you want different other fill

.rating-block {
  padding: 2px 5px;
  display: flex;
  align-items: center;
  justify-content: space-between;
}

.rating-block .ratings-type {
  margin-right: 1rem;
  margin-bottom: 0;
}

.rating-block .rating-block {
  display: flex;
  align-items: center;
  margin-bottom: 2rem;
}

.rating-block .rating-block-rating {
  display: flex;
}

.rating-block .star {
  cursor: pointer;
  stroke: #cc4b37;
}

.rating-block .rating-block-rating .star.selected polygon {
  fill: #cc4b37;
}
.rating-block .rating-block-rating .star.half polygon {
  fill: url(#grad);
}

.rating-block .rating-block-rating.is-voted .star polygon {
  fill: #cc4b37;
}

.rating-block .rating-block-rating.is-voted .star.selected~.star polygon {
  fill: transparent;
}

<svg height="0" width="0">
  <defs>
    <linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="0%">
      <stop offset="0%" style="stop-color:#cc4b37;stop-opacity:1" />
      <stop offset="50%" style="stop-color:#cc4b37;stop-opacity:1" />
      <stop offset="50%" style="stop-color:transparent;stop-opacity:1" />
      <stop offset="100%" style="stop-color:transparent;stop-opacity:1" />
    </linearGradient>
  </defs>
</svg>

<div class="rating-block">
  <div class="rating-block-rating" data-rating>
    <div class="star selected">
      <svg xmlns="http://www.w3.org/2000/svg" width="40" height="37" viewBox="0 0 40 37">
                    <polygon fill="none" points="272 30 260.244 36.18 262.489 23.09 252.979 13.82 266.122 11.91 272 0 277.878 11.91 291.021 13.82 281.511 23.09 283.756 36.18" transform="translate(-252)" />
                </svg>
    </div>
    <div class="star half">
      <svg xmlns="http://www.w3.org/2000/svg" width="40" height="37" viewBox="0 0 40 37">
                    <polygon fill="none" points="272 30 260.244 36.18 262.489 23.09 252.979 13.82 266.122 11.91 272 0 277.878 11.91 291.021 13.82 281.511 23.09 283.756 36.18" transform="translate(-252)" />
                </svg>
    </div>
    <div class="star">
      <svg xmlns="http://www.w3.org/2000/svg" width="40" height="37" viewBox="0 0 40 37">
                    <polygon fill="none" points="272 30 260.244 36.18 262.489 23.09 252.979 13.82 266.122 11.91 272 0 277.878 11.91 291.021 13.82 281.511 23.09 283.756 36.18" transform="translate(-252)" />
                </svg>
    </div>
    <div class="star">
      <svg xmlns="http://www.w3.org/2000/svg" width="40" height="37" viewBox="0 0 40 37">
                    <polygon fill="none" points="272 30 260.244 36.18 262.489 23.09 252.979 13.82 266.122 11.91 272 0 277.878 11.91 291.021 13.82 281.511 23.09 283.756 36.18" transform="translate(-252)" />
                </svg>
    </div>
    <div class="star">
      <svg xmlns="http://www.w3.org/2000/svg" width="40" height="37" viewBox="0 0 40 37">
                    <polygon fill="none" points="272 30 260.244 36.18 262.489 23.09 252.979 13.82 266.122 11.91 272 0 277.878 11.91 291.021 13.82 281.511 23.09 283.756 36.18" transform="translate(-252)" />
                </svg>
    </div>
  </div>
</div>

通过这种方式,可以轻松处理等级,而无需多次使用svg并为填充定义渐变.您可以使用svg作为背景,只需控制宽度即可控制评分:

By the way here is an easier way to handle the rating without having to use the svg multiple time and define a gradient for the fill. You can use svg as background and simply control the width to control the rating:

.rating{
  width: calc(45px * 5);
  height: 45px;
  background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45" viewBox="-40 -40 80 80"><path fill="%23cc4b37" stroke="%23cc4b37" stroke-width="2"  d="M 0.000 20.000 L 23.511 32.361 L 19.021 6.180 L 38.042 -12.361 L 11.756 -16.180 L 0.000 -40.000 L -11.756 -16.180 L -38.042 -12.361 L -19.021 6.180 L -23.511 32.361 L 0.000 20.000 "/></svg>');
  position:relative;
}
.rating:before {
  content:"";
  position:absolute;
  top:0;
  bottom:0;
  left:0;
  width: calc(45px * 5);
  z-index:-1;
  background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45" viewBox="-40 -40 80 80"><path fill="transparent" stroke="%23cc4b37" stroke-width="2"  d="M 0.000 20.000 L 23.511 32.361 L 19.021 6.180 L 38.042 -12.361 L 11.756 -16.180 L 0.000 -40.000 L -11.756 -16.180 L -38.042 -12.361 L -19.021 6.180 L -23.511 32.361 L 0.000 20.000 "/></svg>');
}

<div class="rating">
</div>
<div class="rating" style="width:calc(45px * 2)">
</div>
<div class="rating" style="width:calc(45px * 2.5)">
</div>
<div class="rating" style="width:calc(45px * 4.75)">
</div>
<div class="rating" style="width:calc(45px * 1.75)">
</div>

也可以通过CSS变量进行改进:

Can also be improved with CSS variable:

.rating{
  width: calc(45px * 5);
  height: 45px;
  background: 
    url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45" viewBox="-40 -40 80 80"><path fill="transparent" stroke="%23cc4b37" stroke-width="2"  d="M 0.000 20.000 L 23.511 32.361 L 19.021 6.180 L 38.042 -12.361 L 11.756 -16.180 L 0.000 -40.000 L -11.756 -16.180 L -38.042 -12.361 L -19.021 6.180 L -23.511 32.361 L 0.000 20.000 "/></svg>');
  position:relative;
}
.rating:before {
  content:"";
  position:absolute;
  top:0;
  bottom:0;
  left:0;
  width: calc(45px * var(--r,1));
  background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45" viewBox="-40 -40 80 80"><path fill="%23cc4b37" stroke="%23cc4b37" stroke-width="2"  d="M 0.000 20.000 L 23.511 32.361 L 19.021 6.180 L 38.042 -12.361 L 11.756 -16.180 L 0.000 -40.000 L -11.756 -16.180 L -38.042 -12.361 L -19.021 6.180 L -23.511 32.361 L 0.000 20.000 "/></svg>');
}

<div class="rating">
</div>
<div class="rating" style="--r:2">
</div>
<div class="rating" style="--r:2.5">
</div>
<div class="rating" style="--r:4.75">
</div>
<div class="rating" style="--r:1.75">
</div>

这篇关于填充一半的svg多边形形状-星形的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆