• 解决下拉菜单的过渡问题


    解决下拉菜单的过渡问题

    使用 js 实现

    基本布局如下

    .text-select {
      width: 500px;
      box-sizing: border-box;
    }
    
    .text {
      padding: 0 8px;
      margin: 0;
      width: 500px;
      height: 35px;
      border-radius: 5px;
      border: 1px solid #23aaf2;
      box-sizing: border-box;
      outline: #0075b7;
    }
    
    .select {
      margin-top: -2px;
      width: 500px;
      height: 0;
      box-sizing: border-box;
      border: 1px solid #0075b7;
      border-top: 0;
      overflow: hidden;
    }
    
    .select span {
      display: block;
      padding: 0 20px;
      width: 500px;
      height: 30px;
      line-height: 30px;
      white-space: nowrap;
      text-overflow: ellipsis;
      box-sizing: border-box;
      overflow: hidden;
    
      &:hover {
        color: #23aaf2;
        cursor: pointer;
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    <div class="text-select">
      <input type="text" class="text" />
      <div class="select">
        <span>多种方案解决下拉菜单的过渡问题,你会如何选择?span>
        <span>
          育人为渡,经久如一 如需课程配套学习资料、源码、工具安装包私信up主~
        span>
        <span>如何使用 flex 弹性盒保持容器均分布局【bunny】span>
        <span>几行 CSS 让你的文字立起来【bunny】span>
        <span>喜大普奔!纯 CSS 实现瀑布流布局的方法终于来啦【bunny】span>
        <span>多种方案解决下拉菜单的过渡问题,你会如何选择?span>
        <span>
          育人为渡,经久如一 如需课程配套学习资料、源码、工具安装包私信up主~
        span>
        <span>如何使用 flex 弹性盒保持容器均分布局【bunny】span>
        <span>几行 CSS 让你的文字立起来【bunny】span>
        <span>喜大普奔!纯 CSS 实现瀑布流布局的方法终于来啦【bunny】span>
      div>
    div>
    body>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    1. 使用 document.querySelector 方法获取一个名为 selectDOM 元素,该元素将用于显示下拉框的选项。

    2. 接下来,使用 document.querySelector 方法获取一个名为 text 的 DOM 元素,该元素将用于触发下拉框的显示。

    3. 然后,为 text 元素添加一个 focus 事件监听器。当用户聚焦于该元素时,将执行以下操作:

      a. 将 select 元素的 transition 属性设置为 none,以便在下一个步骤中准确计算元素的高度。

      b. 将 select 元素的 height 属性设置为 auto,以便在下一个步骤中计算元素的高度。

      c. 获取 select 元素的高度,并将其存储在一个名为 height 的变量中。

      d. 将 select 元素的 height 属性设置为 0,以便在下一个步骤中执行动画。

      e. 使用 offsetHeight 属性强制浏览器重新计算 select 元素的高度。

      f. 将 select 元素的 transition 属性设置为 all 1s,以便在下一个步骤中执行动画。

      g. 将 select 元素的 height 属性设置为 height 变量的值,以便执行下拉框的动画效果。

    4. 最后,为 text 元素添加一个 blur 事件监听器。当用户失去焦点时,将执行以下操作:

      a. 将 select 元素的 transition 属性设置为 1s,以便在下一个步骤中执行动画。

      b. 将 select 元素的 height 属性设置为 0,以便将下拉框收起来。

    总之,这段代码实现了一个基本的下拉选择框效果,当用户聚焦于文本框时,下拉框会展开,并在用户选择选项后自动收起。
    在这里插入图片描述

    使用 css 实现

    使用缩放的方式解决,一开始将select高度设为 auto

    当失去焦点时触发下面样式

    .text-select .text:focus ~ .select {
      transform: scaleY(1);
    }
    
    • 1
    • 2
    • 3

    最开始时将样式设为,让高度自动,并使用动画

    height: auto;
    transition: all 1s;
    
    • 1
    • 2

    完整代码如下

    .text-select {
      width: 500px;
      box-sizing: border-box;
    }
    
    .text {
      padding: 0 8px;
      margin: 0;
      width: 500px;
      height: 35px;
      border-radius: 5px;
      border: 1px solid #23aaf2;
      box-sizing: border-box;
      outline: #0075b7;
    }
    
    .text-select .text:focus ~ .select {
      transform: scaleY(1);
    }
    
    .select {
      margin-top: -2px;
      width: 500px;
      height: auto;
      box-sizing: border-box;
      border: 1px solid #0075b7;
      border-top: 0;
      transform-origin: center top;
      transform: scaleY(0);
      transition: all 1s;
      overflow: hidden;
    }
    
    .select span {
      display: block;
      padding: 0 20px;
      width: 500px;
      height: 30px;
      line-height: 30px;
      white-space: nowrap;
      text-overflow: ellipsis;
      box-sizing: border-box;
      overflow: hidden;
    
      &:hover {
        color: #23aaf2;
        cursor: pointer;
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    在这里插入图片描述

  • 相关阅读:
    将vscode打造无敌的IDE(14) tasks.json和launch.json配置详解,随心所欲添加自动化任务
    Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】
    配置mysql+Navicat+XShell宝塔:Mark
    Windows账号和密码的获取与破解 相关工具集合
    javaweb-SMBMS
    基于Springboot+Vue实现高校疫情防控系统
    [NISACTF 2022]popchains - 反序列化+伪协议
    数学建模:最优化问题及其求解概述
    k8s教程(17)-pod之优先级调度
    【计算机网络】HTTP协议详解(举例解释,超级详细)
  • 原文地址:https://blog.csdn.net/weixin_46533577/article/details/133809402