如何用JavaScript写一个简单的折叠面板,代码是什么
Admin 2022-06-29 群英技术资讯 419 次浏览
本文实例为大家分享了vue.js实现简易折叠面板的具体代码,供大家参考,具体内容如下
代码如下:
主文件:app.vue
<template> <div id="app"> <img alt="Vue logo" src="./assets/logo.png"> <collpase> <collpase-item :title="item.name" :showAnimation="true" v-for="(item, i) in chapterList" :key="i" > <div class="list" v-for="(it, index) in item.list" :key="index"> {{it.name}} </div> </collpase-item> </collpase> </div> </template> <script> import Collpase from './components/Collpase.vue'; import CollpaseItem from './components/CollpaseItem.vue' export default { name: 'App', data() { return { chapterList: [ { name: '标题一', list: [ { name: '是是是是是是所' }, { name: '啊啊啊啊' } ] }, { name: '标题二', list: [ { name: '是是是是是是所' }, { name: '啊啊啊啊' }, { name: '啊啊啊啊' } ] } ] } }, components: { Collpase, CollpaseItem, } } </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
子组件:
<template> <div class="collapse"> <slot /> </div> </template> <script> export default { name: 'Collapse', props: { accordion: { type: [Boolean, String], default: false } }, provide() { return { collapse: this } }, created() { this.childrens = [] }, methods: { onChange() { let activeItem = [] this.childrens.forEach((vm) => { if (vm.isOpen) { activeItem.push(vm.nameSync) } }) this.$emit('change', activeItem) } } } </script> <style lang="css" scoped> .collapse { width: 100%; display: flex; flex: 1; flex-direction: column; } </style>
子组件:
<template> <div> <div :class="{ 'collapse-disabled': disabled,'collapse-cell--notdisabled': !disabled, 'collapse-cell--open': isOpen,'collapse-cell--hide':!isOpen }" class="collapse-cell"> <div :class="{ 'collapse-disabled': disabled}" class="collapse-cell__title" @click="onClick"> <span class="collapse-cell__title-text">{{ title }}</span> <img :class="{ 'active': isOpen, 'active-animation': showAnimation === true }" class="title-arrow" src="https://static-mumway.oss-cn-zhangjiakou.aliyuncs.com/NetworkFrontEnd/wsj/yslbq/btn_dropdown.png"/> </div> <div :class="{'collapse-cell__content--hide':!isOpen}" class="collapse-cell__content"> <div :class="{ 'active-animation': showAnimation === true }" class="collapse-cell__wrapper" :style="{'transform':isOpen?'translateY(0)':'translateY(-50%)','-webkit-transform':isOpen?'translateY(0)':'translateY(-50%)'}"> <slot /> </div> </div> </div> </div> </template> <script> export default { name: 'UniCollapseItem', props: { title: { // 列表标题 type: String, default: '' }, name: { // 唯一标识符 type: [Number, String], default: 0 }, disabled: { // 是否禁用 type: Boolean, default: false }, showAnimation: { // 是否显示动画 type: Boolean, default: false }, open: { // 是否展开 type: Boolean, default: false }, thumb: { // 缩略图 type: String, default: '' } }, data() { return { isOpen: false } }, watch: { open(val) { this.isOpen = val } }, inject: ['collapse'], created() { this.isOpen = this.open this.nameSync = this.name ? this.name : this.collapse.childrens.length this.collapse.childrens.push(this) if (String(this.collapse.accordion) === 'true') { if (this.isOpen) { let lastEl = this.collapse.childrens[this.collapse.childrens.length - 2] if (lastEl) { this.collapse.childrens[this.collapse.childrens.length - 2].isOpen = false } } } }, methods: { onClick() { if (this.disabled) { return } if (String(this.collapse.accordion) === 'true') { this.collapse.childrens.forEach(vm => { if (vm === this) { return } vm.isOpen = false }) } this.isOpen = !this.isOpen this.collapse.onChange && this.collapse.onChange() this.$forceUpdate() } } } </script> <style lang="css" scoped> .collapse-cell { flex-direction: column; border-color: #f0f0f0; border-bottom-width: 1px; } .collapse-cell--open { background-color: #fff; } .collapse-disabled { cursor: not-allowed !important; } .collapse-cell--hide { height: 48px; } .active-animation { transition-property: transform; transition-duration: 0.3s; transition-timing-function: ease; } .collapse-cell__title { border-bottom: 1px solid #f0f0f0; padding: 12px 20px; position: relative; display: flex; width: 100%; box-sizing: border-box; height: 44px; line-height: 44px; flex-direction: row; justify-content: space-between; align-items: center; cursor: pointer; } .collapse-cell__title-img { margin-right: 10px; } .title-arrow { width: 22px; height: 14px; } .active { transform: rotate(180deg); } .collapse-cell__title-text { flex: 1; font-size: 16px; margin-right: 16px; white-space: nowrap; color: #333333; font-weight: bold; lines: 1; overflow: hidden; text-overflow: ellipsis; } .collapse-cell__content { overflow-x: hidden; } .collapse-cell__wrapper { display: flex; flex-direction: column; } .collapse-cell__content--hide { height: 0px; line-height: 0px; } </style>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
jquery中show()方法不起作用怎么办原因:show() 适用于通过 jQuery 方法和 CSS 中 display:none 隐藏的元素(不适用于通过 visibility:hidden 隐藏的元素)。visibility:hidden
JavaScript隐藏option元素的方法是什么?对于实现隐藏option元素,首先我们需要获取指定option对象,然后在使用option对象.style.display="none语句将指定option选项隐藏即可,那么具体怎样实现呢?文中有示例供大家参考,感兴趣的朋友可以了解看看。
使用node.js怎么样实现发送邮件提醒?邮件在学习和工作中的使用还是比较多的,有时候我们需要定期的发送一些邮件,而要确保能按时发送不忘记,定时自动邮件提醒功能还是很关键的,下面我们就来看看这个功能要怎样做?
最近开发React 使用tsx编写,没有找到什么好的随机生成验证码的插件,自己就手撸了一个,废话不多话,直接上代码。
这篇文章主要给大家分享jQuery替换掉所有的类名的方法,小编觉得挺实用的,因此分享给大家做个参考,文中示例代码介绍的很详细,感兴趣的朋友接下来一起跟随小编学习一下吧。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008