Vue-弹层显示样式

news2024/9/23 12:04:32

弹层显示样式1

这里插入图片描述
1.先将左侧样式写

<template>
  <div class='home-category'>
    <ul class="menu">
      <li v-for="i in 10" :key="i">
        <RouterLink to="/">居家</RouterLink>
        <RouterLink to="/">洗漱</RouterLink>
        <RouterLink to="/">清洁</RouterLink>
		//留着存放弹层位置
		<div class="layer"></div>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'HomeCategory'
}
</script>

<style scoped lang='less'>
.home-category {
  width: 250px;
  height: 500px;
  background: rgba(0,0,0,0.8);
  position: relative;
  z-index: 99;
  .menu {
    li {
      height: 50px;
      line-height: 50px;
      &:hover {
        background: @xtxColor;
      }
      a {
        margin-right: 4px;
        color: #fff;
        &:first-child {
          font-size: 16px;
        }
      }
    }
  }
}
</style>

在这里插入图片描述
2.然后渲染左侧数据

<template>
  <div class='home-category'>
    <ul class="menu">
      <li v-for="item in menuList" :key="item.id">
        <RouterLink :to="`/category/${item.id}`">{{item.name}}</RouterLink>
        <template v-if="item.children">
          <RouterLink
            v-for="sub in item.children"
            :key="sub.id"
            :to="`/category/sub/${sub.id}`">
            {{sub.name}}
          </RouterLink>
        </template>
      </li>
    </ul>
  </div>
</template>

<script>
import { useStore } from 'vuex'
import { reactive, computed } from 'vue'   
export default {
  name: 'HomeCategory',
  // 1. 获取vuex的一级分类,并且只需要两个二级分类
  // 2. 需要在组件内部,定义一个品牌数据
  // 3. 根据vuex的分类数据和组件中定义品牌数据,得到左侧分类完整数据(9分类+1品牌)数组
  // 4. 进行渲染即可
  setup () {  
    const brand = reactive({
      id: 'brand',
      name: '品牌',
      children: [{ id: 'brand-chilren', name: '品牌推荐' }]
    })    
    const store = useStore()
    //setup函数里使用Vuex里的数据  需要使用计算属性
    const menuList = computed(() => {
      const list = store.state.category.list.map(item => {
        return {
          id: item.id,
          name: item.name,
          // 防止初始化没有children的时候调用slice函数报错
          children: item.children && item.children.slice(0, 2)
        }
      })
      list.push(brand)
      return list
    })
    return { menuList }
  }
}
</script>

<style scoped lang='less'>
.home-category {
  width: 250px;
  height: 500px;
  background: rgba(0,0,0,0.8);
  position: relative;
  z-index: 99;
  .menu {
    li {
      padding-left: 40px;
      height: 50px;
      line-height: 50px;
      &:hover {
        background: @xtxColor;
      }
      a {
        margin-right: 4px;
        color: #fff;
        &:first-child {
          font-size: 16px;
        }
      }
    }
  }
}
</style>

3.接着写弹层样式
思路:
1.先写固定样式
2.写好之后 将样式隐藏
3.鼠标经过li 的时候 layer显示

<!-- 弹层 -->
    <div class="layer">
      <h4>分类推荐 <small>根据您的购买或浏览记录推荐</small></h4>
      <ul>
        <li v-for="i in 9" :key="i">
          <RouterLink to="/">
            <img src="https://yanxuan-item.nosdn.127.net/5a115da8f2f6489d8c71925de69fe7b8.png" alt="">
            <div class="info">
              <p class="name ellipsis-2">【定金购】严选零食大礼包(12件)</p>
              <p class="desc ellipsis">超值组合装,满足馋嘴欲</p>
              <p class="price"><i>¥</i>100.00</p>
            </div>
          </RouterLink>
        </li>
      </ul>
    </div>
//嵌套在上放的li中
  .layer {
    width: 990px;
    height: 500px;
    background: rgba(255,255,255,0.8);
    position: absolute;
    left: 250px;
    top: 0;
    display: none;
    padding: 0 15px;
    h4 {
      font-size: 20px;
      font-weight: normal;
      line-height: 80px;
      small {
        font-size: 16px;
        color: #666;
      }
    }
    ul {
      display: flex;
      flex-wrap: wrap;
      li {
        width: 310px;
        height: 120px;
        margin-right: 15px;
        margin-bottom: 15px;
        border: 1px solid #eee;
        border-radius: 4px;
        background: #fff;
        &:nth-child(3n) {
          margin-right: 0;
        }
        a {
          display: flex;
          width: 100%;
          height: 100%;
          align-items: center;
          padding: 10px;
          &:hover {
            background: #e3f9f4;
          }
          img {
              width: 95px;
              height: 95px;
          }
          .info {
            padding-left: 10px;
            line-height: 24px;
		    width: 190px;
            .name {
              font-size: 16px;
              color: #666;
            }
            .desc {
              color: #999;
            }
            .price {
              font-size: 22px;
              color: @priceColor;
              i {
                font-size: 16px;
              }
            }
          }
        }
      }
    }
  }
  &:hover {
    .layer {
      display: block;
    }
  }

4.渲染弹层数据
定义一个数据记录当前鼠标经过分类的ID,使用计算属性得到当前的分类推荐商品数据

    <ul class="menu">
+      <li v-for="item in menuList" :key="item.id" @mouseenter="categoryId=item.id">
import { useStore } from 'vuex'
import { reactive, computed, ref } from 'vue'
export default {
  name: 'HomeCategory',
  setup () {
  	// 组织所有数据逻辑
  	// 1. 获取vuex的一级分类,并且只需要两个二级分类
  	// 2. 需要在组件内部,定义一个品牌数据
  	// 3. 根据vuex的分类数据和组件中定义品牌数据,得到左侧分类完整数据(9分类+1品牌)数组
  	// 4. 进行渲染即可
    const brand = reactive({
      id: 'brand',
      name: '品牌',
      children: [{ id: 'brand-chilren', name: '品牌推荐' }]
    })
    const store = useStore()
    const menuList = computed(() {
      const list = store.state.category.list.map(item => {
        return {
          id: item.id,
          name: item.name,
          // 防止初始化没有children的时候调用slice函数报错
          children: item.children && item.children.slice(0, 2),
+          goods: item.goods
        }
      })
      list.push(brand)
      return list
    })
    // 上方定义鼠标移入li 事件  将移入的商品id赋值给categoryId
    // 通过计算属性获取到 vux存放的数据 并找出对应的菜单栏
+    const categoryId = ref(null)
+    const currCategory = computed(()=>{
+      return menuList.value.find(item => item.id === category.value)
+    })
+    return { menuList, categoryId, currCategory }
  }
}
    <!-- 弹层 -->
    <div class="layer">
      <h4>分类推荐 <small>根据您的购买或浏览记录推荐</small></h4>
      <ul v-if="currCategory && currCategory.goods && currCategory.goods.length">
        <li v-for="item in currCategory.goods" :key="item.id">
          <RouterLink to="/">
            <img :src="item.picture" alt="">
            <div class="info">
              <p class="name ellipsis-2">{{item.name}}</p>
              <p class="desc ellipsis">{{item.desc}}</p>
              <p class="price"><i>¥</i>{{item.price}}</p>
            </div>
          </RouterLink>
        </li>
      </ul>
  </div>

弹层显示2

在这里插入图片描述
@/components/app-header-nav

<template>
  <ul class="app-header-nav">
    <li class="home"><RouterLink to="/">首页</RouterLink></li>
    <li v-for="item in list" :key="item.id">
      <a href="#">{{item.name}}</a>
      <!-- 弹层 -->
      <div class="layer">
        <ul>
          <li v-for="sub in item.children" :key="sub.id">
            <RouterLink to="/">
              <img :src="sub.picture" alt="">
              <p>{{sub.name}}</p>
            </RouterLink>
          </li>
        </ul>
      </div>
    </li>
  </ul>
</template>

<script >
import { useStore } from 'vuex'
import { computed } from 'vue'
export default {
  name: 'AppHeaderNav',
  setup () {
    const store = useStore()
    const list = computed(() => {
      return store.state.category.list
    })
    return { list }
  }
}
</script>

<style scoped lang='less'>
.app-header-nav {
  width: 820px;
  display: flex;
  justify-content: space-around;
  padding-left: 40px;
  position: relative;
  z-index: 998;
  li {
    margin-right: 40px;
    width: 38px;
    text-align: center;
    a {
      font-size: 16px;
      line-height: 32px;
      height: 32px;
      display: inline-block;
    }
    // 鼠标移入li
    &:hover {
      // 子选择器 改变a标签的颜色 只对直接子级生效
    >a {
        color: @xtxColor;
        border-bottom: 1px solid @xtxColor;
      }
      // 子选择器 设置layer高度且不透明
    > .layer {
        height: 182px;
        opacity: 1;
      }
    }
  }
}
// 固定样式
.layer {
  width: 1240px;
  background-color: #fff;
  position: absolute;
  left: -200px;
  top: 56px;
  height: 0;
  overflow: hidden;
  // 主要部分 设透明度为0  做过渡效果   鼠标移入li的时候 设置为不透明
  opacity: 0;
  box-shadow: 0 0 5px #ccc;
  transition: all .2s .1s;
  ul {
    display: flex;
    flex-wrap: wrap;
    padding: 20px 70px;
    align-items: center;
    height: 182px;
    li {
      width: 110px;
      text-align: center;
      img {
        width: 60px;
        height: 60px;
      }
      p {
        padding-top: 10px;
      }
      &:hover {
        p {
          color: @xtxColor;
        }
      }
    }
  }
}
</style>

@/components/app-header-sticky (吸顶效果)

<template>
<!-- 吸顶组件 -->
  <div class="app-header-sticky" :class="{show:y>=78}">
    <div class="container" v-show="y>=78">
      <RouterLink class="logo" to="/" />
      <AppHeaderNav />
      <div class="right">
        <RouterLink to="/" >品牌</RouterLink>
        <RouterLink to="/" >专题</RouterLink>
      </div>
    </div>
  </div>
</template>

<script>
import AppHeaderNav from '@/components/app-header-nav'
import { onMounted, ref } from 'vue'
export default {
  name: 'AppHeaderSticky',
  components: { AppHeaderNav },
  setup () {
    const y = ref(0)
    onMounted(() => {
      window.onscroll = () => {
        const scrollTop = document.documentElement.scrollTop
        y.value = scrollTop
      }
    })
    return { y }
  }
}

</script>
<style scoped lang='less'>
.app-header-sticky {
  width: 100%;
  height: 80px;
  position: fixed;
  left: 0;
  top: 0;
  z-index: 999;
  background-color: #fff;
  border-bottom: 1px solid #e4e4e4;
  transform: translateY(-100%);
  opacity: 0;
  &.show {
    transition: all 0.3s linear;
    transform: none;
    opacity: 1;
  }
  .container {
    display: flex;
    align-items: center;
  }
  .logo {
    width: 200px;
    height: 80px;
    background-size: 160px auto;
  }
  .right {
    width: 220px;
    display: flex;
    text-align: center;
    padding-left: 40px;
    border-left: 2px solid @xtxColor;
    a {
      width: 38px;
      margin-right: 40px;
      font-size: 16px;
      line-height: 1;
      &:hover {
        color: @xtxColor;
      }
    }
  }
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/505674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pd电源测试-PD电源自动测试系统ATECLOUD-Power

PD电源测试是一种重要的电源测试方法&#xff0c;采用该方法可以更加全面、详细地评估各种电子产品和设备的性能和安全性。本文将阐述PD电源测试的基本原理、测试对象以及测试的应用价值。 首先&#xff0c;PD电源测试的基本原理是通过对电压、电流、功率等重要指标进行测试评…

无论是企业或个人,你知道数据泄露有多严重吗?

现代科技的发展使我们的隐私越来越容易受到侵犯&#xff0c;互联网、社交媒体和智能手机等技术使我们的信息变得更加易于访问和共享。此外商业公司和机构也积极收集和利用我们的个人数据&#xff0c;这些公司和机构可能利用我们的数据来推销产品和服务&#xff0c;或者在不经过…

励志长篇小说《周兴和》书连载之二饥饿寒冷童年

饥饿寒冷童年梦 兴和至今也记得&#xff0c;这年冬天特别冷。 那一天&#xff0c;放了学的小兴和背着书篼&#xff0c;又冷又饿地从毛公乡小学出来&#xff0c;艰难地爬上了回家的那条山道。他已一天没吃东西了&#xff0c;肚皮早就饿得贴着脊梁骨了。爬上一个小山坡&#xff…

(六)实现好友管理:教你如何在即时通信系统中添加好友

文章目录 一、引言1.1 即时通信系统中用户增加好友功能的重要性和应用场景1.2 TCP连接传输用户增加好友请求的基本原理 二、实现用户增加好友功能2.1 实现用户好友列表的展示和管理2.1.1 使用QListWidgetItem控件展示好友列表客户端关键代码展示服务端关键代码展示 三、效果展示…

深度学习笔记之梯度下降、反向传播与内置优化器

文章目录 1. 梯度下降法2. 反向传播算法3. PyTorch内置的优化器3.1 SGD优化器3.2 RMSprop优化器3.3 Adam优化器 1. 梯度下降法 笔者往期的机器学习笔记&#xff1a; 机器学习之梯度下降算法 梯度下降法是一种致力于找到函数极值点的算法。 所谓“训练”或“学习”就是改进…

2023年跨境电商必读:海外网红营销的4大雷区及应对策略

随着跨境电商的快速发展和海外网红的普及&#xff0c;海外网红营销已成为越来越多跨境电商企业推广品牌的必备手段。然而&#xff0c;在进行海外网红营销时&#xff0c;企业需要注意一系列雷区&#xff0c;以确保营销的有效性和可持续性。本文Nox聚星将和大家探讨2023年跨境电商…

AI自动写文章_免费在线原创文章生成器

自动写文章生成器 自动写文章生成器是一种利用人工智能和自然语言处理技术&#xff0c;帮助用户快速生成文章的工具。该软件可以根据用户的需求和选择&#xff0c;自动生成符合要求的文章&#xff0c;无需手动编写和修改。 自动写文章生成器的主要功能包括以下几个方面&#…

(三)打造华丽的即时通信系统主界面,让你的聊天体验更有质感

文章目录 一、引言1、即时通信系统的基本概念和应用场景2、Qt框架在实现即时通信系统中的应用 二、主界面设计2.1 界面设计的基本要求2.2 主界面的设计 三、通信功能实现3.1 通信协议的选择3.1.1 TCP协议和UDP协议的优缺点比较3.1.2选择何种协议进行即时通信系统的实现 3.2 通信…

单片机的电子秤方案设计

电子秤是一种利用电子技术实现重量计量的设备&#xff0c;广泛应用于商业、工业、医疗、科学研究等领域。电子秤是一种高精度的计重装置&#xff0c;不仅精度高&#xff0c;而且使用方便、稳定可靠。下面&#xff0c;我们从结构设计、工作原理、功能参数、产品种类四个方面来介…

MyBatis基础知识点总结

MyBatis了解 MyBatis 是什么&#xff1f; MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集 MyBatis 可以使用简单的XML或注解用于配置和原始映射&#xff0c;将接口和Java的 POJO&#x…

Canvas 2D详解

在我书的第六章中有一个关于MNIST手写数字的例子&#xff0c;当数据集加载完成之后&#xff0c;用户可以在<canvas/>上输入手写数字&#xff0c;点击「预测」按钮之后&#xff0c;浏览器会弹出经模型预测之后的结果&#xff1b;在我书的第九章和第十章中&#xff0c;分别…

2023年宜昌市中等职业学校技能大赛 “网络搭建与应用”竞赛题-2

2023年宜昌市中等职业学校技能大赛 “网络搭建与应用”竞赛题 一、竞赛内容分布 “网络搭建及应用”竞赛共分二个部分&#xff0c;其中&#xff1a; 第一部分&#xff1a;企业网络搭建部署项目&#xff0c;占总分的比例为50%&#xff1b; 第二部分&#xff1a;企业网络服…

第十四届蓝桥杯大赛软件赛省赛(Java 大学A组)

蓝桥杯 2023年省赛真题 Java 大学A组 试题 A: 特殊日期  试题 B: 与或异或 把填空挂上跟大伙对对答案&#xff0c;先把C/C B组的做了。 试题 A: 特殊日期 本题总分&#xff1a;5 分 【问题描述】 记一个日期为 y y \small yy yy 年 m m \small mm mm 月 d d \small dd dd 日…

链表的初步认识

什么是链表&#xff1f;链表是一种物理存储结构上非连续存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。 就如现实中的火车或铁链一般&#xff0c;环环相扣。当我们到达一个节点时&#xff0c;就可以通过这个节点找到下一个节点。链表与顺序表一样…

【服务器数据恢复】EXT4文件系统下KVM虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 服务器采用的Linux操作系统EXT4文件系统&#xff1b; 服务器中有3台KVM虚拟机&#xff1a;一台运行Mysql数据库&#xff0c;一台存放数据库备份&#xff0c;一台存放程序代码文件&#xff1b; 每台虚拟机包含一个qcow2格式的磁盘文件和一个raw格…

联合发版+主题演讲|GBASE南大通用亮相鲲鹏开发者峰会2023

5月6-7日&#xff0c;以“创未来 享非凡”为主题的鲲鹏开发者峰会2023在东莞松山湖举办&#xff0c;旨在打造生态伙伴和开发者学习、共享、交流的平台&#xff0c;帮助开发者深入了解鲲鹏、昇腾全栈技术&#xff0c;加速行业技术、产品和解决方案的创新。行业技术领袖、产业技术…

Apache FtpServer在Windows上使用以及SpringBoot中集成apache ftpserver实现Ftp 服务端搭建

场景 Apache Ftpserver Apache FtpServer是100&#xff05;纯Java FTP服务器。它被设计为基于当前可用的开放协议的完整且 可移植的FTP服务器引擎解决方案。FtpServer可以作为Windows服务或Unix / Linux守护程序独立运行&#xff0c; 也可以嵌入Java应用程序中。我们还提供…

【图】邻接表

目录 无向图的邻接表 链表&#xff08;存相邻顶点下标&#xff09;的类 数组里放的顶点 邻接表&#xff08;操作&#xff09; 构造和析构&#xff08;创建销毁邻接表&#xff09; 插入顶点 插入边 获取下标 插v1、v2之间的边 删除顶点 删除边 输出&#xff1a; 其他…

多种采购方式下,数智化招采系统解决方案(实例)

广发证券成立于1991年&#xff0c;是国内首批综合类证券公司&#xff0c;先后于2010年和2015年在深圳证券交易所及香港联合交易所主板上市。 多年来&#xff0c;广发证券在竞争激烈、复杂多变的行业环境中努力开拓、锐意进取&#xff0c;以卓越的经营业绩、持续完善的全面风险…