【问题标题】:CSS: Expanding a <div> from right to left to reveal textCSS:从右到左扩展 <div> 以显示文本
【发布时间】:2019-02-12 03:55:57
【问题描述】:

我想设置一个固定的&lt;div&gt;,包含一个图标,当悬停在上面时会从右向左展开(&lt;div&gt; 展开,而不是图标),在左边显示一段文字图标的一侧。图标的位置保持不变。这是一个草图,可以帮助说明我想做的事情:

在悬停时更改&lt;div&gt; 的大小没有问题,我只需添加一个宽度更大的类(包括为展开动画制作的过渡)。但我在元素的定位上挣扎。我将图标和文本(在&lt;span&gt; 内)放在单独的&lt;div&gt; 中,并尝试使用flex 安排所有内容。在展开/悬停状态下,事情看起来应该是这样,但是一旦 &lt;div&gt; 再次缩小,包含图标和文本的两个 div 尝试共享剩余的小空间,因此图标被切断,文本被压扁了。

如果有人能帮我弄清楚如何按照我想要的方式进行设置,我将不胜感激。

这是我到目前为止得到的一个 jsFiddle:Button-GrowOnHover

加上代码本身:

$(document).ready(function() {
  var button = $("#myButton");

  button.mouseenter(function() {
    $(this).addClass("grow");
  });
  button.mouseleave(function() {
    $(this).removeClass("grow");
  });
});
.button-container {
  position: fixed;
  top: 5%;
  right: 5%;
  width: 100px;
  padding: 5px;
  background-color: tomato;
  display: flex;
  justify-content: space-between;
  overflow: hidden;
  transition: width 1s;
}

.button-container.grow {
  width: 300px
}

.button-text-container {
  display: flex;
  align-items: center;
  justify-content: center;
  background-color: lightblue;
}

.button-icon-container {
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="button-container" id="myButton">

  <div class="button-text-container">
    <span>Here comes some text.</span>
  </div>

  <div class="button-icon-container">
    <img src="https://placeholder.pics/svg/100x100/7AFFA6/000000/ICON">
  </div>

</div>

【问题讨论】:

  • 您可以只使用 CSS 来实现您所需要的。
  • 尝试添加 .button-text-container {min-width:0;}

标签: jquery css flexbox hover expand


【解决方案1】:

如果您依赖 flexbox order,您可以使用 only CSS 执行此操作,并且您可以将宽度更改移动到文本而不是父容器:

.button-container {
  position: fixed;
  top: 5%;
  right: 5%;
  padding: 5px;
  background-color: tomato;
  display: flex;
  justify-content: space-between;
  overflow: hidden;
}


.button-text-container {
  order:-1;
  display: flex;
  align-items: center;
  justify-content: center;
  background-color: lightblue;
  white-space:nowrap; /*Keep text always one line*/
  overflow:hidden;
  width:0;
  transition: width 1s;
}

.button-icon-container {
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}
.button-icon-container:hover + .button-text-container {
  width:200px;
}
<div class="button-container" id="myButton">
  <div class="button-icon-container">
    <img src="https://placeholder.pics/svg/100x100/7AFFA6/000000/ICON">
  </div>
  
  <div class="button-text-container">
    <span>Here comes some text.</span>
  </div>
</div>

【讨论】:

  • 像魅力一样工作,谢谢。不知道这里的 flexbox order 的用处,谢谢指出。出于好奇:通过类添加(使用 jQuery)增加宽度有什么缺点吗?
  • 虽然我没有做任何测试,但我认为 CSS 解决方案的执行速度会稍快一些。但是,您可能看不到任何区别。另一个优点是,如果您的解决方案不包含 Javascript,则更易于维护。
  • @JoSch 是的,如果您必须在仅使用 CSS 或为 2 行代码引入像 jQuery 这样的整个库之间做出选择,那么会有很大的缺点......避免使用 JS/jQuery 总是更好
  • @TemaniAfif,你能帮我解决这个链接吗?我也在尝试一些东西,但使用点击事件stackoverflow.com/questions/62609231/…
【解决方案2】:

css 有更好的选择,但如果你想用 javascript 来做,这可以解决问题。让需要增长的实际容器改变宽度,而不是包裹它的容器。

$(document).ready(function() {
  var button = $("#myButton");

  button.mouseenter(function() {
    $('.button-text-container').addClass("grow");
  });
  button.mouseleave(function() {
    $('.button-text-container').removeClass("grow");
  });
});
.button-container {
  position: fixed;
  top: 5%;
  right: 5%;
  padding: 5px;
  background-color: tomato;
  display: flex;
  justify-content: space-between;

}

.button-text-container.grow {
  width: 300px;
}

.button-text-container {
  display: flex;
  align-items: center;
  justify-content: center;
  background-color: lightblue;
  overflow: hidden;
  width: 0px;
  transition: width 1s;
}

.button-icon-container {
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="button-container" id="myButton">

  <div class="button-text-container">
    <span>Here comes some text.</span>
  </div>

  <div class="button-icon-container">
    <img src="https://placeholder.pics/svg/100x100/7AFFA6/000000/ICON">
  </div>

</div>

【讨论】:

    猜你喜欢
    • 2011-02-03
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    相关资源
    最近更新 更多