Skrót CSS o wielu właściwościach?

519

Nie mogę znaleźć poprawnej składni dla stenografii przejścia CSS z wieloma właściwościami. To nic nie robi:

.element {
  -webkit-transition: height .5s, opacity .5s .5s;
     -moz-transition: height .5s, opacity .5s .5s;
      -ms-transition: height .5s, opacity .5s .5s;
          transition: height .5s, opacity .5s .5s;
  height: 0;
  opacity: 0;
  overflow: 0;
}
.element.show {
  height: 200px;
  opacity: 1;
}

Dodaję klasę show za pomocą javascript. Element staje się wyższy i widoczny, po prostu się nie zmienia. Testowanie w najnowszych przeglądarkach Chrome, FF i Safari.

Co ja robię źle?

EDYCJA: Żeby było jasne, szukam wersji skróconej, aby zmniejszyć mój CSS. Jest wystarczająco napompowany wszystkimi prefiksami dostawcy. Rozszerzono również przykładowy kod.

Gregory Bolkenstijn
źródło
2
Sprawdź tę dokumentację. developer.mozilla.org/en/CSS/CSS_transitions
websymphony
3
Czy faktycznie zmieniasz wartości wysokości i krycia? W przeciwnym razie nie ulegną zmianie
Junzen
Nie jestem zbyt dobrze zaznajomiony z przejściami CSS - czy podwójne .5swartości są opacityzamierzone?
BoltClock
Dokumentacja nie podaje przykładu użycia wersji skróconej z wieloma właściwościami. Wysokość zmienia się od 0 do 200 pikseli, krycie od 0 do 1. Drugie 0,5 sekundy to opóźnienie przejścia krycia. Chcę, aby element wyrósł na wysokość, a kiedy to się skończy,
zaniknij
2
Ach tak, wartość opóźnienia.
BoltClock

Odpowiedzi:

752

Składnia:

transition: <property> || <duration> || <timing-function> || <delay> [, ...];

Pamiętaj, że czas trwania musi być wcześniejszy niż opóźnienie, jeśli jest ono określone.

Poszczególne przejścia połączone w deklaracje skrócone:

-webkit-transition: height 0.3s ease-out, opacity 0.3s ease 0.5s;
-moz-transition: height 0.3s ease-out, opacity 0.3s ease 0.5s;
-o-transition: height 0.3s ease-out, opacity 0.3s ease 0.5s;
transition: height 0.3s ease-out, opacity 0.3s ease 0.5s;

Lub po prostu przenieś je wszystkie:

-webkit-transition: all 0.3s ease-out;
-moz-transition: all 0.3s ease-out;
-o-transition: all 0.3s ease-out;
transition: all 0.3s ease-out;

Oto prosty przykład . Oto kolejna z właściwością delay .


Edycja: poprzednio wymienione tutaj były kompatybilności i znane problemy dotyczące transition. Usunięto dla czytelności.

Podsumowując: po prostu go użyj. Charakter tej właściwości jest niezniszczalny dla wszystkich aplikacji, a kompatybilność jest obecnie znacznie wyższa niż 94% na całym świecie.

Jeśli nadal chcesz być pewien, zajrzyj na http://caniuse.com/css-transitions

Rémi Breton
źródło
1
Próbowałeś tego? To nie działa dla mnie. Nie mogę również użyć całej właściwości, ponieważ mam opóźnienie w przypadku drugiej właściwości.
Gregory Bolkenstijn,
3
Czy ma miejsce jakikolwiek wpływ na wydajność / pamięć / inne implikacje allzamiast używania konkretnych właściwości? Na przykład, jeśli planuję przejść backgroundi colortylko - czy lepiej jest podać oba, czy tylko używać all? Ponadto - biorąc pod uwagę, że IE6-9 nie obsługuje przejść, a IE10 obsługuje je bez prefiksu - czy jest jakieś plusy / minusy dołączania ms-transition:dyrektyw?
mattstuehler
9
Przeniesienie wszystkich właściwości zamiast po prostu tej, której potrzebujesz, ma zdecydowanie wpływ na wydajność. Może to spowodować poważne uszkodzenia, jeśli wiele elementów przenosi wszystkie właściwości w tym samym czasie. O ms-transition, nie znam żadnego powodu, skoro IE10 jest obecnie dostępny, dlaczego ktoś nadal używałby ms-transitionzamiast standardu transition. Oba będą sprawiać kłopoty, ale, szczególnie w arkuszu stylów wymagającym intensywnego przejścia, nadwyrężą twój CSS. Co ważniejsze, rozmiar pliku również się przyda.
Rémi Breton,
3
Miałem ten sam problem i wydawało się, że użycie „przejścia: krycie 1s .5s, maksymalna wysokość .5s 0” nie działało, podczas gdy „przejście: krycie 1s .5s, maksymalna wysokość .5s 0s” było. Pierwszy raz widzę jednostkę wymaganą dla zerowej wartości w css!
mlarcher
5
Warto zauważyć, że użycie „wszystkiego” jest wolniejsze niż określenie określonych właściwości.
Nathan
433

Jeśli masz kilka określonych właściwości, które chcesz przenieść w ten sam sposób (ponieważ masz również pewne właściwości, których konkretnie nie chcesz, powiedzmy opacity), inną opcją jest zrobienie czegoś takiego (przedrostki pominięto dla zwięzłości):

.myclass {
    transition: all 200ms ease;
    transition-property: box-shadow, height, width, background, font-size;
}

Druga deklaracja zastępuje allpowyższą deklarację skróconą i sprawia, że ​​(czasami) kod jest bardziej zwięzły.

/* prefixes omitted for brevity */
.box {
    height: 100px;
    width: 100px;
    background: red;
    box-shadow: red 0 0 5px 1px;
    transition: all 500ms ease;
    /*note: not transitioning width */
    transition-property: height, background, box-shadow;
}

.box:hover {
  height: 50px;
  width: 50px;
  box-shadow: blue 0 0 10px 3px;
  background: blue;
}
<p>Hover box for demo</p>
<div class="box"></div>

Próbny

Jason
źródło
4
To jest przydatne! Nie tylko z powodu transition-propertyzastąpienia, ale także dlatego, że na przykład transition-delaynależy podać po skrócie (przynajmniej w pakiecie internetowym). Innymi słowy, skrót oznacza a transition-delayz 0, a samodzielne opóźnienie przed skrótem ustawia go z powrotem na 0.
duncanwilcox
@ Duncanwilcox możesz zrobić transition: [props] [duration] [easing] [delay] w każdej nowoczesnej przeglądarce
Jason
9
Wolę tę odpowiedź DUŻO niż odpowiedź zaakceptowana.
Erutan409
3
śliczny! bardzo podoba mi się podejście!
wasddd_
36

Pracuję z tym:

element{
   transition : height 3s ease-out, width 5s ease-in;
}
Ahbap Aldirmaz
źródło
Właśnie tego szukałem - stenografia dla wielu właściwości. Dzięki!
Adam Moisa,
2

Dzięki opóźnieniu .5s po przejściu przez właściwość krycia element będzie całkowicie przezroczysty (a przez to niewidoczny) przez cały czas jego zmiany wysokości. Jedyną rzeczą, którą zobaczysz, jest zmiana krycia. Otrzymasz taki sam efekt, jak pozostawienie właściwości height poza przejściem:

„przejście: krycie .5s .5s;”

Czy tego właśnie chcesz? Jeśli nie, a chcesz zobaczyć zmianę wysokości, nie możesz mieć krycia zero przez cały czas jej przejścia.

JB
źródło
To również nie działa, ponieważ wysokość pozostanie równa 0 podczas przejścia krycia.
Xesau,
0

Pomogło mi to zrozumieć / usprawnić, tylko to, czego potrzebowałem do animacji:

// SCSS - Multiple Animation: Properties | durations | etc.
// on hover, animate div (width/opacity) - from: {0px, 0} to: {100vw, 1}

.base {
  max-width: 0vw;
  opacity: 0;

  transition-property: max-width, opacity; // relative order
  transition-duration: 2s, 4s; // effects relatively ordered animation properties
  transition-delay: 6s; // effects delay of all animation properties
  animation-timing-function: ease;

  &:hover {
    max-width: 100vw;
    opacity: 1;

    transition-duration: 5s; // effects duration of all aniomation properties
    transition-delay: 2s, 7s; // effects relatively ordered animation properties
  }
}

~ Dotyczy to wszystkich właściwości przejścia (czas trwania, funkcja synchronizacji czasu itp.) W klasie „.base”

gav_aus_web
źródło
-4

Myślę, że to działa z tym:

element{
   transition: all .3s;
   -webkit-transition: all .3s;
   -moz-transition: all .3s;
   -o-transition: all .3s;
Thomas Lamothe
źródło