0

0

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

PHPz

PHPz

发布时间:2023-09-04 09:25:06

|

839人浏览过

|

来源于php中文网

原创

本教程将教您如何创建汉堡菜单图标并为其设置动画,然后通过 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。

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

最终结果应如下所示:

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

查看当前代码

SuperCms在线订餐系统
SuperCms在线订餐系统

模板采用响应式设计,自动适应手机,电脑及平板显示;满足单一店铺外卖需求。功能:1.菜单分类管理2.菜品管理:菜品增加,删除,修改3.订单管理4.友情链接管理5.数据库备份6.文章模块:如:促销活动,帮助中心7.单页模块:如:企业信息,关于我们更强大的功能在开发中……安装方法:上传到网站根目录,运行http://www.***.com/install 自动

下载

汉堡菜单图标

现在是时候创建一个简单但有吸引力的汉堡菜单并通过 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

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

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

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

汉堡菜单图标动画

此时,我们将使用基本的 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 中。

p>

现在我们需要将这些关键帧附加到 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

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

我们对 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 切换类来控制这些动画。

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

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

553

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

374

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

731

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

477

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

990

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

656

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

551

2023.09.20

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号