CSS переход между левым -> правым и верхним -> нижним положениями

Можно ли использовать переходы CSS для анимации чего-либо между позициями, установленными как left: 0px, и right: 0px, чтобы они проходили по всему экрану? Мне нужно сделать то же самое сверху вниз. Я застрял в расчете ширины экрана/размера объекта?

#nav {
    position: absolute;
    top: 0px;
    left: 0px;
    width: 50px;
    height: 50px;
    -webkit-transition: all 0.5s ease-out;
}

.moveto {
    top: 0px;
    right: 0px;
}

а затем я использую jQuery .addClass


person grep    schedule 20.04.2012    source источник
comment
Итак, что вы пробовали? С каким HTML вы работаете? CSS, любой JavaScript? У вас есть демонстрация того, что у вас уже есть?..?   -  person David says reinstate Monica    schedule 20.04.2012
comment
@David Thomas см. правки.   -  person grep    schedule 20.04.2012
comment
Спасибо! ... можем ли мы также увидеть (соответствующие) HTML и jQuery?   -  person David says reinstate Monica    schedule 20.04.2012
comment
В более современных браузерах вы также можете использовать calc() для определения позиций, что помогает вам делать такие вещи, как .moveto { left: calc(100% - 50px); }.   -  person candu    schedule 20.11.2014


Ответы (4)


Вы можете анимировать положение (сверху, снизу, слева, справа), а затем вычесть ширину или высоту элемента с помощью преобразования CSS.

Рассмотреть возможность:

$('.animate').on('click', function(){
  $(this).toggleClass("move");
})
     .animate {
        height: 100px;
        width: 100px;
        background-color: #c00;
        transition: all 1s ease;
        position: absolute;
        cursor: pointer;
        font: 13px/100px sans-serif;
        color: white;
        text-align: center;
      }

                               /* ↓ just to position things  */
      .animate.left   { left: 0;   top: 50%;  margin-top: -100px;}
      .animate.right  { right: 0;  top: 50%;  }
      .animate.top    { top: 0;    left: 50%; }
      .animate.bottom { bottom: 0; left: 50%; margin-left: -100px;}


      .animate.left.move {
        left: 100%; 
        transform: translate(-100%, 0);
      }

      .animate.right.move {
        right: 100%; 
        transform: translate(100%, 0);
      }

      .animate.top.move {
        top: 100%; 
        transform: translate(0, -100%);
      }

      .animate.bottom.move {
        bottom: 100%; 
        transform: translate(0, 100%);
      }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Click to animate
<div class="animate left">left</div>
<div class="animate top">top</div>
<div class="animate bottom">bottom</div>
<div class="animate right">right</div>

А затем анимировать в зависимости от положения...

person methodofaction    schedule 20.04.2012
comment
Возможно, вы захотите добавить переход с эластичным замедлением .com/questions/23462515/ - person Adrien Be; 01.03.2016

Это сработало для меня на Chromium. % для перевода относится к размеру ограничивающей рамки элемента, к которому он применяется, поэтому он идеально перемещает элемент к нижнему правому краю, не переключая, какое свойство используется для указания его местоположения.

topleft {
  top: 0%;
  left: 0%;
}
bottomright {
  top: 100%;
  left: 100%;
  -webkit-transform: translate(-100%,-100%);
}
person teknotus    schedule 29.08.2013

В более современных браузерах (включая IE 10+) теперь можно использовать calc():

.moveto {
  top: 0px;
  left: calc(100% - 50px);
}
person candu    schedule 20.11.2014

Для элементов с динамической шириной можно использовать transform: translateX(-100%); для подсчета горизонтального процентного значения. Это приводит к двум возможным решениям:

1. Вариант: перемещение элемента во всём окне просмотра:

Переход от:

transform: translateX(0);

to

transform: translateX(calc(100vw - 100%));

#viewportPendulum {
  position: fixed;
  left: 0;
  top: 0;
  animation: 2s ease-in-out infinite alternate swingViewport;
  /* just for styling purposes */
  background: #c70039;
  padding: 1rem;
  color: #fff;
  font-family: sans-serif;
}

@keyframes swingViewport {
  from {
    transform: translateX(0);
  }
  to {
    transform: translateX(calc(100vw - 100%));
  }
}
<div id="viewportPendulum">Viewport</div>

2. Вариант: перемещение элемента в родительский контейнер:

Переход от:

transform: translateX(0);
left: 0;

to

left: 100%;
transform: translateX(-100%);

#parentPendulum {
  position: relative;
  display: inline-block;
  animation: 2s ease-in-out infinite alternate swingParent;
  /* just for styling purposes */
  background: #c70039;
  padding: 1rem;
  color: #fff;
  font-family: sans-serif;
}

@keyframes swingParent {
  from {
    transform: translateX(0);
    left: 0;
  }
  to {
    left: 100%;
    transform: translateX(-100%);
  }
}

.wrapper {
  padding: 2rem 0;
  margin: 2rem 15%;
  background: #eee;
}
<div class="wrapper">
  <div id="parentPendulum">Parent</div>
</div>


Демонстрация на Codepen

Примечание. Этот подход можно легко расширить для работы с вертикальным позиционированием. Посетите пример здесь.

person Robbendebiene    schedule 19.03.2020
comment
Это должен быть принятый ответ! Кажется, это самый чистый способ сделать это. - person oemera; 14.10.2020
comment
Самое простое и чистое решение, сработало для меня. - person mignaway; 05.03.2021