将 marginLeft 动画到元素的 -width

Posted

技术标签:

【中文标题】将 marginLeft 动画到元素的 -width【英文标题】:Animate marginLeft to element's -width 【发布时间】:2015-12-19 13:55:07 【问题描述】:

我有一个带有长内联文本的元素,并且想要制作将这个文本从屏幕右侧(窗口右边框后面的整个文本)移动到屏幕左侧的动画。

我的想法是通过将 margin-left 设置为元素的减(宽度)来移动元素:

var element = $(this);
$("p").animate(
  'marginLeft': - element;
, 4000);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>element with long long long long inline text....</p>

但这不起作用。有什么想法吗?

【问题讨论】:

【参考方案1】:

在这种情况下,据我所知,$(this) 是窗口。您想要为 $("p") 本身设置动画,并且您需要根据其宽度而不是一般 DOM 元素指定您正在制作动画。在您发送到animate 函数的对象中还有一个流氓;(您可以在开发者工具控制台中看到类似的错误)。

var $element = $("p");

$element.animate(
  'marginLeft': -($element.outerWidth())
, 4000);
body 
  margin: 0;
  font-family: sans-serif;
  font-size: 12px;
  overflow-x: hidden; /* no horizontal scrollbar */

p 
  white-space: nowrap;
  background: #ccc;
  display: inline-block;
  margin-left: 100%;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<p>element with long long long long inline text....</p>

编辑

或者,这里是纯 CSS。如果您正在开发的浏览器支持它,这是更有效的途径。它使浏览器“重绘”更少,并在 GPU 上运行,而不是像 JS 那样在 CPU 上运行。

body 
  margin: 0;
  font-family: sans-serif;
  font-size: 12px;
  overflow-x: hidden; /* no horizontal scrollbar */


@-webkit-keyframes offscreenLeft 
  0%    transform: translateX(0); 
  100%  transform: translateX(-100%); 

@-moz-keyframes offscreenLeft 
  0%    transform: translateX(0); 
  100%  transform: translateX(-100%); 

@-o-keyframes offscreenLeft 
  0%    transform: translateX(0); 
  100%  transform: translateX(-100%); 

@keyframes offscreenLeft 
  0%    transform: translateX(0); 
  100%  transform: translateX(-100%); 


p 
  white-space: nowrap;
  background: #ccc;
  display: inline-block;
  padding-left: 100%; /* translate uses the inner width of the p tag, so the thing pushing it offscreen needs to be *inside* the p, not outside (like margin is) */
  
  -webkit-animation: offscreenLeft 4s forwards; /* Safari 4+ */
  -moz-animation:    offscreenLeft 4s forwards; /* Fx 5+ */
  -o-animation:      offscreenLeft 4s forwards; /* Opera 12+ */
  animation:         offscreenLeft 4s forwards; /* IE 10+, Fx 29+ */
&lt;p&gt;element with long long long long inline text....&lt;/p&gt;

【讨论】:

谢谢。我对 p 标签的绝对位置有问题,所以我删除了它,现在我正在使用你的解决方案。非常感谢! :) position:absolute; 也可以工作;这实际上取决于您页面上的其余内容如何与之交互。您还可以根据您需要支持的浏览器使用纯 CSS,就像在@azium 的回答中一样。【参考方案2】:

如果我是你,我会在元素上切换一个类并使用 CSS 的 transform: translateX() 结合 transition 将元素移出屏幕。

codepen

css

p 
  transform: translateX(0);
  transition: transform 0.3s ease;


p.off-screen-right 
  transform: translateX(100%)

js

$(document).ready(function () 
  $('button').click(function () 
    $('p').toggleClass('off-screen-right')
  )
)

【讨论】:

【参考方案3】:

步骤

获取&lt;p&gt; 宽度并将其保存在变量中。 然后,将初始 margin-left 设置为 $(window).width() 之后,您可以调用animate 函数将margin-left 设置为您最初保存在变量中的宽度的负值

工作代码

$(function() 
  var width = $("p").width();
  
  $("p")
    .css('margin-left', $(window).width())
    .animate( 'margin-left': -width , 4000);
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>element with long long long long inline text....</p>

【讨论】:

以上是关于将 marginLeft 动画到元素的 -width的主要内容,如果未能解决你的问题,请参考以下文章

我的 JS 动画重置了它的 marginTop,但不是它的 marginLeft

在单个元素上使用多个动画(连续)

将 div 上的 j.truncate 与 div P 标签上的动画 marginLeft 结合起来 jQuery

jquery 的 animate(left:1000px,1000);和animate(marginLeft:1000px,1000);有啥区别呢?

JQuery:结合动画 CSS 和淡入淡出

jQuery .animate() marginLeft 在 IE8 及更低版本中不起作用 - 参数无效