【问题标题】:Fill background color left to right CSS从左到右填充背景颜色 CSS
【发布时间】:2020-10-06 17:17:25
【问题描述】:

今天玩了一些css3,主要是转场。

我想要实现的是,在 li 元素悬停时,背景将从左到右填充不同的颜色,理想情况下,我希望能够填充一半或全部......我已经开始了jsfiddle

我需要使用该物业吗

-vendor-prefix transition 

谁能给我一些关于实现这一目标的建议。

谢谢

【问题讨论】:

标签: css


【解决方案1】:

您需要在这里做的是使用线性渐变作为背景并为背景位置设置动画。在代码中:

使用线性渐变(50% 红色,50% 蓝色)并告诉浏览器背景是元素宽度(宽度:200%,高度:100%)的 2 倍,然后告诉它将背景定位在左侧.

background: linear-gradient(to right, red 50%, blue 50%);
background-size: 200% 100%;
background-position:left bottom;

悬停时,将背景位置更改为right bottom,使用transition:all 2s ease;,位置会逐渐变化(使用linear 会更好) 背景位置:右下角;

http://jsfiddle.net/75Umu/3/

至于 -vendor-prefix'es,请参阅您的问题的 cmets

额外的 如果您希望在颜色中有一个“过渡”,您可以将其设为 300% 宽度,并让过渡从 34%(略大于 1/3)开始并以 65%(略小于 2/3)结束)。

background: linear-gradient(to right, red 34%, blue 65%);
background-size: 300% 100%;

演示:

div {
    font: 22px Arial;
    display: inline-block;
    padding: 1em 2em;
    text-align: center;
    color: white;
    background: red; /* default color */

    /* "to left" / "to right" - affects initial color */
    background: linear-gradient(to left, salmon 50%, lightblue 50%) right;
    background-size: 200%;
    transition: .5s ease-out;
}
div:hover {
    background-position: left;
}
<div>Hover me</div>

【讨论】:

  • +1 但我必须编辑您的小提琴以删除 -webkit-prefix 才能看到它在 Firefox 中工作。 :-(
  • @Spudley 您需要同时使用这两种浏览器,因为 Webkit 浏览器目前不使用 stock 转换。
  • @jezzipin - 实际上根据CanIUse,Chrome 不再需要前缀(尽管我猜 Chrome 在技术上不再是 webkit 浏览器......)。但我的意思是,这个问题专门询问了前缀,所以由于前缀,小提琴在所有浏览器中都不起作用的事实有点失礼。 :) 无论如何,现在都整理好了。
  • @gar_onn 我怎样才能让过渡在 3/4 处停止?而不是填充元素
  • 你可以使用background-position:75% bottom;the backgound-position documentaion on MDN
【解决方案2】:

悬停时的单个 CSS 代码可以解决问题: box-shadow: inset 100px 0 0 0 #e0e0e0;

一个完整的演示可以在我的小提琴中找到:

https://jsfiddle.net/shuvamallick/3o0h5oka/

【讨论】:

  • 聪明。我喜欢。我不知道浏览器的兼容性,但我喜欢它。
  • 我唯一能立即看到的是 100px 值需要硬编码,因此很难将其用作跨多个不同宽度元素的类。
  • 它可以工作,但是 box-shadow 是一个非常昂贵的动画属性(就系统资源而言)csstriggers.com/box-shadow 并且设置 transition: all; 并不是最好的。使用伪元素可以实现类似的效果:jsfiddle.net/f198x4bq/19。通过转换::before 上的transform 和opacity 属性以及转换按钮上的color 属性可以实现相同的效果。它解决了@armadadrive 指出的问题
【解决方案3】:

如果您像我一样需要更改文本本身的颜色,同时填充背景颜色,请检查我的解决方案。

创建步骤:

  1. 有两个文本,一个是悬停时的静态颜色,另一个是您将在悬停时移动的默认状态颜色
  2. 悬停移动非静态文本的包装,同时将该包装的内部文本移动到相反方向。
  3. 确保在需要的地方添加溢出隐藏

这个解决方案的好处:

  • 支持 IE9,仅使用转换
  • 按钮(或您正在应用动画的元素)的宽度是可变的,因此这里没有使用固定值

这个解决方案不太好:

  • 一个非常混乱的标记,可以通过使用伪元素和 att(data) 来解决吗?
  • 当多个按钮并排放置时,动画会出现一些小故障,也许可以轻松解决,但我没有花太多时间进行调查。

检查笔--->https://codepen.io/nikolamitic/pen/vpNoNq

<button class="btn btn--animation-from-right">
  <span class="btn__text-static">Cover left</span>
  <div class="btn__text-dynamic">
    <span class="btn__text-dynamic-inner">Cover left</span>
  </div>
</button>

.btn {
  padding: 10px 20px;
  position: relative;

  border: 2px solid #222;
  color: #fff;
  background-color: #222;
  position: relative;

  overflow: hidden;
  cursor: pointer;

  text-transform: uppercase;
  font-family: monospace;
  letter-spacing: -1px;

  [class^="btn__text"] {
    font-size: 24px;
  }

  .btn__text-dynamic,
  .btn__text-dynamic-inner {    
    display: flex;
    justify-content: center;
    align-items: center;

    position: absolute;
    top:0;
    left:0;
    right:0;
    bottom:0;
    z-index: 2;

    transition: all ease 0.5s;
  }

  .btn__text-dynamic {
    background-color: #fff;
    color: #222;

    overflow: hidden;
  }

  &:hover {
    .btn__text-dynamic {
      transform: translateX(-100%);
    }
    .btn__text-dynamic-inner {
      transform: translateX(100%);
    }
  }
}

.btn--animation-from-right {
    &:hover {
    .btn__text-dynamic {
      transform: translateX(100%);
    }
    .btn__text-dynamic-inner {
      transform: translateX(-100%);
    }
  }
}

如果要向左设置动画,可以删除 .btn--animation-from-right 修饰符。

【讨论】:

  • @MadaraUchiha np 很高兴有人觉得它有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 2014-06-04
  • 2022-11-01
  • 1970-01-01
相关资源
最近更新 更多