【问题标题】:CSS Transition Width Right to LeftCSS 过渡宽度从右到左
【发布时间】:2017-12-01 16:37:39
【问题描述】:

我已经创建了一个标题(欢迎词),一旦页面加载(onload="")就会显示出来。

Fiddle 以防下面的代码不起作用。

function animate() {
  document.getElementById("mainText").style.width = "100%";

}
#mainText {
  margin: 0px;
  display: inline-block;
  font-size: 100px;
  width: 0%;
  transition: width 2s;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: clip;
}
<body onload="animate()">
  <h1 id="mainText">Welcome</h1>
</body>

CSS 和普通 JS 工作正常,但我希望“欢迎”这个词首先显示在右侧,然后沿着移动,所以从 e 到 W,而不是现在的样子,从左到右打开。

我试过text align: right;,但这并没有改变任何东西。

如果解决方案是 JS,我最好不要使用任何 jQuery。

过渡到一半时所需外观的示例:

【问题讨论】:

  • 是的......完成了工作小提琴......试试这是否适合你。有点hacky...☺
  • 这个链接可能会帮助你实现这个jsfiddle.net/ZJyYY

标签: javascript html css css-transitions


【解决方案1】:

您可以使用clip-path 属性来剪切元素的某些部分,使其不可见。该属性也可以通过动画再次显示元素,在动画中使用 forwards 关键字,使其保持“显示”结束状态。

inset 采用的值按顺序排列:从顶部开始、从右侧开始、从底部开始、从左侧开始。

#text {
  margin: 0;
  font-size: 100px;
  animation: reveal 2s forwards;
}

@keyframes reveal {
  from {
    clip-path: inset(0 0 0 100%);
  }
  to {
    clip-path: inset(0 0 0 0);
  }
}
&lt;h1 id="text"&gt;Welcome&lt;/h1&gt;

【讨论】:

  • forward 关键字有什么作用吗?你能解释一下吗
  • @OliverMurfett 看起来他正在使用 CSS 关键帧动画。
  • @OliverMurfett 这是一项实验性技术,并非所有浏览器都支持,您可以在这里查看:developer.mozilla.org/en/docs/Web/CSS/animation-fill-mode
  • @OliverMurfett forwards 使动画的最后一帧保持不变,否则元素将恢复到应用动画之前的初始设置
  • 对不起,我很忙,所以我还没有发布解释。稍后再做。
【解决方案2】:

是的,可以使用过渡和位置:

window.onload = function () {
  document.querySelector("h1").classList.add("active");
};
h1 {
  overflow: hidden;
  display: inline-block;
  position: relative;
}
h1 .mask {
  position: absolute;
  transition: all 0.5s linear;
  left: 0;
  top: 0;
  bottom: 0;
  right: 0;
  background-color: #fff;
}
h1.active .mask {
  right: 100%;
}
&lt;h1&gt;&lt;span class="mask"&gt;&lt;/span&gt;Welcome&lt;/h1&gt;

我刚刚写了一篇关于这个的文章 - CSS Transitions & JavaScript for Animated Entry Effects。希望有用...:)

【讨论】:

  • 肯定不是我要问的,以 Fiddle 为例
  • @OliverMurfett 是的,我知道...我正在尝试做某事...让我们看看...这有点难...:)但是,不错...
  • @OliverMurfett 我有一个...让我现在添加它。
  • @OliverMurfett 刷新答案试试?
  • 最后一个正是我想要的!您是否介意编辑您的评论并删除前 2 条,以免人们将来看到此内容时造成混淆?
【解决方案3】:

一个选项是transform: translate 带有一个伪元素,不需要额外的元素。

function animate() {
  document.getElementById("mainText").classList.add('show');
}
#mainText {
  position: relative;
  margin: 0px;
  display: inline-block;
  font-size: 100px;
  white-space: nowrap;
  text-overflow: clip;
  overflow: hidden;
}
#mainText::after {
  content: '';
  position: absolute;
  left: 0; top: 0;
  width: 100%; height: 100%;
  background: white;
  transition: transform 2s;
}
#mainText.show::after {
  transform: translateX(-100%);
}
<body onload="animate()">

    <h1 id="mainText">Welcome</h1>
    
</body>

另一个选项,一个更好的解决方案,使用 directionleft/width 的伪。

这与clip-path 的工作方式相同,在其背景下完全透明,与具有使文本陶醉的蒙版相反,并且具有更好的浏览器支持。

function animate() {
  document.getElementById("mainText").classList.add('show');
}
body {
  background: black;
}
#mainText {
  position: relative;
  margin: 0px;
  display: inline-block;
  font-size: 100px;
  white-space: nowrap;
  color: rgba(0, 0, 0, 0);
}
#mainText::before {
  content: attr(data-text);
  position: absolute;
  left: 100%;
  top: 0;
  width: 0;
  height: 100%;
  color: white;
  direction: rtl;
  overflow: hidden;
  transition: left 2s, width 2s;
}
#mainText.show::before {
  left: 0;
  width: 100%;
}
<body onload="animate()">

  <h1 id="mainText" data-text="Welcome">Welcome</h1>

</body>

【讨论】:

  • 这是一个很酷的效果,但实际上并不是我想要的。我想要 e,然后是 m,然后是 o ect。以该顺序显示。
  • 看看我链接的图片,虽然中途截屏会是什么样子。
  • @OliverMurfett 更新...没有额外的元素,只是 CSS
【解决方案4】:

类似的东西

function animate() {
  document.getElementById("overlay").style.width = "0%";

}
#mainText {
  margin: 0px;
  display: inline-block;
  font-size: 100px;
  width: 100%;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: clip;
}
#overlay{
  width: 100%;
  position:absolute;
  top:0;
  left:0;
  background:#fff;
  transition: width 2s;
  height:100%;
}
<body onload="animate()">
  <h1 id="mainText">Welcome</h1>
  <div id="overlay"></div>
</body>

【讨论】:

    【解决方案5】:

    这将需要一个在标题顶部带有背景的伪元素作为掩码。我不会更改内联样式,而是简单地添加一个类is-active。所以所有与样式相关的东西都可以通过 CSS 来设置样式。

    function animate() {
      document.getElementById("mainText").className = "is-active";
    }
    #mainText {
      margin: 0px;
      display: inline-block;
      position: relative;
      font-size: 100px;
      white-space: nowrap;
      overflow: hidden;
      text-overflow: clip;
    }
    
    #mainText:before {
      content: '';
      position: absolute;
      top: 0;
      left: 0;
      bottom: 0;
      width: 100%;
      background: #FFF;
      transition: width 2s;
    }
    
    #mainText.is-active:before {
      width: 0%;
    }
    <body onload="animate()">
      <h1 id="mainText">Welcome</h1>
    </body>

    【讨论】:

    • Welp,有点晚了
    【解决方案6】:

    我使用Transform: translateX 来达到预期的效果。

    它在 X 轴上横向滑动文本或水平

    .message {
      color: darkred;
      font-size: 30px;
      display: inline-block;
      font-weight: 100;
      font-family: sans-serif;
    }
    
    .sliding-text-1,
    .sliding-text-2,
    .sliding-text-3 {
      animation-name: slide;
      animation-duration: 1s;
      animation-timing-function: ease-out;
      animation-iteration-count: 1;
      animation-fill-mode: forwards;
      opacity: 0;
    }
    
    .sliding-text-2 {
      animation-delay: 2s;
      color: darkblue;
    }
    
    .sliding-text-3 {
      animation-delay: 4s;
      color: darkgreen;
    }
    
    @keyframes slide {
      from {
        transform: translateX(200px);
      }
      to {
        transform: translateX(0px);
        opacity: 1;
      }
    }
    <h1 class="message sliding-text-1">Hello!</h1>
    <h1 class="message sliding-text-2">Thanks for visiting!</h1>
    <h1 class="message sliding-text-3">Have a nice day!</h1>

    【讨论】:

      猜你喜欢
      • 2014-08-07
      • 2018-07-22
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      相关资源
      最近更新 更多