2015-08-13 3 views
1


Я создаю сайт, который позволит вам обновить таблицу SQL, и я хочу добавить какую-то обратную связь при нажатии кнопки. Я сделал невидимую кнопку (opacity = 0), которая находится справа от каждой строки как статус. Я сделал эту функцию JS fade(), чтобы установить непрозрачность на 1, а затем медленно вернет ее в 0, поэтому сообщение появляется, а затем исчезает.CSS исчезает несколько раз

function fade() { 
    var invis = document.getElementById("invis".concat(num.toString())); 
     if(invis.style.opacity > .990) { 
      invis.style.opacity = (invis.style.opacity) - .001; 
      setTimeout(fade, 50); 
     } else if(invis.style.opacity > 0) { 
      invis.style.opacity = (invis.style.opacity) - .05; 
      setTimeout(fade, 50); 
     } 
    } 

Проблема, так как веб-страниц являются однопоточных, любое другое действие будет прерывать анимацию и оставить наполовину утрачен статус. Так что это не хорошо. Поэтому теперь я пытаюсь настроить невидимые кнопки для изменения класса при обновлении новой строки. Новый класс выглядит так:

.invisible_anim { 
    ... 
    opacity: 0; 
    animation:trans 3000ms; 
} 
@keyframes trans { 
    0% { 
     opacity: 1; 
    } 
    50% { 
     opacity: 1; 
    } 

Это прекрасно работает, за исключением того, что он работает только один раз. Отсюда я не могу заставить анимацию играть во второй раз. Я попытался изменить класс обратно на «невидимый», а затем «invisible_anim» без везения. Я также не могу использовать JQuery или Webkit. Мне интересно, есть ли какой-то флаг, который вы можете установить для кнопки без фактического нажатия на нее, чтобы я мог сбросить класс, когда мне нужно? Или даже какой-то способ наполнить мою функцию JS, чтобы я мог придерживаться этого.

Я тоже турбо-нуб, когда дело доходит до этого. Я не касался JS или CSS примерно неделю назад, поэтому, если есть другое решение, о котором я не знаю, не стесняйтесь предлагать альтернативу.

EDIT: Наш бесстрашный герой @Daemedeor спас день. Я добавил слушатель мой статус:

var invis = document.getElementById("invis".concat(num.toString())); 
    invis.addEventListener("animationend", listener, false); 

затем добавили эту прекрасную функцию:

function listener(e) { 
    var invis = document.getElementById("invis".concat(num.toString())); 
    switch(e.type) { 
    case "animationend": 
     invis.className = "invisible"; 
     break; 
    } 
} 

И я получил именно то, что я искал. Какое время быть живым.

ответ

1

Если вы хотели бы играть анимации несколько раз (см docs здесь: https://developer.mozilla.org/en-US/docs/Web/CSS/animation), если вы хотите играть только дважды.

так это:

.invisible_anim { 
... 
opacity: 0; 
animation:trans 3000ms; 
} 
@keyframes trans { 
0% { 
    opacity: 1; 
} 
50% { 
    opacity: 1; 
} 

превратится в

.invisible_anim { 
... 
opacity: 0; 
animation:trans 3s 2 ; 
} 

@keyframes trans { 
0% { 
    opacity: 1; 
} 
50% { 
    opacity: 1; 
} 

EDIT: Видимо требования иначе, чем я думал. Вместо того, чтобы решение, кажется, чтобы ключ от события анимации, расположенный в https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Using_CSS_animations, а затем, когда эта анимация сделано делать то, что вам нужно сделать: так в JS-только

var e = document.getElementById("watchme"); 
e.addEventListener("animationend", listener, false); 

function listener(){ 
    //do what you need to do here 
} 

Только будьте осторожны, причина этого заключается в том, что большинство браузеров имеют разные события «анимации», которые срабатывают в разное время. Поэтому определенно нужно будет протестировать в разных браузерах, чтобы убедиться, что событие анимации стреляет в нужное время. Там есть сообщение (https://css-tricks.com/controlling-css-animations-transitions-javascript/), в котором описаны некоторые проблемы, с которыми вы можете столкнуться.

+0

Спасибо, но проблема в том, что мне нужно заставить его играть один раз за событие. Щелчок на кнопке перед ней - это то, что вызывает его оживление. Я знаю, что в CSS есть что-то вроде .button + invisible_anim, которое влияет только на invisible_anim, если оно сразу после кнопки. Можно ли настроить анимацию на постоянное затухание до 0 (с «бесконечным»), а затем настроить onclick для кнопки, чтобы установить непрозрачность нашего invisible_anim на 1? Я не уверен, что анимация позволила бы это произойти ... –

+0

@LordFarquaad, вы должны просто добавить класс к рассматриваемому элементу с событием onclick, и это сделает все затухание. бесконечный фактически просто воспроизводит анимацию снова. поэтому он будет идти от 0 до 1, а затем перезапускается снова и снова. Вы можете применить другой класс, например .invisible.invisibleanim позже в своем css, чтобы иметь разные свойства и переопределить остальные. – Daemedeor

+0

На самом деле, я использовал слушателя, который вы добавили в комментарий к ответу Блейка, и он отлично работал, спасибо! Я gunna редактирую мой вопрос, чтобы включить это решение, но если вы представите его в качестве ответа, я с радостью проведу его. –

0

Вы должны начать прозрачный затем показать то скрыть:

@keyframes trans { 
    0% { 
     opacity: 0; 
    } 
    50% { 
     opacity: 1; 
    } 
    100% { 
     opacity: 0; 
    } 
} 

Тогда просто добавить класс (удалить после периода 3000ms времени)

+0

Я пробовал что-то в этом роде, но проблема в том, что я не знаю, когда 3 секунды встают без какого-то слушателя, а затем я столкнулся с той же проблемой, что и с функцией JS. –

+0

Вы можете сделать: $ (element) .addClass ('invisible_anim'); setTimeout ($ (элемент) .removeClass ('invisible_anim'), 3000); если вы используете jquery –

+0

Хотя это было бы здорово, я оставался без jQuery –

Смежные вопросы