【问题标题】:Css animation to extend button text on hover悬停时扩展按钮文本的 Css 动画
【发布时间】:2021-09-26 23:46:51
【问题描述】:

我想在按钮悬停时在按钮上显示更多文本,并且我希望按钮随着扩展文本缩小和增长。

我需要一个通用的解决方案,因为按钮上的文本及其宽度将取决于用户选择的语言。

这是我(目前不工作)的尝试

.hover-value {
  display: inline-block;
  visibility: collapse;
  width: 0%;
  -webkit-transition: width 2s;
  transition: width 2s;
  overflow: hidden;
}
button:hover .hover-value {
  visibility: visible;
  width: 100%;
}
<button>
  Result
  <span class="hover-value">Add new result</span>
</button>

也在 JsFiddle 上:https://jsfiddle.net/JohanGovers/46392xss/

我在我的项目中使用 jQuery 和 bootstrap,但如果可能的话,我想用 css 解决这个问题。我已尝试按照其他 SO 答案中的建议使用可见性属性,但无济于事。

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript css css-animations


    【解决方案1】:

    为了获得最好的动画效果,我决定为max-width 属性设置动画。这是因为,目前,您无法在 width:auto 之间设置动画。

    (将max-width:7rem 设置为大于文本长度的值。)

    为了避免一堆对齐的 CSS,我使用了 display: inline-flex,因为它完全对齐了它,而没有使用 vertical-align 等等。 (如果这是一个问题,可以更改。)

    然后我使用white-space:nowrap 将所有文本强制放在一行,以便动画更流畅。

    button span {
      max-width: 0;
      -webkit-transition: max-width 1s;
      transition: max-width 1s;
      display: inline-block;
      vertical-align: top;
      white-space: nowrap;
      overflow: hidden;
    }
    button:hover span {
      max-width: 7rem;
    }
    <button id="btn">
      Result 
      <span>New result</span>
    </button>
    <button id="btn">
      Result 
      <span>Different text</span>
    </button>

    【讨论】:

    • 感谢这在 Chrome 和 IE 10+ 中运行良好,但在 Firefox 42.0 中文本不对齐。知道如何解决这个问题吗?
    • 啊,这可能与inline-flex有关,更新的答案是否解决了问题?
    • 是的。非常感谢。
    【解决方案2】:

    完成,但动画古怪:

    已更新- 感谢 jaunt,现在结果顺利,他建议将此 white-space: nowrap; 添加到按钮 css

    JS Fiddle

    button {
      width: 53px;
      height: 21px;
      overflow: hidden;
      -webkit-transition: width 1s;
      transition: width 1s;
      white-space: nowrap; /*this was suggested by jaunt, thanks */
    }
    button:hover {
      width: 145px;
      -webkit-transition: width 1s;
      transition: width 1s;
    }
    button:hover::after {
      content: 'Add new result';
    }
    <h3>This is what I've got so far.</h3>
    
    <button id="btn">
      Result
    </button>

    【讨论】:

    • 如果您将white-space: nowrap; 添加到button,则文本将被强制为一行,这会导致您的“古怪”动画。
    • @jaunt,非常感谢,我从来没有遇到过需要它的问题,这就是为什么我从来没想过,谢谢你提醒我!
    【解决方案3】:

    试试这个方法,你会得到你喜欢的输出。

    .hover-value {
        display: inline-block;
        /*visibility: collapse;*/
        -webkit-transition: width 2s;
        transition: width 2s;
        overflow: hidden;
        display:none;
      top:3px;
        position:relative;
    }
    
    button:hover .hover-value {
        visibility: visible;
        display: inline-block;
    }
    <button>
        Result
        <span class="hover-value">Add new result</span>
    </button>

    【讨论】:

      【解决方案4】:

      你可以用 font-size 做出类似的效果。

      将其从 0px 更改为继承或特定大小。

      .hover-value {
          font-size: 0px;
          -webkit-transition: font-size 1s;
          transition: font-size 1s;
      }
      
      button:hover .hover-value {
          font-size: inherit;
      }
      

      在 jsfiddle 上查看 Demo

      【讨论】:

      • 不错,尝试改变 span 的宽度,看起来会更好
      • 修复宽度属性是危险的。当 Text-Length 改变时会发生什么?!
      • 因为它说的是“添加新结果”,我认为他不会动态更改按钮的文本,如果他愿意,他可以更改宽度,增加字体大小的唯一问题是动画看起来有点幼稚
      【解决方案5】:

      希望对你有帮助,我已经分享了底部的jfiddle链接供你参考,但是把相关代码贴在这里。

      body{
          margin:0;
          padding:0;
      }
      
      h3{
          margin:0;
          padding:0;
          line-height:1.5em;
      }
      button{
         text-align:left;
         width:7.5em; 
         overflow:hidden;
         transition:width 1s ease-in-out;
      }
      button:hover{
           width:20em;
           transition:width 1s ease-in-out;
      }
      button:focus{
          outline:none;
      }
      button span.sthGroup{
          display:block;
          width:20em;
          overflow-x:hidden;
      }
      </style>
      
      <h3>button</h3>
      <button class="" type="button">
          <span class="sthGroup">
              <span>some text here</span>
              <span>some additional text here</span>
          </span>
      </button>
      

      Sample for your reference

      【讨论】:

      • @Mi-Creativity 感谢您的编辑,是的,这是一个错误。 :)
      【解决方案6】:

      基于 CSS 的解决方案

      .bookNow {
        width: 35px;
        display: flex;
        align-items: center;
        justify-content: flex-start;
        overflow: hidden;
        transition: 0.4s;
        height: 35px;
        padding: 0 5px;
        border-radius: 35px;
        cursor: pointer;
        border: 1px solid;
      }
      
      h1 {
        font-size: 14px;
        margin-left: 10px;
      }
      
      header {
        display: none;
        white-space: nowrap;
        padding-left: 15px;
      }
      
      .bookNow:hover {
        width: 200px;
        transition: 0.4s;
        border-radius: 35px;
      }
      
      .bookNow:hover header {
        display: block;
      }
      <div class="bookNow" title='Book Now'>
        <h1>X</h1>
        <header>Book An Appointment</header>
      </div>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-25
        • 2020-09-23
        • 1970-01-01
        • 2021-01-20
        • 2020-04-28
        • 1970-01-01
        • 2014-11-02
        相关资源
        最近更新 更多