Skip to content

Commit 384c563

Browse files
island205iamkun
authored andcommitted
Message: display in stack mode (#15639)
1 parent 714a2a9 commit 384c563

File tree

7 files changed

+34
-9
lines changed

7 files changed

+34
-9
lines changed

examples/docs/en-US/message.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Displays at the top, and disappears after 3 seconds.
2020
open() {
2121
this.$message('This is a message.');
2222
},
23-
23+
2424
openVn() {
2525
const h = this.$createElement;
2626
this.$message({
@@ -210,6 +210,7 @@ In this case you should call `Message(options)`. We have also registered methods
210210
| showClose | whether to show a close button | boolean || false |
211211
| center | whether to center the text | boolean || false |
212212
| onClose | callback function when closed with the message instance as the parameter | function |||
213+
| offset | set the distance to the top of viewport | number || 20 |
213214

214215
### Methods
215216
`Message` and `this.$message` returns the current Message instance. To manually close the instance, you can call `close` on it.

examples/docs/es/message.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ En este caso deberia llamar al metodo `Message(options)`. Tambien se han registr
210210
| showClose | utilizado para mostrar un boton para cerrar | boolean || false |
211211
| center | utilizado para centrar el texto | boolean || false |
212212
| onClose | funcion callback ejecutada cuando se cierra con una instancia de mensaje como parametro | function |||
213+
| offset | set the distance to the top of viewport | number || 20 |
213214

214215
### Metodos
215216
`Message` y `this.$message` regresan una instancia del componente Message. Para cerrar manualmente la instancia, puede llamar al metodo `close`.

examples/docs/fr-FR/message.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ Dans ce cas il faudra appeler `Message(options)`. Les méthodes des différents
213213
| showClose | Si un bouton de fermeture doit être affiché. | boolean || false |
214214
| center | Si le texte doit être centré. | boolean || false |
215215
| onClose | Callback de fermeture avec en paramètre l'instance de Message. | function |||
216+
| offset | set the distance to the top of viewport | number || 20 |
216217

217218
### Méthodes
218219

examples/docs/zh-CN/message.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ import { Message } from 'element-ui';
210210
| showClose | 是否显示关闭按钮 | boolean || false |
211211
| center | 文字是否居中 | boolean || false |
212212
| onClose | 关闭时的回调函数, 参数为被关闭的 message 实例 | function |||
213+
| offset | Message 距离窗口顶部的偏移量 | number || 20 |
213214

214215
### 方法
215216
调用 `Message``this.$message` 会返回当前 Message 的实例。如果需要手动关闭实例,可以调用它的 `close` 方法。

packages/message/src/main.js

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,17 @@ const Message = function(options) {
3030
instance.$slots.default = [instance.message];
3131
instance.message = null;
3232
}
33-
instance.vm = instance.$mount();
34-
document.body.appendChild(instance.vm.$el);
35-
instance.vm.visible = true;
36-
instance.dom = instance.vm.$el;
37-
instance.dom.style.zIndex = PopupManager.nextZIndex();
33+
instance.$mount();
34+
document.body.appendChild(instance.$el);
35+
let verticalOffset = options.offset || 20;
36+
instances.forEach(item => {
37+
verticalOffset += item.$el.offsetHeight + 16;
38+
});
39+
instance.verticalOffset = verticalOffset;
40+
instance.visible = true;
41+
instance.$el.style.zIndex = PopupManager.nextZIndex();
3842
instances.push(instance);
39-
return instance.vm;
43+
return instance;
4044
};
4145

4246
['success', 'warning', 'info', 'error'].forEach(type => {
@@ -52,15 +56,25 @@ const Message = function(options) {
5256
});
5357

5458
Message.close = function(id, userOnClose) {
55-
for (let i = 0, len = instances.length; i < len; i++) {
59+
let len = instances.length;
60+
let index = -1;
61+
for (let i = 0; i < len; i++) {
5662
if (id === instances[i].id) {
63+
index = i;
5764
if (typeof userOnClose === 'function') {
5865
userOnClose(instances[i]);
5966
}
6067
instances.splice(i, 1);
6168
break;
6269
}
6370
}
71+
if (len <= 1 || index === -1 || index > instances.length - 1) return;
72+
const removedHeight = instances[index].$el.offsetHeight;
73+
for (let i = index; i < len - 1 ; i++) {
74+
let dom = instances[i].$el;
75+
dom.style['top'] =
76+
parseInt(dom.style['top'], 10) - removedHeight - 16 + 'px';
77+
}
6478
};
6579

6680
Message.closeAll = function() {

packages/message/src/main.vue

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
showClose ? 'is-closable' : '',
99
customClass
1010
]"
11+
:style="positionStyle"
1112
v-show="visible"
1213
@mouseenter="clearTimer"
1314
@mouseleave="startTimer"
@@ -43,6 +44,7 @@
4344
onClose: null,
4445
showClose: false,
4546
closed: false,
47+
verticalOffset: 20,
4648
timer: null,
4749
dangerouslyUseHTMLString: false,
4850
center: false
@@ -54,6 +56,11 @@
5456
return this.type && !this.iconClass
5557
? `el-message__icon el-icon-${ typeMap[this.type] }`
5658
: '';
59+
},
60+
positionStyle() {
61+
return {
62+
'top': `${ this.verticalOffset }px`
63+
};
5764
}
5865
},
5966

packages/theme-chalk/src/message.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
top: 20px;
1414
transform: translateX(-50%);
1515
background-color: $--message-background-color;
16-
transition: opacity 0.3s, transform .4s;
16+
transition: opacity 0.3s, transform .4s, top 0.4s;
1717
overflow: hidden;
1818
padding: $--message-padding;
1919
display: flex;

0 commit comments

Comments
 (0)