惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
M
MIT News - Artificial intelligence
大猫的无限游戏
大猫的无限游戏
The Cloudflare Blog
Apple Machine Learning Research
Apple Machine Learning Research
罗磊的独立博客
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
有赞技术团队
有赞技术团队
博客园 - 叶小钗
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Visual Studio Blog
美团技术团队
F
Fortinet All Blogs
I
Intezer
IT之家
IT之家
T
Threat Research - Cisco Blogs
Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Know Your Adversary
Know Your Adversary
P
Proofpoint News Feed
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
AWS News Blog
AWS News Blog
P
Palo Alto Networks Blog
S
Securelist
L
LINUX DO - 热门话题
Security Archives - TechRepublic
Security Archives - TechRepublic
N
Netflix TechBlog - Medium
TaoSecurity Blog
TaoSecurity Blog
Scott Helme
Scott Helme
Hugging Face - Blog
Hugging Face - Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Project Zero
Project Zero
U
Unit 42
博客园_首页
博客园 - 司徒正美
S
Security Affairs
V
V2EX
T
Threatpost
T
Tailwind CSS Blog
GbyAI
GbyAI
O
OpenAI News
K
Kaspersky official blog
Y
Y Combinator Blog
宝玉的分享
宝玉的分享
H
Hacker News: Front Page
V2EX - 技术
V2EX - 技术
Security Latest
Security Latest

希仁之拥

领克900半年使用体验 | 希仁之拥的博客 Ubuntu 26.04 Desktop使用体验 | 希仁之拥的博客 【转载】谈谈不受欢迎的博客技术特征 | 希仁之拥的博客 【转载】ClaudeCode 你想知道的所有秘密,源码深度研究报告 | 希仁之拥的博客 2025年年终总结 | 希仁之拥的博客 集成和使用Openclaw后的思考 | 希仁之拥的博客 我买了领克900 | 希仁之拥的博客 服务器性能优化之io拷贝 | 希仁之拥的博客 Go-Sail导航站上线啦 | 希仁之拥的博客 今年国庆的一些感受 [2025] | 希仁之拥的博客 在Deepin 25上配置forticlient | 希仁之拥的博客 分享一些酷酷的站点 [20250908] | 希仁之拥的博客 Go-Sail发布v3.0.6版本了 | 希仁之拥的博客 我对V2EX发布$V2EX讨论的一些感受 | 希仁之拥的博客 如何让Stripe支持支付宝和微信支付 | 希仁之拥的博客 2025上半年里程碑 | 希仁之拥的博客 GitLab+Drone使用体验 | 希仁之拥的博客 四姑娘山之旅 | 希仁之拥的博客 近来帮同事做性能优化的过程回顾 | 希仁之拥的博客 聊聊接口的返回数据结构 | 希仁之拥的博客 由GORM的Updates语法糖 我把 Go-Sail 的文档站更新了 | 希仁之拥的博客 这就是我为什么讨厌拼多多 | 希仁之拥的博客 元旦快乐~ | 希仁之拥的博客 致敬还在写博客的我们 | 希仁之拥的博客 逐步的把图片资源迁移到星光图床上 | 希仁之拥的博客 帮弟弟配了一台mini主机 | 希仁之拥的博客 国庆的一些碎碎念 | 希仁之拥的博客 就这一刻而言,我觉得科技冷冰冰的。 | 希仁之拥的博客 如何使用acme.sh自动续签证书 | 希仁之拥的博客 Go-Sail的文档站点搭建好了 | 希仁之拥的博客 我的第一个谷歌浏览器插件发布成功啦! | 希仁之拥的博客 我开源了一个golang的web框架 | 希仁之拥的博客 流芳 | 希仁之拥的博客 第一次开发微信小程序 | 希仁之拥的博客 春节快乐 | 希仁之拥的博客 我把博客站点重写了 | 希仁之拥的博客 阆中古城 | 希仁之拥的博客 入了把Keydous NJ80 | 希仁之拥的博客 Mac上有用的知识 | 希仁之拥的博客 记一次服务器被攻击 | 希仁之拥的博客 Ubuntu server不停机扩容系统盘 | 希仁之拥的博客 端午安康 | 希仁之拥的博客 搭建hadoop伪分布式集群总结 | 希仁之拥的博客 在goa框架中,如何访问原始请求数据 | 希仁之拥的博客 postgresql相关操作笔记 | 希仁之拥的博客 golang解析带命名空间的xml数据(带冒号的节点或属性名) | 希仁之拥的博客 【转载】解决deepin环境下wine QQ无法接收图片问题 | 希仁之拥的博客 杂项笔记 | 希仁之拥的博客 Mac如何修改通知横幅消失时间 | 希仁之拥的博客 Golang校验结构体是否实现了接口 | 希仁之拥的博客 关于deepin os的大半年使用体验 | 希仁之拥的博客 有态度的翻唱 | 希仁之拥的博客 【转载】Golang 在 Mac、Linux、Windows 下如何交叉编译 | 希仁之拥的博客 和幺幺一起成长的半年时光 | 希仁之拥的博客 从predis组件开始了解如何与redis服务交互 | 希仁之拥的博客 【转载】 尤雨溪谈Vue.js :缔造自由与真我 | 希仁之拥的博客 【转载】百万 Go TCP 连接的思考: epoll方式减少资源占用 | 希仁之拥的博客 【分享】移除git中的commit历史(保留文件,仅移除提交历史信息) | 希仁之拥的博客 shell学习笔记 | 希仁之拥的博客 【分享】Ruby 之父松本行弘:程序员的乐趣、存在感与平衡 | 希仁之拥的博客 安利一下我用过的一些sublime text 3工具、插件及配置 | 希仁之拥的博客 PHP处理苹果内购数据验证 | 希仁之拥的博客 PHP获取XML所有节点名称 | 希仁之拥的博客 Sentinel::check() 在Laravel5.3版本之后总是返回false的解决方案 | 希仁之拥的博客 吃货的美食集,持续更新~ | 希仁之拥的博客 第二十一届成都汽车博览会 | 希仁之拥的博客 马云宣布1年后卸任集团董事局主席 由CEO张勇接任 | 希仁之拥的博客 nginx配置非443端口的https连接 | 希仁之拥的博客 PHP7 异常类型列表 | 希仁之拥的博客 【分享】《燃点》:不被嘲笑的愿望是不值得去实现的|一部属于创业者的电影 | 希仁之拥的博客 【分享】前端资源加载优先级[译] | 希仁之拥的博客 【小技巧】Laravel动态配置多个数据库连接 | 希仁之拥的博客 php使用ftp上传、下载文件 | 希仁之拥的博客 php使用mysqlnd扩展进行mysql异步并行查询 | 希仁之拥的博客 基于以太坊区块链,使用web3.js在geth服务器上执行合约方法以及事件监听 | 希仁之拥的博客 Smartisan OS | 希仁之拥的博客 母校 | 希仁之拥的博客 php后期静态绑定 | 希仁之拥的博客 [mysql优化]子查询与连接查询 | 希仁之拥的博客 PHP常见运行模式及原理 | 希仁之拥的博客 mysql用户与授权 | 希仁之拥的博客 如何在ubuntu14.04上安装composer | 希仁之拥的博客 关于mews/captcha for laravel存在method [validateCaptcha] doesn't exists解决方法 | 希仁之拥的博客
Element UI中message消息提示实现原理 | 希仁之拥的博客
希仁之拥 · 2019-03-27 · via 希仁之拥

前言

之前很好奇Element UI中的消息提示message是如何实现支持连续点击生成多个消息提示并且能够自动回收(消息收起隐藏)的,这两天需要用到类似的功能,我就去研究了一下element ui关于这一功能的源码,然后发现了一些很好玩的东西。:)

源码分析

  • Element UI的message相关代码

Element UI-blog.keepchen.com

  • Element UI的message组件生成的DOM节点

Element UI-blog.keepchen.com

于是我猜想,大致流程应该是这样的:

  • 通过js动态创建元素节点

  • 赋予元素相应的样式属性及方法

    • 下沉动画及基础样式
    • 堆叠层级(z-index)
  • 绑定元素与回调函数

    • 淡出或隐藏效果处理函数(将处理方法与实时的元素绑定,这也就是为什么每个消息提示能够单独自动回收)
  • 追加元素节点到文档

然后我就模拟着写了一些代码:

  • javascript
function showTips(msg, isSuccess = 1, isAutoClose = true) {
        var ele = document.createElement("div"),
          zIndex = 30 + document.getElementsByClassName("global-msg-tips").length + 1;
        ele.textContent = msg;
        ele.style.display = "block";
        ele.style.zIndex = zIndex;
        ele.className = "global-msg-tips " + (isSuccess == 0 ? "success" : "error");
        ele.fadeOut = function() {
          setTimeout(function() {
            ele.remove();
          }, 3000)
        }
       document.body.appendChild(ele);
}       
  • html & css
<!DOCTYPE html>
<html>

  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    <meta name="renderer" content="webkit" />
    <style type="text/css">
      html,
      body {
        user-select: none;
        -webkit-user-select: none;
        -moz-user-select: none;
        background-color: #000;
        width: 100%;
        min-height: 200px;
        color: #fff;
        margin: 0;
        padding: 0;
      }

      .global-msg-tips {
        position: fixed;
        z-index: 30;
        width: 100%;
        height: 44px;
        text-align: center;
        color: #fff;
        line-height: 44px;
        font-size: 14px;
        top: -44px;
        border: none;
        animation: tips_animate 3s ease-in-out;
      }

      @keyframes tips_animate {
        0% {
          transform: translateY(0px);
        }
        50% {
          transform: translateY(176px);
        }
        100% {
          transform: translateY(176px);
        }
      }

      .error {
        background-color: #e91e63;
      }

      .success {
        background-color: #009688;
      }

      .btn {
        width: 60%;
        text-align: center;
        border: none;
        cursor: pointer;
        color: #fff;
        height: 50px;
        border-radius: 2px;
        margin-bottom: 2px;
      }

    </style>

  </head>

  <body>
    <div style="position:fixed;bottom:0;width:100%;text-align:center;">
      <button type="button" class="btn success" onclick="showTips('Success message', 0)">click here!</button>
      <button type="button" class="btn error" onclick="showTips('Error message',1)">click here!</button>
    </div>
</body>
</html>

效果

blog.keepchen.com

大致实现了Element UI消息提示组件的加载原理,真好玩。:)

效果在线预览

---------------------------------------------分割线---------------------------------------------------

2019年3月30日更新: 可能有细心的小伙伴发现了,消息提示的层级显示有bug,原因是计算层级的方式不妥当,因此,这里加以修正:

function showTips(msg, isSuccess = 1, isAutoClose = true) {
        var ele = document.createElement("div"),
              //zIndex = 30 + document.getElementsByClassName("global-msg-tips").length + 1;
              messageEle = document.getElementsByClassName("global-msg-tips");
        //获取最后一个消息提示的显示层级,新的消息提示层级在此基础上+1
        var zIndex = messageEle.length == 0 ? 30 + 1 : parseInt(messageEle[messageEle.length-1].style.zIndex) + 1;
        ele.textContent = msg;
        ele.style.display = "block";
        ele.style.zIndex = zIndex;
        ele.className = "global-msg-tips " + (isSuccess == 0 ? "success" : "error");
        ele.fadeOut = function() {
          setTimeout(function() {
            ele.remove();
          }, 3000)
        }
       document.body.appendChild(ele);
}

980_120.png(via stardots.io)

觉得博主写的不错?给他一个赞赏:

keepchen的赞赏码-支付宝 keepchen的赞赏码-微信