<svg x="0" y="0" height="2048" width="4096" style="position: absolute; top: 0px; left: 0px; pointer-events: none;">
<defs>
<mask x="0" y="0" id="shadowLayerMask">
<polygon fill="#FFF" points="1042,1578 630,2048 3902,2048 3370,1464"></polygon>
</mask>
</defs>
<rect x="0" y="0" fill="red" mask="url(#shadowLayerMask)" maskContentUnits="userSpaceOnUse" height="2048" width="4096"></rect>
</svg>
シンプルですよね?この svg を html ファイルにドロップすると、マスキングは完全に機能します。しかし、仮想 dom で同じ svg を生成すると、マスクは効果がなく、巨大な赤い四角形が表示されます。
<defs></defs>
迷惑なことに、開発者ツールを開いてsvgに無意味なものを追加すると、生成時に表示することができます。それはどういうわけかsvgを蹴り、マスクする必要があることを思い出させるようです。
ここで何が起こっているか知っている人はいますか?empty を注入するようにタイマーを設定する必要のない回避策はありますdefs
か?
アップデート:
ここにソースがあります
render : Layer -> Html
render { key, shader, mask, size } =
let
key' =
key ++ "LayerMask"
style' =
[ "position" => "absolute"
, "top" => "0px"
, "left" => "0px"
, "pointer-events" => "none"
]
hw =
[ A.height << toString <| getY size
, A.width << toString <| getX size
]
polygon =
Svg.polygon
[ A.fill "#FFF"
, toPoints mask
]
[]
mask' =
node
"mask"
[ A.x "0", A.y "0", id key' ]
[ polygon ]
image =
Svg.rect
(A.x "0"
::
A.y "0"
-- :: A.xlinkHref shader
::
A.fill "red"
::
A.mask (url key')
::
A.maskContentUnits "userSpaceOnUse"
::
hw
)
[]
in
Svg.svg
(A.x "0" :: A.y "0" :: style style' :: hw)
[ Svg.defs [] [ mask' ]
, image
]
ここにいくつかの関連するインポートがあります
import Html exposing (..)
import Svg
import Svg.Attributes as A
import Html.Attributes as H exposing (style, id)
アップデート
コメントの助けを借りてそれを理解しました。node
対でしSvg.node
た。に変更したらSvg.node
、問題はなくなりました。質問は:
- なぜこれが修正されたのですか?
- これを重要なものにしている、ここの裏で何が起こっているのでしょうか?
- 私が経験した問題がコンパイル時のエラーになるように、これをタイプセーフにすることはできますか?