ohoTips - 最屌的消息弹窗工具!

ohoTips - 一款功能丰富的前端弹出消息提醒工具

ohoTips 消息美观,可自由方便地定位消息位置,支持任何定位。

麻烦您务必阅读下 1.3 开发目标, 谢谢!

目录

[TOC]

1. 简介

1.1 特点

  • 支持单行、多行消息,支持 DOM 消息
  • 支持自定义消息类型,成功、失败、警告、信息、普通5种类型,默认普通
  • 支持自定义图标,成功、失败、警告、信息4种类型,默认成功;支持自定义图标位置,上下左右,默认左
  • 支持角标,我也不知道应该管它叫什么,就是消息的那个小三角形
  • 支持遮罩层,遮盖住整个基准元素
  • 支持自定义消息位置类型,有左上角,上居中,右上角,左居中,全居中,右居中,左小角,下居中,右小角。定位基于基准元素,基准元素可以是任意元素,也可以基于整个窗口
  • 支持精准定位,也就是传说中的top,left,right,bottom。基准元素可以是任意元素,也可以基于整个窗口
  • 支持自定义消息手动销毁,销毁延时以及手动销毁
  • 支持生命周期函数,shown, destroyed 等
  • 支持消息分组,同组消息上下排列
  • 支持浮动,使消息在页面来回浮动。支持自定义浮动函数
  • 支持自定义动画类型,支持自定义动画函数

1.2 用法

下面简单介绍下该工具的用法:

let ohoTips = oho.ohoTips;
let ohoTipsPrototype = oho.ohoTipsPrototype;

ohoTips({
    baseElement: baseElement,           //基准元素为空或者body,则定位基于整个窗口
    position: "top-left",               //Tip显示位置,窗口左上角
    type: "success",                    //显示的class,可接受自定义
    icon: false,                        //不显示图标
    message: message,                   //Tip内容
})

ohoTips().success(message, baseElement);

ohoTips(message, options);

具体例子展示 请看 index.html

1.3 开发目标

  1. 增加更多的css样式
  2. 增加更多的图标
  3. 增加更多类型的角标,目前仅有三角形(难度较高)
  4. 增加更多的消息边框,目前仅是方形(难度较高)
  5. 优化浮动效果,减少抖动
  6. 增加更多的浮动效果
  7. 增加更多的动画效果
  8. 针对图片的设计,比如鼠标悬浮则自动放大图片细节

。。。

如果您对我的作品感兴趣的话,

诚邀来自五湖四海的你共同开发ohoTips!

联系人:蛮吉是魁拔 - 707077549@qq.com

2. 如何引用

ohoTips 可以与 CommonJS、AMD 以及 script 标签使用。

# 项目引入 ohoTips.js, ohoTips.min.css
<html>
    <link href="../dist/ohoTips/css/themes/ohoTips.min.css" rel="stylesheet">
    <script src="../dist/ohoTips/js/ohoTips.min.js"></script>
</html>

本插件提供测试代码,打开 examples/index.html 即可。

您可以直接引用 ./dist 文件夹里面的文件, 这是已经构建好的文件。

如果您想要开发或者设计您喜欢的样式,可以看看 3. 开发与构建

3. 开发与构建

3.1. css 构建

目前提供了两种样式,ohoTips.scss 和 ohoTips-light.scss

ohoTips.scss - 默认样式
ohoTips-light.scss - 只是改了一点点默认样式,您可参考这个定制您喜欢的样式
# 构建调试版
sass src/css/themes/ohoTips.scss dist/ohoTips/css/themes/ohoTips.css --style expanded
# 构建生产版
sass src/css/themes/ohoTips.scss dist/ohoTips/css/themes/ohoTips.min.css --style compressed

如果不熟悉 sass,请参考 如何安装Sass

3.2. js 构建

npm install -save-dev   // 安装依赖

npm run dev             // 构建调试版JS
npm run prod            // 构建生产版JS

如果不熟悉 webpack, 请参考 起步

3.3 开发

  1. 本插件提供测试代码,打开 examples/index.html 即可。

每次修改 src 里面的源码,您必须重新构建 css 或者 js, 然后刷新页面。

  1. 模块热替换开发

开发过程中,强烈建议使用 webpack 提供的 模块热替换 功能。它允许在运行时更新所有类型的模块,而无需完全刷新。

// 运行此命令,将自动打开 examples/index.html,任何修改都无所刷新页面
npm run start

4. 配置及使用方法

4.1 配置

{
    message: '',                //传入数组可换行, 支持DOM元素,jQuery元素
    html: {
        param: false,                   //false - 文本类型信息,true - dom元素类型信息
        isContainerTransparent: false,  //false - Tips 容器不透明,true - Tips 容器透明
    },
    baseElement: "",            //基准方位元素
    parentElement: "",          //Tips container 直接父元素,注意,基准元素建议也是父元素的子元素,且父元素定位是特殊的定位类型
    direction: 'inner',         //计算Tips定位时,inner - 计算Tips 宽高,尽量使Tips 位于基准元素内部,normal - 不计算Tips宽高,按照position数据来,outer - 计算Tips 宽高,尽量使Tips 位于基准元素外部, outside - 计算Tips 宽高,尽量使Tips 位于基准元素外部; 默认'inner'。
    position: "middle",         //Tips 位置,左上角,上居中,右上角,左居中,全居中,右居中,左下角,下居中,右下角,自定义相对位置,浮动
    offset: {                   //如果position 是对象如{top: 0},则一般不需要这个,如果是字符串,则可以酌情添加offset, 调整基准元素与Tips 的相对定位, 仅支持top,left
        top: null,
        left: null
    },
    group: {                    //分组,多个Tips 集合,超出分组最大限制个数则删除最开始的Tips
        name: null,                 //分组名称
        maxLength: 9999,            //一个分组最大Tips个数
    },
    type: "normal",             //Tips 样式, 支持自定义样式(传入class名称)
    limit: true,                //限制Tips 的最大宽度 400px
    shadow: false,              //false - 没有阴影, true - 有阴影
    background: false,          //false - 不显示遮罩层覆盖基准元素, true - 显示遮罩层覆盖基准元素
    icon: false,                //是否显示icon, true - 按照type参数自动设置icon类型,支持字符串设置icon类型,主要是形状,如 normal,clock等
    iconOptions: {
        type: 'info',           //当icon 为字符串时,icon主要定制形状(也含颜色),此时type可以额外设置icon 的色调
        position: 'left',       //icon 的位置,支持top, left, bottom, right
    },
    symbol: false,              //是否显示binder, true - 默认triangle,支持字符串设置symbol类型,如 triangle等,目前仅支持triangle
    symbolOptions: {
        type: null,             //如果不设置,symbol则按option.type 色调,否则按该参数的色调
        position: null,         //如果不设置,symbol则根据option.position 设置定位(不一定一样),否则按该参数定位
    },
    destroy: "auto",            //auto - 自动销毁Tips,manual - 不自动销毁Tips,需手动销毁, never - 从不销毁Tips
    delay: 2000,                //自动销毁Tips 延时,单位:ms
    animation: {                //动画
        in: 'default',              //Tips 显示动画
        out: 'default',             //Tips 隐藏动画
        fragments: {
            type: 1,                    // 两种创建fragment 的算法,0和1,1 体验更好
            basePix: 10,                // 对应type = 0, 最小的像素, type 1则不需要该参数
            xCount: 10,                 // 对应type = 1, 水平fragment的个数
            yCount: 10,                 // 对应type = 1, 垂直fragment的个数
        },
        delay: 1000,                //Tips 动画执行时间,延时时间删除Tips
        customAmtFuntion: null,     //自定义Tips 动画函数
    },
    float: {                    //浮动参数,当position 等于 'float' 或 'translate' 时,可选;其余情况不需要 
        type: 'default',            //可选择默认浮动方法,浮动方法支持自定义,见 customFloatType
        customFloatOptions: null,   //自定义浮动选项
        customFloatStatus: null,    //自定义浮动初始状态,top,left等
        customFloatType: null,      //自定义浮动类型的方法, 参考 floatTypeDefault 方法
    },
    events: {
        beforeCreated: C.noop,      //Tips 创建消息之前 触发
        created: C.noop,            //Tips 创建消息之后 触发
        beforeShown: C.noop,        //Tips 创建消息之后,展示之前 触发
        shown: C.noop,              //Tips 展示之后 触发
        beforeDestroyed: C.noop,    //Tips 销毁之前 触发
        destroyed: C.noop,          //Tips 销毁之后 触发
        beforeFloated: C.noop,      //Tips 每次浮动之前 触发
        floated: C.noop,            //Tips 每次浮动之后 触发
    },
    debug: true                     //debug 默认打开,打开可以调试log。 error, warn 类型的log 不受此影响
}

4.2 使用方法

  1. Options 实例法

直接实例化并且创建展示Tips

ohoTips({
    baseElement: baseElement,           //基准元素为空或者body,则定位基于整个窗口
    position: "top-left",               //Tip显示位置,窗口左上角
    type: "success",                    //显示的class,可接受自定义
    icon: false,                        //不显示图标
    message: message,                   //Tip内容
})
  1. 空实例法

先生成Tips实例但不展示Tips, 然后再创建Tips。

目的是简化调用,其他配置保持默认值。

ohoTips().show(message, "success", baseElement);
或者
ohoTips().normal(message, baseElement);
ohoTips().success(message, baseElement);
ohoTips().error(message, baseElement);
ohoTips().warning(message, baseElement);
ohoTips().info(message, baseElement);

实现鼠标悬停,展示详情的效果。

ohoTips().hoverTip({
    baseElement: hoverElement,              //基准元素,可以不是hoverElement 
    position: "top-center",                 //Tip显示位置,基准元素左上角
    direction: 'outer',                     //Tip 方向, 在基准元素外部
    type: 'success',
    destroy: 'never',                       //永不销毁,鼠标移开后销毁
    message: '当鼠标悬停时,展示详情',
}, hoverElement);                           //鼠标悬停对象hoverElement
  1. Message 实例法
ohoTips(message, options);

与Options 实例法 不同的是,第一个参数是 消息字符串,第二个参数options是可选的。

并且不建议使用第二个参数options,这样就失去了灵性。

我们可以在调用前修改一次Tips 默认配置,这样就一劳永逸了。

let options = {
    baseElement: baseElement,           //基准元素为空或者body,则定位基于整个窗口
    position: "top-left",               //Tip显示位置,窗口左上角
    type: "info",                       //显示的class,可接受自定义
    icon: true,                         //显示图标
}
ohoTipsPrototype.setDefOptions(options);

// 重置默认配置
ohoTipsPrototype.resetDefOptions();

5. 功能介绍

5.1 消息

  1. 消息支持单行或者多行,多行传入数组
ohoTips("Hello World!");

ohoTips(["Hello World!", "Here is the second line."]);
  1. 支持 DOM 元素 和 jQuery 元素
{
    html: true                      //可以直接配置 true, 也可接受对象类型
}

# 或者

{
    html: {
        param: false,               //false - 文本类型信息,true - dom元素类型信息
        isContainerTransparent: false, //false - Tips 容器不透明,true - Tips 容器透明
    }
}

以上配置,即使传入字符串,也会被处理成 DOM 元素。

如果直接传入 DOM 元素 或者 jQuery 元素,则可省略以上配置。

5.2 基准元素与父元素

1. 基准元素

{
    baseElement: "",            //基准方位元素
}
  • 任何定位都以此为基准。默认以整个整个窗口为基准。
  • 支持 DOM选择器(id等),DOM元素 以及 jQuery 元素。
  • 遮罩层也将遮罩的是基准元素,不是父元素

2. 父元素

{
    parentElement: "",          //Tips container 直接父元素,注意,基准元素建议也是父元素的子元素,且父元素定位是特殊的定位类型
}

Tips container 直接父元素,也就是 Tips 将插入到这个元素内。

需要说明的是

特殊的定位,比如,position: relative / absolute / fixed 。 如果这种定位类型的父元素的子元素的定位是 absolute,定位以父元素为基准。

根据这个特性,我们支持:

  • 用户可以根据这个特性自定义父元素,注意,基准元素建议也是父元素的子元素,且父元素定位是特殊的定位类型,否则毫无意义
  • 如果基准元素的定位是特殊定位,我们把 Tips 插入到这个基准元素内部
  • 如果基准元素的直接父元素的定位是特殊定位,我们把 Tips 插入到这个基准元素的直接父元素
  • 以上均不匹配,那么父元素就是 BODY

5.3 方位

Tips与基准元素的相对方向

{
    direction: 'inner',         //计算Tips定位时,inner - 计算Tips 宽高,尽量使Tips 位于基准元素内部,'normal' - 不计算Tips宽高,按照position数据来,'outer' - 计算Tips 宽高,尽量使Tips 
}

默认: inner

  • inner - 计算Tips 宽高,尽量使Tips 位于基准元素内部
  • normal - 不计算Tips宽高,按照position数据来,尽量使Tips 位于基准元素内部
  • outer - 计算Tips 宽高,尽量使Tips 位于基准元素外部
  • outside - 不计算Tips 宽高,尽量使Tips 位于基准元素外部。与outer 主要是负数有区别

5.4 定位

{
    position: "middle",         //tips 位置,左上角,上居中,右上角,左居中,全居中,右居中,左下角,下居中,右下角,自定义相对位置,浮动
    offset: {                   //如果position 是对象如{top: 0},则一般不需要这个,如果是字符串,则可以酌情添加offset, 调整基准元素与Tips 的相对定位, 仅支持top,left
        top: null,
        left: null
    },
}

position 支持字符串 或者 对象:

参数 描述 可能的值
position Tips与基准元素的相对定位 top-left, top-center , top-right , center-left , middle ,
center-right , bottom-left , bottom-center , bottom-right, float, translate
offset 微调定位 top, left 设置 微调量, 支持正负数,单位px

特别地,当position 等于 float 或 translate,Tips会浮动起来。具体参考 ++5.10 浮动的Tips++

5.5 分组的Tips

{
    group: {                    //分组,多个Tips 集合,超出分组最大限制个数则删除最开始的Tips
        name: null,                 //分组名称
        maxLength: 9999,            //一个分组最大Tips个数
    },
}

具有相同 group.name 的 Tips 会自动归类为同一组。组控制由以下功能:

  • 相同组的Tips 会从上到下自动排列在一起。
  • 如果存在的Tips 个数超过 group.maxLength,将自动删除第一个Tips。

5.6 css 样式

{
    type: "normal",             //Tips 样式, 支持自定义样式(传入class名称)
    limit: true,                //限制Tips 的最大宽度 400px
    shadow: false,              //false - 没有阴影, true - 有阴影
    background: false,          //false - 不显示遮罩层覆盖基准元素, true - 显示遮罩层覆盖基准元素
}

插件内内置5种样式可供选择:
normal, success, error, warning, info

分别有各自对应的便捷调用:

ohoTips().success(message, baseElement);
// 或者
ohoTips().show(message, "success", baseElement);

默认: normal

支持自定义css:

  • 自写css, 如
my-css-1 { background-color: transparent; }
my-css-2 { color: #ffffff; }
  • type 传入完整的css,如
{
    type: "my-css-1 my-css2"
}

5.7 图标

{
    icon: false,                //是否显示icon, true - 按照type参数自动设置icon类型,支持字符串设置icon类型,主要是形状,如 normal,clock等
    iconOptions: {
        type: 'info',           //当icon 为字符串时,icon主要定制形状(也含颜色),此时type可以额外设置icon 的色调
        position: 'left',       //icon 的位置,支持top, left, bottom, right
    },
}

插件内内置5种样式可供选择:
normal, success, error, warning, info, clock

默认: info

5.8 角标

{
    symbol: false,              //是否显示binder, true - 默认triangle,支持字符串设置symbol类型,如 triangle等,目前仅支持triangle
    symbolOptions: {
        type: null,             //如果不设置,symbol则按option.type 色调,否则按该参数的色调
        position: null,         //如果不设置,symbol则根据option.position 设置定位(不一定一样),否则按该参数定位
    },
}

角标目前仅支持附着在Tips 边框上三角形标志。希望朋友们能创作出各种有意思的角标

角标的type 颜色伴随Tips 的type 颜色,也可自行选择定义。同 css 样式。

角标的定位类似Tips 的定位,但有更多的选择。

top-left, top-center , top-right , right-top , center-right , right-bottom ,
bottom-left , bottom-center , bottom-right, left-bottom, center-left, left-top, middle

5.9 销毁

{
    destroy: "auto",            //auto - 自动销毁Tips,manual - 不自动销毁Tips,需手动销毁, never - 从不销毁Tips
    delay: 2000,                //自动销毁Tips 延时,单位:ms
}

支持3种销毁方式

  • auto 自动销毁,可设置销毁时间,默认2s
  • manual 手动销毁,单击Tips 右上角x图标销毁
  • never 永不销毁,调用接口可销毁Tips - myTips.destroy();

5.10 浮动的Tips

{
    position: 'float',          //Tip浮动显示,float 或者 translate
    float: {                    //浮动参数,当position 等于 'float' 或 'translate' 时,可选;其余情况不需要 
        type: 'default',            //可选择默认浮动方法,浮动方法支持自定义,见 customFloatType
        customFloatOptions: null,   //自定义浮动选项
        customFloatStatus: null,    //自定义浮动初始状态,top,left等
        customFloatType: null,      //自定义浮动类型的方法, 参考 floatTypeDefault 方法
    },
}

当position 等于 float 或 translate,Tips会浮动起来。

  • float: 不断设置Tips 的top 以及 left 达到 Tips 浮动的效果
  • translate: 不断设置Tips 的css transform Tips 浮动的效果

支持3种销毁方式

  • default: 默认浮动方式。沿着基准元素左上角到右下角直线浮动
  • x: 浮动方向是 左上角->右下角->右上角->左下角->左上角...
  • square: 浮动方向是 左上角->右上角->右下角->左下角->左上角...

5.11 动画

{
    animation: {                //动画
        in: 'default',              //Tips 显示动画
        out: 'default',             //Tips 隐藏动画
        fragments: {
            type: 1,                    // 两种创建fragment 的算法,0和1,1 体验更好
            basePix: 10,                // 对应type = 0, 最小的像素, type 1则不需要该参数
            xCount: 10,                 // 对应type = 1, 水平fragment的个数
            yCount: 10,                 // 对应type = 1, 垂直fragment的个数
        },
        delay: 1000,                //Tips 动画执行时间,延时的时间删除Tips
        customAmtFuntion: null,     //自定义Tips 动画函数
    },
}

支持4种销毁方式

  • default: 同 fade
  • fade: 淡入淡出动画
  • fold: 向下展开,向上收起
  • oho: 在基准元素中间由小到大弹出到定位位置,从定位位置由大到小消失在基准元素中间
  • fragment: Tips 由碎片合成整体展示,Tips 由整体分裂成碎片消失

5.12 生命周期函数

{
    events: {
        beforeCreated: C.noop,      //Tips 创建消息之前 触发
        created: C.noop,            //Tips 创建消息之后 触发
        beforeShown: C.noop,        //Tips 创建消息之后,展示之前 触发
        shown: C.noop,              //Tips 展示之后 触发
        beforeDestroyed: C.noop,    //Tips 销毁之前 触发
        destroyed: C.noop,          //Tips 销毁之后 触发
        beforeFloated: C.noop,      //Tips 每次浮动之前 触发
        floated: C.noop,            //Tips 每次浮动之后 触发
    },
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353