You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Mask.js 1.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js'
  2. import { registerMethods } from '../utils/methods.js'
  3. import Container from './Container.js'
  4. import baseFind from '../modules/core/selector.js'
  5. export default class Mask extends Container {
  6. // Initialize node
  7. constructor (node, attrs = node) {
  8. super(nodeOrNew('mask', node), attrs)
  9. }
  10. // Unmask all masked elements and remove itself
  11. remove () {
  12. // unmask all targets
  13. this.targets().forEach(function (el) {
  14. el.unmask()
  15. })
  16. // remove mask from parent
  17. return super.remove()
  18. }
  19. targets () {
  20. return baseFind('svg [mask*="' + this.id() + '"]')
  21. }
  22. }
  23. registerMethods({
  24. Container: {
  25. mask: wrapWithAttrCheck(function () {
  26. return this.defs().put(new Mask())
  27. })
  28. },
  29. Element: {
  30. // Distribute mask to svg element
  31. masker () {
  32. return this.reference('mask')
  33. },
  34. maskWith (element) {
  35. // use given mask or create a new one
  36. const masker = element instanceof Mask
  37. ? element
  38. : this.parent().mask().add(element)
  39. // apply mask
  40. return this.attr('mask', 'url(#' + masker.id() + ')')
  41. },
  42. // Unmask element
  43. unmask () {
  44. return this.attr('mask', null)
  45. }
  46. }
  47. })
  48. register(Mask, 'Mask')