Можно ли изменить внутренний цвет изображения SVG по клику - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть изображение звезды, внутренний цвет, очевидно, прозрачен, мне было интересно, могу ли я щелкнуть по нему, чтобы изменить внутренний цвет, как, например, в рейтинге звезд. Просто используя html CSS без каких-либо сценариев. пустая звезда

- опробовал параметр заливки, но он изменяет только внешнюю линию звезды. -пробовал с помощью тегов объекта svg теги, но опять же не заполняет звезду.

Я думаю, мой единственный вариант, чтобы заполнить другое изображение и обмен между ними ...

Ответы [ 4 ]

2 голосов
/ 06 февраля 2020

Вам понадобятся как заполненные, так и незаполненные SVG, и вы можете переключаться между ними по щелчку. Например, если вы используете библиотеку значков, такую ​​как font-awesome, вы можете переключаться между их значками в виде звездочек, которые имеют разновидности 'обычной' и 'solid'.

Вы также можете манипулировать fill атрибут SVG, но он действительно зависит от того, как построен SVG, и какие элементы пути используются в нем, и можно ли использовать заполнение им или нет.

$('i').click((ev) => {
  $(ev.target).toggleClass('fa-star')
  $(ev.target).toggleClass('fa-star-o')
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">

<i class="fa fa-star-o"></i>
2 голосов
/ 06 февраля 2020

Да, вы можете изменить внутренний цвет звезды onclick, но вам нужно небольшое js, чтобы добавить класс к объекту. Если бы это был просто rollover, вы могли бы сделать это только с помощью CSS, добавив состояние :hover к определению класса элемента.

Чтобы достичь обоих, SVG должен быть HTML -подключен, поэтому он является частью DOM.

По вашему вопросу:

-попробовал параметр заливки, но он изменяет только внешнюю линию звезды , -пробовал использовать теги svg теги объекта, но снова не заполняет звезду.

Чтобы изменить цвет заливки объекта, вы должны изменить атрибут fill, например, так:

.star-holder{
width:6rem; 
height:6rem;
}

.star-holder img {
width: 100%
height:auto;
}

.star {
fill:#666
}

.star:hover {
fill:#f29111;
}
<h3> Star rollover demo</h3>

<div class="star-holder">
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
 "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
 viewBox="0 0 1278.000000 1280.000000"
 preserveAspectRatio="xMidYMid meet">

<g transform="translate(0.000000,1280.000000) scale(0.100000,-0.100000)"
 stroke="none" class="star">
<path d="M6760 12443 c-137 -26 -302 -163 -453 -375 -207 -293 -384 -645 -802
-1598 -347 -790 -486 -1070 -667 -1337 -211 -311 -357 -373 -878 -374 -303 0
-573 22 -1315 106 -310 36 -666 73 -930 97 -191 17 -792 17 -905 0 -359 -56
-525 -174 -538 -382 -7 -128 43 -265 161 -442 197 -294 514 -612 1317 -1323
955 -845 1247 -1174 1290 -1452 37 -234 -95 -656 -453 -1458 -364 -816 -430
-963 -490 -1110 -252 -611 -352 -998 -318 -1236 31 -222 145 -333 357 -346
311 -21 768 169 1699 704 749 431 885 508 1051 596 451 240 718 338 924 341
121 1 161 -10 310 -84 265 -133 574 -380 1300 -1040 1006 -916 1405 -1206
1752 -1276 102 -21 173 -13 255 27 103 50 160 135 204 304 21 81 23 111 23
315 0 125 -5 267 -12 320 -51 379 -107 674 -253 1335 -229 1034 -279 1327
-279 1647 0 162 16 260 55 346 101 221 462 490 1275 952 661 375 831 473 1005
578 739 446 1065 761 1065 1027 0 155 -96 273 -306 378 -300 150 -748 236
-1764 342 -1052 108 -1334 148 -1637 225 -387 100 -514 201 -648 515 -117 276
-211 629 -391 1482 -135 644 -212 973 -289 1237 -115 398 -240 668 -380 824
-94 105 -221 156 -335 135z"/>
</g>
</svg>


</div>

Система оценки звездочек требует сценария для сохранения состояния звезды, когда пользователь нажимает на нее, среди прочего. Возможно, вы захотите проверить этот репо , в котором уже работает звездная система с SVG

0 голосов
/ 06 февраля 2020

Можно ли изменить внутренний цвет изображения SVC по клику?

Да, существует множество подходов для получения этого результата.

Вот один из них, который использует URL данных SVG в CSS и Javascript.

Рабочий пример:

let stars = [...document.getElementsByClassName('star')];

const highlightStars = (event) => {

  let targetStar = event.target;
  let targetStarIndex = stars.indexOf(targetStar);
  targetStar.classList.toggle('highlighted');
  
  for (star of stars) {
    
    if (stars.indexOf(star) > (targetStarIndex - 1)) {
      star.classList.add('highlighted');
    }
      
    else {
      star.classList.remove('highlighted');
    }
  }
}

for (star of stars) {

  star.addEventListener('click', highlightStars, false);
}
.ratings {
  float: left;
  width: 520px;
}

.star,
.ratings:hover .star {
  display: inline-block;
  float: right;
  width: 100px;
  height: 108px;
  background: rgb(191, 191, 191) url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 198 198"><polygon points="100,10 40,198 190,78 10,78 160,198" fill="rgb(255, 255, 255)"></polygon></svg>') no-repeat;
  cursor: pointer;
}

.ratings:hover .star:hover,
.star:hover ~ .star,
.star.highlighted {
  background: rgb(255, 255, 255) url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 198 198"><polygon points="100,10 40,198 190,78 10,78 160,198" fill="rgb(255, 255, 0)"></polygon></svg>') no-repeat;
}
<div class="ratings">
  <div class="star"></div>
  <div class="star"></div>
  <div class="star"></div>
  <div class="star"></div>
  <div class="star"></div>
</div>

NB Я знаю, что вы написали:

Просто используя html CSS без каких-либо сценариев

но всегда стоит помнить, что:

  • HTML описывает структуру
  • CSS описывает представление
  • Javascript описывает поведение

, поэтому, если вы хотите, чтобы элементы отображались по-другому после взаимодействия пользователя с кликом, тогда javascript - абсолютно подходящий инструмент для прослушивания кликов и обновления CSS когда он слышит один.

0 голосов
/ 06 февраля 2020

Вы можете попробовать поиграть с чем-то вроде этого:

<?xml version="1.0" standalone="no"?>

  <svg width="200" height="250" version="1.1" xmlns="http://www.w3.org/2000/svg">

    <polygon points="50 160 55 180 70 180 60 190 65 205 50 195 35 205 40 190 30 180 45 180" stroke="green" fill="red" stroke-width="3"/>

  </svg>

Используйте «штрих» для цвета заливки и «заливку» для силуэта звезды.

И для первой части вопрос. Изменение css при нажатии без js. https://css-tricks.com/the-checkbox-hack/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...