@lavida/vue-element-admin-template 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/package.json +15 -0
  2. package/template/.editorconfig +14 -0
  3. package/template/.env.development +5 -0
  4. package/template/.env.production +6 -0
  5. package/template/.env.staging +8 -0
  6. package/template/.eslintignore +4 -0
  7. package/template/.eslintrc.js +198 -0
  8. package/template/.travis.yml +5 -0
  9. package/template/LICENSE +21 -0
  10. package/template/README.es.md +222 -0
  11. package/template/README.ja.md +218 -0
  12. package/template/README.md +222 -0
  13. package/template/README.zh-CN.md +245 -0
  14. package/template/babel.config.js +14 -0
  15. package/template/build/index.js +35 -0
  16. package/template/jest.config.js +24 -0
  17. package/template/jsconfig.json +9 -0
  18. package/template/mock/article.js +116 -0
  19. package/template/mock/index.js +60 -0
  20. package/template/mock/mock-server.js +81 -0
  21. package/template/mock/remote-search.js +51 -0
  22. package/template/mock/role/index.js +98 -0
  23. package/template/mock/role/routes.js +530 -0
  24. package/template/mock/user.js +84 -0
  25. package/template/mock/utils.js +48 -0
  26. package/template/package.json +111 -0
  27. package/template/plop-templates/component/index.hbs +26 -0
  28. package/template/plop-templates/component/prompt.js +55 -0
  29. package/template/plop-templates/store/index.hbs +16 -0
  30. package/template/plop-templates/store/prompt.js +62 -0
  31. package/template/plop-templates/utils.js +2 -0
  32. package/template/plop-templates/view/index.hbs +26 -0
  33. package/template/plop-templates/view/prompt.js +55 -0
  34. package/template/plopfile.js +9 -0
  35. package/template/postcss.config.js +5 -0
  36. package/template/public/favicon.ico +0 -0
  37. package/template/public/index.html +15 -0
  38. package/template/src/App.vue +11 -0
  39. package/template/src/api/article.js +41 -0
  40. package/template/src/api/qiniu.js +8 -0
  41. package/template/src/api/remote-search.js +17 -0
  42. package/template/src/api/role.js +38 -0
  43. package/template/src/api/user.js +24 -0
  44. package/template/src/assets/401_images/401.gif +0 -0
  45. package/template/src/assets/404_images/404.png +0 -0
  46. package/template/src/assets/404_images/404_cloud.png +0 -0
  47. package/template/src/assets/custom-theme/fonts/element-icons.ttf +0 -0
  48. package/template/src/assets/custom-theme/fonts/element-icons.woff +0 -0
  49. package/template/src/assets/custom-theme/index.css +1 -0
  50. package/template/src/components/BackToTop/index.vue +111 -0
  51. package/template/src/components/Breadcrumb/index.vue +82 -0
  52. package/template/src/components/Charts/Keyboard.vue +155 -0
  53. package/template/src/components/Charts/LineMarker.vue +227 -0
  54. package/template/src/components/Charts/MixChart.vue +271 -0
  55. package/template/src/components/Charts/mixins/resize.js +56 -0
  56. package/template/src/components/DndList/index.vue +166 -0
  57. package/template/src/components/DragSelect/index.vue +65 -0
  58. package/template/src/components/Dropzone/index.vue +297 -0
  59. package/template/src/components/ErrorLog/index.vue +78 -0
  60. package/template/src/components/GithubCorner/index.vue +54 -0
  61. package/template/src/components/Hamburger/index.vue +44 -0
  62. package/template/src/components/HeaderSearch/index.vue +180 -0
  63. package/template/src/components/ImageCropper/index.vue +1779 -0
  64. package/template/src/components/ImageCropper/utils/data2blob.js +19 -0
  65. package/template/src/components/ImageCropper/utils/effectRipple.js +39 -0
  66. package/template/src/components/ImageCropper/utils/language.js +232 -0
  67. package/template/src/components/ImageCropper/utils/mimes.js +7 -0
  68. package/template/src/components/JsonEditor/index.vue +77 -0
  69. package/template/src/components/Kanban/index.vue +99 -0
  70. package/template/src/components/MDinput/index.vue +360 -0
  71. package/template/src/components/MarkdownEditor/default-options.js +31 -0
  72. package/template/src/components/MarkdownEditor/index.vue +118 -0
  73. package/template/src/components/Pagination/index.vue +101 -0
  74. package/template/src/components/PanThumb/index.vue +142 -0
  75. package/template/src/components/RightPanel/index.vue +145 -0
  76. package/template/src/components/Screenfull/index.vue +60 -0
  77. package/template/src/components/Share/DropdownMenu.vue +103 -0
  78. package/template/src/components/SizeSelect/index.vue +57 -0
  79. package/template/src/components/Sticky/index.vue +91 -0
  80. package/template/src/components/SvgIcon/index.vue +62 -0
  81. package/template/src/components/TextHoverEffect/Mallki.vue +113 -0
  82. package/template/src/components/ThemePicker/index.vue +175 -0
  83. package/template/src/components/Tinymce/components/EditorImage.vue +111 -0
  84. package/template/src/components/Tinymce/dynamicLoadScript.js +59 -0
  85. package/template/src/components/Tinymce/index.vue +250 -0
  86. package/template/src/components/Tinymce/plugins.js +7 -0
  87. package/template/src/components/Tinymce/toolbar.js +6 -0
  88. package/template/src/components/Upload/SingleImage.vue +134 -0
  89. package/template/src/components/Upload/SingleImage2.vue +130 -0
  90. package/template/src/components/Upload/SingleImage3.vue +157 -0
  91. package/template/src/components/UploadExcel/index.vue +138 -0
  92. package/template/src/directive/clipboard/clipboard.js +49 -0
  93. package/template/src/directive/clipboard/index.js +13 -0
  94. package/template/src/directive/el-drag-dialog/drag.js +77 -0
  95. package/template/src/directive/el-drag-dialog/index.js +13 -0
  96. package/template/src/directive/el-table/adaptive.js +41 -0
  97. package/template/src/directive/el-table/index.js +13 -0
  98. package/template/src/directive/permission/index.js +13 -0
  99. package/template/src/directive/permission/permission.js +31 -0
  100. package/template/src/directive/sticky.js +91 -0
  101. package/template/src/directive/waves/index.js +13 -0
  102. package/template/src/directive/waves/waves.css +26 -0
  103. package/template/src/directive/waves/waves.js +72 -0
  104. package/template/src/filters/index.js +68 -0
  105. package/template/src/icons/index.js +9 -0
  106. package/template/src/icons/svg/404.svg +1 -0
  107. package/template/src/icons/svg/bug.svg +1 -0
  108. package/template/src/icons/svg/chart.svg +1 -0
  109. package/template/src/icons/svg/clipboard.svg +1 -0
  110. package/template/src/icons/svg/component.svg +1 -0
  111. package/template/src/icons/svg/dashboard.svg +1 -0
  112. package/template/src/icons/svg/documentation.svg +1 -0
  113. package/template/src/icons/svg/drag.svg +1 -0
  114. package/template/src/icons/svg/edit.svg +1 -0
  115. package/template/src/icons/svg/education.svg +1 -0
  116. package/template/src/icons/svg/email.svg +1 -0
  117. package/template/src/icons/svg/example.svg +1 -0
  118. package/template/src/icons/svg/excel.svg +1 -0
  119. package/template/src/icons/svg/exit-fullscreen.svg +1 -0
  120. package/template/src/icons/svg/eye-open.svg +1 -0
  121. package/template/src/icons/svg/eye.svg +1 -0
  122. package/template/src/icons/svg/form.svg +1 -0
  123. package/template/src/icons/svg/fullscreen.svg +1 -0
  124. package/template/src/icons/svg/guide.svg +1 -0
  125. package/template/src/icons/svg/icon.svg +1 -0
  126. package/template/src/icons/svg/international.svg +1 -0
  127. package/template/src/icons/svg/language.svg +1 -0
  128. package/template/src/icons/svg/link.svg +1 -0
  129. package/template/src/icons/svg/list.svg +1 -0
  130. package/template/src/icons/svg/lock.svg +1 -0
  131. package/template/src/icons/svg/message.svg +1 -0
  132. package/template/src/icons/svg/money.svg +1 -0
  133. package/template/src/icons/svg/nested.svg +1 -0
  134. package/template/src/icons/svg/password.svg +1 -0
  135. package/template/src/icons/svg/pdf.svg +1 -0
  136. package/template/src/icons/svg/people.svg +1 -0
  137. package/template/src/icons/svg/peoples.svg +1 -0
  138. package/template/src/icons/svg/qq.svg +1 -0
  139. package/template/src/icons/svg/search.svg +1 -0
  140. package/template/src/icons/svg/shopping.svg +1 -0
  141. package/template/src/icons/svg/size.svg +1 -0
  142. package/template/src/icons/svg/skill.svg +1 -0
  143. package/template/src/icons/svg/star.svg +1 -0
  144. package/template/src/icons/svg/tab.svg +1 -0
  145. package/template/src/icons/svg/table.svg +1 -0
  146. package/template/src/icons/svg/theme.svg +1 -0
  147. package/template/src/icons/svg/tree-table.svg +1 -0
  148. package/template/src/icons/svg/tree.svg +1 -0
  149. package/template/src/icons/svg/user.svg +1 -0
  150. package/template/src/icons/svg/wechat.svg +1 -0
  151. package/template/src/icons/svg/zip.svg +1 -0
  152. package/template/src/icons/svgo.yml +22 -0
  153. package/template/src/layout/components/AppMain.vue +57 -0
  154. package/template/src/layout/components/Navbar.vue +167 -0
  155. package/template/src/layout/components/Settings/index.vue +108 -0
  156. package/template/src/layout/components/Sidebar/FixiOSBug.js +26 -0
  157. package/template/src/layout/components/Sidebar/Item.vue +41 -0
  158. package/template/src/layout/components/Sidebar/Link.vue +43 -0
  159. package/template/src/layout/components/Sidebar/Logo.vue +82 -0
  160. package/template/src/layout/components/Sidebar/SidebarItem.vue +95 -0
  161. package/template/src/layout/components/Sidebar/index.vue +54 -0
  162. package/template/src/layout/components/TagsView/ScrollPane.vue +94 -0
  163. package/template/src/layout/components/TagsView/index.vue +292 -0
  164. package/template/src/layout/components/index.js +5 -0
  165. package/template/src/layout/index.vue +102 -0
  166. package/template/src/layout/mixin/ResizeHandler.js +45 -0
  167. package/template/src/main.js +53 -0
  168. package/template/src/permission.js +74 -0
  169. package/template/src/router/index.js +404 -0
  170. package/template/src/router/modules/charts.js +36 -0
  171. package/template/src/router/modules/components.js +102 -0
  172. package/template/src/router/modules/nested.js +66 -0
  173. package/template/src/router/modules/table.js +41 -0
  174. package/template/src/settings.js +35 -0
  175. package/template/src/store/getters.js +15 -0
  176. package/template/src/store/index.js +25 -0
  177. package/template/src/store/modules/app.js +56 -0
  178. package/template/src/store/modules/errorLog.js +28 -0
  179. package/template/src/store/modules/permission.js +69 -0
  180. package/template/src/store/modules/settings.js +35 -0
  181. package/template/src/store/modules/tagsView.js +160 -0
  182. package/template/src/store/modules/user.js +131 -0
  183. package/template/src/styles/btn.scss +99 -0
  184. package/template/src/styles/element-ui.scss +84 -0
  185. package/template/src/styles/element-variables.scss +31 -0
  186. package/template/src/styles/index.scss +191 -0
  187. package/template/src/styles/mixin.scss +66 -0
  188. package/template/src/styles/sidebar.scss +226 -0
  189. package/template/src/styles/transition.scss +48 -0
  190. package/template/src/styles/variables.scss +35 -0
  191. package/template/src/utils/auth.js +15 -0
  192. package/template/src/utils/clipboard.js +32 -0
  193. package/template/src/utils/error-log.js +35 -0
  194. package/template/src/utils/get-page-title.js +10 -0
  195. package/template/src/utils/index.js +357 -0
  196. package/template/src/utils/open-window.js +25 -0
  197. package/template/src/utils/permission.js +25 -0
  198. package/template/src/utils/request.js +85 -0
  199. package/template/src/utils/scroll-to.js +58 -0
  200. package/template/src/utils/validate.js +87 -0
  201. package/template/src/vendor/Export2Excel.js +220 -0
  202. package/template/src/vendor/Export2Zip.js +24 -0
  203. package/template/src/views/charts/keyboard.vue +23 -0
  204. package/template/src/views/charts/line.vue +23 -0
  205. package/template/src/views/charts/mix-chart.vue +23 -0
  206. package/template/src/views/clipboard/index.vue +49 -0
  207. package/template/src/views/components-demo/avatar-upload.vue +61 -0
  208. package/template/src/views/components-demo/back-to-top.vue +154 -0
  209. package/template/src/views/components-demo/count-to.vue +218 -0
  210. package/template/src/views/components-demo/dnd-list.vue +39 -0
  211. package/template/src/views/components-demo/drag-dialog.vue +61 -0
  212. package/template/src/views/components-demo/drag-kanban.vue +66 -0
  213. package/template/src/views/components-demo/drag-select.vue +43 -0
  214. package/template/src/views/components-demo/dropzone.vue +31 -0
  215. package/template/src/views/components-demo/json-editor.vue +36 -0
  216. package/template/src/views/components-demo/markdown.vue +101 -0
  217. package/template/src/views/components-demo/mixin.vue +169 -0
  218. package/template/src/views/components-demo/split-pane.vue +67 -0
  219. package/template/src/views/components-demo/sticky.vue +135 -0
  220. package/template/src/views/components-demo/tinymce.vue +36 -0
  221. package/template/src/views/dashboard/admin/components/BarChart.vue +102 -0
  222. package/template/src/views/dashboard/admin/components/BoxCard.vue +118 -0
  223. package/template/src/views/dashboard/admin/components/LineChart.vue +135 -0
  224. package/template/src/views/dashboard/admin/components/PanelGroup.vue +181 -0
  225. package/template/src/views/dashboard/admin/components/PieChart.vue +79 -0
  226. package/template/src/views/dashboard/admin/components/RaddarChart.vue +116 -0
  227. package/template/src/views/dashboard/admin/components/TodoList/Todo.vue +81 -0
  228. package/template/src/views/dashboard/admin/components/TodoList/index.scss +320 -0
  229. package/template/src/views/dashboard/admin/components/TodoList/index.vue +127 -0
  230. package/template/src/views/dashboard/admin/components/TransactionTable.vue +55 -0
  231. package/template/src/views/dashboard/admin/components/mixins/resize.js +55 -0
  232. package/template/src/views/dashboard/admin/index.vue +124 -0
  233. package/template/src/views/dashboard/editor/index.vue +74 -0
  234. package/template/src/views/dashboard/index.vue +31 -0
  235. package/template/src/views/documentation/index.vue +56 -0
  236. package/template/src/views/error-log/components/ErrorTestA.vue +13 -0
  237. package/template/src/views/error-log/components/ErrorTestB.vue +11 -0
  238. package/template/src/views/error-log/index.vue +32 -0
  239. package/template/src/views/error-page/401.vue +99 -0
  240. package/template/src/views/error-page/404.vue +228 -0
  241. package/template/src/views/example/components/ArticleDetail.vue +289 -0
  242. package/template/src/views/example/components/Dropdown/Comment.vue +41 -0
  243. package/template/src/views/example/components/Dropdown/Platform.vue +46 -0
  244. package/template/src/views/example/components/Dropdown/SourceUrl.vue +38 -0
  245. package/template/src/views/example/components/Dropdown/index.js +3 -0
  246. package/template/src/views/example/components/Warning.vue +13 -0
  247. package/template/src/views/example/create.vue +13 -0
  248. package/template/src/views/example/edit.vue +13 -0
  249. package/template/src/views/example/list.vue +112 -0
  250. package/template/src/views/excel/components/AutoWidthOption.vue +34 -0
  251. package/template/src/views/excel/components/BookTypeOption.vue +39 -0
  252. package/template/src/views/excel/components/FilenameOption.vue +27 -0
  253. package/template/src/views/excel/export-excel.vue +116 -0
  254. package/template/src/views/excel/merge-header.vue +101 -0
  255. package/template/src/views/excel/select-excel.vue +107 -0
  256. package/template/src/views/excel/upload-excel.vue +42 -0
  257. package/template/src/views/guide/index.vue +36 -0
  258. package/template/src/views/guide/steps.js +53 -0
  259. package/template/src/views/icons/element-icons.js +3 -0
  260. package/template/src/views/icons/index.vue +101 -0
  261. package/template/src/views/icons/svg-icons.js +10 -0
  262. package/template/src/views/login/auth-redirect.vue +15 -0
  263. package/template/src/views/login/components/SocialSignin.vue +72 -0
  264. package/template/src/views/login/index.vue +324 -0
  265. package/template/src/views/nested/menu1/index.vue +7 -0
  266. package/template/src/views/nested/menu1/menu1-1/index.vue +7 -0
  267. package/template/src/views/nested/menu1/menu1-2/index.vue +7 -0
  268. package/template/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue +5 -0
  269. package/template/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue +5 -0
  270. package/template/src/views/nested/menu1/menu1-3/index.vue +5 -0
  271. package/template/src/views/nested/menu2/index.vue +5 -0
  272. package/template/src/views/pdf/content.js +58 -0
  273. package/template/src/views/pdf/download.vue +201 -0
  274. package/template/src/views/pdf/index.vue +13 -0
  275. package/template/src/views/permission/components/SwitchRoles.vue +32 -0
  276. package/template/src/views/permission/directive.vue +111 -0
  277. package/template/src/views/permission/page.vue +19 -0
  278. package/template/src/views/permission/role.vue +270 -0
  279. package/template/src/views/profile/components/Account.vue +38 -0
  280. package/template/src/views/profile/components/Activity.vue +185 -0
  281. package/template/src/views/profile/components/Timeline.vue +43 -0
  282. package/template/src/views/profile/components/UserCard.vue +134 -0
  283. package/template/src/views/profile/index.vue +68 -0
  284. package/template/src/views/qiniu/upload.vue +41 -0
  285. package/template/src/views/redirect/index.vue +12 -0
  286. package/template/src/views/tab/components/TabPane.vue +103 -0
  287. package/template/src/views/tab/index.vue +57 -0
  288. package/template/src/views/table/complex-table.vue +379 -0
  289. package/template/src/views/table/drag-table.vue +153 -0
  290. package/template/src/views/table/dynamic-table/components/FixedThead.vue +62 -0
  291. package/template/src/views/table/dynamic-table/components/UnfixedThead.vue +50 -0
  292. package/template/src/views/table/dynamic-table/index.vue +24 -0
  293. package/template/src/views/table/inline-edit-table.vue +149 -0
  294. package/template/src/views/theme/index.vue +120 -0
  295. package/template/src/views/zip/index.vue +77 -0
  296. package/template/tests/unit/.eslintrc.js +5 -0
  297. package/template/tests/unit/components/Hamburger.spec.js +18 -0
  298. package/template/tests/unit/components/SvgIcon.spec.js +22 -0
  299. package/template/tests/unit/utils/formatTime.spec.js +29 -0
  300. package/template/tests/unit/utils/param2Obj.spec.js +14 -0
  301. package/template/tests/unit/utils/parseTime.spec.js +37 -0
  302. package/template/tests/unit/utils/validate.spec.js +28 -0
  303. package/template/vue.config.js +125 -0
@@ -0,0 +1,1779 @@
1
+ <template>
2
+ <div v-show="value" class="vue-image-crop-upload">
3
+ <div class="vicp-wrap">
4
+ <div class="vicp-close" @click="off">
5
+ <i class="vicp-icon4" />
6
+ </div>
7
+
8
+ <div v-show="step == 1" class="vicp-step1">
9
+ <div
10
+ class="vicp-drop-area"
11
+ @dragleave="preventDefault"
12
+ @dragover="preventDefault"
13
+ @dragenter="preventDefault"
14
+ @click="handleClick"
15
+ @drop="handleChange"
16
+ >
17
+ <i v-show="loading != 1" class="vicp-icon1">
18
+ <i class="vicp-icon1-arrow" />
19
+ <i class="vicp-icon1-body" />
20
+ <i class="vicp-icon1-bottom" />
21
+ </i>
22
+ <span v-show="loading !== 1" class="vicp-hint">{{ lang.hint }}</span>
23
+ <span v-show="!isSupported" class="vicp-no-supported-hint">{{ lang.noSupported }}</span>
24
+ <input v-show="false" v-if="step == 1" ref="fileinput" type="file" @change="handleChange">
25
+ </div>
26
+ <div v-show="hasError" class="vicp-error">
27
+ <i class="vicp-icon2" />
28
+ {{ errorMsg }}
29
+ </div>
30
+ <div class="vicp-operate">
31
+ <a @click="off" @mousedown="ripple">{{ lang.btn.off }}</a>
32
+ </div>
33
+ </div>
34
+
35
+ <div v-if="step == 2" class="vicp-step2">
36
+ <div class="vicp-crop">
37
+ <div v-show="true" class="vicp-crop-left">
38
+ <div class="vicp-img-container">
39
+ <img
40
+ ref="img"
41
+ :src="sourceImgUrl"
42
+ :style="sourceImgStyle"
43
+ class="vicp-img"
44
+ draggable="false"
45
+ @drag="preventDefault"
46
+ @dragstart="preventDefault"
47
+ @dragend="preventDefault"
48
+ @dragleave="preventDefault"
49
+ @dragover="preventDefault"
50
+ @dragenter="preventDefault"
51
+ @drop="preventDefault"
52
+ @touchstart="imgStartMove"
53
+ @touchmove="imgMove"
54
+ @touchend="createImg"
55
+ @touchcancel="createImg"
56
+ @mousedown="imgStartMove"
57
+ @mousemove="imgMove"
58
+ @mouseup="createImg"
59
+ @mouseout="createImg"
60
+ >
61
+ <div :style="sourceImgShadeStyle" class="vicp-img-shade vicp-img-shade-1" />
62
+ <div :style="sourceImgShadeStyle" class="vicp-img-shade vicp-img-shade-2" />
63
+ </div>
64
+
65
+ <div class="vicp-range">
66
+ <input
67
+ :value="scale.range"
68
+ type="range"
69
+ step="1"
70
+ min="0"
71
+ max="100"
72
+ @input="zoomChange"
73
+ >
74
+ <i
75
+ class="vicp-icon5"
76
+ @mousedown="startZoomSub"
77
+ @mouseout="endZoomSub"
78
+ @mouseup="endZoomSub"
79
+ />
80
+ <i
81
+ class="vicp-icon6"
82
+ @mousedown="startZoomAdd"
83
+ @mouseout="endZoomAdd"
84
+ @mouseup="endZoomAdd"
85
+ />
86
+ </div>
87
+
88
+ <div v-if="!noRotate" class="vicp-rotate">
89
+ <i @mousedown="startRotateLeft" @mouseout="endRotate" @mouseup="endRotate">↺</i>
90
+ <i @mousedown="startRotateRight" @mouseout="endRotate" @mouseup="endRotate">↻</i>
91
+ </div>
92
+ </div>
93
+ <div v-show="true" class="vicp-crop-right">
94
+ <div class="vicp-preview">
95
+ <div v-if="!noSquare" class="vicp-preview-item">
96
+ <img :src="createImgUrl" :style="previewStyle">
97
+ <span>{{ lang.preview }}</span>
98
+ </div>
99
+ <div v-if="!noCircle" class="vicp-preview-item vicp-preview-item-circle">
100
+ <img :src="createImgUrl" :style="previewStyle">
101
+ <span>{{ lang.preview }}</span>
102
+ </div>
103
+ </div>
104
+ </div>
105
+ </div>
106
+ <div class="vicp-operate">
107
+ <a @click="setStep(1)" @mousedown="ripple">{{ lang.btn.back }}</a>
108
+ <a class="vicp-operate-btn" @click="prepareUpload" @mousedown="ripple">{{ lang.btn.save }}</a>
109
+ </div>
110
+ </div>
111
+
112
+ <div v-if="step == 3" class="vicp-step3">
113
+ <div class="vicp-upload">
114
+ <span v-show="loading === 1" class="vicp-loading">{{ lang.loading }}</span>
115
+ <div class="vicp-progress-wrap">
116
+ <span v-show="loading === 1" :style="progressStyle" class="vicp-progress" />
117
+ </div>
118
+ <div v-show="hasError" class="vicp-error">
119
+ <i class="vicp-icon2" />
120
+ {{ errorMsg }}
121
+ </div>
122
+ <div v-show="loading === 2" class="vicp-success">
123
+ <i class="vicp-icon3" />
124
+ {{ lang.success }}
125
+ </div>
126
+ </div>
127
+ <div class="vicp-operate">
128
+ <a @click="setStep(2)" @mousedown="ripple">{{ lang.btn.back }}</a>
129
+ <a @click="off" @mousedown="ripple">{{ lang.btn.close }}</a>
130
+ </div>
131
+ </div>
132
+ <canvas v-show="false" ref="canvas" :width="width" :height="height" />
133
+ </div>
134
+ </div>
135
+ </template>
136
+
137
+ <script>
138
+ 'use strict'
139
+ import request from '@/utils/request'
140
+ import language from './utils/language.js'
141
+ import mimes from './utils/mimes.js'
142
+ import data2blob from './utils/data2blob.js'
143
+ import effectRipple from './utils/effectRipple.js'
144
+ export default {
145
+ props: {
146
+ // 域,上传文件name,触发事件会带上(如果一个页面多个图片上传控件,可以做区分
147
+ field: {
148
+ type: String,
149
+ default: 'avatar'
150
+ },
151
+ // 原名key,类似于id,触发事件会带上(如果一个页面多个图片上传控件,可以做区分
152
+ ki: {
153
+ type: Number,
154
+ default: 0
155
+ },
156
+ // 显示该控件与否
157
+ value: {
158
+ type: Boolean,
159
+ default: true
160
+ },
161
+ // 上传地址
162
+ url: {
163
+ type: String,
164
+ default: ''
165
+ },
166
+ // 其他要上传文件附带的数据,对象格式
167
+ params: {
168
+ type: Object,
169
+ default: null
170
+ },
171
+ // Add custom headers
172
+ headers: {
173
+ type: Object,
174
+ default: null
175
+ },
176
+ // 剪裁图片的宽
177
+ width: {
178
+ type: Number,
179
+ default: 200
180
+ },
181
+ // 剪裁图片的高
182
+ height: {
183
+ type: Number,
184
+ default: 200
185
+ },
186
+ // 不显示旋转功能
187
+ noRotate: {
188
+ type: Boolean,
189
+ default: true
190
+ },
191
+ // 不预览圆形图片
192
+ noCircle: {
193
+ type: Boolean,
194
+ default: false
195
+ },
196
+ // 不预览方形图片
197
+ noSquare: {
198
+ type: Boolean,
199
+ default: false
200
+ },
201
+ // 单文件大小限制
202
+ maxSize: {
203
+ type: Number,
204
+ default: 10240
205
+ },
206
+ // 语言类型
207
+ langType: {
208
+ type: String,
209
+ default: 'zh'
210
+ },
211
+ // 语言包
212
+ langExt: {
213
+ type: Object,
214
+ default: null
215
+ },
216
+ // 图片上传格式
217
+ imgFormat: {
218
+ type: String,
219
+ default: 'png'
220
+ },
221
+ // 是否支持跨域
222
+ withCredentials: {
223
+ type: Boolean,
224
+ default: false
225
+ }
226
+ },
227
+ data() {
228
+ const { imgFormat, langType, langExt, width, height } = this
229
+ let isSupported = true
230
+ const allowImgFormat = ['jpg', 'png']
231
+ const tempImgFormat =
232
+ allowImgFormat.indexOf(imgFormat) === -1 ? 'jpg' : imgFormat
233
+ const lang = language[langType] ? language[langType] : language['en']
234
+ const mime = mimes[tempImgFormat]
235
+ // 规范图片格式
236
+ this.imgFormat = tempImgFormat
237
+ if (langExt) {
238
+ Object.assign(lang, langExt)
239
+ }
240
+ if (typeof FormData !== 'function') {
241
+ isSupported = false
242
+ }
243
+ return {
244
+ // 图片的mime
245
+ mime,
246
+ // 语言包
247
+ lang,
248
+ // 浏览器是否支持该控件
249
+ isSupported,
250
+ // 浏览器是否支持触屏事件
251
+ // eslint-disable-next-line no-prototype-builtins
252
+ isSupportTouch: document.hasOwnProperty('ontouchstart'),
253
+ // 步骤
254
+ step: 1, // 1选择文件 2剪裁 3上传
255
+ // 上传状态及进度
256
+ loading: 0, // 0未开始 1正在 2成功 3错误
257
+ progress: 0,
258
+ // 是否有错误及错误信息
259
+ hasError: false,
260
+ errorMsg: '',
261
+ // 需求图宽高比
262
+ ratio: width / height,
263
+ // 原图地址、生成图片地址
264
+ sourceImg: null,
265
+ sourceImgUrl: '',
266
+ createImgUrl: '',
267
+ // 原图片拖动事件初始值
268
+ sourceImgMouseDown: {
269
+ on: false,
270
+ mX: 0, // 鼠标按下的坐标
271
+ mY: 0,
272
+ x: 0, // scale原图坐标
273
+ y: 0
274
+ },
275
+ // 生成图片预览的容器大小
276
+ previewContainer: {
277
+ width: 100,
278
+ height: 100
279
+ },
280
+ // 原图容器宽高
281
+ sourceImgContainer: {
282
+ // sic
283
+ width: 240,
284
+ height: 184 // 如果生成图比例与此一致会出现bug,先改成特殊的格式吧,哈哈哈
285
+ },
286
+ // 原图展示属性
287
+ scale: {
288
+ zoomAddOn: false, // 按钮缩放事件开启
289
+ zoomSubOn: false, // 按钮缩放事件开启
290
+ range: 1, // 最大100
291
+ rotateLeft: false, // 按钮向左旋转事件开启
292
+ rotateRight: false, // 按钮向右旋转事件开启
293
+ degree: 0, // 旋转度数
294
+ x: 0,
295
+ y: 0,
296
+ width: 0,
297
+ height: 0,
298
+ maxWidth: 0,
299
+ maxHeight: 0,
300
+ minWidth: 0, // 最宽
301
+ minHeight: 0,
302
+ naturalWidth: 0, // 原宽
303
+ naturalHeight: 0
304
+ }
305
+ }
306
+ },
307
+ computed: {
308
+ // 进度条样式
309
+ progressStyle() {
310
+ const { progress } = this
311
+ return {
312
+ width: progress + '%'
313
+ }
314
+ },
315
+ // 原图样式
316
+ sourceImgStyle() {
317
+ const { scale, sourceImgMasking } = this
318
+ const top = scale.y + sourceImgMasking.y + 'px'
319
+ const left = scale.x + sourceImgMasking.x + 'px'
320
+ return {
321
+ top,
322
+ left,
323
+ width: scale.width + 'px',
324
+ height: scale.height + 'px',
325
+ transform: 'rotate(' + scale.degree + 'deg)', // 旋转时 左侧原始图旋转样式
326
+ '-ms-transform': 'rotate(' + scale.degree + 'deg)', // 兼容IE9
327
+ '-moz-transform': 'rotate(' + scale.degree + 'deg)', // 兼容FireFox
328
+ '-webkit-transform': 'rotate(' + scale.degree + 'deg)', // 兼容Safari 和 chrome
329
+ '-o-transform': 'rotate(' + scale.degree + 'deg)' // 兼容 Opera
330
+ }
331
+ },
332
+ // 原图蒙版属性
333
+ sourceImgMasking() {
334
+ const { width, height, ratio, sourceImgContainer } = this
335
+ const sic = sourceImgContainer
336
+ const sicRatio = sic.width / sic.height // 原图容器宽高比
337
+ let x = 0
338
+ let y = 0
339
+ let w = sic.width
340
+ let h = sic.height
341
+ let scale = 1
342
+ if (ratio < sicRatio) {
343
+ scale = sic.height / height
344
+ w = sic.height * ratio
345
+ x = (sic.width - w) / 2
346
+ }
347
+ if (ratio > sicRatio) {
348
+ scale = sic.width / width
349
+ h = sic.width / ratio
350
+ y = (sic.height - h) / 2
351
+ }
352
+ return {
353
+ scale, // 蒙版相对需求宽高的缩放
354
+ x,
355
+ y,
356
+ width: w,
357
+ height: h
358
+ }
359
+ },
360
+ // 原图遮罩样式
361
+ sourceImgShadeStyle() {
362
+ const { sourceImgMasking, sourceImgContainer } = this
363
+ const sic = sourceImgContainer
364
+ const sim = sourceImgMasking
365
+ const w =
366
+ sim.width === sic.width ? sim.width : (sic.width - sim.width) / 2
367
+ const h =
368
+ sim.height === sic.height ? sim.height : (sic.height - sim.height) / 2
369
+ return {
370
+ width: w + 'px',
371
+ height: h + 'px'
372
+ }
373
+ },
374
+ previewStyle() {
375
+ const { ratio, previewContainer } = this
376
+ const pc = previewContainer
377
+ let w = pc.width
378
+ let h = pc.height
379
+ const pcRatio = w / h
380
+ if (ratio < pcRatio) {
381
+ w = pc.height * ratio
382
+ }
383
+ if (ratio > pcRatio) {
384
+ h = pc.width / ratio
385
+ }
386
+ return {
387
+ width: w + 'px',
388
+ height: h + 'px'
389
+ }
390
+ }
391
+ },
392
+ watch: {
393
+ value(newValue) {
394
+ if (newValue && this.loading !== 1) {
395
+ this.reset()
396
+ }
397
+ }
398
+ },
399
+ created() {
400
+ // 绑定按键esc隐藏此插件事件
401
+ document.addEventListener('keyup', this.closeHandler)
402
+ },
403
+ destroyed() {
404
+ document.removeEventListener('keyup', this.closeHandler)
405
+ },
406
+ methods: {
407
+ // 点击波纹效果
408
+ ripple(e) {
409
+ effectRipple(e)
410
+ },
411
+ // 关闭控件
412
+ off() {
413
+ setTimeout(() => {
414
+ this.$emit('input', false)
415
+ this.$emit('close')
416
+ if (this.step === 3 && this.loading === 2) {
417
+ this.setStep(1)
418
+ }
419
+ }, 200)
420
+ },
421
+ // 设置步骤
422
+ setStep(no) {
423
+ // 延时是为了显示动画效果呢,哈哈哈
424
+ setTimeout(() => {
425
+ this.step = no
426
+ }, 200)
427
+ },
428
+ /* 图片选择区域函数绑定
429
+ ---------------------------------------------------------------*/
430
+ preventDefault(e) {
431
+ e.preventDefault()
432
+ return false
433
+ },
434
+ handleClick(e) {
435
+ if (this.loading !== 1) {
436
+ if (e.target !== this.$refs.fileinput) {
437
+ e.preventDefault()
438
+ if (document.activeElement !== this.$refs) {
439
+ this.$refs.fileinput.click()
440
+ }
441
+ }
442
+ }
443
+ },
444
+ handleChange(e) {
445
+ e.preventDefault()
446
+ if (this.loading !== 1) {
447
+ const files = e.target.files || e.dataTransfer.files
448
+ this.reset()
449
+ if (this.checkFile(files[0])) {
450
+ this.setSourceImg(files[0])
451
+ }
452
+ }
453
+ },
454
+ /* ---------------------------------------------------------------*/
455
+ // 检测选择的文件是否合适
456
+ checkFile(file) {
457
+ const { lang, maxSize } = this
458
+ // 仅限图片
459
+ if (file.type.indexOf('image') === -1) {
460
+ this.hasError = true
461
+ this.errorMsg = lang.error.onlyImg
462
+ return false
463
+ }
464
+ // 超出大小
465
+ if (file.size / 1024 > maxSize) {
466
+ this.hasError = true
467
+ this.errorMsg = lang.error.outOfSize + maxSize + 'kb'
468
+ return false
469
+ }
470
+ return true
471
+ },
472
+ // 重置控件
473
+ reset() {
474
+ this.loading = 0
475
+ this.hasError = false
476
+ this.errorMsg = ''
477
+ this.progress = 0
478
+ },
479
+ // 设置图片源
480
+ setSourceImg(file) {
481
+ const fr = new FileReader()
482
+ fr.onload = e => {
483
+ this.sourceImgUrl = fr.result
484
+ this.startCrop()
485
+ }
486
+ fr.readAsDataURL(file)
487
+ },
488
+ // 剪裁前准备工作
489
+ startCrop() {
490
+ const {
491
+ width,
492
+ height,
493
+ ratio,
494
+ scale,
495
+ sourceImgUrl,
496
+ sourceImgMasking,
497
+ lang
498
+ } = this
499
+ const sim = sourceImgMasking
500
+ const img = new Image()
501
+ img.src = sourceImgUrl
502
+ img.onload = () => {
503
+ const nWidth = img.naturalWidth
504
+ const nHeight = img.naturalHeight
505
+ const nRatio = nWidth / nHeight
506
+ let w = sim.width
507
+ let h = sim.height
508
+ let x = 0
509
+ let y = 0
510
+ // 图片像素不达标
511
+ if (nWidth < width || nHeight < height) {
512
+ this.hasError = true
513
+ this.errorMsg = lang.error.lowestPx + width + '*' + height
514
+ return false
515
+ }
516
+ if (ratio > nRatio) {
517
+ h = w / nRatio
518
+ y = (sim.height - h) / 2
519
+ }
520
+ if (ratio < nRatio) {
521
+ w = h * nRatio
522
+ x = (sim.width - w) / 2
523
+ }
524
+ scale.range = 0
525
+ scale.x = x
526
+ scale.y = y
527
+ scale.width = w
528
+ scale.height = h
529
+ scale.degree = 0
530
+ scale.minWidth = w
531
+ scale.minHeight = h
532
+ scale.maxWidth = nWidth * sim.scale
533
+ scale.maxHeight = nHeight * sim.scale
534
+ scale.naturalWidth = nWidth
535
+ scale.naturalHeight = nHeight
536
+ this.sourceImg = img
537
+ this.createImg()
538
+ this.setStep(2)
539
+ }
540
+ },
541
+ // 鼠标按下图片准备移动
542
+ imgStartMove(e) {
543
+ e.preventDefault()
544
+ // 支持触摸事件,则鼠标事件无效
545
+ if (this.isSupportTouch && !e.targetTouches) {
546
+ return false
547
+ }
548
+ const et = e.targetTouches ? e.targetTouches[0] : e
549
+ const { sourceImgMouseDown, scale } = this
550
+ const simd = sourceImgMouseDown
551
+ simd.mX = et.screenX
552
+ simd.mY = et.screenY
553
+ simd.x = scale.x
554
+ simd.y = scale.y
555
+ simd.on = true
556
+ },
557
+ // 鼠标按下状态下移动,图片移动
558
+ imgMove(e) {
559
+ e.preventDefault()
560
+ // 支持触摸事件,则鼠标事件无效
561
+ if (this.isSupportTouch && !e.targetTouches) {
562
+ return false
563
+ }
564
+ const et = e.targetTouches ? e.targetTouches[0] : e
565
+ const {
566
+ sourceImgMouseDown: { on, mX, mY, x, y },
567
+ scale,
568
+ sourceImgMasking
569
+ } = this
570
+ const sim = sourceImgMasking
571
+ const nX = et.screenX
572
+ const nY = et.screenY
573
+ const dX = nX - mX
574
+ const dY = nY - mY
575
+ let rX = x + dX
576
+ let rY = y + dY
577
+ if (!on) return
578
+ if (rX > 0) {
579
+ rX = 0
580
+ }
581
+ if (rY > 0) {
582
+ rY = 0
583
+ }
584
+ if (rX < sim.width - scale.width) {
585
+ rX = sim.width - scale.width
586
+ }
587
+ if (rY < sim.height - scale.height) {
588
+ rY = sim.height - scale.height
589
+ }
590
+ scale.x = rX
591
+ scale.y = rY
592
+ },
593
+ // 按钮按下开始向右旋转
594
+ startRotateRight(e) {
595
+ const { scale } = this
596
+ scale.rotateRight = true
597
+ const rotate = () => {
598
+ if (scale.rotateRight) {
599
+ const degree = ++scale.degree
600
+ this.createImg(degree)
601
+ setTimeout(function() {
602
+ rotate()
603
+ }, 60)
604
+ }
605
+ }
606
+ rotate()
607
+ },
608
+ // 按钮按下开始向左旋转
609
+ startRotateLeft(e) {
610
+ const { scale } = this
611
+ scale.rotateLeft = true
612
+ const rotate = () => {
613
+ if (scale.rotateLeft) {
614
+ const degree = --scale.degree
615
+ this.createImg(degree)
616
+ setTimeout(function() {
617
+ rotate()
618
+ }, 60)
619
+ }
620
+ }
621
+ rotate()
622
+ },
623
+ // 停止旋转
624
+ endRotate() {
625
+ const { scale } = this
626
+ scale.rotateLeft = false
627
+ scale.rotateRight = false
628
+ },
629
+ // 按钮按下开始放大
630
+ startZoomAdd(e) {
631
+ const { scale } = this
632
+ scale.zoomAddOn = true
633
+ const zoom = () => {
634
+ if (scale.zoomAddOn) {
635
+ const range = scale.range >= 100 ? 100 : ++scale.range
636
+ this.zoomImg(range)
637
+ setTimeout(function() {
638
+ zoom()
639
+ }, 60)
640
+ }
641
+ }
642
+ zoom()
643
+ },
644
+ // 按钮松开或移开取消放大
645
+ endZoomAdd(e) {
646
+ this.scale.zoomAddOn = false
647
+ },
648
+ // 按钮按下开始缩小
649
+ startZoomSub(e) {
650
+ const { scale } = this
651
+ scale.zoomSubOn = true
652
+ const zoom = () => {
653
+ if (scale.zoomSubOn) {
654
+ const range = scale.range <= 0 ? 0 : --scale.range
655
+ this.zoomImg(range)
656
+ setTimeout(function() {
657
+ zoom()
658
+ }, 60)
659
+ }
660
+ }
661
+ zoom()
662
+ },
663
+ // 按钮松开或移开取消缩小
664
+ endZoomSub(e) {
665
+ const { scale } = this
666
+ scale.zoomSubOn = false
667
+ },
668
+ zoomChange(e) {
669
+ this.zoomImg(e.target.value)
670
+ },
671
+ // 缩放原图
672
+ zoomImg(newRange) {
673
+ const { sourceImgMasking, scale } = this
674
+ const {
675
+ maxWidth,
676
+ maxHeight,
677
+ minWidth,
678
+ minHeight,
679
+ width,
680
+ height,
681
+ x,
682
+ y
683
+ } = scale
684
+ const sim = sourceImgMasking
685
+ // 蒙版宽高
686
+ const sWidth = sim.width
687
+ const sHeight = sim.height
688
+ // 新宽高
689
+ const nWidth = minWidth + ((maxWidth - minWidth) * newRange) / 100
690
+ const nHeight = minHeight + ((maxHeight - minHeight) * newRange) / 100
691
+ // 新坐标(根据蒙版中心点缩放)
692
+ let nX = sWidth / 2 - (nWidth / width) * (sWidth / 2 - x)
693
+ let nY = sHeight / 2 - (nHeight / height) * (sHeight / 2 - y)
694
+ // 判断新坐标是否超过蒙版限制
695
+ if (nX > 0) {
696
+ nX = 0
697
+ }
698
+ if (nY > 0) {
699
+ nY = 0
700
+ }
701
+ if (nX < sWidth - nWidth) {
702
+ nX = sWidth - nWidth
703
+ }
704
+ if (nY < sHeight - nHeight) {
705
+ nY = sHeight - nHeight
706
+ }
707
+ // 赋值处理
708
+ scale.x = nX
709
+ scale.y = nY
710
+ scale.width = nWidth
711
+ scale.height = nHeight
712
+ scale.range = newRange
713
+ setTimeout(() => {
714
+ if (scale.range === newRange) {
715
+ this.createImg()
716
+ }
717
+ }, 300)
718
+ },
719
+ // 生成需求图片
720
+ createImg(e) {
721
+ const {
722
+ mime,
723
+ sourceImg,
724
+ scale: { x, y, width, height, degree },
725
+ sourceImgMasking: { scale }
726
+ } = this
727
+ const canvas = this.$refs.canvas
728
+ const ctx = canvas.getContext('2d')
729
+ if (e) {
730
+ // 取消鼠标按下移动状态
731
+ this.sourceImgMouseDown.on = false
732
+ }
733
+ canvas.width = this.width
734
+ canvas.height = this.height
735
+ ctx.clearRect(0, 0, this.width, this.height)
736
+ // 将透明区域设置为白色底边
737
+ ctx.fillStyle = '#fff'
738
+ ctx.fillRect(0, 0, this.width, this.height)
739
+ ctx.translate(this.width * 0.5, this.height * 0.5)
740
+ ctx.rotate((Math.PI * degree) / 180)
741
+ ctx.translate(-this.width * 0.5, -this.height * 0.5)
742
+ ctx.drawImage(
743
+ sourceImg,
744
+ x / scale,
745
+ y / scale,
746
+ width / scale,
747
+ height / scale
748
+ )
749
+ this.createImgUrl = canvas.toDataURL(mime)
750
+ },
751
+ prepareUpload() {
752
+ const { url, createImgUrl, field, ki } = this
753
+ this.$emit('crop-success', createImgUrl, field, ki)
754
+ if (typeof url === 'string' && url) {
755
+ this.upload()
756
+ } else {
757
+ this.off()
758
+ }
759
+ },
760
+ // 上传图片
761
+ upload() {
762
+ const {
763
+ lang,
764
+ imgFormat,
765
+ mime,
766
+ url,
767
+ params,
768
+ field,
769
+ ki,
770
+ createImgUrl
771
+ } = this
772
+ const fmData = new FormData()
773
+ fmData.append(
774
+ field,
775
+ data2blob(createImgUrl, mime),
776
+ field + '.' + imgFormat
777
+ )
778
+ // 添加其他参数
779
+ if (typeof params === 'object' && params) {
780
+ Object.keys(params).forEach(k => {
781
+ fmData.append(k, params[k])
782
+ })
783
+ }
784
+ // 监听进度回调
785
+ // const uploadProgress = (event) => {
786
+ // if (event.lengthComputable) {
787
+ // this.progress = 100 * Math.round(event.loaded) / event.total
788
+ // }
789
+ // }
790
+ // 上传文件
791
+ this.reset()
792
+ this.loading = 1
793
+ this.setStep(3)
794
+ request({
795
+ url,
796
+ method: 'post',
797
+ data: fmData
798
+ })
799
+ .then(resData => {
800
+ this.loading = 2
801
+ this.$emit('crop-upload-success', resData.data)
802
+ })
803
+ .catch(err => {
804
+ if (this.value) {
805
+ this.loading = 3
806
+ this.hasError = true
807
+ this.errorMsg = lang.fail
808
+ this.$emit('crop-upload-fail', err, field, ki)
809
+ }
810
+ })
811
+ },
812
+ closeHandler(e) {
813
+ if (this.value && (e.key === 'Escape' || e.keyCode === 27)) {
814
+ this.off()
815
+ }
816
+ }
817
+ }
818
+ }
819
+ </script>
820
+
821
+ <style lang="scss">
822
+ @charset "UTF-8";
823
+ @-webkit-keyframes vicp_progress {
824
+ 0% {
825
+ background-position-y: 0;
826
+ }
827
+ 100% {
828
+ background-position-y: 40px;
829
+ }
830
+ }
831
+ @keyframes vicp_progress {
832
+ 0% {
833
+ background-position-y: 0;
834
+ }
835
+ 100% {
836
+ background-position-y: 40px;
837
+ }
838
+ }
839
+ @-webkit-keyframes vicp {
840
+ 0% {
841
+ opacity: 0;
842
+ -webkit-transform: scale(0) translatey(-60px);
843
+ transform: scale(0) translatey(-60px);
844
+ }
845
+ 100% {
846
+ opacity: 1;
847
+ -webkit-transform: scale(1) translatey(0);
848
+ transform: scale(1) translatey(0);
849
+ }
850
+ }
851
+ @keyframes vicp {
852
+ 0% {
853
+ opacity: 0;
854
+ -webkit-transform: scale(0) translatey(-60px);
855
+ transform: scale(0) translatey(-60px);
856
+ }
857
+ 100% {
858
+ opacity: 1;
859
+ -webkit-transform: scale(1) translatey(0);
860
+ transform: scale(1) translatey(0);
861
+ }
862
+ }
863
+ .vue-image-crop-upload {
864
+ position: fixed;
865
+ display: block;
866
+ -webkit-box-sizing: border-box;
867
+ box-sizing: border-box;
868
+ z-index: 10000;
869
+ top: 0;
870
+ bottom: 0;
871
+ left: 0;
872
+ right: 0;
873
+ width: 100%;
874
+ height: 100%;
875
+ background-color: rgba(0, 0, 0, 0.65);
876
+ -webkit-tap-highlight-color: transparent;
877
+ -moz-tap-highlight-color: transparent;
878
+ }
879
+ .vue-image-crop-upload .vicp-wrap {
880
+ -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);
881
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);
882
+ position: fixed;
883
+ display: block;
884
+ -webkit-box-sizing: border-box;
885
+ box-sizing: border-box;
886
+ z-index: 10000;
887
+ top: 0;
888
+ bottom: 0;
889
+ left: 0;
890
+ right: 0;
891
+ margin: auto;
892
+ width: 600px;
893
+ height: 330px;
894
+ padding: 25px;
895
+ background-color: #fff;
896
+ border-radius: 2px;
897
+ -webkit-animation: vicp 0.12s ease-in;
898
+ animation: vicp 0.12s ease-in;
899
+ }
900
+ .vue-image-crop-upload .vicp-wrap .vicp-close {
901
+ position: absolute;
902
+ right: -30px;
903
+ top: -30px;
904
+ }
905
+ .vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4 {
906
+ position: relative;
907
+ display: block;
908
+ width: 30px;
909
+ height: 30px;
910
+ cursor: pointer;
911
+ -webkit-transition: -webkit-transform 0.18s;
912
+ transition: -webkit-transform 0.18s;
913
+ transition: transform 0.18s;
914
+ transition: transform 0.18s, -webkit-transform 0.18s;
915
+ -webkit-transform: rotate(0);
916
+ -ms-transform: rotate(0);
917
+ transform: rotate(0);
918
+ }
919
+ .vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4::after,
920
+ .vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4::before {
921
+ -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);
922
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);
923
+ content: "";
924
+ position: absolute;
925
+ top: 12px;
926
+ left: 4px;
927
+ width: 20px;
928
+ height: 3px;
929
+ -webkit-transform: rotate(45deg);
930
+ -ms-transform: rotate(45deg);
931
+ transform: rotate(45deg);
932
+ background-color: #fff;
933
+ }
934
+ .vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4::after {
935
+ -webkit-transform: rotate(-45deg);
936
+ -ms-transform: rotate(-45deg);
937
+ transform: rotate(-45deg);
938
+ }
939
+ .vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4:hover {
940
+ -webkit-transform: rotate(90deg);
941
+ -ms-transform: rotate(90deg);
942
+ transform: rotate(90deg);
943
+ }
944
+ .vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area {
945
+ position: relative;
946
+ -webkit-box-sizing: border-box;
947
+ box-sizing: border-box;
948
+ padding: 35px;
949
+ height: 170px;
950
+ background-color: rgba(0, 0, 0, 0.03);
951
+ text-align: center;
952
+ border: 1px dashed rgba(0, 0, 0, 0.08);
953
+ overflow: hidden;
954
+ }
955
+ .vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area .vicp-icon1 {
956
+ display: block;
957
+ margin: 0 auto 6px;
958
+ width: 42px;
959
+ height: 42px;
960
+ overflow: hidden;
961
+ }
962
+ .vue-image-crop-upload
963
+ .vicp-wrap
964
+ .vicp-step1
965
+ .vicp-drop-area
966
+ .vicp-icon1
967
+ .vicp-icon1-arrow {
968
+ display: block;
969
+ margin: 0 auto;
970
+ width: 0;
971
+ height: 0;
972
+ border-bottom: 14.7px solid rgba(0, 0, 0, 0.3);
973
+ border-left: 14.7px solid transparent;
974
+ border-right: 14.7px solid transparent;
975
+ }
976
+ .vue-image-crop-upload
977
+ .vicp-wrap
978
+ .vicp-step1
979
+ .vicp-drop-area
980
+ .vicp-icon1
981
+ .vicp-icon1-body {
982
+ display: block;
983
+ width: 12.6px;
984
+ height: 14.7px;
985
+ margin: 0 auto;
986
+ background-color: rgba(0, 0, 0, 0.3);
987
+ }
988
+ .vue-image-crop-upload
989
+ .vicp-wrap
990
+ .vicp-step1
991
+ .vicp-drop-area
992
+ .vicp-icon1
993
+ .vicp-icon1-bottom {
994
+ -webkit-box-sizing: border-box;
995
+ box-sizing: border-box;
996
+ display: block;
997
+ height: 12.6px;
998
+ border: 6px solid rgba(0, 0, 0, 0.3);
999
+ border-top: none;
1000
+ }
1001
+ .vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area .vicp-hint {
1002
+ display: block;
1003
+ padding: 15px;
1004
+ font-size: 14px;
1005
+ color: #666;
1006
+ line-height: 30px;
1007
+ }
1008
+ .vue-image-crop-upload
1009
+ .vicp-wrap
1010
+ .vicp-step1
1011
+ .vicp-drop-area
1012
+ .vicp-no-supported-hint {
1013
+ display: block;
1014
+ position: absolute;
1015
+ top: 0;
1016
+ left: 0;
1017
+ padding: 30px;
1018
+ width: 100%;
1019
+ height: 60px;
1020
+ line-height: 30px;
1021
+ background-color: #eee;
1022
+ text-align: center;
1023
+ color: #666;
1024
+ font-size: 14px;
1025
+ }
1026
+ .vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area:hover {
1027
+ cursor: pointer;
1028
+ border-color: rgba(0, 0, 0, 0.1);
1029
+ background-color: rgba(0, 0, 0, 0.05);
1030
+ }
1031
+ .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop {
1032
+ overflow: hidden;
1033
+ }
1034
+ .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left {
1035
+ float: left;
1036
+ }
1037
+ .vue-image-crop-upload
1038
+ .vicp-wrap
1039
+ .vicp-step2
1040
+ .vicp-crop
1041
+ .vicp-crop-left
1042
+ .vicp-img-container {
1043
+ position: relative;
1044
+ display: block;
1045
+ width: 240px;
1046
+ height: 180px;
1047
+ background-color: #e5e5e0;
1048
+ overflow: hidden;
1049
+ }
1050
+ .vue-image-crop-upload
1051
+ .vicp-wrap
1052
+ .vicp-step2
1053
+ .vicp-crop
1054
+ .vicp-crop-left
1055
+ .vicp-img-container
1056
+ .vicp-img {
1057
+ position: absolute;
1058
+ display: block;
1059
+ cursor: move;
1060
+ -webkit-user-select: none;
1061
+ -moz-user-select: none;
1062
+ -ms-user-select: none;
1063
+ user-select: none;
1064
+ }
1065
+ .vue-image-crop-upload
1066
+ .vicp-wrap
1067
+ .vicp-step2
1068
+ .vicp-crop
1069
+ .vicp-crop-left
1070
+ .vicp-img-container
1071
+ .vicp-img-shade {
1072
+ -webkit-box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);
1073
+ box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);
1074
+ position: absolute;
1075
+ background-color: rgba(241, 242, 243, 0.8);
1076
+ }
1077
+ .vue-image-crop-upload
1078
+ .vicp-wrap
1079
+ .vicp-step2
1080
+ .vicp-crop
1081
+ .vicp-crop-left
1082
+ .vicp-img-container
1083
+ .vicp-img-shade.vicp-img-shade-1 {
1084
+ top: 0;
1085
+ left: 0;
1086
+ }
1087
+ .vue-image-crop-upload
1088
+ .vicp-wrap
1089
+ .vicp-step2
1090
+ .vicp-crop
1091
+ .vicp-crop-left
1092
+ .vicp-img-container
1093
+ .vicp-img-shade.vicp-img-shade-2 {
1094
+ bottom: 0;
1095
+ right: 0;
1096
+ }
1097
+ .vue-image-crop-upload
1098
+ .vicp-wrap
1099
+ .vicp-step2
1100
+ .vicp-crop
1101
+ .vicp-crop-left
1102
+ .vicp-rotate {
1103
+ position: relative;
1104
+ width: 240px;
1105
+ height: 18px;
1106
+ }
1107
+ .vue-image-crop-upload
1108
+ .vicp-wrap
1109
+ .vicp-step2
1110
+ .vicp-crop
1111
+ .vicp-crop-left
1112
+ .vicp-rotate
1113
+ i {
1114
+ display: block;
1115
+ width: 18px;
1116
+ height: 18px;
1117
+ border-radius: 100%;
1118
+ line-height: 18px;
1119
+ text-align: center;
1120
+ font-size: 12px;
1121
+ font-weight: bold;
1122
+ background-color: rgba(0, 0, 0, 0.08);
1123
+ color: #fff;
1124
+ overflow: hidden;
1125
+ }
1126
+ .vue-image-crop-upload
1127
+ .vicp-wrap
1128
+ .vicp-step2
1129
+ .vicp-crop
1130
+ .vicp-crop-left
1131
+ .vicp-rotate
1132
+ i:hover {
1133
+ -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);
1134
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);
1135
+ cursor: pointer;
1136
+ background-color: rgba(0, 0, 0, 0.14);
1137
+ }
1138
+ .vue-image-crop-upload
1139
+ .vicp-wrap
1140
+ .vicp-step2
1141
+ .vicp-crop
1142
+ .vicp-crop-left
1143
+ .vicp-rotate
1144
+ i:first-child {
1145
+ float: left;
1146
+ }
1147
+ .vue-image-crop-upload
1148
+ .vicp-wrap
1149
+ .vicp-step2
1150
+ .vicp-crop
1151
+ .vicp-crop-left
1152
+ .vicp-rotate
1153
+ i:last-child {
1154
+ float: right;
1155
+ }
1156
+ .vue-image-crop-upload
1157
+ .vicp-wrap
1158
+ .vicp-step2
1159
+ .vicp-crop
1160
+ .vicp-crop-left
1161
+ .vicp-range {
1162
+ position: relative;
1163
+ margin: 30px 0 10px 0;
1164
+ width: 240px;
1165
+ height: 18px;
1166
+ }
1167
+ .vue-image-crop-upload
1168
+ .vicp-wrap
1169
+ .vicp-step2
1170
+ .vicp-crop
1171
+ .vicp-crop-left
1172
+ .vicp-range
1173
+ .vicp-icon5,
1174
+ .vue-image-crop-upload
1175
+ .vicp-wrap
1176
+ .vicp-step2
1177
+ .vicp-crop
1178
+ .vicp-crop-left
1179
+ .vicp-range
1180
+ .vicp-icon6 {
1181
+ position: absolute;
1182
+ top: 0;
1183
+ width: 18px;
1184
+ height: 18px;
1185
+ border-radius: 100%;
1186
+ background-color: rgba(0, 0, 0, 0.08);
1187
+ }
1188
+ .vue-image-crop-upload
1189
+ .vicp-wrap
1190
+ .vicp-step2
1191
+ .vicp-crop
1192
+ .vicp-crop-left
1193
+ .vicp-range
1194
+ .vicp-icon5:hover,
1195
+ .vue-image-crop-upload
1196
+ .vicp-wrap
1197
+ .vicp-step2
1198
+ .vicp-crop
1199
+ .vicp-crop-left
1200
+ .vicp-range
1201
+ .vicp-icon6:hover {
1202
+ -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);
1203
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);
1204
+ cursor: pointer;
1205
+ background-color: rgba(0, 0, 0, 0.14);
1206
+ }
1207
+ .vue-image-crop-upload
1208
+ .vicp-wrap
1209
+ .vicp-step2
1210
+ .vicp-crop
1211
+ .vicp-crop-left
1212
+ .vicp-range
1213
+ .vicp-icon5 {
1214
+ left: 0;
1215
+ }
1216
+ .vue-image-crop-upload
1217
+ .vicp-wrap
1218
+ .vicp-step2
1219
+ .vicp-crop
1220
+ .vicp-crop-left
1221
+ .vicp-range
1222
+ .vicp-icon5::before {
1223
+ position: absolute;
1224
+ content: "";
1225
+ display: block;
1226
+ left: 3px;
1227
+ top: 8px;
1228
+ width: 12px;
1229
+ height: 2px;
1230
+ background-color: #fff;
1231
+ }
1232
+ .vue-image-crop-upload
1233
+ .vicp-wrap
1234
+ .vicp-step2
1235
+ .vicp-crop
1236
+ .vicp-crop-left
1237
+ .vicp-range
1238
+ .vicp-icon6 {
1239
+ right: 0;
1240
+ }
1241
+ .vue-image-crop-upload
1242
+ .vicp-wrap
1243
+ .vicp-step2
1244
+ .vicp-crop
1245
+ .vicp-crop-left
1246
+ .vicp-range
1247
+ .vicp-icon6::before {
1248
+ position: absolute;
1249
+ content: "";
1250
+ display: block;
1251
+ left: 3px;
1252
+ top: 8px;
1253
+ width: 12px;
1254
+ height: 2px;
1255
+ background-color: #fff;
1256
+ }
1257
+ .vue-image-crop-upload
1258
+ .vicp-wrap
1259
+ .vicp-step2
1260
+ .vicp-crop
1261
+ .vicp-crop-left
1262
+ .vicp-range
1263
+ .vicp-icon6::after {
1264
+ position: absolute;
1265
+ content: "";
1266
+ display: block;
1267
+ top: 3px;
1268
+ left: 8px;
1269
+ width: 2px;
1270
+ height: 12px;
1271
+ background-color: #fff;
1272
+ }
1273
+ .vue-image-crop-upload
1274
+ .vicp-wrap
1275
+ .vicp-step2
1276
+ .vicp-crop
1277
+ .vicp-crop-left
1278
+ .vicp-range
1279
+ input[type="range"] {
1280
+ display: block;
1281
+ padding-top: 5px;
1282
+ margin: 0 auto;
1283
+ width: 180px;
1284
+ height: 8px;
1285
+ vertical-align: top;
1286
+ background: transparent;
1287
+ -webkit-appearance: none;
1288
+ -moz-appearance: none;
1289
+ appearance: none;
1290
+ cursor: pointer;
1291
+ /* 滑块
1292
+ ---------------------------------------------------------------*/
1293
+ /* 轨道
1294
+ ---------------------------------------------------------------*/
1295
+ }
1296
+ .vue-image-crop-upload
1297
+ .vicp-wrap
1298
+ .vicp-step2
1299
+ .vicp-crop
1300
+ .vicp-crop-left
1301
+ .vicp-range
1302
+ input[type="range"]:focus {
1303
+ outline: none;
1304
+ }
1305
+ .vue-image-crop-upload
1306
+ .vicp-wrap
1307
+ .vicp-step2
1308
+ .vicp-crop
1309
+ .vicp-crop-left
1310
+ .vicp-range
1311
+ input[type="range"]::-webkit-slider-thumb {
1312
+ -webkit-box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);
1313
+ box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);
1314
+ -webkit-appearance: none;
1315
+ appearance: none;
1316
+ margin-top: -3px;
1317
+ width: 12px;
1318
+ height: 12px;
1319
+ background-color: #61c091;
1320
+ border-radius: 100%;
1321
+ border: none;
1322
+ -webkit-transition: 0.2s;
1323
+ transition: 0.2s;
1324
+ }
1325
+ .vue-image-crop-upload
1326
+ .vicp-wrap
1327
+ .vicp-step2
1328
+ .vicp-crop
1329
+ .vicp-crop-left
1330
+ .vicp-range
1331
+ input[type="range"]::-moz-range-thumb {
1332
+ box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);
1333
+ -moz-appearance: none;
1334
+ appearance: none;
1335
+ width: 12px;
1336
+ height: 12px;
1337
+ background-color: #61c091;
1338
+ border-radius: 100%;
1339
+ border: none;
1340
+ -webkit-transition: 0.2s;
1341
+ transition: 0.2s;
1342
+ }
1343
+ .vue-image-crop-upload
1344
+ .vicp-wrap
1345
+ .vicp-step2
1346
+ .vicp-crop
1347
+ .vicp-crop-left
1348
+ .vicp-range
1349
+ input[type="range"]::-ms-thumb {
1350
+ box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);
1351
+ appearance: none;
1352
+ width: 12px;
1353
+ height: 12px;
1354
+ background-color: #61c091;
1355
+ border: none;
1356
+ border-radius: 100%;
1357
+ -webkit-transition: 0.2s;
1358
+ transition: 0.2s;
1359
+ }
1360
+ .vue-image-crop-upload
1361
+ .vicp-wrap
1362
+ .vicp-step2
1363
+ .vicp-crop
1364
+ .vicp-crop-left
1365
+ .vicp-range
1366
+ input[type="range"]:active::-moz-range-thumb {
1367
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);
1368
+ width: 14px;
1369
+ height: 14px;
1370
+ }
1371
+ .vue-image-crop-upload
1372
+ .vicp-wrap
1373
+ .vicp-step2
1374
+ .vicp-crop
1375
+ .vicp-crop-left
1376
+ .vicp-range
1377
+ input[type="range"]:active::-ms-thumb {
1378
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);
1379
+ width: 14px;
1380
+ height: 14px;
1381
+ }
1382
+ .vue-image-crop-upload
1383
+ .vicp-wrap
1384
+ .vicp-step2
1385
+ .vicp-crop
1386
+ .vicp-crop-left
1387
+ .vicp-range
1388
+ input[type="range"]:active::-webkit-slider-thumb {
1389
+ -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);
1390
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);
1391
+ margin-top: -4px;
1392
+ width: 14px;
1393
+ height: 14px;
1394
+ }
1395
+ .vue-image-crop-upload
1396
+ .vicp-wrap
1397
+ .vicp-step2
1398
+ .vicp-crop
1399
+ .vicp-crop-left
1400
+ .vicp-range
1401
+ input[type="range"]::-webkit-slider-runnable-track {
1402
+ -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);
1403
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);
1404
+ width: 100%;
1405
+ height: 6px;
1406
+ cursor: pointer;
1407
+ border-radius: 2px;
1408
+ border: none;
1409
+ background-color: rgba(68, 170, 119, 0.3);
1410
+ }
1411
+ .vue-image-crop-upload
1412
+ .vicp-wrap
1413
+ .vicp-step2
1414
+ .vicp-crop
1415
+ .vicp-crop-left
1416
+ .vicp-range
1417
+ input[type="range"]::-moz-range-track {
1418
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);
1419
+ width: 100%;
1420
+ height: 6px;
1421
+ cursor: pointer;
1422
+ border-radius: 2px;
1423
+ border: none;
1424
+ background-color: rgba(68, 170, 119, 0.3);
1425
+ }
1426
+ .vue-image-crop-upload
1427
+ .vicp-wrap
1428
+ .vicp-step2
1429
+ .vicp-crop
1430
+ .vicp-crop-left
1431
+ .vicp-range
1432
+ input[type="range"]::-ms-track {
1433
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);
1434
+ width: 100%;
1435
+ cursor: pointer;
1436
+ background: transparent;
1437
+ border-color: transparent;
1438
+ color: transparent;
1439
+ height: 6px;
1440
+ border-radius: 2px;
1441
+ border: none;
1442
+ }
1443
+ .vue-image-crop-upload
1444
+ .vicp-wrap
1445
+ .vicp-step2
1446
+ .vicp-crop
1447
+ .vicp-crop-left
1448
+ .vicp-range
1449
+ input[type="range"]::-ms-fill-lower {
1450
+ background-color: rgba(68, 170, 119, 0.3);
1451
+ }
1452
+ .vue-image-crop-upload
1453
+ .vicp-wrap
1454
+ .vicp-step2
1455
+ .vicp-crop
1456
+ .vicp-crop-left
1457
+ .vicp-range
1458
+ input[type="range"]::-ms-fill-upper {
1459
+ background-color: rgba(68, 170, 119, 0.15);
1460
+ }
1461
+ .vue-image-crop-upload
1462
+ .vicp-wrap
1463
+ .vicp-step2
1464
+ .vicp-crop
1465
+ .vicp-crop-left
1466
+ .vicp-range
1467
+ input[type="range"]:focus::-webkit-slider-runnable-track {
1468
+ background-color: rgba(68, 170, 119, 0.5);
1469
+ }
1470
+ .vue-image-crop-upload
1471
+ .vicp-wrap
1472
+ .vicp-step2
1473
+ .vicp-crop
1474
+ .vicp-crop-left
1475
+ .vicp-range
1476
+ input[type="range"]:focus::-moz-range-track {
1477
+ background-color: rgba(68, 170, 119, 0.5);
1478
+ }
1479
+ .vue-image-crop-upload
1480
+ .vicp-wrap
1481
+ .vicp-step2
1482
+ .vicp-crop
1483
+ .vicp-crop-left
1484
+ .vicp-range
1485
+ input[type="range"]:focus::-ms-fill-lower {
1486
+ background-color: rgba(68, 170, 119, 0.45);
1487
+ }
1488
+ .vue-image-crop-upload
1489
+ .vicp-wrap
1490
+ .vicp-step2
1491
+ .vicp-crop
1492
+ .vicp-crop-left
1493
+ .vicp-range
1494
+ input[type="range"]:focus::-ms-fill-upper {
1495
+ background-color: rgba(68, 170, 119, 0.25);
1496
+ }
1497
+ .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-right {
1498
+ float: right;
1499
+ }
1500
+ .vue-image-crop-upload
1501
+ .vicp-wrap
1502
+ .vicp-step2
1503
+ .vicp-crop
1504
+ .vicp-crop-right
1505
+ .vicp-preview {
1506
+ height: 150px;
1507
+ overflow: hidden;
1508
+ }
1509
+ .vue-image-crop-upload
1510
+ .vicp-wrap
1511
+ .vicp-step2
1512
+ .vicp-crop
1513
+ .vicp-crop-right
1514
+ .vicp-preview
1515
+ .vicp-preview-item {
1516
+ position: relative;
1517
+ padding: 5px;
1518
+ width: 100px;
1519
+ height: 100px;
1520
+ float: left;
1521
+ margin-right: 16px;
1522
+ }
1523
+ .vue-image-crop-upload
1524
+ .vicp-wrap
1525
+ .vicp-step2
1526
+ .vicp-crop
1527
+ .vicp-crop-right
1528
+ .vicp-preview
1529
+ .vicp-preview-item
1530
+ span {
1531
+ position: absolute;
1532
+ bottom: -30px;
1533
+ width: 100%;
1534
+ font-size: 14px;
1535
+ color: #bbb;
1536
+ display: block;
1537
+ text-align: center;
1538
+ }
1539
+ .vue-image-crop-upload
1540
+ .vicp-wrap
1541
+ .vicp-step2
1542
+ .vicp-crop
1543
+ .vicp-crop-right
1544
+ .vicp-preview
1545
+ .vicp-preview-item
1546
+ img {
1547
+ position: absolute;
1548
+ display: block;
1549
+ top: 0;
1550
+ bottom: 0;
1551
+ left: 0;
1552
+ right: 0;
1553
+ margin: auto;
1554
+ padding: 3px;
1555
+ background-color: #fff;
1556
+ border: 1px solid rgba(0, 0, 0, 0.15);
1557
+ overflow: hidden;
1558
+ -webkit-user-select: none;
1559
+ -moz-user-select: none;
1560
+ -ms-user-select: none;
1561
+ user-select: none;
1562
+ }
1563
+ .vue-image-crop-upload
1564
+ .vicp-wrap
1565
+ .vicp-step2
1566
+ .vicp-crop
1567
+ .vicp-crop-right
1568
+ .vicp-preview
1569
+ .vicp-preview-item.vicp-preview-item-circle {
1570
+ margin-right: 0;
1571
+ }
1572
+ .vue-image-crop-upload
1573
+ .vicp-wrap
1574
+ .vicp-step2
1575
+ .vicp-crop
1576
+ .vicp-crop-right
1577
+ .vicp-preview
1578
+ .vicp-preview-item.vicp-preview-item-circle
1579
+ img {
1580
+ border-radius: 100%;
1581
+ }
1582
+ .vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload {
1583
+ position: relative;
1584
+ -webkit-box-sizing: border-box;
1585
+ box-sizing: border-box;
1586
+ padding: 35px;
1587
+ height: 170px;
1588
+ background-color: rgba(0, 0, 0, 0.03);
1589
+ text-align: center;
1590
+ border: 1px dashed #ddd;
1591
+ }
1592
+ .vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload .vicp-loading {
1593
+ display: block;
1594
+ padding: 15px;
1595
+ font-size: 16px;
1596
+ color: #999;
1597
+ line-height: 30px;
1598
+ }
1599
+ .vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload .vicp-progress-wrap {
1600
+ margin-top: 12px;
1601
+ background-color: rgba(0, 0, 0, 0.08);
1602
+ border-radius: 3px;
1603
+ }
1604
+ .vue-image-crop-upload
1605
+ .vicp-wrap
1606
+ .vicp-step3
1607
+ .vicp-upload
1608
+ .vicp-progress-wrap
1609
+ .vicp-progress {
1610
+ position: relative;
1611
+ display: block;
1612
+ height: 5px;
1613
+ border-radius: 3px;
1614
+ background-color: #4a7;
1615
+ -webkit-box-shadow: 0 2px 6px 0 rgba(68, 170, 119, 0.3);
1616
+ box-shadow: 0 2px 6px 0 rgba(68, 170, 119, 0.3);
1617
+ -webkit-transition: width 0.15s linear;
1618
+ transition: width 0.15s linear;
1619
+ background-image: -webkit-linear-gradient(
1620
+ 135deg,
1621
+ rgba(255, 255, 255, 0.2) 25%,
1622
+ transparent 25%,
1623
+ transparent 50%,
1624
+ rgba(255, 255, 255, 0.2) 50%,
1625
+ rgba(255, 255, 255, 0.2) 75%,
1626
+ transparent 75%,
1627
+ transparent
1628
+ );
1629
+ background-image: linear-gradient(
1630
+ -45deg,
1631
+ rgba(255, 255, 255, 0.2) 25%,
1632
+ transparent 25%,
1633
+ transparent 50%,
1634
+ rgba(255, 255, 255, 0.2) 50%,
1635
+ rgba(255, 255, 255, 0.2) 75%,
1636
+ transparent 75%,
1637
+ transparent
1638
+ );
1639
+ background-size: 40px 40px;
1640
+ -webkit-animation: vicp_progress 0.5s linear infinite;
1641
+ animation: vicp_progress 0.5s linear infinite;
1642
+ }
1643
+ .vue-image-crop-upload
1644
+ .vicp-wrap
1645
+ .vicp-step3
1646
+ .vicp-upload
1647
+ .vicp-progress-wrap
1648
+ .vicp-progress::after {
1649
+ content: "";
1650
+ position: absolute;
1651
+ display: block;
1652
+ top: -3px;
1653
+ right: -3px;
1654
+ width: 9px;
1655
+ height: 9px;
1656
+ border: 1px solid rgba(245, 246, 247, 0.7);
1657
+ -webkit-box-shadow: 0 1px 4px 0 rgba(68, 170, 119, 0.7);
1658
+ box-shadow: 0 1px 4px 0 rgba(68, 170, 119, 0.7);
1659
+ border-radius: 100%;
1660
+ background-color: #4a7;
1661
+ }
1662
+ .vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload .vicp-error,
1663
+ .vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload .vicp-success {
1664
+ height: 100px;
1665
+ line-height: 100px;
1666
+ }
1667
+ .vue-image-crop-upload .vicp-wrap .vicp-operate {
1668
+ position: absolute;
1669
+ right: 20px;
1670
+ bottom: 20px;
1671
+ }
1672
+ .vue-image-crop-upload .vicp-wrap .vicp-operate a {
1673
+ position: relative;
1674
+ float: left;
1675
+ display: block;
1676
+ margin-left: 10px;
1677
+ width: 100px;
1678
+ height: 36px;
1679
+ line-height: 36px;
1680
+ text-align: center;
1681
+ cursor: pointer;
1682
+ font-size: 14px;
1683
+ color: #4a7;
1684
+ border-radius: 2px;
1685
+ overflow: hidden;
1686
+ -webkit-user-select: none;
1687
+ -moz-user-select: none;
1688
+ -ms-user-select: none;
1689
+ user-select: none;
1690
+ }
1691
+ .vue-image-crop-upload .vicp-wrap .vicp-operate a:hover {
1692
+ background-color: rgba(0, 0, 0, 0.03);
1693
+ }
1694
+ .vue-image-crop-upload .vicp-wrap .vicp-error,
1695
+ .vue-image-crop-upload .vicp-wrap .vicp-success {
1696
+ display: block;
1697
+ font-size: 14px;
1698
+ line-height: 24px;
1699
+ height: 24px;
1700
+ color: #d10;
1701
+ text-align: center;
1702
+ vertical-align: top;
1703
+ }
1704
+ .vue-image-crop-upload .vicp-wrap .vicp-success {
1705
+ color: #4a7;
1706
+ }
1707
+ .vue-image-crop-upload .vicp-wrap .vicp-icon3 {
1708
+ position: relative;
1709
+ display: inline-block;
1710
+ width: 20px;
1711
+ height: 20px;
1712
+ top: 4px;
1713
+ }
1714
+ .vue-image-crop-upload .vicp-wrap .vicp-icon3::after {
1715
+ position: absolute;
1716
+ top: 3px;
1717
+ left: 6px;
1718
+ width: 6px;
1719
+ height: 10px;
1720
+ border-width: 0 2px 2px 0;
1721
+ border-color: #4a7;
1722
+ border-style: solid;
1723
+ -webkit-transform: rotate(45deg);
1724
+ -ms-transform: rotate(45deg);
1725
+ transform: rotate(45deg);
1726
+ content: "";
1727
+ }
1728
+ .vue-image-crop-upload .vicp-wrap .vicp-icon2 {
1729
+ position: relative;
1730
+ display: inline-block;
1731
+ width: 20px;
1732
+ height: 20px;
1733
+ top: 4px;
1734
+ }
1735
+ .vue-image-crop-upload .vicp-wrap .vicp-icon2::after,
1736
+ .vue-image-crop-upload .vicp-wrap .vicp-icon2::before {
1737
+ content: "";
1738
+ position: absolute;
1739
+ top: 9px;
1740
+ left: 4px;
1741
+ width: 13px;
1742
+ height: 2px;
1743
+ background-color: #d10;
1744
+ -webkit-transform: rotate(45deg);
1745
+ -ms-transform: rotate(45deg);
1746
+ transform: rotate(45deg);
1747
+ }
1748
+ .vue-image-crop-upload .vicp-wrap .vicp-icon2::after {
1749
+ -webkit-transform: rotate(-45deg);
1750
+ -ms-transform: rotate(-45deg);
1751
+ transform: rotate(-45deg);
1752
+ }
1753
+ .e-ripple {
1754
+ position: absolute;
1755
+ border-radius: 100%;
1756
+ background-color: rgba(0, 0, 0, 0.15);
1757
+ background-clip: padding-box;
1758
+ pointer-events: none;
1759
+ -webkit-user-select: none;
1760
+ -moz-user-select: none;
1761
+ -ms-user-select: none;
1762
+ user-select: none;
1763
+ -webkit-transform: scale(0);
1764
+ -ms-transform: scale(0);
1765
+ transform: scale(0);
1766
+ opacity: 1;
1767
+ }
1768
+ .e-ripple.z-active {
1769
+ opacity: 0;
1770
+ -webkit-transform: scale(2);
1771
+ -ms-transform: scale(2);
1772
+ transform: scale(2);
1773
+ -webkit-transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;
1774
+ transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;
1775
+ transition: opacity 1.2s ease-out, transform 0.6s ease-out;
1776
+ transition: opacity 1.2s ease-out, transform 0.6s ease-out,
1777
+ -webkit-transform 0.6s ease-out;
1778
+ }
1779
+ </style>