CSS преход при премахване на клас

Имам формуляр, който функционира като страница с настройки. Когато елементите на формуляра се променят, те се маркират като unsaved и имат различен цвят на рамката. Когато формулярът е запазен, те се маркират като запазени, като имат друг цвят на рамката.

Това, което искам е, когато формулярът бъде запазен, границата постепенно да избледнява.

Редът ще бъде:

<input type='text' class='unsaved' /> Not saved yet, border is yellow
<input type='text' class='saved' />   Saved, so the border is green
<input type='text' class='' />        Fade out if coming from class saved

Ако успея да накарам CSS3 преход да се задейства, когато класът saved бъде премахнат, тогава той може да изчезне и всичко ще бъде ужасно. В момента трябва ръчно да го анимирам (с помощта на приставка, разбира се), но изглежда накъсано и бих искал да преместя кода в CSS3, така че да бъде по-плавно.

Имам нужда само от това, за да работя в Chrome и Firefox 4+, въпреки че други биха били добри.

CSS:

Ето свързания CSS:

.unsaved {
    border: 3px solid #FFA500;
    padding: 0;
}
.saved {
    border: 3px solid #0F0;
    padding: 0;
}

Бих искал да работя в следния преход (или нещо подобно):

border-color: rgba(0,0,0,0);
-webkit-transition: border-color .25s ease-in;  
-moz-transition: border-color .25s ease-in;  
-o-transition: border-color .25s ease-in;  
transition: border-color .25s ease-in;

Забележка:

Лично аз не съм съгласен с тази схема на взаимодействие с потребителите, но това е начина, по който нашият софтуерен ръководител го иска. Моля, не ми предлагайте да променя начина, по който функционира в момента. Благодаря!


person beatgammit    schedule 01.03.2012    source източник
comment
всякакви преходи от дисплея: никой няма да бъде мигновен   -  person Peter Ehrlich    schedule 27.07.2012
comment
променете unsaved на .unsaved. Това е клас, а не елемент.   -  person hofnarwillie    schedule 01.10.2013
comment
@hofnarwillie - фиксирано; това беше просто печатна грешка   -  person beatgammit    schedule 02.10.2013


Отговори (4)


CSS преходите работят, като дефинират две състояния за обекта с помощта на CSS. Във вашия случай вие определяте как изглежда обектът, когато има клас "saved" и вие определяте как изглежда, когато няма клас "saved" (това е нормален вид). Когато премахнете класа "saved", той ще премине към другото състояние според настройките за преход на място за обекта без класа "saved".

Ако настройките за CSS преход се прилагат за обекта (без класа "saved"), тогава те ще се прилагат и за двата прехода.

Бихме могли да помогнем по-конкретно, ако включите всички подходящи CSS, които използвате, с предоставения от вас HTML.

Моето предположение от разглеждане на вашия HTML е, че вашите настройки за CSS за преход се прилагат само към .saved и следователно, когато го премахнете, няма контроли за указване на CSS настройка. Може да искате да добавите друг клас ".fade", който оставяте на обекта през цялото време и можете да посочите вашите настройки за CSS преход в този клас, така че те винаги да са в сила.

person jfriend00    schedule 01.03.2012
comment
Добавих своя CSS, както е в момента, и добавих прехода, който бих искал. Не съм сигурен дали добавянето на клас '.fade' ще проработи, защото той вече ще има другите настройки от 'saved'. Все пак ще го пробвам и ще видя дали мога да го накарам да работи. Благодаря! - person beatgammit; 01.03.2012
comment
@tjameson - имате нужда от клас на обекта, който го идентифицира в състоянието след премахване на .saved. Както е, нямате дефинирани преходи за това състояние (поради което не получавате нито един). Освен това не сте включили никакъв CSS, който действително дефинира смислен преход. Изброихте някои преходи, но не показахте към кои класове са прикрепени и това е ключът. Това ще работи най-добре, ако го поставите в jsFiddle, така че и двамата да можем по-лесно да играем с него там и всъщност да видим какво работи и какво не работи. - person jfriend00; 01.03.2012
comment
Имайте предвид, че невключването на преход към базовия клас може да накара IE да не се върне правилно към оригиналните свойства. (т.е. ако анимирате непрозрачност и класът, който извършва анимирането, непрозрачността ще увисне, вместо да върне [jsfiddle. net/z3txjbaj/6 ], добавянето на преход към базовия клас коригира това jsfiddle.net/z3txjbaj /9). Обърнете внимание, че и двете демонстрации работят само в Chrome и FF, само IE изглежда има този проблем. - person Hanna; 26.07.2016

Отговорът на @jfriend00 ми помага да разбера техниката за анимиране само на клас премахване (не добавяне).

Един "базов" клас трябва да има свойството transition (като transition: 2s linear all;). Това позволява анимации, когато всеки друг клас се добавя или премахва към този елемент. Но за да деактивираме анимацията, когато се добави друг клас (и само премахване на анимиран клас), трябва да добавим transition: none; към втория клас.

Пример

CSS:

.issue {
  background-color: lightblue;
  transition: 2s linear all;
}

.recently-updated {
  background-color: yellow;
  transition: none;
}

HTML:

<div class="issue" onclick="addClass()">click me</div>

JS (необходим само за добавяне на клас):

var timeout = null;

function addClass() {
  $('.issue').addClass('recently-updated');
  if (timeout) {
    clearTimeout(timeout);
    timeout = null;
  }
  timeout = setTimeout(function () {
    $('.issue').removeClass('recently-updated');
  }, 1000);
}

плънкер на този пример.

С този код само премахването на recently-updated клас ще бъде анимирано.

person Ruslan Stelmachenko    schedule 15.02.2016
comment
Кратко и добре обяснено. Благодаря ти - person oodavid; 01.03.2016
comment
Това е, което мога да отговоря чудесно! Кратко, но точно обяснение, с прост, но задълбочен примерен код, връзка към работещ плункер. Не можех да поискам повече! - person FireAphis; 10.07.2016

Основно настройте вашия css като:

element {
  border: 1px solid #fff;      
  transition: border .5s linear;
}

element.saved {
  border: 1px solid transparent;
}
person Ken Wheeler    schedule 01.03.2012

В моя случай имах някакъв проблем с прехода на непрозрачност, така че този го поправи:

#dropdown {
    transition:.6s opacity;
}
#dropdown.ns {
    opacity:0;
    transition:.6s all;
}
#dropdown.fade {
    opacity:1;
}

Мишка Enter

$('#dropdown').removeClass('ns').addClass('fade');

Мишка напуска

$('#dropdown').addClass('ns').removeClass('fade');
person user956584    schedule 08.08.2014