Transisi CSS tidak bekerja dengan atas, bawah, kiri, kanan


91

Saya memiliki elemen dengan gaya

position: relative;
transition: all 2s ease 0s;

Kemudian saya ingin mengubah posisinya dengan mulus setelah mengkliknya, tetapi ketika saya menambahkan gaya, transisi tidak terjadi, melainkan elemen bergerak secara instan.

$$('.omre')[0].on('click',function(){
    $$(this).style({top:'200px'});
});

Namun jika saya mengubah colorproperti misalnya, itu berubah dengan mulus.

$$('.omre')[0].on('click',function(){
    $$(this).style({color:'red'});
});

Apa yang mungkin menjadi penyebabnya? Apakah ada properti yang bukan 'transisi'?

EDIT : Saya kira saya harus menyebutkan bahwa ini bukan jQuery, ini perpustakaan lain. Kode tampaknya berfungsi sebagaimana mestinya, gaya ditambahkan, tetapi transisi hanya berfungsi dalam kasus kedua?


2
Dengan asumsi $$ adalah alias untuk jQuery, melakukan [0] akan mengembalikan objek dom asli (sebagai lawan dari objek jquery) dan tidak memiliki .on()metode apa pun . Jika tidak - apa itu $$?
xec

Tidak ada yang valid, jika Anda menggunakan jQuery tidak ada yang disebut style (), dan di native JS, itu pasti tidak berfungsi seperti itu.
adeneo

1
Ada sekumpulan aturan yang dapat ditransisikan. lihat Spesifikasi W3
Goldentoa11

@ Goldentoa11 toptampaknya ada dalam daftar, yang menghilangkan keraguan saya tentang toptidak tersedia untuk transisi.
php_nub_qq

3
@php_nub_qq Periksa jawaban adaneo dan komentar saya untuk itu, dari kelihatannya Anda perlu memulai dengan topset nilai (misalnya 0) sebelum Anda mengubahnya (menjadi 200 atau apa pun)
xec

Jawaban:


191

Coba tetapkan nilai default di css (untuk memberi tahu di mana Anda ingin memulai)

CSS

position: relative;
transition: all 2s ease 0s;
top: 0; /* start out at position 0 */

11
atau transition: top 1s ease 0s;untuk tophanya
Oleg Abrazhaev

16

Mungkin Anda perlu menentukan nilai teratas di set aturan css Anda, sehingga akan tahu apa nilai bernyawa dari .


2

Dalam kasus saya, posisi div diperbaiki, menambahkan posisi kiri tidak cukup, itu mulai berfungsi hanya setelah menambahkan blok tampilan

left:0; display:block;


2

Sesuatu yang tidak relevan untuk OP, tetapi mungkin untuk orang lain di masa mendatang:

Untuk piksel ( px), jika nilainya adalah "0", unit dapat dihilangkan: right: 0dan right: 0pxkeduanya berfungsi.

Namun saya perhatikan bahwa di Firefox dan Chrome ini bukan kasus untuk unit detik ( s). Sementara transition: right 1s ease 0skarya, transition: right 1s ease 0(unit hilang suntuk nilai terakhir transition-delay) tidak tidak (hal itu tidak bekerja di Ujung namun).

Dalam contoh berikut, Anda akan melihat bahwa rightberfungsi untuk 0pxdan 0, tetapi transitionhanya berfungsi untuk 0sdan tidak berfungsi dengan 0.

#box {
    border: 1px solid black;
    height: 240px;
    width: 260px;
    margin: 50px;
    position: relative;
}
.jump {
    position: absolute;
    width: 200px;
    height: 50px;
    color: white;
    padding: 5px;
}
#jump1 {
    background-color: maroon;
    top: 0px;
    right: 0px;
    transition: right 1s ease 0s;
}
#jump2 {
    background-color: green;
    top: 60px;
    right: 0;
    transition: right 1s ease 0s;
}
#jump3 {
    background-color: blue;
    top: 120px;
    right: 0px;
    transition: right 1s ease 0;
}
#jump4 {
    background-color: gray;
    top: 180px;
    right: 0;
    transition: right 1s ease 0;
}
#box:hover .jump {
    right: 50px;
}
<div id="box">
  <div class="jump" id="jump1">right: 0px<br>transition: right 1s ease 0s</div>
  <div class="jump" id="jump2">right: 0<br>transition: right 1s ease 0s</div>
  <div class="jump" id="jump3">right: 0px<br>transition: right 1s ease 0</div>
  <div class="jump" id="jump4">right: 0<br>transition: right 1s ease 0</div>
</div>



-1

Saya mengalami masalah ini hari ini. Inilah solusi hacky saya.

Saya membutuhkan elemen posisi tetap untuk bertransisi hingga 100 piksel saat dimuat.

var delay = (ms) => new Promise(res => setTimeout(res, ms));
async function animateView(startPosition,elm){
  for(var i=0; i<101; i++){
    elm.style.top = `${(startPosition-i)}px`;
    await delay(1);
  }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.