boxShadow.vue 3.6 KB

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