Spec-Zone.ru › CSS

clip-rule

Базовая линия Широко поддерживается

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с января 2020 года.

  • Подробнее
  • Полная совместимость
  • Отправить отзыв

Свойство clip-rule CSS определяет, какие пиксели в области маски находятся внутри фигуры обрезки, определённой путем обрезки, а какие — снаружи, когда части пути перекрывают друг друга. В частности, оно выбирает между методами «неравен нулю» и «чёт-нечёт» для определения включения. clip-rule может применяться ко всем элементам SVG, но оказывает эффект только на те, которые являются частью пути обрезки. Значения CSS свойства clip-rule могут переопределять значения SVG атрибута clip-rule.

Синтаксис

/* Keywords */
clip-rule: nonzero;
clip-rule: evenodd;

/* Global values */
clip-rule: inherit;
clip-rule: initial;
clip-rule: revert;
clip-rule: revert-layer;
clip-rule: unset;

Значения

nonzero

Для каждой точки в области маски обрезки проводится луч в случайном направлении. Каждый раз, когда луч пересекает часть пути обрезки, счётчик увеличивается на единицу, если часть пути обрезки движется слева направо по лучу, и уменьшается на единицу, если часть пути обрезки движется справа налево по лучу. Если итоговое значение счётчика равно нулю, точка находится вне фигуры пути. В противном случае — внутри.

even-odd

Для каждой точки в области маски обрезки проводится луч в случайном направлении. Каждый раз, когда луч пересекает часть пути обрезки, счётчик увеличивается на единицу. Если итоговое значение счётчика чётно, точка находится вне фигуры пути; в противном случае — внутри. Ноль считается чётным числом.

Формальный синтаксис

clip-rule = 
nonzero |
evenodd

Примеры

Выбор между правилами для пути со всеми часами

На этом изображении SVG есть два прямоугольника, которые обрезаны, один с каждым правилом обрезки. Есть два <clipPath> элемента, так что один может быть настроен на использование правила обрезки «неравен нулю», а другой — на использование правила «чёт-нечёт». Оба пути нарисованы по часовой стрелке как для внутренней, так и для внешней частей.

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 50">
  <g stroke="#123" fill="#BCD">
    <!-- basic rectangle and clipping path visualization follow -->
    <rect x="10" y="10" width="30" height="30" />
    <path
      d="M 65,5 l 20,20 -20,20 -20,-20 20,-20 m 0,10 l 10,10 -10,10 -10,-10 10,-10 z"
      fill="none"
      stroke-width="0.5" />
    <!-- rectangles to be clipped follow -->
    <rect x="110" y="10" width="30" height="30" clip-path="url(#clipper1)" />
    <rect x="160" y="10" width="30" height="30" clip-path="url(#clipper2)" />
  </g>
  <!-- clipping paths follow -->
  <clipPath id="clipper1" clipPathUnits="objectBoundingBox">
    <path
      d="M 0.5 -0.15 l 0.65 0.65 -0.65,0.65 -0.65,-0.65 0.65,-0.65 m 0,0.33 l 0.33,0.33 -0.33,0.33 -0.33,-0.33 0.33,-0.33 z"
      clip-rule="evenodd" />
  </clipPath>
  <clipPath id="clipper2" clipPathUnits="objectBoundingBox">
    <path
      d="M 0.5 -0.15 l 0.65 0.65 -0.65,0.65 -0.65,-0.65 0.65,-0.65 m 0,0.33 l 0.33,0.33 -0.33,0.33 -0.33,-0.33 0.33,-0.33 z"
      clip-rule="nonzero" />
  </clipPath>
</svg>

Для путей обрезки, которые применяются к обрезанным прямоугольникам, используется свойство CSS clip-rule для установки одного пути на использование правила nonzero , а другого — правила evenodd . Эти правила переопределяют значения атрибутов clip-path в SVG, которые намеренно установлены в противоположных значениях, так как CSS навязывает свои.

#clipper1 {
  clip-rule: nonzero;
}
#clipper2 {
  clip-rule: evenodd;
}

Поскольку и внутренняя, и внешняя части пути движутся по часовой стрелке (слева направо), форма результата обрезки будет отличаться для двух правил обрезки. Для nonzero, любой луч внутри внешней части фигуры будет иметь счётчик больше нуля, потому что он столкнётся с одним или несколькими фрагментами пути, движущимися слева направо. Для even-odd, точки между двумя частями пути будут иметь нечётное значение счётчика, а любая точка либо внутри внутреннего пути, либо вне внешней части, будет иметь чётное значение.

Выбор между правилами для пути с разными направлениями

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

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 50">
  <g stroke="#123" fill="#BCD">
    <!-- basic rectangle and clipping path visualization follow -->
    <rect x="10" y="10" width="30" height="30" />
    <path
      d="M 65,5 l 20,20 -20,20 -20,-20 20,-20 m 0,10 l 10,10 -10,10 -10,-10 10,-10 z"
      fill="none"
      stroke-width="0.5" />
    <!-- rectangles to be clipped follow -->
    <rect x="110" y="10" width="30" height="30" clip-path="url(#clipper1)" />
    <rect x="160" y="10" width="30" height="30" clip-path="url(#clipper2)" />
  </g>
  <!-- clipping paths follow -->
  <clipPath id="clipper1" clipPathUnits="objectBoundingBox">
    <path
      d="M 0.5 -0.15 l 0.65 0.65 -0.65,0.65 -0.65,-0.65 0.65,-0.65 m 0,0.33 l -0.33,0.33 0.33,0.33 0.33,-0.33 -0.33,-0.33 z" />
  </clipPath>
  <clipPath id="clipper2" clipPathUnits="objectBoundingBox">
    <path
      d="M 0.5 -0.15 l 0.65 0.65 -0.65,0.65 -0.65,-0.65 0.65,-0.65 m 0,0.33 l 0.33,0.33 -0.33,0.33 -0.33,-0.33 0.33,-0.33 z" />
  </clipPath>
</svg>

Мы применяем тот же CSS, что и раньше.

#clipper1 {
  clip-rule: nonzero;
}
#clipper2 {
  clip-rule: evenodd;
}

В этом случае, поскольку внешняя часть пути движется по часовой стрелке (слева направо), а внутренняя часть пути движется против часовой стрелки (справа налево), полученная форма обрезки будет одинаковой независимо от правила обрезки, которое используется.

Спецификации

Спецификация
CSS Masking Module Level 1
# the-clip-rule

Совместимость с браузерами

Десктопные Мобильные
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari на IOS Samsung Internet WebView Android
clip-rule ≤80 ≤80 ≤72 67 ≤13.1 80 79 57 ≤13.4 13.0 80
evenodd ≤83 83 ≤72 69 ≤13.1 83 79 59 ≤13.4 13.0 83
nonzero ≤83 83 ≤72 69 ≤13.1 83 79 59 ≤13.4 13.0 83

См. также

  • Атрибут SVG clip-rule
  • Элемент SVG <clipPath>
  • Свойство CSS clip-path

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

Spec-Zone.ru

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