SVG Blur Filter не работает на iOS wkwebview - PullRequest
0 голосов
/ 10 апреля 2020

Я немного новичок в использовании SVG и столкнулся с проблемой, когда фильтр feGaussianBlur неправильно отображается в iOS wkwebview. Он отлично работает на android и на рабочем столе. Я не уверен, как именно это исправить. Любая помощь будет оценена.

Следует отметить, что это проект Cordova / vue, и Cordova использует Apple wkwebview для веб-просмотра.

Работа размытия (Chrome)

Размытие не работает (iOS)

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="120%" width="120%">
  <defs>
    <filter
      id="myblurfilter"
      x="0%"
      y="0%"
      width="100%"
      height="100%"
      filterUnits="userSpaceOnUse"
      color-interpolation-filters="sRGB"
    >
      <feGaussianBlur stdDeviation="5" edgeMode="duplicate" result="blur" />
      <feComponentTransfer>
        <feFuncA type="discrete" tableValues="1 1" />
      </feComponentTransfer>
      <feImage id="feimage" xlink:href="#rect2" result="mask" />
      <feComposite in2="mask" in="blur" operator="in" result="comp" />
      <feMerge result="merge">
        <feMergeNode in="SourceGraphic" />
        <feMergeNode in="comp" />
      </feMerge>
    </filter>
    <rect id="rect" width="100%" height="100%" rx="5" />
    <clipPath id="clip">
      <use xlink:href="#rect" />
    </clipPath>
    <rect id="rect2" y="70%" width="100%" height="30%" fill="#fff" />
  </defs>
  <use xlink:href="#rect" />
  <image
    x="0"
    width="100%"
    height="100%"
    filter="url(#myblurfilter)"
    clip-path="url(#clip)"
    :xlink:href="data.imageURL"
    preserveAspectRatio="xMinYMin slice"
  />
  <use opacity=".15" xlink:href="#rect2"/>
</svg>

1 Ответ

0 голосов
/ 24 апреля 2020

Вот версия того, что я упомянул в комментарии выше. Я также явно определил размеры и расположение каждого элемента (x / y / width / height), что иногда может создавать проблемы в Safari. Я также заменил use в clipPath на вставку фигуры. Это должно работать.

Это не работает в Firefox по другой причине - что feImage не поддерживает ссылки на фрагменты в Firefox. Вы должны вставить любые фигуры, которые хотите вставить в feImage, используя данные: uri.

Обновление - версия 2: по какой-то причине iOS Safari не нравится комбинация feImage / rect2, поэтому я изменил фильтр примитивами objectBoundingBox и корректировкой stdDeviation для размытия в%, и переключением на использование позиционированного feFlood для маски - теперь это похоже на iOS Safari.

    <svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="120%" width="120%">
  <defs>
    <rect id="rect" x="0%" y="0%" width="100%" height="100%" rx="5" />

    <clipPath id="clip">
      <rect x="0%" y="0%" width="100%" height="100%" rx="5" />
    </clipPath>

    <rect id="rect2" x="0%" y="70%" width="100%" height="30%" fill="#fff" />

    <filter
      id="myblurfilter"
      x="0%"
      y="0%"
      width="100%"
      height="100%"
      filterUnits="objectBoundingBox"
      primitiveUnits="objectBoundingBox"
      color-interpolation-filters="sRGB">

      <feGaussianBlur stdDeviation=".005"/>
      <feComponentTransfer result="blur">
        <feFuncA type="discrete" tableValues="1 1" />
      </feComponentTransfer>
      <feFlood flood-color="white"  x="0" y="0.7" height="0.3" width="1" result="mask"/>
      <feComposite in2="mask" in="blur" operator="in" result="comp" />
      <feMerge result="merge">
        <feMergeNode in="SourceGraphic" />
        <feMergeNode in="comp" />
      </feMerge>
    </filter>

  </defs>
  <use xlink:href="#rect" />
  <image
    x="0%"
    y="0%"
    width="100%"
    height="100%"
    filter="url(#myblurfilter)"
    clip-path="url(#clip)"
    xlink:href="https://upload.wikimedia.org/wikipedia/commons/4/4f/DandelionFlower.jpg"
    preserveAspectRatio="xMinYMin meet"
  />
  <use opacity=".15" xlink:href="#rect2"/>
</svg>
...