Vue+Element UI实现概要小弹窗的全过程


Posted in Vue.js onMay 30, 2021

场景:一个巡检单据有n个巡检明细,一个巡检明细有n个巡检项目。

实现效果:当鼠标移到明细行的概要图标时显示当前行的巡检项目卡片弹窗,移出弹窗时关闭弹窗

巡检单据详情

Vue+Element UI实现概要小弹窗的全过程

鼠标移到项目概要图标

Vue+Element UI实现概要小弹窗的全过程
Vue+Element UI实现概要小弹窗的全过程

效果实现

data里面声明的变量

// 概要弹窗
outlineDialog: false,
// 当前行标准概要
standSummary: [],
// 概要弹窗位置控制
outlineCard: {
    pageY: null,
    pageX: null,
    display: "none"
}

1、弹窗代码

outlineDialog:默认false,概要弹窗显示标志
outlineStyle:弹窗的动态样式设置,在computed进行监控和进行双向数据绑定展示
leave:鼠标离开弹窗卡片的事件

<!-- 项目概要 -->
<div class="summary-div" v-show="outlineDialog" ref="box-cardDiv" :style="outlineStyle"  @mouseleave="leave">
    <div class="summary-title">项目概要</div>
    <ul class="summary-ul">
        <li class="summary-li"><span>标准名称</span><span>是否必填</span><span>是否显示</span></li>
        <li v-for="(item, index) in standSummary" :key="index" class="summary-li"><span>{{item.inspectdetailName}}</span><span>{{item.isRequired ? '是':'否'}}</span> <span>{{item.isDisplay ? '是':'否'}}</span> </li>
    </ul>
</div>

2、弹窗样式代码

<style lang="scss">
#box-cardDiv {
    position: absolute;
}

.summary-div {
    border: solid 1px #eee;
    background-color: #fff;
    border-radius: 4px;
    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
    padding: 10px 10px 0 10px;
    width: 300px;
    position: absolute;
    font-size: 13px;
}

.summary-ul {
    list-style: none;
    padding-left: 0;
    max-height: 350px;
    overflow-x: hidden;
    overflow-y: auto;
}

.summary-li {
    margin: 10px 10px 15px 10px;
    width: 250px;
    text-overflow: ellipsis;
    overflow: hidden;
    /* white-space: nowrap; */
    display: flex;

    span {
        margin: auto;
        width: 55px;
    }
}

.summary-li:first-child span:not(:first-child) {
    margin-left: 40px;
}

.summary-li:not(:first-child) span:nth-child(1) {
    width: 90px;
}

.summary-li:not(:first-child) span:nth-child(2) {
    width: 50px;
    margin-left: 45px;
}

.summary-li:not(:first-child) span:nth-child(3) {
    margin-left: 60px;
}

.summary-title {
    color: #cccccc;
    margin-left: 10px;
}
</style>

3、明细表格的项目概要列代码

checkStandSunmmary:鼠标移到概要图标的事件
<el-table-column label="项目概要" align="center" width="500">
    <template slot="header">
        <span>项目概要</span>
        <span class="vertical"></span>
    </template>
    <template slot-scope="scope">
        <div class="col-summmary-div">
            <span class="col-summmary-format"><span>{{scope.row.firstListItem}}</span></span>
            <span>&nbsp;等&nbsp;{{scope.row.equInspectplanItemList.length}}&nbsp;项&nbsp;</span>
            <i class="el-icon-arrow-down" @mouseenter="checkStandSunmmary(scope.row)"></i>
        </div>
    </template>
</el-table-column>

4、outlineStyle 弹窗卡片动态样式控制

明细在页面底端的时候卡片照旧展示会被盖掉一部分,需要根据概要图标的位置动态计算卡片打开的位置,如果在底端就把卡片往上边打开
computed: {
    outlineStyle() {
        let h = 45 * this.standSummary.length;
        let browser = document.body.clientHeight - 50;
        let pageY = this.outlineCard.pageY - 50;
        let pageX = this.outlineCard.pageX - 280;
        if (pageY + h > browser) {
            return `left: ${ pageX }px; top: ${ (pageY-h) }px; position: absolute; display: ${ this.outlineCard.display }`;
        } else {
            return `left: ${ pageX }px; top: ${ (pageY-60) }px; position: absolute; display: ${ this.outlineCard.display }`;
        }
    }
},

5、leave 鼠标离开弹窗卡片的事件

当鼠标移出卡片把卡片display样式设置为none同时设置v-show为false弹窗不展示
/**
 * 鼠标离开标准概要
 */
leave() {
    this.outlineCard.display = "none";
    this.outlineDialog = false;
},

6、checkStandSunmmary 鼠标移到概要图标的事件

打开弹窗卡片
获取当前行的检验项目集合
获取当前鼠标在浏览器的X轴Y轴位置
动态设置弹窗卡片样式为null(display除了写none为不显示其他值都是显示)

/**
 * 当前行标准概要
 */
checkStandSunmmary(row) {
    this.outlineDialog = true;
    this.standSummary = row.equInspectplanItemList;
    this.outlineCard.pageY = window.event.clientY;
    this.outlineCard.pageX = window.event.clientX;
    this.outlineCard.display = null;
},

总结

到此这篇关于Vue+Element UI实现概要小弹窗的文章就介绍到这了,更多相关Vue+Element UI小弹窗内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
Vue+penlayers实现多边形绘制及展示
Dec 24 Vue.js
如何在vue-cli中使用css-loader实现css module
Jan 07 Vue.js
vue实现验证用户名是否可用
Jan 20 Vue.js
Vue仿Bibibili首页的问题
Jan 21 Vue.js
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 Vue.js
vue keep-alive的简单总结
Jan 25 Vue.js
vue 组件基础知识总结
Jan 26 Vue.js
用vite搭建vue3应用的实现方法
Feb 22 Vue.js
vue前端和Django后端如何查询一定时间段内的数据
Feb 28 Vue.js
如何理解Vue简单状态管理之store模式
May 15 Vue.js
如何用vue实现网页截图你知道吗
Nov 17 Vue.js
vue css 相对路径导入问题级踩坑记录
Jun 05 Vue.js
vue-cli4.5.x快速搭建项目
Vue CLI中模式与环境变量的深入详解
springboot+VUE实现登录注册
May 27 #Vue.js
vue+springboot实现登录验证码
vue+spring boot实现校验码功能
May 27 #Vue.js
vue-cropper组件实现图片切割上传
May 27 #Vue.js
vue-cropper插件实现图片截取上传组件封装
May 27 #Vue.js
You might like
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
学习PHP session的传递方式
2016/06/15 PHP
Thinkphp连表查询及数据导出方法示例
2016/10/15 PHP
php中final关键字用法分析
2016/12/07 PHP
浅谈PHP安全防护之Web攻击
2017/01/03 PHP
textarea的value是html文件源代码,存成html文件的代码
2007/04/20 Javascript
JS 获取浏览器和屏幕宽高等信息代码
2014/03/31 Javascript
javascript移出节点removeChild()使用介绍
2014/04/03 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
jquery仿QQ登录账号选择下拉框效果
2016/03/22 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
Bootstrap Table从零开始
2017/06/30 Javascript
详解使用webpack构建多页面应用
2017/12/21 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
vue h5移动端禁止缩放代码
2019/10/28 Javascript
[02:27]2018DOTA2亚洲邀请赛趣味视频之钓鱼大赛 谁是垂钓冠军?
2018/04/05 DOTA
简介Django框架中可使用的各类缓存
2015/07/23 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
python实现K最近邻算法
2018/01/29 Python
Python实现将多个空格换为一个空格.md的方法
2018/12/20 Python
Python读取指定日期邮件的实例
2019/02/01 Python
Python利用PyExecJS库执行JS函数的案例分析
2019/12/18 Python
基础的CSS3弹性盒Flexbox布局使用实例
2016/04/08 HTML / CSS
欧缇丽英国官方网站:Caudalie英国
2016/08/17 全球购物
Annoushka英国官网:英国奢侈珠宝品牌
2018/10/20 全球购物
adidas泰国官网:adidas TH
2020/07/11 全球购物
应届毕业生应聘自荐信范文
2014/02/26 职场文书
高考励志标语
2014/06/05 职场文书
班级学雷锋活动总结
2014/06/26 职场文书
英语三分钟演讲稿
2014/08/19 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
民事诉讼答辩状范文
2015/05/21 职场文书
成绩单家长意见
2015/06/03 职场文书
win11系统中dhcp服务异常什么意思? Win11 DHCP服务异常修复方法
2022/04/08 数码科技
Vue深入理解插槽slot的使用
2022/08/05 Vue.js