返回顶部
首页 > 资讯 > 前端开发 > html >怎样进行HTML5及CSS3气泡组件的实现
  • 407
分享到

怎样进行HTML5及CSS3气泡组件的实现

2024-04-02 19:04:59 407人浏览 泡泡鱼
摘要

怎样进行HTML5及css3气泡组件的实现,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。气泡组件在实际工作中非常普遍,无论是网

怎样进行HTML5css3气泡组件的实现,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

气泡组件在实际工作中非常普遍,无论是网页中还是app中,比如:

怎样进行HTML5及CSS3气泡组件的实现

怎样进行HTML5及CSS3气泡组件的实现

怎样进行HTML5及CSS3气泡组件的实现

怎样进行HTML5及CSS3气泡组件的实现

怎样进行HTML5及CSS3气泡组件的实现

我们这里所谓气泡组件是指列表型气泡组件,这里就其dom实现,CSS实现,js实现做一个讨论,***对一些细节点做一些说明,希望对各位有用

小钗最近初学CSS,这里做一个专题,便于自身CSS提升,文章有不少问题与可优化点,请各位指导

组件分类

单由气泡组件来说,他仍然属于“弹出层”类组件,也就是说其会具有这些特性:

① 布局为脱离文档流

② 可以具有mask蒙版,并且可配置点击蒙版是否关闭的特性

③ 可选的特性有点击浏览器回退关闭组件以及动画的显示与隐藏动画特性

其中比较不同的是:

① 不是居中定位

② 具有一个箭头标识,并且可以设置再上或者在下

③ 因为具有箭头,而且这个箭头是相对于一个元素的,一般意义上我们任务是相对某个按钮,所以说具有一个triggerEL

所以单从这里论述来说,我们的组件名为BubbleLayer,其应该继承与一个通用的Layer

但是,就由Layer来说,其最少会具有以下通用特性:

① 创建——create

② 显示——show

③ 隐藏——hide

④ 摧毁——destroy

而以上特性并不是Layer组件所特有的,而是所有组件所特有,所以在Layer之上还应该存在一个AbstractView的抽象组件

至此继承关系便出来了,抛开多余的接口不看,简单来说是这样的:

怎样进行HTML5及CSS3气泡组件的实现

组件dom层面实现

最简单实现

单从dom实现来说,其实一个简单的ul便可以完成任务

<ul class="cui-bubble-layer" style="position: absolute; top: 110px; left: 220px;"> <li data-index="0" data-flag="c">价格:¥35</li> <li data-index="1" data-flag="c">评分:80</li> <li data-index="2" data-flag="c">级别:5</li> </ul>

当然这里要有相关的css

.cui-bubble-layer {     background: #f2f2f2;     border: #bcbcbc 1px solid;     border-radius: 3px }

至此形成的效果是酱紫滴:

怎样进行HTML5及CSS3气泡组件的实现

<!doctype html> <html> <head>   <meta charset="utf-8" />   <title>Blade Demo</title>   <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-Scalable=no">   <meta content="telephone=no" name="fORMat-detection" />   <meta name="apple-mobile-WEB-app-capable" content="yes" />   <style type="text/css">     body, button, input, select, textarea { font: 400 14px/1.5 Arial, "Lucida Grande" ,Verdana, "Microsoft YaHei" ,hei; }     body, div, dl, dt, dd, ul, ol, li, h2, h3, h4, h5, h6, h7, pre, code, form, fieldset, legend, input, textarea, p, blockquote, th, td, hr, button, article, aside, details, fiGCaption, figure, footer, header, hgroup, menu, nav, section { margin: 0; padding: 0; }     body { background: #f5f5f5; }     ul, ol { list-style: none; }          .cui-bubble-layer { background: #f2f2f2; border: #bcbcbc 1px solid; border-radius: 3px; }   </style> </head> <body>   <ul class="cui-bubble-layer" style="position: absolute; top: 110px; left: 220px;">     <li data-index="0" data-flag="c">价格:¥35</li>     <li data-index="1" data-flag="c">评分:80</li>     <li data-index="2" data-flag="c">级别:5</li>   </ul> </body> </html>

这个时候在为其加一个伪类,做点样式上的调整,便基本实现了,这里用到了伪类的知识点:

cui-bubble-layer:before {  position: absolute; content: ""; width: 10px; height: 10px; -webkit-transform: rotate(45deg);  background: #f2f2f2;  border-top: #bcbcbc 1px solid;  border-left: #bcbcbc 1px solid;  top: -6px; left: 50%; margin-left: -5px; z-index: 1; }

这里设置了一个绝对定位的矩形框,为其两个边框设置了值,然后变形偏斜45度形成小三角,然后大家都知道了

<!doctype html> <html> <head>   <meta charset="utf-8" />   <title>Blade Demo</title>   <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">   <meta content="telephone=no" name="format-detection" />   <meta name="apple-mobile-web-app-capable" content="yes" />   <style type="text/css">     body, button, input, select, textarea { font: 400 14px/1.5 Arial, "Lucida Grande" ,Verdana, "Microsoft YaHei" ,hei; }     body, div, dl, dt, dd, ul, ol, li, h2, h3, h4, h5, h6, h7, pre, code, form, fieldset, legend, input, textarea, p, blockquote, th, td, hr, button, article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { margin: 0; padding: 0; }     body { background: #f5f5f5; }     ul, ol { list-style: none; }          .cui-bubble-layer { background: #f2f2f2; border: #bcbcbc 1px solid; border-radius: 3px; }     .cui-bubble-layer > li { padding: 5px 10px; }     .cui-bubble-layer:before { position: absolute; content: ""; width: 10px; height: 10px; -webkit-transform: rotate(45deg); background: #f2f2f2; border-top: #bcbcbc 1px solid; border-left: #bcbcbc 1px solid; top: -6px; left: 50%; margin-left: -5px; z-index: 1;</style> </head> <body>   <ul class="cui-bubble-layer" style="position: absolute; top: 110px; left: 220px;">     <li data-index="0" data-flag="c">价格:¥35</li>     <li data-index="1" data-flag="c">评分:80</li>     <li data-index="2" data-flag="c">级别:5</li>   </ul> </body> </html>

怎样进行HTML5及CSS3气泡组件的实现

Http://sandbox.runjs.cn/show/9ywitfn8

不足与扩展

上面作为基本实现,没有什么问题,但是其实际应用场景会有以下不足:

① 基本的ul层级需要一个包裹层,包裹层具有一个up或者down的class,然后在决定那个箭头是向上还是向下

② 我们这里不能使用伪类,其原因是,我们的小三角标签并不是一定在中间,其具有一定滑动的特性,也就是说,这个小三角需要被js控制其左右位置,他需要是一个标签

根据以上所述,我们的结构似乎应该是这个样子滴:

<section class="cui-bubble-layer up-or-down-class">   <i class="cui-icon-triangle"></i>   <ul>     <li data-index="0" data-flag="c">价格:¥35</li>     <li data-index="1" data-flag="c">评分:80</li>     <li data-index="2" data-flag="c">级别:5</li>   </ul> </section>

① 根元素上我们可以设置当前应该是up还是down的样式

② i标签根据根元素的up或者down选择是向上还是向下,并且该标签可被js操作

到此,似乎整个组件便比较完全了,但是真实的情况却不是如此,怎么说了,上面的结构太局限了

该组件需要一个容器,这个容器标签应该位于ul之上,这个时候容器内部所装载的dom结构便可以不是ul而是其他什么结构了

其次,在手机上,我们可视项目在4S手机上不会超过5个,往往是4个,所以我们应该在其容器上设置类似overflow之类的可滚动属性

组件回归&middot;最终结构

由上所述,基于其是继承至Layer的事实,我们可以形成这样的结构:

<section class="cui-pop cui-bubble-layer">   <i class="cui-pop-triangle"></i>   <div class="cui-pop-head">   </div>   <div class="cui-pop-body">     <ul>       <li data-index="0" data-flag="c">价格:¥35</li>       <li data-index="1" data-flag="c">评分:80</li>       <li data-index="2" data-flag="c">级别:5</li>     </ul>   </div>   <div class="cui-pop-footer">   </div> </section>

这个也可以是我们整个弹出层类的基本结构,我们可以在此上做很多扩展,但是这里我们不扯太多,单就气泡组件做论述

就气泡组件,其结构是:

<section class="cui-pop cui-bubble-layer">   <i class="cui-pop-triangle"></i>   <div class="cui-pop-body">     <ul>       <li data-index="0" data-flag="c">价格:¥35</li>       <li data-index="1" data-flag="c">评分:80</li>       <li data-index="2" data-flag="c">级别:5</li>     </ul>   </div> </section>

js层面的实现

这里仍然是采用的blade中的那一套继承机制,如果有不明白又有点兴趣的同学请移步:【blade的UI设计】理解前端mvc与分层思想

关于模板

因为我们这一部分的主题为重构相关,所以我们这里的关注点是CSS,我们首先生成我们的模板:

<section class="cui-pop <%=wrapperClass %> <%if(dir == 'up'){ %> <%=upClass %> <% } else { %> <%=downClass %> <% } %>">   <i class="cui-pop-triangle"></i>   <div class="cui-pop-body">     <ul class="cui-pop-list <%=itemStyleClass %>">     <% for(var i = 0, len = data.length; i < len; i++) { %>       <% var itemData = data[i]; %>       <li data-index="<%=i%>" data-flag="c" class="<% if(index == i){ %><%=curClass %><%} %>" >         <%if(typeof itemFn == 'function') { %><%=itemFn.call(itemData) %> <% } else { %><%=itemData.name%><%} %>     <% } %>     </ul>   </div> </section>

这里给出了几个关键的定制化点:

① wrapperClass用以添加业务团队定制化的class以改变根元素的class,如此的好处是便于业务团队定制化气泡组件的样式

② 给出了项目列表Ul的可定制化className,通用单单只是方便业务团队做样式改变

③ 默认情况下返回的是传入项目的name字段,但是用户可传入一个itemFn的回调,定制化返回

以上模板基本可满足条件,如果不满足,便可把整个模板作为参数传入了

关于js实现

由于继承的实现,我们大部分工作已经被做了,我们只需要在几个关键地方编写代码即可

define(['UILayer', getAppUITemplatePath('ui.bubble.layer')], function (UILayer, template) {   return _.inherit(UILayer, {     propertys: function ($super) {       $super();       //html模板       this.template = template;       this.needMask = false;        this.datamodel = {         data: [],         wrapperClass: 'cui-bubble-layer',         upClass: 'cui-pop--triangle-up',         downClass: 'cui-pop--triangle-down',         curClass: 'active',         itemStyleClass: '',         needBorder: true,         index: -1,         dir: 'up'  //箭头方向默认值       };        this.events = {         'click .cui-pop-list>li': 'clickAction'       };        this.onClick = function (data, index, el, e) {         console.log(arguments); //        this.setIndex(index);       };        this.width = null;        //三角图标偏移量       this.triangleLeft = null;       this.triangleRight = null;        this.triggerEl = null;      },      initialize: function ($super, opts) {       $super(opts);     },      createRoot: function (html) {       this.$el = $(html).hide().attr('id', this.id);     },      clickAction: function (e) {       var el = $(e.currentTarget);       var i = el.attr('data-index');       var data = this.datamodel.data[i];       this.onClick.call(this, data, i, el, e);     },      initElement: function () {       this.el = this.$el;       this.triangleEl = this.$('.cui-pop-triangle');       this.windowWidth = $(window).width();     },      setIndex: function (i) {       var curClass = this.datamodel.curClass;       i = parseInt(i);       if (i < 0 || i > this.datamodel.data.length || i == this.datamodel.index) return;       this.datamodel.index = i;        //这里不以datamodel改变引起整个dom变化了,不划算       this.$('.cui-pop-list li').removeClass(curClass);       this.$('li[data-index="' + i + '"]').addClass(curClass);     },      //位置定位     reposition: function () {       if (!this.triggerEl) return;       var offset = this.triggerEl.offset();       var step = 6, w = offset.width - step;       var top = 0, left = 0, right;       if (this.datamodel.dir == 'up') {         top = (offset.top + offset.height + 8) + 'px';       } else {         top = (offset.top - this.el.offset().height - 8) + 'px';       }        left = (offset.left + 2) + 'px';        if (offset.left + (parseInt(this.width) || w) > this.windowWidth) {         this.el.css({           width: this.width || w,           top: top,           right: '2px'         });       } else {         this.el.css({           width: this.width || w,           top: top,           left: left         });       }        if (this.triangleLeft) {         this.triangleEl.css({ 'left': this.triangleLeft, 'right': 'auto' });       }       if (this.triangleRight) {         this.triangleEl.css({ 'right': this.triangleRight, 'left': 'auto' });       }     },      addEvent: function ($super) {       $super();       this.on('onCreate', function () {         this.$el.removeClass('cui-layer');         this.$el.css({ position: 'absolute' });       });       this.on('onShow', function () {         this.setzIndexTop(this.el);       });     }    });  });

这里开始调用的,便可做简单实现:

'click .demo1': function (e) {   if (!this.demo1) {     var data = [{ name: '<span class="center">普通会员</span>' },     { name: '<span class="center">vip</span>' },     { name: '<span class="center">高级vip</span>' },     { name: '<span class="center">钻石vip</span>'}];     this.list = new UIBubbleLayer({       datamodel: {         data: data       },       triggerEl: $(e.currentTarget),       width: '150px',       triangleLeft: '20px'     });   }   this.list.show(); }

稍作修改便可形成另一种样子:

怎样进行HTML5及CSS3气泡组件的实现

只不过我们还得考虑这个场景的发生,在项目过多过长时我们仍需要做处理:

怎样进行HTML5及CSS3气泡组件的实现

这里有很多办法可以处理,***个是直接传入maxHeight,如果高度超出的话便出现滚动条,第二个是动态在组件内部计算,查看组件与可视区域的关系

我们这里还是采用可视区域计算吧,于是对原组件做一些改造,加一个接口:

this.checkHeightOverflow();

就这一简单接口其实可分为几个段落的实现

***个接口为检测可视区域,这个可以被用户重写

isSizeOverflow

第二个接口是如果可视区域超出,也就是***个接口返回true时的处理逻辑

handleSizeOverflow

考虑到超出的未必是高度,所以这里height改为了Size

当然,这里会存在资源销毁的工作,所以会新增一个hide接口

isSizeOverflow: function () {   if (!this.el) return false;   if (this.el.height() > this.windowHeight * 0.8) return true;   return false; },  handleSizeOverflow: function () {   if (!this.isSizeOverflow()) return;    this.listWrapper.css({     height: (parseInt(this.windowHeight * 0.8) + 'px'),     overflow: 'hidden',     position: 'relative'   });    this.listEl.css({ position: 'absolute', width: '100%' });    //调用前需要重置位置   this.reposition();    this.scroll = new UIScroll({     wrapper: this.listWrapper,     scroller: this.listEl   }); },  checkSizeOverflow: function () {   this.handleSizeOverflow(); },  addEvent: function ($super) {   $super();   this.on('onCreate', function () {     this.$el.removeClass('cui-layer');     this.$el.css({ position: 'absolute' });   });   this.on('onShow', function () {      //检查可视区域是否超出;     this.checkSizeOverflow();     this.setzIndexTop(this.el);   });   this.on('onHide', function () {     if (this.scroll) this.scroll.destroy();   }); }

怎样进行HTML5及CSS3气泡组件的实现

到此,我们的功能也基本结束了,***实现一个定制化一点的功能,将我们的气泡组件变成黑色:

怎样进行HTML5及CSS3气泡组件的实现

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网html频道,感谢您对编程网的支持。

--结束END--

本文标题: 怎样进行HTML5及CSS3气泡组件的实现

本文链接: https://lsjlt.com/news/86204.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎样进行HTML5及CSS3气泡组件的实现
    怎样进行HTML5及CSS3气泡组件的实现,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。气泡组件在实际工作中非常普遍,无论是网...
    99+
    2024-04-02
  • html5+css3气泡组件的实现方法
    本篇内容主要讲解“html5+css3气泡组件的实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“html5+css3气泡组件的实现方法”吧! ...
    99+
    2024-04-02
  • html5+css3气泡组件的实现方式
    本篇内容主要讲解“html5+css3气泡组件的实现方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“html5+css3气泡组件的实现方式”吧! ...
    99+
    2024-04-02
  • CSS3怎么实现超酷炫的粘性气泡效果
    今天小编给大家分享一下CSS3怎么实现超酷炫的粘性气泡效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起...
    99+
    2024-04-02
  • React父子组件间的通信是怎样进行的
    目录父子组件通信方式父传子子传父ref标记(传递数据)非父子组件通信方式状态提升(兄弟通信)发布订阅模式context状态树传参(跨组件方案)React插槽children实现插槽多...
    99+
    2023-03-14
    React父子组件通信 React组件通信
  • vue-prop中怎么实现父组件向子组件进行传值
    这篇文章给大家介绍vue-prop中怎么实现父组件向子组件进行传值,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。vue-prop是父组件向子组件进行传递数据时使用的。例如子组件为chi...
    99+
    2024-04-02
  • vue父子组件进行通信方式是怎样的
    这篇文章主要介绍“vue父子组件进行通信方式是怎样的”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue父子组件进行通信方式是怎样的”文章能帮助大家解决问题。如图所示,父组件向子组件传递数据,可以通...
    99+
    2023-06-29
  • Java实战中怎样进行仓库管理系统的实现
    这篇文章主要为大家分析了Java实战中怎样进行仓库管理系统的实现的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Java实战中怎样进行仓库管理系统的实现”的知...
    99+
    2023-06-28
  • HTML5 Canvas渐进填充与透明实现图像的Mask效果是怎样的
    这篇文章将为大家详细讲解有关HTML5 Canvas渐进填充与透明实现图像的Mask效果是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 ...
    99+
    2024-04-02
  • 基于React封装组件的实现步骤是怎样的
    这篇文章将为大家详细讲解有关基于React封装组件的实现步骤是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言很多小伙伴在第一次尝试封装组件时会和我一样碰到许多问题,比如人家的组件会...
    99+
    2023-06-21
  • 怎样进行介绍Java 泛型的理解与等价实现
    这篇文章给大家介绍怎样进行介绍Java 泛型的理解与等价实现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数...
    99+
    2023-06-17
  • vue怎么实现快进后退的跑马灯组件
    这篇文章主要介绍了vue怎么实现快进后退的跑马灯组件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue怎么实现快进后退的跑马灯组件文章都会有所收获,下面我们一起来看看吧。用vue编写一个可以快进后退的跑马灯组...
    99+
    2023-06-29
  • Django组合条件的搜索功能实现是怎么样的
    这期内容当中小编将会给大家带来有关Django组合条件的搜索功能实现是怎么样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一直想着如何做组合条件的搜索!如:前端有三个输入框....输入后过滤,后台写一条...
    99+
    2023-06-04
  • vue使用v-model进行跨组件绑定的基本实现方法
    大家好,今天我们来说一下使用v-model实现父子组件的绑定效果 1:简单版代码如下: 父组件: <template> <div> // 3:使用...
    99+
    2024-04-02
  • 如何进行基于el-table封装的可拖拽行列、选择列组件的实现
    本篇文章为大家展示了如何进行基于el-table封装的可拖拽行列、选择列组件的实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。效果需要环境vue elementUI 拖拽插件Sortable.js...
    99+
    2023-06-22
  • 怎么使用elementUI组件实现表格的分页及搜索功能
    今天小编给大家分享一下怎么使用elementUI组件实现表格的分页及搜索功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。主...
    99+
    2023-07-05
  • python监控日志中的报错并进行邮件报警怎么实现
    今天小编给大家分享一下python监控日志中的报错并进行邮件报警怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实现思...
    99+
    2023-07-02
  • linux系统更新正在运行进程的可执行文件需要注意的text file busy的原因及解决方法是怎样的
    linux系统更新正在运行进程的可执行文件需要注意的text file busy的原因及解决方法是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。最近发现很多同学不知道线上...
    99+
    2023-06-13
  • windows系统中实现磁盘满额自动邮件报警的具体思路及操作步骤是怎样的
    windows系统中实现磁盘满额自动邮件报警的具体思路及操作步骤是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  Windows系统下,如果出现在软件中的磁盘满了,那么...
    99+
    2023-06-14
  • 蓝牙聊天App设计3:Android Studio制作蓝牙聊天通讯软件(完结,蓝牙连接聊天,结合生活情景进行蓝牙通信的通俗讲解,以及代码功能实现,内容详细,讲解通俗易懂)
    前言:蓝牙聊天App设计全部有三篇文章(一、UI界面设计,二、蓝牙搜索配对连接实现,三、蓝牙连接聊天),这篇文章是:三、蓝牙连接聊天。 课程1:Android Studio小白安装教程,以及第一个An...
    99+
    2023-10-22
    android studio 生活 android java wechat
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作