15. 实现模块 hover 时的滑动切换-使用饿了吗官网举例

64 阅读3分钟

饿了么的官网展示框 当hover 的时候展开,并且显示字体和更多信息

2d0925d32bd695968f6a6d8ca588145.png

  • 思路-使用 css3 新特性之一的 display-flex 和 flex-shrink 来实现;
    • display 显示器,展示,显露,在这里我理解为展现形式-以什么形式方法在页面上存在。
    • flex 弯曲,屈伸,可活动的,如它的字面意思,display就是为 所在的 dom 元素开启一个可以自由伸展,收缩的容器,也叫作弹性盒子,它的子元素,我们可以称他们为弹性因子,是弹性盒子的每一项。
    • flex-grow 在盒子里可以伸展的空间,如果一个容器里面的空间是有剩余的,给一个弹性因子设置flex-grow:1;指的是这一项将剩余的空间沾满,如果是两个因子同时设置了flex-grow:1;那就是两个子项平分剩余的空间。
    • 也就是说所有弹性因子 的 flex-grow 值会被累加起来,与剩余空间相除,计算后返回相应的占比值。
  • 首先给它套一个大盒子,并开启弹性盒子
  • 之后给选中的子项设置 flex-grow 让他占据剩余空间,它就撑大了,可以在上图中看到,它是有一项在默认展示的,正巧与felx的逻辑相似,且实现简单。

布局

  • 这是使用的 justify-content:space-between;设置的靠齐方式-并不理想 image.png
  • 这是使用 justify-content:space-around,符合理想 image.png
<template>
<div class="box">
   <div class="elema">
      <div class="item" v-for="(itemContent,index) in data" :key="index">{{ itemContent }}</div>
   </div>
你好
</div>
</template>

<script>
export default {
name:'',
data() {
   return {
      data:['蜂鸟配送','合作加盟','商家开店','及时零售','外卖点单']
   }
},
}
</script>

<style scoped lang="less">

.elema{
   margin: 0 auto;
   width: 600px;
   height: 300px;
   background-color: rgb(14 90 131);
   border-radius: 4px;

   display: flex;
   justify-content: space-around;
   align-items: center;

}
.item{
   border-radius: 5px;
   box-sizing: border-box;
   width: 45px;
   height: 200px;
   background-color: skyblue;
   color: white;
   padding: 50px 15px;
   text-align: center;
}

</style>
  • 接下来就是设置flex-grow 实现一个大图
  • 由于子项都是渲染的 我使用 动态条件来控制样式的显示与隐藏
  • <div class="item" v-for="(itemContent,index) in data" :key="index" :class="{'active': index == showBig}" >{{ itemContent }}</div> 这里是class的另一个写法, :class="{'active': index == showBig}"前面类名的成立与否取决于它的值是否为true。

image.png

  • 展开一项成立,接下来给它绑定事件,就可以基本实现 官网上的效果了,如果想要一模一样还需要加上动画过渡,这里就交给你们啦。
  • image.png
  • active 这一个样式是通过对比是否是当前索引判断的,所以,当鼠标移入的时候切换索引就可以实现动态效果。


<template>
<div class="box">
   <div class="elema">
      <div class="item" v-for="(itemContent,index) in data" :key="index"
         :class="{'active': index == showBig}"
         @mouseenter="hoverEnter(index)"
         >{{ itemContent }}</div>
   </div>
你好
</div>
</template>

<script>
export default {
name:'',
data() {
   return {
      data:['蜂鸟配送','合作加盟','商家开店','及时零售','外卖点单'],
      showBig: 0,
   }
},
methods:{
   hoverEnter(index){
      console.log('进入');
      this.showBig = index
   },
}
}
</script>

<style scoped lang="less">

.elema{
   margin: 0 auto;
   width: 600px;
   height: 300px;
   background-color: rgb(14 90 131);
   border-radius: 4px;

   display: flex;
   justify-content: space-around;
   align-items: center;

}
.item{
   border-radius: 5px;
   box-sizing: border-box;
   width: 45px;
   height: 200px;
   background-color: skyblue;
   color: white;
   padding: 50px 15px;
   text-align: center;
}
.active{
   flex-grow: .8;
}
</style>