Анимация CSS3: отображение + непрозрачность

102

У меня проблема с анимацией CSS3.

.child {
    opacity: 0;
    display: none;

    -webkit-transition: opacity 0.5s ease-in-out;
    -moz-transition: opacity 0.5s ease-in-out;
    transition: opacity 0.5s ease-in-out;
}

.parent:hover .child {
    opacity: 0.9;
    display: block;
}

Этот код работает, только если я удалю изменение display.

Я хочу изменить отображение сразу после наведения, но прозрачность следует изменить с помощью перехода.

Алексис Дельриу
источник
2
Если CSS не работает так, как предлагали другие, вот очень простой код Javascript для затухания.
Абхранил Дас,

Ответы:

119

Основываясь на ответе Майклса, это фактический код CSS для использования

.parent:hover .child
{
    display: block;

    -webkit-animation: fadeInFromNone 0.5s ease-out;
    -moz-animation: fadeInFromNone 0.5s ease-out;
    -o-animation: fadeInFromNone 0.5s ease-out;
    animation: fadeInFromNone 0.5s ease-out;
}

@-webkit-keyframes fadeInFromNone {
    0% {
        display: none;
        opacity: 0;
    }

    1% {
        display: block;
        opacity: 0;
    }

    100% {
        display: block;
        opacity: 1;
    }
}

@-moz-keyframes fadeInFromNone {
    0% {
        display: none;
        opacity: 0;
    }

    1% {
        display: block;
        opacity: 0;
    }

    100% {
        display: block;
        opacity: 1;
    }
}

@-o-keyframes fadeInFromNone {
    0% {
        display: none;
        opacity: 0;
    }

    1% {
        display: block;
        opacity: 0;
    }

    100% {
        display: block;
        opacity: 1;
    }
}

@keyframes fadeInFromNone {
    0% {
        display: none;
        opacity: 0;
    }

    1% {
        display: block;
        opacity: 0;
    }

    100% {
        display: block;
        opacity: 1;
    }
}
Крис
источник
1
для поддержки всех браузеров ..?
david_adler
CSS3 поддерживается не всеми браузерами. Если вы хотите расширить, просто добавьте правильные префиксы
Крис
17
Как насчет того, чтобы реализовать fadeOutToNone при зависании?
Грин
4
Поскольку вы можете использовать доли процента, лучше использовать что-то вроде 0,001%, а не 1%, потому что это минимизирует задержку до «старта», которая может стать очевидной при более длительной анимации
Zach Saucier
1
Директива -o-keyframes на самом деле бесполезна, потому что первая версия Opera, поддерживающая анимацию, уже была основана на webkit.
Rico Ocepek
43

Вы можете делать с анимацией CSS:

0% display:none ; opacity: 0;
1% display: block ; opacity: 0;
100% display: block ; opacity: 1;
Майкл Маллани
источник
Хорошая идея, мне удалось сохранить отображение моего элемента во время наведения с помощью animation-fill-mode, но затем при наведении курсора мыши элемент исчезает.
Alexis Delrieu,
2
вы можете использовать fill-mode: forward, чтобы сохранить изменения после завершения анимации.
Майкл Маллани
42

Если есть возможность - используйте visibilityвместоdisplay

Например:

.child {
    visibility: hidden;
    opacity: 0;
    transition: opacity 0.3s, visibility 0.3s;
}

.parent:hover .child {
    visibility: visible;
    opacity: 1;
    transition: opacity 0.3s, visibility 0.3s;
}
томас сатинский
источник
24
Проблема со свойством видимости в том, что оно не скрывает элемент, а только делает его невидимым. Так что он все равно займет место.
Сэмюэл
6
Не только невидимым, но и прозрачным для событий (кликов и т. Д.). Не изменять отображение означает не перекомпоновывать документ, и это хорошо. Большинство элементов, которые должны проявляться / исчезать из-за непрозрачности, в любом случае, вероятно, должны иметь фиксированное или абсолютное положение.
Расмус Кай
13

Этот обходной путь работает:

  1. определить «ключевой кадр»:

    @-webkit-keyframes fadeIn { 
      0% { opacity: 0; }
      20% { opacity: 0; }
      40% { opacity: 0.3; }
      60% { opacity: 0.5; }
      80% { opacity: 0.9; }
      100% { opacity: 1; }
    }
    
    @keyframes fadeIn {
      0% { opacity: 0; }
      20% { opacity: 0; }
      40% { opacity: 0.3; }
      60% { opacity: 0.5; }
      80% { opacity: 0.9; }
      100% { opacity: 1; }
    }
  2. Используйте этот «ключевой кадр» при «наведении»:

    div a span { 
      display: none;
    }
    
    div a:hover span {
      display: block;
    
      -webkit-animation-name: fadeIn;
      -webkit-animation-duration: 1s;
      animation-name: fadeIn;
      animation-duration: 1s;
    }
Герман Шварц
источник
9

Я использовал это, чтобы добиться этого. Они исчезают при наведении, но не занимают места, когда спрятаны, идеально!

.child {
    height: 0px;
    opacity: 0;
    visibility: hidden;
    transition: all .5s ease-in-out;
}

.parent:hover .child {
    height: auto;
    opacity: 1;
    visibility: visible;
}
Felixhirschfeld
источник
6

Немного изменил, но результат красивый.

.child {
    width: 0px;
    height: 0px;
    opacity: 0;
}

.parent:hover child {
    width: 150px;
    height: 300px;
    opacity: .9;
}

Спасибо всем.

Алексис Дельриу
источник
4
Это не очень хорошо работает с программами чтения с экрана: они будут продолжать читать содержимое.
ehdv
1
Вы можете добавить visibility: hidden;в .child / visibility:visible;при наведении курсора, и это должно решить проблему программы чтения с экрана
csilk
6

Есть еще один хороший способ сделать это с помощью событий-указателей:

.child {
    opacity: 0;
    pointer-events: none;

    -webkit-transition: opacity 0.5s ease-in-out;
    -moz-transition: opacity 0.5s ease-in-out;
    transition: opacity 0.5s ease-in-out;
}

.parent:hover .child {
    opacity: 0.9;
    pointer-events: all;
}

К сожалению, это не поддерживается в IE10 и ниже.

РафаэльКр
источник
4

У меня такая же проблема. Я пробовал использовать анимацию вместо переходов - как это было предложено @MichaelMullany и @Chris - но это работало только для браузеров webkit, даже если я скопировал с префиксами «-moz» и «-o».

Я смог обойти проблему, используя visibilityвместо display. Это работает для меня, потому что мой дочерний элемент position: absoluteне влияет на поток документов. Это может сработать и для других.

Вот как будет выглядеть исходный код с моим решением:

.child {
    position: absolute;
    opacity: 0;
    visibility: hidden;

    -webkit-transition: opacity 0.5s ease-in-out;
    -moz-transition: opacity 0.5s ease-in-out;
    transition: opacity 0.5s ease-in-out;
}

.parent:hover .child {
    position: relative;
    opacity: 0.9;
    visibility: visible;
}
Дэйв
источник
Если бы вы вернулись к дочернему элементу во время его анимации вне поля зрения, он бы вернулся обратно, поскольку элемент просто скрыт. Довольно раздражает, если вы перемещаете указатель мыши по месту.
adamj 06
4

Если вы запускаете изменение с помощью JS, скажем, при нажатии, есть хороший обходной путь.

Вы видите, что проблема возникает из-за того, что анимация игнорируется при отображении: ни один элемент, но браузер не применяет все изменения сразу, и элемент никогда не отображается: блок без анимации в то же время.

Уловка состоит в том, чтобы попросить браузер отобразить кадр после изменения видимости, но до запуска анимации.

Вот пример JQuery:

    $('.child').css({"display":"block"});
    //now ask the browser what is the value of the display property
    $('.child').css("display"); //this will trigger the browser to apply the change. this costs one frame render
    //now a change to opacity will trigger the animation
    $('.child').css("opacity":100);
Дэниел Седлачек
источник
2
Этот вопрос не помечен ни JavaScript, ни jQuery
j08691
Я знаю, я написал это, чтобы объяснить причину, по которой это происходит. Когда я узнал об этом, мне было очень полезно, и я надеюсь, что это поможет и другим.
daniel.sedlacek
1
Кстати, значения непрозрачности находятся в
Amr
2

Для абсолютных или фиксированных элементов вы также можете использовать z-index:

.item {
    position: absolute;
    z-index: -100;
}

.item:hover {
    z-index: 100;
}

Остальные элементы теперь должны иметь z-index от -100 до 100.

Лука Стиб
источник
К сожалению, это портит символ индикатора пароля KeePass на type=passwordполях. Его не видно.
Филк
1
Можем ли мы прекратить использовать произвольные числа z-index? Здесь: z-index: 1; vs z-index: -1 подойдет. Выбор огромных чисел z-index делает вещи неуправляемыми.
dudewad
2

Я знаю, это не совсем решение вашего вопроса, потому что вы просите

дисплей + непрозрачность

Мой подход решает более общий вопрос, но, возможно, это была фоновая проблема, которую следует решить, используя displayв сочетании с opacity.

Моим желанием было убрать элемент с дороги, когда он не виден. Это решение делает именно это: оно перемещает элемент за пределы, и это можно использовать для перехода:

.child {
  left: -2000px;
  opacity: 0;
  visibility: hidden;
  transition: left 0s 0.8s, visibility 0s 0.8s, opacity 0.8s;
}

.parent:hover .child {
  left: 0;
  opacity: 1;
  visibility: visible;
  transition: left 0s, visibility 0s, opacity 0.8s;
}

Этот код не содержит никаких префиксов браузера или хаков обратной совместимости. Он просто иллюстрирует концепцию того, как элемент удаляется, поскольку он больше не нужен.

Интересная часть - это два разных определения перехода. Когда указатель мыши наведен на .parentэлемент, его .childнужно сразу поставить на место, а затем его прозрачность изменится:

transition: left 0s, visibility 0s, opacity 0.8s;

Когда нет зависания или указатель мыши был перемещен с элемента, нужно дождаться завершения изменения непрозрачности, прежде чем элемент можно будет переместить за пределы экрана:

transition: left 0s 0.8s, visibility 0s 0.8s, opacity 0.8s;

Перемещение объекта будет жизнеспособной альтернативой в случае, если настройка display:noneне нарушит макет.

Надеюсь, я попал в точку в этом вопросе, хотя и не ответил на него.

Ханнес Моргенштерн
источник
Этот фильтр Microsoft устарел с IE9. Есть ли конкретная причина, по которой вы хотите добавить это в ответы в 2016 году?
TylerH
@TylerH Сколько пользователей хочет привлечь - это вопрос вкуса.
Hannes Morgenstern
Учитывая, что он устарел , а IE <11 больше не поддерживается Microsoft, использование этого свойства в лучшем случае вызывает сомнения.
TylerH
@TylerH Обычно приходится обслуживать клиентов, которые не хотят или не могут перейти на новый браузер. У меня есть известный банк как клиент, который все еще использует IE6 и отказывается обновляться по «причинам».
Маркус Каннингем
@MarcusCunningham Вопрос помечен тегом css3, что полностью исключает использование IE6 (а также IE7 и IE8). В самом раннем возможном браузере OP мог писать код, фильтр MS в этом ответе устарел. А для будущих читателей это еще более бесполезно, поскольку даже не поддерживается. Нет никаких аргументов в пользу включения его в ответ на этот вопрос. Однако это спорный вопрос, поскольку Ханнес уже удалил его из своего ответа.
TylerH
1

Одна вещь, которую я сделал, - это установила маржу начального состояния примерно как «margin-left: -9999px», чтобы она не отображалась на экране, а затем сбросила «margin-left: 0» при наведении курсора. В этом случае оставьте "display: block". Помогло мне :)

Изменить: сохранить состояние и не возвращаться к предыдущему состоянию наведения? Хорошо, нам нужен JS:

<style>
.hovered { 
    /* hover styles here */
}
</style>

<script type="text/javascript">
$('.link').hover(function() {
   var $link = $(this);
   if (!$link.hasclass('hovered')) { // check to see if the class was already given
        $(this).addClass('hovered');
   } 
});
</script>
Джошуа
источник
Хорошая идея, но затем я
нахожу мышь
Алексис, разве ты не этого хочешь? Наведение означает ТОЛЬКО при наведении курсора мыши. Пожалуйста, поясните, чего вы пытаетесь достичь.
Джошуа
Да, прости. Я хочу сохранить затухание при наведении курсора мыши.
Alexis Delrieu
Это все меняет. Почти. В основном то, что вам нужно, это функция JS, которая будет определять состояние зависания, как указали другие пользователи, и добавлять ... ну ... см. Мой обновленный ответ.
Джошуа
1

Чтобы иметь анимацию в обоих направлениях onHoverIn / Out, я сделал это решение. Надеюсь, это кому-то поможет

@keyframes fadeOutFromBlock {
  0% {
    position: relative;
    opacity: 1;
    transform: translateX(0);
  }

  90% {
    position: relative;
    opacity: 0;
    transform: translateX(0);
  }

  100% {
    position: absolute;
    opacity: 0;
    transform: translateX(-999px);
  }
}

@keyframes fadeInFromNone {
  0% {
    position: absolute;
    opacity: 0;
    transform: translateX(-999px);
  }

  1% {
    position: relative;
    opacity: 0;
    transform: translateX(0);
  }

  100% {
    position: relative;
    opacity: 1;
    transform: translateX(0);
  }
}

.drafts-content {
  position: relative;
  opacity: 1;
  transform: translateX(0);
  animation: fadeInFromNone 1s ease-in;
  will-change: opacity, transform;

  &.hide-drafts {
    position: absolute;
    opacity: 0;
    transform: translateX(-999px);
    animation: fadeOutFromBlock 0.5s ease-out;
    will-change: opacity, transform;
  }
}
Николай
источник
0

КАК ВОССТАНОВИТЬ НЕПРОИЗВОДИТЕЛЬНОСТЬ С помощью CSS:
это мой код:
код CSS

.item {   
    height:200px;
    width:200px;
    background:red;
    opacity:0;
    transition: opacity 1s ease-in-out;
}

.item:hover {
    opacity: 1;
}
code {
    background: linear-gradient(to right,#fce4ed,#ffe8cc);
}
<div class="item">

</div>
<p><code> move mouse over top of this text</code></p>

или проверьте этот демонстрационный файл

function vote () {
var vote = getElementById ("yourOpinion")
if (this.workWithYou):
vote + = 1};
ржунимагу

Закизакибзр
источник
1
Не отвечает на вопрос, так как displayнедвижимость просто вывезли.
тост
-4

display:не подлежит переходу. Вам, вероятно, потребуется использовать jQuery, чтобы делать то, что вы хотите.

Призрак Мадары
источник
3
Ты должен прекратить пропагандировать jQuery повсюду, чувак.
Бенджамин Грюнбаум
1
@BenjaminGruenbaum jQuery - потрясающий человек. Это здорово и все делает.
Призрак Мадары