diff --git a/CHANGELOG.md b/CHANGELOG.md
index a3b70b97c..cfca0c1b1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,9 +1,12 @@
## 更新日志
### 1.0.0
+
*2016-11-9*
+
- 修复 TimePicker 选择范围时结束时间小于开始时间会重置开始时间, #894
- 修复结合 `vue-i18n` 使用时会提示不能覆盖 `$t` 方法的问题
+- 新增 Loading 自定义加载文案的功能,并优化了视觉表现
### 1.0.0-rc.9
diff --git a/examples/docs/zh-CN/loading.md b/examples/docs/zh-CN/loading.md
index 62086f5ee..89a69477f 100644
--- a/examples/docs/zh-CN/loading.md
+++ b/examples/docs/zh-CN/loading.md
@@ -1,8 +1,6 @@
@@ -10,8 +8,21 @@
export default {
data() {
return {
+ tableData: [{
+ date: '2016-05-03',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-02',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-04',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }],
loading: true,
- loading2: false,
+ loading2: true,
fullscreenLoading: false
}
},
@@ -35,16 +46,46 @@
在表格等容器中加载数据时显示。
:::demo 在 Loading 组件中,Element 准备了自定义命令`v-loading`,只需要绑定`Boolean`即可。默认状况下,Loading 遮罩会插入到绑定元素的子节点,通过添加`body`修饰符,可以使遮罩插入至 DOM 中的 body 上。
-
```html
-
+
+
+
+
+
+
+
+
+```
+:::
+
### 整页加载
页面数据加载时显示。
diff --git a/packages/loading/src/directive.js b/packages/loading/src/directive.js
index 0ef89ab8c..8600681ed 100644
--- a/packages/loading/src/directive.js
+++ b/packages/loading/src/directive.js
@@ -1,4 +1,6 @@
-import Spinner from './spinner';
+import Vue from 'vue';
+let Spinner = Vue.extend(require('./spinner.vue'));
+
exports.install = Vue => {
let toggleLoading = (el, binding) => {
if (binding.value) {
@@ -88,11 +90,18 @@ exports.install = Vue => {
el.maskStyle = {
position: 'absolute',
zIndex: '10000',
- backgroundColor: 'rgba(0, 0, 0, .65)',
+ backgroundColor: 'rgba(255, 255, 255, .9)',
margin: '0'
};
- el.spinner = (new Spinner()).el;
+ let spinner = new Spinner({
+ data: {
+ text: el.getAttribute('element-loading-text'),
+ fullScreen: !!binding.modifiers.fullscreen
+ }
+ });
+ spinner.$mount(el.mask);
+ el.spinner = spinner.$el;
el.spinnerStyle = {
position: 'absolute'
};
diff --git a/packages/loading/src/spinner.js b/packages/loading/src/spinner.js
deleted file mode 100644
index 342a6e819..000000000
--- a/packages/loading/src/spinner.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import { addClass } from 'wind-dom/src/class';
-
-class Spinner {
- constructor() {
- let spinner = document.createElement('div');
- addClass(spinner, 'el-loading-spinner');
- [1, 2, 3].forEach(index => {
- let bubble = document.createElement('div');
- addClass(bubble, `el-loading-bubble bubble${ index }`);
- spinner.appendChild(bubble);
- });
- this.el = spinner;
- }
-}
-
-export default Spinner;
diff --git a/packages/loading/src/spinner.vue b/packages/loading/src/spinner.vue
new file mode 100644
index 000000000..3362fd928
--- /dev/null
+++ b/packages/loading/src/spinner.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/theme-default/src/common/var.css b/packages/theme-default/src/common/var.css
index b9cab91ea..7754b8361 100644
--- a/packages/theme-default/src/common/var.css
+++ b/packages/theme-default/src/common/var.css
@@ -539,4 +539,9 @@
--datepicker-inrange-hover-color: #AFDCFF;
--datepicker-active-color: var(--color-primary);
--datepicker-text-hover-color: #20a0ff;
+
+ /* Loading
+ --------------------------*/
+ --loading-spinner-size: 42px;
+ --loading-fullscreen-spinner-size: 64px;
}
diff --git a/packages/theme-default/src/loading.css b/packages/theme-default/src/loading.css
index 5a71bc893..c3dd552de 100644
--- a/packages/theme-default/src/loading.css
+++ b/packages/theme-default/src/loading.css
@@ -1,44 +1,62 @@
+@charset "UTF-8";
+@import "./common/var.css";
+
.el-loading-spinner {
- height: 12px;
- width: 60px;
top: 50%;
- left: 50%;
- font-size: 0;
+ margin-top: calc(- var(--loading-spinner-size) / 2);
+ width: 100%;
text-align: center;
- margin-top: -6px;
- margin-left: -30px;
- z-index: 10001;
-}
-.el-loading-bubble {
- height: 12px;
- width: 12px;
- background-color: #fff;
- margin: 0 3px;
- border-radius: 50%;
- display: inline-block;
- animation: 1s cubic-bezier(.2,.68,.18,1.08) infinite both bubble-pulse;
-}
-
-.el-loading-bubble.bubble1 {
- animation-delay: .16s;
-}
-
-.el-loading-bubble.bubble2 {
- animation-delay: .32s;
-}
-
-.el-loading-bubble.bubble3 {
- animation-delay: .48s;
-}
-
-@keyframes bubble-pulse {
- 0%, 80% {
- transform: scale(1);
- opacity: 1;
+ .el-loading-text {
+ color: var(--color-primary);
+ margin: 3px 0;
+ font-size: 16px;
}
- 45% {
- transform: scale(0);
- opacity: 0;
+
+ .circular {
+ width: var(--loading-spinner-size);
+ animation: rotate 2s linear infinite;
}
-}
\ No newline at end of file
+
+ .path {
+ stroke-dasharray: 1, 100;
+ stroke-dashoffset: 0;
+ stroke-width: 2;
+ stroke: var(--color-primary);
+ animation: dash 1.5s ease-in-out infinite, color 6s ease-in-out infinite;
+ stroke-linecap: round;
+ }
+
+ @when full-screen {
+ margin-top: calc(- var(--loading-fullscreen-spinner-size) / 2);
+
+ .circular {
+ width: var(--loading-fullscreen-spinner-size);
+ }
+
+ .path {
+ stroke-width: 3;
+ }
+ }
+}
+
+@keyframes rotate {
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes dash {
+ 0% {
+ stroke-dasharray: 1, 100;
+ stroke-dashoffset: 0;
+ }
+ 50% {
+ stroke-dasharray: 45, 100;
+ stroke-dashoffset: -35px;
+ }
+ 100% {
+ stroke-dasharray: 45, 100;
+ stroke-dashoffset: -124px;
+ }
+}
diff --git a/test/unit/specs/loading.spec.js b/test/unit/specs/loading.spec.js
index cc1b13683..30219328c 100644
--- a/test/unit/specs/loading.spec.js
+++ b/test/unit/specs/loading.spec.js
@@ -136,4 +136,25 @@ describe('Loading', () => {
done();
});
});
+
+ it('text', done => {
+ vm = createVue({
+ template: `
+
+ `,
+
+ data() {
+ return {
+ loading: true
+ };
+ }
+ }, true);
+ Vue.nextTick(() => {
+ const mask = document.querySelector('.el-loading-mask');
+ const text = mask.querySelector('.el-loading-text');
+ expect(text).to.exist;
+ expect(text.textContent).to.equal('拼命加载中');
+ done();
+ });
+ });
});