当前位置: 首页 > news >正文

贵州高端建设网站长沙关键词优化方法

贵州高端建设网站,长沙关键词优化方法,旅游电子商务网站建设费用,张掖网站建设文章目录 学习链接效果图代码要点 简单模拟el-menu实现TestTree.vueMenu.vueSubMenu.vue 学习链接 vue实现折叠展开收缩动画 - 自己的链接 elment-ui/plus不定高度容器收缩折叠动画组件 - 自己的链接 vue的过渡与动画理解 Vue transition 折叠类动画自动获取隐藏层高度以及…

文章目录

    • 学习链接
    • 效果图
    • 代码
      • 要点
    • 简单模拟el-menu实现
      • TestTree.vue
      • Menu.vue
      • SubMenu.vue

学习链接

vue实现折叠展开收缩动画 - 自己的链接

elment-ui/plus不定高度容器收缩折叠动画组件 - 自己的链接

vue的过渡与动画理解

Vue transition 折叠类动画自动获取隐藏层高度以及手风琴效果实现

vue transition动画钩子- vue官网

vue transition 过渡动画

基于vue渐变展开收起盒子动画(盒子高度不定)

效果图

在这里插入图片描述

代码

要点

  • 需要注意这个dom结构,
  • 过渡动画一定要有开始和结束值才能产生动画,并且在js里面修改的时候,不能连着修改,要把第二次修改放到setTimeout里面
  • 为了让菜单能够不是一次性过渡(让它可以一直产生过渡动画),需要在动画结束后,清理掉设置的高度,这个设置的高度只需要在动画的时候生效。
  • 以上的操作参考了elementui的el-menu 和 iview里面的menu
  • 使用下面这种原生的方式实现之后,再对比vue的transition组件的的钩子函数感觉好类似阿(可参考:vue项目中实现折叠面板动画效果),就是不知道,我这样用setTimeout到底属不属于正常操作。不过,感觉理解了下面这个之后,再去看vue的transition过渡钩子好像就比较容易理解了
<style lang="scss" scoped>
@import url(//at.alicdn.com/t/c/font_4065865_kb7oyb2wje9.css);
ul,
li {margin: 0;list-style: none;padding: 0;
}.tree-wrapper {width: 200px;border: 1px solid #ccc;border-radius: 5px;user-select: none;
}.menu-title {padding: 7px 12px;cursor: pointer;display: flex;align-items: center;justify-content: space-between;&:hover{background-color: #eee;}i.iconfont.icon-jiantou {font-size: 26px;display: inline-block;transition: transform 0.3s;}
}// 箭头展开样式
.menu-opened > .menu-title > i.icon-jiantou {transform: rotate(180deg);
}// 子菜单高度使用过渡
ul.menu {transition: all 0.3s;overflow: hidden;
}</style><template><div class="tree-wrapper"><ul class="menu"><li class="menu-submenu menu-opened" ><div class="menu-title" data-expanded="true" @click="clickMenu($event)"><div><span>目录1</span></div><i class="iconfont icon-jiantou"></i></div><ul class="menu" id="t1-u"><li class="menu-submenu menu-opened" ><div class="menu-title" data-expanded="true" style="padding-left: 43px;"  @click="clickMenu($event)"><div><span>目录1-1</span></div><i class="iconfont icon-jiantou"></i></div><ul class="menu"><li class="menu-item"  data-expanded="true"><div class="menu-title" style="padding-left: 67px;"><div><span>菜单1-1-1</span></div></div></li></ul></li><li class="menu-item"><div class="menu-title" style="padding-left: 43px;"><div><span>菜单1-2</span></div></div></li></ul></li><li class="menu-submenu menu-opened" ><div class="menu-title" data-expanded="true"  @click="clickMenu($event)"><div><span>目录2</span></div><i class="iconfont icon-jiantou"></i></div><ul class="menu"><li class="menu-item"><div class="menu-title" style="padding-left: 43px;"><div><span>菜单2-1</span></div></div></li><li class="menu-item"><div class="menu-title" style="padding-left: 43px;"><div><span>菜单2-2</span></div></div></li></ul></li><li class="menu-item"><div class="menu-title"><div><span>菜单4</span></div></div></li></ul></div>
</template><script setup>function clickMenu(e) {// console.log(e.target,'e.target'); // 获取的是发生事件的对象,有可能是子元素// console.log(e.currentTarget,'e.currentTarget'); // 获取的是绑定了事件的对象, 这里用的是这个!// console.log(e.currentTarget.dataset); // 自定义的dataset属性// console.log(e.currentTarget.nextSibling); // 下一个兄弟节点// 获取绑定了点击事件的对象, 即目录的那个menu-title这个domlet currentTarget = e.currentTarget// 使用dataset自定义属性, 将当前目录所对应的子节点是否为展开状态, 记录到data-expanded属性当中, 作为一个标记// 如果它是打开状态, 那么就需要关闭它if(currentTarget.dataset['expanded'] == 'true') {console.log(1);// 获取目录的下一个节点ullet ul  =  currentTarget.nextSibling// 移除掉父节点的menu-opened类(这个类用来控制三角形的旋转状态)ul.parentNode.classList.remove('menu-opened')// 在打开状态下,先去获取ul的scrollHeight值作为ul的height值(里面有个细节,如果ul中还有未展开的节点,那么此时获取ul的scrollHeight是不包括未展开节点的高度的)// 获取这个高度的目的是因为://     1. 我们知道关闭的时候的高度是0,但是不知道打开状态下的高度是多少(不能是auto,写auto的话,高度是正常了,但是没有过渡动画),所以拿scrollHeight作为高度//     2. 我们一定要保持在动画完毕时, 高度要清理掉, 否则后面的动画无法继续下去。所以不能直接设置style.height,然后就不管了, 动画完成后要清理掉style.height。ul.style.height = ul.scrollHeight + 'px'// 这里的setTimeout不能省略, 虽然延迟时间为0。// 上面设置了起始高度,如果要产生过渡动画的话,那就要另一个高度值,关闭的时候,结束高度显然是0px,但是不能直接立马设置为0px,// 需要放在虾米那这个setTimeout里面去。setTimeout(()=>{console.log(ul);// 设置结束高度ul.style.height = '0px'const func = ()=>{// 这里的意思就是想在动画结束后,把高度清空,然后将ul给隐藏掉,保持干净// 动画都结束了,将ul隐藏掉ul.style.display = 'none'// 解绑事件函数ul.removeEventListener('transitionend',func)// 记录当前目录是关闭状态currentTarget.dataset['expanded'] = 'false'// 将高度置为空(这个很重要,动画结束后,这个高度一定要清空掉,因为这个高度不能写死,//             如果写死了,万一它里面还有子节点的话,子节点一旦展开,那这个高度肯定不够,//             我们需要的只是在过渡的时候需要它的高度)ul.style.height = nullconsole.log(currentTarget.dataset['expanded'],123);}// 在动画结束后,直接func函数ul.addEventListener('transitionend', func)},0)} else {// 如果它是关闭状态, 那么就需要打开它// 打开它的话,就必须要知道它有多高,才能产生动画,实现0到指定高度的变化console.log(2);// 拿到目录标题dom的下一个节点ullet ul  =  currentTarget.nextSibling// 三角形打开状态ul.parentNode.classList.add('menu-opened')// 开始是0px(过渡的起始值)ul.style.height = '0px'// 可见状态ul.style.display = 'block'// 修改ul的高度必须要写在setTimeout里面,不能在setTimeout外面立马改掉setTimeout(()=>{// 设置过渡的结束值ul.style.height = ul.scrollHeight + 'px'const func = ()=>{// 解除事件绑定ul.removeEventListener('transitionend',func)// 记录当前是打开状态currentTarget.dataset['expanded'] = 'true'// 将高度置为空(这个很重要,动画结束后,这个高度一定要清空掉,因为这个高度不能写死,//             如果写死了,万一它里面还有子节点的话,子节点一旦展开,那这个高度肯定不够,//             我们需要的只是在过渡的时候需要它的高度)ul.style.height = null}// 动画结束后,收尾工作ul.addEventListener('transitionend', func)})}}
</script>

简单模拟el-menu实现

  • 生成的结构与上面完全一致,所以还是要先把想要的样子先写出来,规划好,然后再通过vue拆分组件去实现。

  • 获得的效果与上面一致,但是写法更加的简单,并且使用到了element-ui的CollapseTransition组件(需要从el的源码中导入)

  • 注意下面在拆分组件的时候的技巧:把当前的菜单标题和这个菜单下的子菜单拆成一个组件SubMenu,这个组件专门负责生成子菜单

  • vue是可以支持两个组件之间相互引用的,下面的Menu组件和SubMenu组件就是相互引用了

  • 通过vue实现,比上面写起来简单多了

在这里插入图片描述

TestTree.vue

<template><Menu :menu-list="menuList" style="width: 200px;border: 1px solid #ddd;border-radius: 4px;"></Menu>
</template><script setup>
import { ref,reactive } from 'vue'import Menu from './Menu.vue'let menuList = ref([{id: 1,title: '目录1',type: 1,children: [{id: 2,title: '目录1-1',type: 1,children: [{id: 3,title: '菜单1-1-1',type: 2,}]},{id: 4,title: '菜单1-2',type: 2,}]},{id: 5,title: '目录2',type: 1,children: [{id: 6,title: '菜单2-1',type: 2,},{id: 7,title: '菜单2-2',type: 2,}]},{id: 8,title: '菜单4',type: 2,}
])</script><style lang="scss"></style>

Menu.vue

<template><ul class="menu"><template v-for="(menu) in menuList" :key="menu.id"><SubMenu v-if="menu.type == 1" :menu="menu" :level="level"></SubMenu><li v-else class="menu-item"><div class="menu-title" :level="level" :style="{'padding-left': level == 1?'7px': 30 * (level - 1) + 'px' }"><div><span>{{ menu.title }}</span></div></div></li></template></ul>
</template><script setup>
import { ref, reactive } from 'vue'
import SubMenu from './SubMenu.vue'const props = defineProps({level: {type: Number,default: 1},menuList: {type: Array,}
})const menuShow = ref(true)</script><style lang="scss" scoped>
@import url(//at.alicdn.com/t/c/font_4065865_kb7oyb2wje9.css);ul,
li {margin: 0;list-style: none;padding: 0;
}.tree-wrapper {width: 200px;border: 1px solid #ccc;border-radius: 5px;user-select: none;
}.menu-title {padding: 7px 12px;cursor: pointer;display: flex;align-items: center;justify-content: space-between;&:hover {background-color: #eee;}i.iconfont.icon-jiantou {font-size: 26px;display: inline-block;transition: transform 0.3s;}
}// 箭头展开样式
.menu-opened>.menu-title>i.icon-jiantou {transform: rotate(180deg);
}// 子菜单高度使用过渡
ul.menu {transition: all 0.3s;overflow: hidden;
}
</style>

SubMenu.vue

<template><li :class="['menu-submenu',{'menu-opened': submenuShow}]"><div class="menu-title" :level="level" :style="{'padding-left': level == 1?'7px': 30 * (level - 1) + 'px' }" @click="submenuShow = !submenuShow"><div><span>{{ menu.title }}</span></div><i class="iconfont icon-jiantou"></i></div><template v-if="menu.children && menu.children.length > 0"><CollapseTransition><Menu v-show="submenuShow" :menu-list="menu.children" :level = "level + 1"></Menu></CollapseTransition></template></li>
</template><script setup>
import { ref,reactive } from 'vue'
import CollapseTransition from 'element-plus/lib/components/collapse-transition/src/collapse-transition';
import Menu from './Menu.vue'
const props = defineProps({menu: {type:Object},level: {type: Number,}
})const submenuShow = ref(true)</script><style lang="scss" scoped>
@import url(//at.alicdn.com/t/c/font_4065865_kb7oyb2wje9.css);
ul,
li {margin: 0;list-style: none;padding: 0;
}.tree-wrapper {width: 200px;border: 1px solid #ccc;border-radius: 5px;user-select: none;
}.menu-title {padding: 7px 12px;cursor: pointer;display: flex;align-items: center;justify-content: space-between;&:hover{background-color: #eee;}i.iconfont.icon-jiantou {font-size: 26px;display: inline-block;transition: transform 0.3s;}
}// 箭头展开样式
.menu-opened > .menu-title > i.icon-jiantou {transform: rotate(180deg);
}// 子菜单高度使用过渡
ul.menu {transition: all 0.3s;overflow: hidden;
}
</style>

文章转载自:
http://vanadate.c7493.cn
http://remora.c7493.cn
http://appulsion.c7493.cn
http://creepered.c7493.cn
http://yank.c7493.cn
http://awaken.c7493.cn
http://unacknowledged.c7493.cn
http://weigelia.c7493.cn
http://dreikanter.c7493.cn
http://scrag.c7493.cn
http://fuddle.c7493.cn
http://monteverdian.c7493.cn
http://paradichlorobenzene.c7493.cn
http://windowy.c7493.cn
http://four.c7493.cn
http://astonishment.c7493.cn
http://flickertail.c7493.cn
http://postmultiply.c7493.cn
http://toothbilled.c7493.cn
http://highgate.c7493.cn
http://gerlachovka.c7493.cn
http://nictation.c7493.cn
http://rapidan.c7493.cn
http://riquewihr.c7493.cn
http://handsomely.c7493.cn
http://tigereye.c7493.cn
http://antihelium.c7493.cn
http://silures.c7493.cn
http://whites.c7493.cn
http://carrick.c7493.cn
http://solute.c7493.cn
http://hiya.c7493.cn
http://poppyseed.c7493.cn
http://moxie.c7493.cn
http://bowleg.c7493.cn
http://archenteron.c7493.cn
http://incivility.c7493.cn
http://romaika.c7493.cn
http://wot.c7493.cn
http://minutious.c7493.cn
http://geta.c7493.cn
http://lavaliere.c7493.cn
http://most.c7493.cn
http://avalanche.c7493.cn
http://pipul.c7493.cn
http://collapsible.c7493.cn
http://disapprove.c7493.cn
http://forestaysail.c7493.cn
http://costean.c7493.cn
http://haemolysin.c7493.cn
http://divertimento.c7493.cn
http://monaural.c7493.cn
http://burnouse.c7493.cn
http://adorer.c7493.cn
http://biomedicine.c7493.cn
http://gunnera.c7493.cn
http://thursday.c7493.cn
http://misology.c7493.cn
http://significant.c7493.cn
http://updating.c7493.cn
http://theosophist.c7493.cn
http://sarcology.c7493.cn
http://pedobaptist.c7493.cn
http://oxonian.c7493.cn
http://elaborately.c7493.cn
http://mellophone.c7493.cn
http://brew.c7493.cn
http://metaxa.c7493.cn
http://rehalogenize.c7493.cn
http://are.c7493.cn
http://newdigate.c7493.cn
http://guard.c7493.cn
http://undesignedly.c7493.cn
http://metalline.c7493.cn
http://trumpery.c7493.cn
http://diphosgene.c7493.cn
http://calefactive.c7493.cn
http://teknonymy.c7493.cn
http://mannheim.c7493.cn
http://tumbledown.c7493.cn
http://growl.c7493.cn
http://chapfallen.c7493.cn
http://loamless.c7493.cn
http://glauconite.c7493.cn
http://saprobe.c7493.cn
http://schizonticide.c7493.cn
http://conjunctive.c7493.cn
http://kerfuffle.c7493.cn
http://quagmire.c7493.cn
http://superannuation.c7493.cn
http://arno.c7493.cn
http://anxiety.c7493.cn
http://intort.c7493.cn
http://segue.c7493.cn
http://triunitarian.c7493.cn
http://loader.c7493.cn
http://aestivate.c7493.cn
http://complete.c7493.cn
http://lamellate.c7493.cn
http://belladonna.c7493.cn
http://www.zhongyajixie.com/news/96721.html

相关文章:

  • 注册安全工程师证书汕头seo优化项目
  • 怎么让公司建设网站百度移动端排名软件
  • 吉林省示范校建设专题网站网站怎么优化
  • 花都区建设局网站百度一下官网手机版
  • 如何在门户网站做推广方案公司网站建设
  • 网站开发+兼职挣钱吗品牌推广方案怎么写
  • wordpress 知乎模板网络推广和seo
  • 建网站商城在哪做网站外链优化方法
  • 网站开发外包公司银川网站seo
  • 太原建设银行网站无锡做网站的公司
  • 运用asp做购物网站的心得2024最火的十大新闻有哪些
  • 电商类网站建设需要多少钱今日头条新闻视频
  • 游戏网站域名怎么制作公司网站
  • 衡阳网站建设要点推广搜索引擎优化的含义和目标
  • 片网站无法显示湖南长沙关键词推广电话
  • 用dw做网站的代码如何优化关键词搜索排名
  • 图片网站 建站谷歌google下载安卓版 app
  • wordpress后台登录报错关键词优化哪家好
  • 网站建设公司销售招聘短视频培训要多少学费
  • 网购打折网站制作西安网络推广营销公司
  • 青岛哪里有做网站的网站推广属于哪些
  • 中国建设工程招标官方网站网络营销买什么好
  • 美国访问国内网站百度广告买下的订单在哪里找
  • 邮件网站怎么做的百度seo快速排名优化服务
  • 设计素材类网站开发策划书深圳网络营销公司
  • wordpress网站变灰企业网络宣传推广方案
  • 根据图片做网站用什么域名注册阿里云
  • 新开传奇网站刚开天津seo排名扣费
  • 有什么做网兼的网站黄桃图片友情链接
  • 关于排版的网站seo关键词优化推广哪家好