目录
创建游乐场
汉堡菜单图标
汉堡菜单图标动画
使用 jQuery 进行类切换
创建菜单列表
动画菜单列表
结论
首页 web前端 js教程 开发适合移动设备的下拉菜单

开发适合移动设备的下拉菜单

Sep 04, 2023 am 09:25 AM

本教程将教您如何创建汉堡菜单图标并为其设置动画,然后通过 jQuery 附加事件侦听器以触发下拉菜单。

我将使用 Jade (Pug) 和 Sass 而不是普通的 HTML 和 CSS。所以您至少应该对这些模板引擎有基本的了解。

创建游乐场

我们将从实现一个简单的游乐场开始。我只会提供 Jade 模板以及 Sass 样式,因为这不是本教程的范围。您可以接受并使用它,也可以提出自己的设计。

玉文件:

body
    #container
        #header
        #body
            .content
                .left
                .right
                    - for (i=1; i <= 5 ; i++ )
                        div( id="text" + i )
            .content
                .left
                .right
                    - for (j=6; j <= 10 ; j++ )
                        div( id="text" + j )
            .content
                .left
                .right
                    - for (k=11; k <= 15 ; k++ )
                        div( id="text" + k )
登录后复制

Sass 文件:

=flex()
  display: -webkit-box
  display: -moz-box
  display: -ms-flexbox
  display: -webkit-flex
  display: flex
  
=transition($time)
  -webkit-transition: all $time ease
  -moz-transition: all $time ease
  -ms-transition: all $time ease
  -o-transition: all $time ease
  transition: all $time ease

html, body
  margin: 0
  padding: 20px 0
  +flex()
  justify-content: center

//----------------------------------//

#container
  width: 320px
  height: 550px
  background-color: #ebebeb
  overflow: hidden

#header
  height: 45px
  background-color: #9b9b9b
  position: relative


#body
  padding: 0 20px
  padding-top: 40px
  +flex()

  flex-direction: column
  justify-content: flex-start

.content
  +flex()

  flex-direction: row
  justify-content: flex-start
  margin-bottom: 25px


  .left
    width: 100px
    height: 100px
    margin-right: 15px
    background-color: #e1e1e1

  .right
    @for $i from 1 through 15
      #text#{$i}
        margin-top: 10px
        width: 50 + random(100) + px
        height: 10px
        background-color: #e1e1e1
登录后复制

注意:这里我创建了两个名为 flextransition 的 mixin。 Mixins 通过对某些 CSS 规则进行分组,可以更轻松地重用它们。每当我需要添加 display:flex 以及所有供应商前缀时,我都可以使用 +flex() 来代替,这要归功于 mixin。

我们将使用此结构并在本教程的其余部分中以它为基础进行构建。

最终结果应如下所示:

开发适合移动设备的下拉菜单

查看当前代码

汉堡菜单图标

现在是时候创建一个简单但有吸引力的汉堡菜单并通过 CSS 为其设置动画了。

#header 中添加一个新 div,并将其命名为 #hamburger。然后在 #hamburger 中创建两个子 div。他们应该有一个共同的班级和个人 ID。

#hamburger
    .strip#top
    .strip#bottom
登录后复制

现在我们需要使用通用类 .strip 来设置父级 #hamburger div 和子级 div 的样式。

#hamburger
  height: 100%
  width: 45
  +flex()

  flex-direction: column
  justify-content: space-between
  padding-left: 20px
登录后复制

我们通过定义 高度:100%,将 div 的高度设置为其父 div 的高度,即 #header。另外,我们为此父 div 设置了一个宽度值,这将定义其“可点击”区域。

接下来,我们使用之前创建的 mixin 添加具有所有供应商前缀的 Flexbox。

由于我们希望 .strip div 垂直定位,因此我们设置 flex-direction: column ,然后使用 justify-content: space- Between 以便在 .strip div 之间添加空格。

然后我们需要通过向各自的 div 添加底部和顶部填充来将这些 div 相互推向。

#top
  margin-top: 17px
  
#bottom
  margin-bottom: 17px
登录后复制

我们还添加了 padding-left: 20px 以便将 .strip div 进一步移至右侧。

下一步是设置条带的样式。只需定义 div 的大小和颜色即可相对简单。

.strip
  width: 25px
  height: 2px
  background-color: #ffffff
登录后复制

带有汉堡菜单图标的最终结果应如下所示:

开发适合移动设备的下拉菜单

下一步是为菜单图标设置动画,这样当单击它时,它应该动画成十字符号。< /p>

汉堡菜单图标动画

此时,我们将使用基本的 jQuery 来切换一些 CSS 类。

让我们首先创建要切换的 CSS 类。

我们将利用 CSS 的 transform 属性以及 transition 属性的平移和旋转设置。

首先,使用具有特定计时参数的 mixins 向 #top#bottom div 添加过渡。

#top
  margin-top: 17px
  +transition(.25s)

#bottom
  margin-bottom: 17px
  +transition(.25s)
登录后复制

现在我们需要定义要切换的类的样式。

我们将分别轮换和翻译每个 .strip div,因此我们需要为 #top# 切换不同的类底部 div。

#top
  margin-top: 17px
  +transition(.25s)

  &.topRotate
    transform-origin: center
    transform: translateY(4px) rotateZ(45deg)

#bottom
  margin-bottom: 17px
  +transition(.25s)

  &.bottomRotate
    transform-origin: center
    transform: translateY(-5px) rotateZ(-45deg)
登录后复制

在这里,我们定义了两个名为 .bottomRotate.topRotate 的不同类的样式,它们将添加到各自的参考 div 中或从中删除,#top#bottom

请注意,.strip 类的不同大小将导致需要不同的 translateYrotateZ 值,以便将动画转换为正确的十字标志。

使用 jQuery 进行类切换

我们定义了当 topRotatebottomRotate 类存在时,每个 .strip div 的动画方式。但是,我们尚未附加事件侦听器来切换这些类。

创建一个新的 JavaScript 文件,并使用以下代码将 topRotatebottomRotate 类切换到带有 #top#bottom 分别是 ID。

$(document).ready(function(){
  $("#hamburger").click(function(){
      $("#top").toggleClass("topRotate");
      $("#bottom").toggleClass("bottomRotate");
  });
})
登录后复制

我们将所有代码放入 $(document).ready(function(){}) 中,以便在采取任何操作之前等待整个页面加载。

当我们点击 #hamburger div 时,它将切换具有特定 ID 的 div 的类。

注意:不要忘记将 jQuery 源文件添加到您的项目中。

查看当前代码

创建菜单列表

下一步是创建一个包含列表项的菜单。

#header 下使用以下结构:

#dropDown
    #background
    ul
        li Home
        li Blog
        li Projects
        li Authors
        li Jobs
        li Contact
登录后复制

因此,我们在这里使用 ul 标签作为父标签,以便将 li 标签作为子标签的项目分组。此外,为了创建展开的背景动画,我们还添加了一个 ID 为 #background 的 div。

让我们首先设置 ulli 元素的样式。

ul
  list-style: none
  padding: 0
  margin: 0
登录后复制

list-style 设置为 none,以便从 ul 元素中删除项目符号,并同时设置 paddingmargin 为 0,以便删除所有预定义值。

现在设置 li 元素的样式:

li
    //display: none
    background-color: #9b9b9b
    color: #ffffff

    font-family: 'Quicksand', sans-serif
    font-weight: lighter
    font-size: 15px
    padding: 20px
    padding-left: 60px

    &:after
      position: absolute
      content: ''
      left: 60px
      width: 60%
      height: 1px
      bottom: 4px
      background: rgba(255, 255, 255, 0.25)

    &:last-child:after
      width: 0
登录后复制

这里我注释掉了 display:none 以便能够看到结果。但是,在制作动画时,我们最初将使用它来隐藏列表元素。

我还添加了 after 伪元素并相应地设置了样式,以便用直线分隔每个 li 元素。 :last-child:after 删除最后一个 li 元素的这一行。

查看当前代码

动画菜单列表

现在我们将使用一些 Sass 控制指令,以便向每个 li 元素添加具有不同属性的 CSS 关键帧动画。

@keyframes drop
  0%
    opacity: 0
    transform: scale(1.3)

  100%
    opacity: 1
    transform: scale(1)
    
@keyframes fold
  0%
    opacity: 1
    transform: scale(1)

  100%
    opacity: 0
    transform: scale(0.7)
登录后复制

在这里,我们定义了关键帧动画 dropfold

drop 用于动画打开菜单列表。初始缩放比例增加了 30%,随着透明度从 0 变为 1,它会缩小到原始大小。相反的操作发生在 fold 中。

现在我们需要将这些关键帧附加到 li 元素。这部分就是 Sass 派上用场的地方。

@for $i from 1 through 6
  li:nth-child(#{$i})
    animation:
      name: fold
      duration: 80ms*(6-$i) + 1ms
      timing-function: ease-in-out
      fill-mode: forwards

  li.anim:nth-child(#{$i})
    animation:
      name: drop
      duration: 100ms*$i
      timing-function: ease-in-out
      fill-mode: forwards
登录后复制

这里我使用了一个从 1 到 6 的 for 循环,索引为 $i

现在我们需要使用此索引将每个动画附加到具有不同持续时间的 li 元素。

首先,考虑 li.anim:nth-child(#{$i}) 行。

在这里,我们获取 li 元素的 $i 子元素,其类为 anim

我们将切换此 anim 类。因此,当将其添加到 li 元素时,名称为 drop 的关键帧动画将采取行动。删除后,fold 动画将采取行动。

下一个重要的事情是 duration 属性。

持续时间:100ms*$i drop 动画会延长每个递增子编号的动画持续时间。因此,编译此代码时,第一个 li 子级将具有 duration: 100ms,最后一个子级将具有 duration: 600ms。< /p>

这会给人一种依次为每个元素添加动画的感觉。

我们对 fold 动画执行相同的操作。这次,最后一个元素的动画应该更快,因此 持续时间:80ms*(6-$i) + 1ms。持续时间增加 1ms 是因为当你将持续时间设置为 0 时,可能会出现一些问题,并且你的动画可能无法正常工作。

当我们设计 li 元素样式时,我提到我们需要使用 display:none 以避免意外的动画播放。如果您不将其设置为 none,您将看到 fold 动画在页面加载时播放一次。

如果我们将 display 属性设置为 none,我们将看不到该内容,然后我们需要显示 li 元素,然后切换 anim 类。

我们希望在单击汉堡包图标时播放动画。因此,让我们使用一些 jQuery 将每个 li 项的 display 属性设置为 block 并切换 anim 类.

$(document).ready(function(){
  $("#hamburger").click(function(){
      $("#top").toggleClass("topRotate");
      $("#bottom").toggleClass("bottomRotate");

      $("li").show();
      $("li").toggleClass("anim");

  });
})
登录后复制

查看当前代码

您会注意到,我们可以单独看到每个 li 元素的动画。然而,我们宁愿有一种扩展菜单的感觉。

为了解决这个问题,我们只需扩展 div 的高度即可。该 div 是 #background,我们最初是在创建 ulli 元素时添加的。

#background
  width: 100%
  height: 0
  background-color: #9b9b9b
  position: absolute
  +transition(.45s)

  &.expand
    height: 550px
登录后复制

我们将切换 expand 类,以便将 height 属性设置为 550px 内的 .45s 。请注意,我使用 transition mixin 来定义具有特定时间参数的转换。

最终结果

结论

在本教程中,我们练习了如何通过 Jade 和 Sass 模板引擎在 HTML 和 CSS 中使用 for 循环。最重要的是,我们创建了 CSS 关键帧动画,并将它们与不同的持续时间属性附加到特定的 HTML 元素。然后我们使用 jQuery 切换类来控制这些动画。

以上是开发适合移动设备的下拉菜单的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何创建和发布自己的JavaScript库? 如何创建和发布自己的JavaScript库? Mar 18, 2025 pm 03:12 PM

文章讨论了创建,发布和维护JavaScript库,专注于计划,开发,测试,文档和促销策略。

如何在浏览器中优化JavaScript代码以进行性能? 如何在浏览器中优化JavaScript代码以进行性能? Mar 18, 2025 pm 03:14 PM

本文讨论了在浏览器中优化JavaScript性能的策略,重点是减少执行时间并最大程度地减少对页面负载速度的影响。

前端热敏纸小票打印遇到乱码问题怎么办? 前端热敏纸小票打印遇到乱码问题怎么办? Apr 04, 2025 pm 02:42 PM

前端热敏纸小票打印的常见问题与解决方案在前端开发中,小票打印是一个常见的需求。然而,很多开发者在实...

如何使用浏览器开发人员工具有效调试JavaScript代码? 如何使用浏览器开发人员工具有效调试JavaScript代码? Mar 18, 2025 pm 03:16 PM

本文讨论了使用浏览器开发人员工具的有效JavaScript调试,专注于设置断点,使用控制台和分析性能。

如何有效地使用Java的收藏框架? 如何有效地使用Java的收藏框架? Mar 13, 2025 pm 12:28 PM

本文探讨了Java收藏框架的有效使用。 它强调根据数据结构,性能需求和线程安全选择适当的收集(列表,设置,地图,队列)。 通过高效优化收集用法

如何使用源地图调试缩小JavaScript代码? 如何使用源地图调试缩小JavaScript代码? Mar 18, 2025 pm 03:17 PM

本文说明了如何使用源地图通过将其映射回原始代码来调试JAVASCRIPT。它讨论了启用源地图,设置断点以及使用Chrome DevTools和WebPack之类的工具。

开始使用Chart.js:PIE,DONUT和BUBBLE图表 开始使用Chart.js:PIE,DONUT和BUBBLE图表 Mar 15, 2025 am 09:19 AM

本教程将介绍如何使用 Chart.js 创建饼图、环形图和气泡图。此前,我们已学习了 Chart.js 的四种图表类型:折线图和条形图(教程二),以及雷达图和极地区域图(教程三)。 创建饼图和环形图 饼图和环形图非常适合展示某个整体被划分为不同部分的比例。例如,可以使用饼图展示野生动物园中雄狮、雌狮和幼狮的百分比,或不同候选人在选举中获得的投票百分比。 饼图仅适用于比较单个参数或数据集。需要注意的是,饼图无法绘制值为零的实体,因为饼图中扇形的角度取决于数据点的数值大小。这意味着任何占比为零的实体

谁得到更多的Python或JavaScript? 谁得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

See all articles