Spec-Zone.ru › SVG

Вырезание и маскирование

Сначала может показаться парадоксальным удаление части того, что вы создали. Но, например, при попытке создать полукруг в SVG вы быстро обнаружите применение следующих свойств:

  • Вырезание, которое относится к удалению частей элементов, определенных другими частями. В этом случае любые полупрозрачные эффекты невозможны; это подход «все или ничего».
  • Маскирование, которое, с другой стороны, позволяет плавные края, учитывая прозрачность и значения серого маски.

Создание вырезов

Мы создаем вышеупомянутый полукруг на основе элемента circle:

html
<svg
  version="1.1"
  xmlns="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink">
  <defs>
    <clipPath id="cut-off-bottom">
      <rect x="0" y="0" width="200" height="100" />
    </clipPath>
  </defs>

  <circle cx="100" cy="100" r="100" clip-path="url(#cut-off-bottom)" />
</svg>

Окружность с радиусом 100 нарисована по центру (100,100). Атрибут clip-path ссылается на элемент <clipPath>, содержащий единственный элемент rect. Этот прямоугольник сам по себе нарисовал бы верхнюю половину холста черным цветом. Обратите внимание, что элемент clipPath обычно размещается в разделе defs.

Однако rect не будет нарисован. Вместо этого его данные пикселей будут использоваться для определения, какие пиксели окружности «попадут» в окончательное отображение. Поскольку прямоугольник покрывает только верхнюю половину окружности, нижняя половина окружности исчезнет:

Теперь у нас есть полукруг, без необходимости работы с дугами в элементах пути. Для вырезания каждый путь внутри clipPath проверяется и оценивается вместе со свойствами обводки и преобразованием. Затем каждая часть целевого объекта, находящаяся в прозрачной области содержимого полученного clipPath, не будет отображаться. Цвет, непрозрачность и т. п. не оказывают влияния, пока они не заставят полностью исчезнуть части.

Маскирование

Эффект маскирования наиболее впечатляюще демонстрируется с градиентом. Если вы хотите, чтобы элемент побледнел, вы можете довольно быстро добиться этого эффекта с помощью масок.

html
<svg
  width="200"
  height="200"
  version="1.1"
  xmlns="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink">
  <defs>
    <linearGradient id="Gradient">
      <stop offset="0" stop-color="black" />
      <stop offset="1" stop-color="white" />
    </linearGradient>
    <mask id="Mask">
      <rect x="0" y="0" width="200" height="200" fill="url(#Gradient)" />
    </mask>
  </defs>

  <rect x="0" y="0" width="200" height="200" fill="green" />
  <rect x="0" y="0" width="200" height="200" fill="red" mask="url(#Mask)" />
</svg>

Вы видите заполненный зеленым цветом rect на нижнем уровне и сверху заполненный красным rect. Последний имеет атрибут mask, указывающий на элемент mask. Содержимое маски — один элемент rect, заполненный градиентом от черного до белого. В результате пиксели красного прямоугольника используют значение яркости содержимого маски в качестве значения альфа (прозрачность), и мы видим градиент от зеленого к красному:

Прозрачность с opacity

Атрибут opacity позволяет задать прозрачность для целого элемента:

xml
<rect x="0" y="0" width="100" height="100" opacity=".5" />

Вышеуказанный прямоугольник будет нарисован наполовину прозрачным. Для заливки и обводки существуют два отдельных атрибута, fill-opacity и stroke-opacity, которые контролируют непрозрачность каждого из этих свойств по отдельности. Обратите внимание, что обводка будет нарисована поверх заливки. Следовательно, если вы зададите непрозрачность обводки элемента, у которого также есть заливка, заливка будет просвечивать на половине обводки, а на другой половине появится фон:

html
<svg
  width="200"
  height="200"
  version="1.1"
  xmlns="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink">
  <rect x="0" y="0" width="200" height="200" fill="blue" />
  <circle
    cx="100"
    cy="100"
    r="50"
    stroke="yellow"
    stroke-width="40"
    stroke-opacity=".5"
    fill="red" />
</svg>

В этом примере вы видите красную окружность на синем фоне. Желтая обводка имеет непрозрачность 50%, что приводит к двуцветной обводке.

Использование известных методов CSS

Одним из самых мощных инструментов в арсенале веб-разработчика является display: none. Поэтому неудивительно, что было решено добавить это свойство CSS и в SVG, наряду с visibility и clip, как определено в CSS 2. Для отмены ранее установленного display: none, важно знать, что начальное значение для всех элементов SVG — inline.

© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Clipping_and_masking

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API