ShapesElement.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. <template>
  2. <div class='wrap' @mousedown="mousedown" @mouseup="mouseup">
  3. <!--<icon></icon>-->
  4. <svg style="width: 100%;height: 100%;position: absolute">
  5. <use v-bind:xlink:href="'/static/svg/icon.svg#'+ iconKey"/>
  6. </svg>
  7. <Operate v-show="showOperate" @mousedown.native.stop="scaleMousedown" @mouseup.native.stop="scaleMouseup" @mousemove.native.stop="scaleMousemove"
  8. />
  9. </div>
  10. </template>
  11. <style lang='less' scoped>
  12. .wrap {
  13. position: absolute;
  14. cursor: move;
  15. }
  16. .wrap img {
  17. position: absolute;
  18. }
  19. </style>
  20. <script>
  21. // import icon from './svg/icon'
  22. import Operate from '../Operate'
  23. export default{
  24. data () {
  25. return {
  26. }
  27. },
  28. props: {
  29. element: {
  30. type: Object,
  31. require: true
  32. },
  33. showOperate: {
  34. type: Boolean
  35. },
  36. iconKey: '',
  37. stopEvent: '',
  38. style: ''
  39. },
  40. methods: {
  41. // 处理元素拖动
  42. move () {
  43. document.querySelector('.canvas').onmousemove = (event) => {
  44. var e = event || window.event
  45. if (this.flag) {
  46. let nowX = e.clientX
  47. let nowY = e.clientY
  48. let disX = nowX - this.currentX
  49. let disY = nowY - this.currentY
  50. this.element.top = parseInt(this.top) + disY
  51. this.element.left = parseInt(this.left) + disX
  52. }
  53. }
  54. },
  55. // 处理元素伸缩
  56. scaleMousemove () {
  57. document.querySelector('.canvas').onmouseup = (event) => {
  58. this.scaleFlag = false
  59. }
  60. document.querySelector('.canvas').onmousemove = (event) => {
  61. var e = event || window.event
  62. if (this.scaleFlag) {
  63. let nowX = e.clientX
  64. let nowY = e.clientY
  65. let disX = nowX - this.currentX
  66. let disY = nowY - this.currentY
  67. switch (this.direction) {
  68. // 左边
  69. case 'w':
  70. this.element.width = parseInt(this.width) - disX
  71. this.element.left = parseInt(this.left) + disX
  72. break
  73. // 右边
  74. case 'e':
  75. this.element.width = parseInt(this.width) + disX
  76. break
  77. // 上边
  78. case 'n':
  79. this.element.height = parseInt(this.height) - disY
  80. this.element.top = parseInt(this.top) + disY
  81. break
  82. // 下边
  83. case 's':
  84. this.element.height = parseInt(this.height) + disY
  85. break
  86. // 左上
  87. case 'nw':
  88. this.element.width = parseInt(this.width) - disX
  89. this.element.left = parseInt(this.left) + disX
  90. this.element.height = parseInt(this.height) - disY
  91. this.element.top = parseInt(this.top) + disY
  92. break
  93. // 左下
  94. case 'sw':
  95. this.element.width = parseInt(this.width) - disX
  96. this.element.left = parseInt(this.left) + disX
  97. this.element.height = parseInt(this.height) + disY
  98. break
  99. case 'ne':
  100. this.element.height = parseInt(this.height) - disY
  101. this.element.top = parseInt(this.top) + disY
  102. this.element.width = parseInt(this.width) + disX
  103. break
  104. case 'se':
  105. this.element.height = parseInt(this.height) + disY
  106. this.element.width = parseInt(this.width) + disX
  107. break
  108. }
  109. }
  110. }
  111. },
  112. mousedown (e) {
  113. this.$store.state.user.operationFlag=false;
  114. if(this.element.locked){
  115. return false;
  116. }
  117. if(this.stopEvent){
  118. return false
  119. }
  120. this.flag = true
  121. this.currentX = e.clientX
  122. this.currentY = e.clientY
  123. this.top = this.element.top
  124. this.left = this.element.left
  125. this.move()
  126. },
  127. mouseup (e) {
  128. this.$store.state.user.operationFlag=true;
  129. this.flag = false
  130. this.scaleFlag = false
  131. },
  132. scaleMousedown (e) {
  133. this.$store.state.user.operationFlag=false;
  134. this.scaleFlag = true
  135. this.currentX = e.clientX
  136. this.currentY = e.clientY
  137. this.top = this.element.top
  138. this.left = this.element.left
  139. this.width = this.element.width
  140. this.height = this.element.height
  141. this.direction = e.target.getAttribute('data-direction')
  142. this.scaleMousemove()
  143. },
  144. scaleMouseup (e) {
  145. this.$store.state.user.operationFlag=true;
  146. this.scaleFlag = false
  147. }
  148. },
  149. components: {
  150. Operate
  151. }
  152. }
  153. </script>