boxShadow.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <template>
  2. <section class="config" :key="displayName">
  3. <div class="config-label">
  4. {{displayName}}
  5. <el-button
  6. class="plus-button"
  7. size="mini"
  8. round
  9. icon="el-icon-plus"
  10. @click.stop="onAddShadow"
  11. >
  12. </el-button>
  13. </div>
  14. <div class="config-content" v-for="(each, key) in valueArr" :key="key">
  15. <div class="content-10">
  16. <color-picker
  17. size="mini"
  18. class="colorPicker"
  19. v-model="each.color"
  20. @change="val => onInputChange(val, key, 'color')"
  21. show-alpha
  22. ></color-picker>
  23. <span class="content-tip">Color</span>
  24. </div>
  25. <div class="content-20">
  26. <theme-input
  27. size="mini"
  28. :val="each.offsetX"
  29. @change="val => onInputChange(Number(val), key, 'offsetX')"
  30. >
  31. </theme-input>
  32. <span class="content-tip">X-px</span>
  33. </div>
  34. <div class="content-20">
  35. <theme-input
  36. size="mini"
  37. :val="each.offsetY"
  38. @change="val => onInputChange(Number(val), key, 'offsetY')"
  39. >
  40. </theme-input>
  41. <span class="content-tip">Y-px</span>
  42. </div>
  43. <div class="content-20">
  44. <theme-input
  45. size="mini"
  46. :val="each.spreadRadius"
  47. @change="val => onInputChange(Number(val), key, 'spreadRadius')"
  48. >
  49. </theme-input>
  50. <span class="content-tip">Spread</span>
  51. </div>
  52. <div class="content-20">
  53. <theme-input
  54. size="mini"
  55. :val="each.blurRadius"
  56. @change="val => onInputChange(Number(val), key, 'blurRadius')"
  57. >
  58. </theme-input>
  59. <span class="content-tip">Blur</span>
  60. </div>
  61. <div class="content-10">
  62. <el-button
  63. size="mini"
  64. round
  65. icon="el-icon-minus"
  66. @click.stop="val => onMinusShadow(key)"
  67. ></el-button>
  68. </div>
  69. </div>
  70. </section>
  71. </template>
  72. <style scoped>
  73. .plus-button {
  74. position: absolute;
  75. left: 90%;
  76. margin-top: 4px;
  77. }
  78. .colorPicker {
  79. margin-left: 0;
  80. }
  81. .content-20 .el-input__suffix-inner span{
  82. line-height: 28px;
  83. }
  84. .content-20 {
  85. padding: 0 3px;
  86. }
  87. .content-10 {
  88. vertical-align: top;
  89. }
  90. .content-tip {
  91. color: #909399;
  92. font-size: 12px;
  93. }
  94. .config-content {
  95. padding: 5px 0;
  96. }
  97. /* Element buton style override */
  98. .el-button--mini.is-round {
  99. padding: 3px 3px;
  100. }
  101. </style>
  102. <script>
  103. import Mixin from './mixin';
  104. import Input from './input';
  105. import { parse as parseShaodw, stringify as stringifyShaodw } from '../utils/boxShadow.js';
  106. import ColorPicker from './color-picker';
  107. export default {
  108. components: {
  109. ColorPicker,
  110. themeInput: Input
  111. },
  112. data() {
  113. return {
  114. valueArr: []
  115. };
  116. },
  117. mixins: [Mixin],
  118. methods: {
  119. onAddShadow() {
  120. this.valueArr.push({
  121. offsetX: 0,
  122. offsetY: 0,
  123. spreadRadius: 0,
  124. blurRadius: 0,
  125. color: 'rgba(0,0,0,0)',
  126. inset: false
  127. });
  128. },
  129. onMinusShadow(index) {
  130. this.valueArr.splice(index, 1);
  131. this.onShadowChange();
  132. },
  133. onInputChange(e, index, key) {
  134. const arr = this.valueArr[index];
  135. arr[key] = e;
  136. this.valueArr.splice(index, 1, arr);
  137. this.onShadowChange();
  138. },
  139. onShadowChange() {
  140. this.onChange(
  141. stringifyShaodw(this.valueArr)
  142. );
  143. }
  144. },
  145. watch: {
  146. 'mergedValue': {
  147. immediate: true,
  148. handler(value) {
  149. this.valueArr = parseShaodw(value);
  150. }
  151. }
  152. }
  153. };
  154. </script>