#html #css
#css #css-переходы
Вопрос:
В скрипте ниже у меня есть переход на видимость и непрозрачность отдельно. Последнее работает, а первое — нет. Более того, в случае видимости время перехода интерпретируется как задержка при наведении курсора мыши. Происходит как в Chrome, так и в Firefox. Это ошибка?
http://jsfiddle.net/0r218mdo/3/
Случай 1:
#inner{
visibility:hidden;
transition:visibility 1000ms;
}
#outer:hover #inner{
visibility:visible;
}
Случай 2:
#inner1{
opacity:0;
transition:opacity 1000ms;
}
#outer1:hover #inner1{
opacity:1;
}
Комментарии:
1. последнее работает, потому что
opacity
может принимать несколько значений между0
и1
, в то время какvisibility
может быть толькоvisible
илиhidden
(без промежуточных значений)2. Я использую
width
иheight
для этого
Ответ №1:
Это не ошибка — вы можете переходить только по порядковым / вычисляемым свойствам (проще всего думать об этом о любом свойстве с числовым начальным и конечным значением номера .. хотя есть несколько исключений).
Это потому, что переходы работают путем вычисления ключевых кадров между двумя значениями и создания анимации путем экстраполяции промежуточных значений.
visibility
в данном случае это двоичный параметр (видимый / скрытый), поэтому по истечении продолжительности перехода свойство просто переключает состояние, вы видите это как задержку — но на самом деле это можно рассматривать как конечный ключевой кадр анимации перехода, при этом промежуточные ключевые кадры не были вычислены (что представляет собой значения между скрытым / видимым? Непрозрачность? Размерность? Поскольку это не является явным, они не вычисляются).
opacity
значение параметра (0-1), поэтому ключевые кадры могут быть рассчитаны в течение предоставленной продолжительности.
Список переходных (анимируемых) свойств можно найти здесь
Комментарии:
1. dev.w3.org/csswg/css-transitions/#animtype-visibility указывает, что промежуточные значения сопоставляются с «видимыми».
2. @BeniCherniavsky-Paskin — это зависит от функции синхронизации:
other values of the timing function (which occur only at the start/end of the transition or as a result of cubic-bezier() functions with Y values outside of [0, 1]) map to the closer endpoint
3. Ответ SW4 вводит в заблуждение и не объясняет недопонимание относительно цели видимости.
4. @JesseMonroy650 — хотя я бы не решился опровергнуть, это проще сделать без каких-либо дополнительных доказательств этого утверждения, было бы интересно, если бы вы могли уточнить? OP спрашивал не о цели видимости (которая отличается от отображения, непрозрачности), а о том, почему ее нельзя анимировать как свойство, а именно по указанной причине — это фактически параметр включения / выключения. Ответ направлен не на то, «что такое видимость», а на то, «почему ее нельзя анимировать»
5. Мы могли бы поспорить относительно значения операции, но я буду возражать. Раздраженный постоянной (неполной) темой и невозможностью заставить это работать, я решаю исследовать это. Во-первых, стоит отметить, что документация плохая ; объяснения плохие, спецификация плохо написана (у редактора тоже есть примечание). Хотя он задокументирован как
animatable
, на самом деле он имеет лишь несколько свойств; одним из этих свойств является время . Я скоро буду вести блог.
Ответ №2:
Видимость анимируема. Проверьте это сообщение в блоге об этом: http://www.greywyvern.com/?post=337
Вы также можете увидеть это здесь: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_animated_properties
Допустим, у вас есть меню, в котором вы хотите исчезать и исчезать при наведении курсора мыши. Если вы используете opacity:0
только, ваше прозрачное меню все равно будет там, и оно будет анимироваться при наведении курсора мыши на невидимую область. Но если вы добавите visibility:hidden
, вы можете устранить эту проблему:
div {
width:100px;
height:20px;
}
.menu {
visibility:hidden;
opacity:0;
transition:visibility 0.3s linear,opacity 0.3s linear;
background:#eee;
width:100px;
margin:0;
padding:5px;
list-style:none;
}
div:hover > .menu {
visibility:visible;
opacity:1;
}
<div>
<a href="#">Open Menu</a>
<ul class="menu">
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
</ul>
</div>
Комментарии:
1. Это не так. В статье четко показано: 1: Пользователь наводит курсор мыши на элемент 2: видимость переключается на видимую 3: начинается анимация перехода непрозрачности
2. И все же в статье достигается функциональный эквивалент анимированной видимости, благодаря искусному переходу к непрозрачности. Это хорошо объясняет, почему вам все еще нужно возиться с видимостью, чтобы иметь возможность нажимать на объекты «под» скрытым объектом, например, с помощью выпадающего меню. Но этот ответ был бы лучше, если бы он приводил пример и сводку локально . (Разрыв ссылок; я только что исправил один.)
3. этот ответ немного вводит в заблуждение, но, тем не менее, он сработал, спасибо!
4. @BobStein-VisiBone Я отредактировал свой ответ и привел пример. Спасибо за вашу помощь 🙂
5. -1 Возможно, вы добавили пример, но вы все еще анимируете
opacity
. Он не работает, когда я удаляю переход непрозрачности.
Ответ №3:
Видимость является анимируемым свойством в соответствии со спецификацией, но переходы на видимость не работают постепенно, как можно было бы ожидать. Вместо этого переходы при видимости задерживают скрытие элемента. С другой стороны, создание элемента видимым работает немедленно. Это так, как определено спецификацией (в случае функции синхронизации по умолчанию) и как это реализовано в браузерах.
Это также полезное поведение, поскольку на самом деле можно представить различные визуальные эффекты, чтобы скрыть элемент. Исчезновение элемента — это всего лишь один из видов визуального эффекта, который задается с помощью непрозрачности. Другие визуальные эффекты могут перемещать элемент, используя, например, свойство transform, также см. http://taccgl.org/blog/css-transition-visibility.html
Часто бывает полезно объединить переход непрозрачности с переходом видимости! Хотя кажется, что непрозрачность работает правильно, полностью прозрачные элементы (с непрозрачностью: 0) по-прежнему получают события мыши. Так, например, ссылки на элемент, который был удален только с помощью перехода непрозрачности, по-прежнему реагируют на щелчки (хотя и не видны), а ссылки за исчезнувшим элементом не работают (хотя и видны через исчезнувший элемент). Смотрите http://taccgl.org/blog/css-transition-opacity-for-fade-effects.html.
Этого странного поведения можно избежать, просто используя оба перехода, переход по видимости и переход по непрозрачности. Таким образом, свойство visibility используется для отключения событий мыши для элемента, в то время как непрозрачность используется для визуального эффекта. Однако необходимо соблюдать осторожность, чтобы не скрыть элемент во время воспроизведения визуального эффекта, который в противном случае не был бы виден. Здесь особая семантика перехода видимости становится удобной. При скрытии элемента элемент остается видимым во время воспроизведения визуального эффекта и скрывается впоследствии. С другой стороны, при открытии элемента переход видимости делает элемент видимым сразу, то есть до воспроизведения визуального эффекта.
Комментарии:
1. В дополнение к этому сообщению я хочу поделиться еще одной полезной ссылкой с этого сайта: taccgl.org/blog/css-transition-visibility.html Также может быть полезно посмотреть мою демонстрацию codepen «toggle popup»: codepen.io/mundisyum/pen/mdqMMod
Ответ №4:
Если вы хотите отложить видимость, то приведенный ниже фрагмент кода может быть решением.
Поскольку свойство ‘visibility’ включено / выключено, вы можете использовать transition-delay
свойство для управления временем, когда объект должен быть видимым.
div {
width:100px;
height:20px;
}
.menu {
transition-delay: 0s;
transition-duration: 0s;
transition-property: opacity;
background:#eee;
width:100px;
margin:0;
height: 0px;
opacity: 0;
list-style:none;
overflow: hidden;
}
div:hover > .menu {
height: initial;
transition-delay: 1s;
opacity: 1;
}
<div>
<a href="#">Open Menu</a>
<ul class="menu">
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
</ul>
</div>