JS+CSS实现仿支付宝菜单选中效果代码

下面我将为你详细讲解“JS+CSS实现仿支付宝菜单选中效果代码”的完整攻略。

背景

支付宝的菜单选中效果非常优美,用户对于选中菜单项有一个非常直观的反馈。因此,很多网站尝试模仿这种效果,提高用户的体验。

效果演示

在开始之前,我先给你演示一下最终的效果。你可以访问以下链接,预览动态效果:

JS+CSS实现仿支付宝菜单选中效果

实现步骤

下面是实现仿支付宝菜单选中效果的详细步骤:

1. 准备HTML结构

首先,我们需要准备一个HTML结构,用于展示菜单项。示例代码如下:

<ul>
  <li><a href="#">菜单1</a></li>
  <li><a href="#">菜单2</a></li>
  <li><a href="#">菜单3</a></li>
  <li><a href="#">菜单4</a></li>
  <li><a href="#">菜单5</a></li>
</ul>

2. 添加CSS样式

然后,我们添加一些基本的CSS样式,如下:

ul {
  list-style: none;
  padding: 0;
  margin: 0;
}

li {
  float: left;
}

a {
  display: block;
  padding: 10px;
  text-decoration: none;
  color: #000;
}

这里,我们使用了float浮动来让菜单项排列在同一行。

3. 添加选中效果

现在,我们来添加选中效果。我们可以使用CSS3的伪类:before:after来实现。示例代码如下:

a:before, a:after {
  content: "";
  position: absolute;
  width: 100%;
  height: 100%;
  left: 0;
  top: 0;
  z-index: -1;
}

a:before {
  background-color: rgba(255,255,255,0.5);
  transform: scale(1.2, 1.2);
  opacity: 0;
  transition: all .3s ease-out;
}

a:after {
  background-color: rgb(220,224,224);
  transform: scale(0, 0);
  opacity: 1;
  transition: all .3s ease-out;
}

a:hover:before {
  opacity: 1;
  transform: scale(1, 1);
}

a:hover:after {
  -webkit-transition-delay: .3s;
  transition-delay: .3s;
  transform: scale(1, 1);
}

这段代码中,a:before表示在菜单项上方叠加一个白色的选中效果,a:after表示在菜单项下方叠加一个灰色背景。当鼠标悬停在菜单项上时,a:beforea:after都会进行一个过渡动画,展现出选中效果。

4. 添加JS交互

最后,我们可以用JS来实现一个交互效果,使得当用户点击菜单项时,它变为选中状态。示例代码如下:

var menuItems = document.querySelectorAll('a');
for (var i = 0; i < menuItems.length; i++) {
  menuItems[i].addEventListener('click', function(e) {
    e.preventDefault();
    for (var j = 0; j < menuItems.length; j++) {
      menuItems[j].classList.remove('active');
    }
    this.classList.add('active');
  });
}

这段代码中,我们首先获取所有菜单项的DOM元素,然后遍历每一个菜单项,为其添加一个点击事件。当用户点击某一个菜单项时,我们把其它菜单项的选中状态清除,然后将当前菜单项设为选中状态。

示例说明

我们来分别说明一下两个示例的具体实现。

示例1

这个示例中,我们首先通过CSS实现了选中效果,然后通过JS交互实现了菜单的选中状态。这个示例比较简单,适合新手入门。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>示例1:JS+CSS实现支付宝菜单选中效果</title>
  <style>
    ul {
      list-style: none;
      padding: 0;
      margin: 0;
    }
    li {
      float: left;
    }
    a {
      display: block;
      padding: 10px;
      text-decoration: none;
      color: #000;
      position: relative;
    }
    a:before, a:after {
      content: "";
      position: absolute;
      width: 100%;
      height: 100%;
      left: 0;
      top: 0;
      z-index: -1;
    }
    a:before {
      background-color: rgba(255,255,255,0.5);
      transform: scale(1.2, 1.2);
      opacity: 0;
      transition: all .3s ease-out;
    }
    a:after {
      background-color: rgb(220,224,224);
      transform: scale(0, 0);
      opacity: 1;
      transition: all .3s ease-out;
    }
    a:hover:before {
      opacity: 1;
      transform: scale(1, 1);
    }
    a:hover:after {
      -webkit-transition-delay: .3s;
      transition-delay: .3s;
      transform: scale(1, 1);
    }
    .active {
      background-color: #f00;
      color: #fff;
    }
  </style>
</head>
<body>
  <ul>
    <li><a href="#">菜单1</a></li>
    <li><a href="#">菜单2</a></li>
    <li><a href="#">菜单3</a></li>
    <li><a href="#">菜单4</a></li>
    <li><a href="#">菜单5</a></li>
  </ul>
  <script>
    var menuItems = document.querySelectorAll('a');
    for (var i = 0; i < menuItems.length; i++) {
      menuItems[i].addEventListener('click', function(e) {
        e.preventDefault();
        for (var j = 0; j < menuItems.length; j++) {
          menuItems[j].classList.remove('active');
        }
        this.classList.add('active');
      });
    }
  </script>
</body>
</html>

示例2

这个示例中,我们通过CSS实现了两种不同风格的选中效果,一种是宽度扩展,一种是高度扩展。为了实现这两种效果,我们在CSS中使用了不同的transform和transition属性。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>示例2:JS+CSS实现支付宝菜单选中效果(多种选择方式)</title>
  <style>
    ul {
      list-style: none;
      padding: 0;
      margin: 0;
    }
    li {
      float: left;
    }
    a {
      display: block;
      padding: 10px;
      text-decoration: none;
      color: #000;
      position: relative;
    }
    a:before, a:after {
      content: "";
      position: absolute;
      width: 100%;
      height: 100%;
      left: 0;
      top: 0;
      z-index: -1;
    }
    a:before {
      background-color: rgba(255,255,255,0.5);
      transform: scale(1, 1);
      opacity: 0;
      transition: all .3s ease-out;
    }
    a:after {
      background-color: rgb(220,224,224);
      transform: scale(1, 0);
      opacity: 1;
      transition: all .3s ease-out;
    }
    a:hover:before {
      opacity: 1;
      transform: scale(1.2, 1.2);
    }
    a:hover:after {
      -webkit-transition-delay: .3s;
      transition-delay: .3s;
      transform: scale(1, 1);
    }
    a.active:before {
      opacity: 1;
      transform: scale(1, 1);
    }
    a.active:after {
      -webkit-transition-delay: .3s;
      transition-delay: .3s;
      transform: scale(1, 1);
    }
    a.alt:before {
      background-color: #f00;
      transform: scale(1, 1);
      opacity: 0;
      transition: all .3s ease-out;
    }
    a.alt:after {
      background-color: #f00;
      transform: scale(1, 1);
      opacity: 0;
      transition: all .3s ease-out;
    }
    a.alt:hover:before {
      opacity: 1;
      transform: scaleY(1.5);
    }
    a.alt:hover:after {
      -webkit-transition-delay: .3s;
      transition-delay: .3s;
      transform: scaleX(1.5);
    }
    a.alt.active:before {
      opacity: 1;
      transform: scaleY(1.5);
    }
    a.alt.active:after {
      -webkit-transition-delay: .3s;
      transition-delay: .3s;
      transform: scaleX(1.5);
    }
  </style>
</head>
<body>
  <h2>宽度扩展效果</h2>
  <ul>
    <li><a href="#">菜单1</a></li>
    <li><a href="#">菜单2</a></li>
    <li><a href="#">菜单3</a></li>
    <li><a href="#">菜单4</a></li>
    <li><a href="#">菜单5</a></li>
  </ul>
  <h2>高度扩展效果</h2>
  <ul>
    <li><a href="#" class="alt">菜单1</a></li>
    <li><a href="#" class="alt">菜单2</a></li>
    <li><a href="#" class="alt">菜单3</a></li>
    <li><a href="#" class="alt">菜单4</a></li>
    <li><a href="#" class="alt">菜单5</a></li>
  </ul>
  <script>
    var menuItems1 = document.querySelectorAll('ul:first-of-type a');
    for (var i = 0; i < menuItems1.length; i++) {
      menuItems1[i].addEventListener('click', function(e) {
        e.preventDefault();
        for (var j = 0; j < menuItems1.length; j++) {
          menuItems1[j].classList.remove('active');
        }
        this.classList.add('active');
      });
    }
    var menuItems2 = document.querySelectorAll('ul:nth-of-type(2) a');
    for (var i = 0; i < menuItems2.length; i++) {
      menuItems2[i].addEventListener('click', function(e) {
        e.preventDefault();
        for (var j = 0; j < menuItems2.length; j++) {
          menuItems2[j].classList.remove('active');
        }
        this.classList.add('active');
      });
    }
  </script>
</body>
</html>

这个示例中,我们首先定义了两种选中效果,一种是宽度扩展,一种是高度扩展。这两种效果的CSS实现中,transformtransition属性都有所不同。同时,我们在HTML中分别使用了两个ul元素来展示不同的效果,在JS中也分别针对这两个元素来实现交互效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS+CSS实现仿支付宝菜单选中效果代码 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • HTML标记语言——表格标记

    HTML标记语言是一种用于创建网页的标记语言。而表格标记是HTML中最重要的一种标记之一,可以帮助我们在网页中创建表格。在本篇攻略中,我将会详细介绍HTML中表格标记的使用。 创建表格的基础结构 HTML中创建表格的基础结构如下所示: <table> <thead> <tr> <th>标题1</th&gt…

    css 2023年6月9日
    00
  • 在线使用iconfont字体图标的简单实现

    以下是“在线使用iconfont字体图标的简单实现”的完整攻略。 1. 确定使用iconfont字体图标 网站或应用程序通过引入iconfont字体图标的方式,可以使用丰富的图标库,并减小页面加载速度,同时也方便管理和使用。 2. 在iconfont官网获取图标库 打开iconfont官网,注册并登陆账号,搜索所需图标并添加至购物车,确认后前往购物车页面,进…

    css 2023年6月10日
    00
  • 微信小程序适配iphoneX的实现方法

    下面是一份完整的“微信小程序适配iPhone X的实现方法”攻略: 什么是iPhone X适配? iPhone X是苹果公司于2017年推出的一款全面屏手机。与传统的普通iPhone不同之处在于其屏幕上有一块“刘海”区域,同时底部也有一条细长的区域。在iPhone X上运行的小程序如果不进行适配可能会出现布局错乱、显示不全等问题。因此,对iPhone X进行…

    css 2023年6月11日
    00
  • css中定位中的absolute和relative是什么意思

    CSS中的定位是指如何让HTML中的元素出现在页面上的具体位置。在CSS中,有两种主要的定位方式:absolute和relative。 absolute定位:绝对定位,使元素相对于最近的非static(默认)定位的父元素进行定位。如果没有找到对应的非static定位元素,则以body元素为参考定位元素。这意味着即使页面滚动,元素也将保持在原始位置。 示例代码…

    css 2023年6月9日
    00
  • JS实现DIV高度自适应窗口示例

    下面我将为你详细讲解“JS实现DIV高度自适应窗口示例”的完整攻略。 步骤一:设置DIV的CSS样式 首先,我们需要设置DIV的CSS样式,让它具备自适应窗口高度的能力,代码如下: div{ height: auto; /*设置DIV高度自适应窗口*/ min-height: 100%; /*设置DIV最小高度为100%*/ } 步骤二:使用JS动态计算DI…

    css 2023年6月10日
    00
  • CSS中cursor属性的鼠标样式明细

    CSS中的cursor属性用于设置鼠标在元素上的样式,可以通过特定的关键词来指定不同的鼠标样式。 常用的鼠标样式 以下是常用的一些鼠标样式及其关键词: auto:默认状态,浏览器自动根据上下文决定显示什么样式 pointer:小手光标,用于链接、按钮等可以点击的元素 default:箭头样式,用于默认状态下的鼠标 text:I型光标,用于文本内容区域 mov…

    css 2023年6月10日
    00
  • vue中使用vue-seamless-scroll插件实现列表无缝滚动效果

    下面是详细讲解“vue中使用vue-seamless-scroll插件实现列表无缝滚动效果”的攻略: 什么是vue-seamless-scroll插件 vue-seamless-scroll是一款Vue.js的无缝滚动插件,用于实现网页中的列表无缝滚动效果。它具有易用性和可定制性等优点,在Vue.js的项目中被广泛应用。 安装和引入vue-seamless-…

    css 2023年6月10日
    00
  • 关于vue.js弹窗组件的知识点总结

    下面是关于vue.js弹窗组件的知识点总结,主要包括组件创建、使用、传值等方面的内容。 1. 组件创建 1.1 创建基础组件 在Vue.js中,我们可以通过Vue.component方法来创建组件,如下所示: Vue.component(‘my-dialog’, { template: ` <div class="my-dialog&quot…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部