В настоящее время я разрабатываю «мега раскрывающееся» меню CSS - в основном обычное выпадающее меню только для CSS, но содержащее различные типы контента.
На данный момент, похоже, что переходы CSS 3 не применяются к свойству display , то есть вы не можете делать какие-либо переходы из display: none
в display: block
(или любую комбинацию).
Есть ли способ для меню второго уровня из приведенного выше примера «исчезать», когда кто-то наводит курсор на один из пунктов меню верхнего уровня?
Я знаю, что вы можете использовать переходы для visibility:
свойства, но я не могу придумать, как использовать это эффективно.
Я также пытался использовать высоту, но это с треском провалилось.
Я также знаю, что это легко сделать с помощью JavaScript, но я хотел испытать себя на том, чтобы использовать только CSS, и я думаю, что подойду немного.
источник
z-index:0
.visibility: hidden
если вы не хотите, чтобы программы чтения с экрана читали его (тогда как обычные браузеры этого не делают). Он только определяет видимость элемента (как, скажем,opacity: 0
), и он по-прежнему можно выбрать, щелкнуть и все, что было раньше; это просто не видноpointer-events
в IE 8,9,10, так что это не всегда нормальноОтветы:
Вы можете объединить два или более переходов, и
visibility
это то, что пригодится в этот раз.(Не забудьте префиксы поставщика к
transition
собственности.)Более подробно в этой статье .
источник
Вам нужно скрыть элемент другими способами, чтобы заставить это работать.
Я достиг эффекта,
<div>
установив оба s абсолютно и установив скрытыйopacity: 0
.Если вы даже переключите
display
свойство сnone
наblock
, переход на другие элементы не произойдет.Чтобы обойти это, всегда разрешайте элементу быть
display: block
, но скрывайте элемент, настраивая любое из этих средств:height
для0
.opacity
для0
.overflow: hidden
.Вероятно, есть и другие решения, но вы не можете выполнить переход, если переключите элемент на
display: none
. Например, вы можете попробовать что-то вроде этого:Но это не будет сработает. Исходя из моего опыта, я обнаружил, что это ничего не делает.
Из-за этого вам всегда нужно сохранять элемент
display: block
- но вы можете обойти его, выполнив что-то вроде этого:источник
visibility:hidden; opacity:0; -webkit-transition: all .2s ease-in-out;
Мало того, что это не правильно, но целевой элемент никогда не будет отображаться. QA подведет тебя, меня и твою маму.height: 0;
и не изменили его, переход не будет работать. Я пытался это просто пытаться перейти непрозрачность. Я должен был удалитьheight: 0;
overflow: hidden
за большое спасибо!На момент написания этой статьи все основные браузеры отключали переходы CSS, если вы пытаетесь изменить
display
свойство, но анимации CSS по-прежнему работают нормально, поэтому мы можем использовать их в качестве обходного пути.Пример кода (вы можете применить его к своему меню соответственно) Демо :
Добавьте следующий CSS в вашу таблицу стилей:
Затем примените
fadeIn
анимацию к ребенку при наведении на родительский элемент (и, конечно, установитеdisplay: block
):Обновление 2019 - метод, который также поддерживает затухание:
(Требуется некоторый код JavaScript)
источник
height: 0
Трюк (для переходов) , упомянутых выше , кажется, не работает , потому что высота получает значение 0 на перепыла из перехода, но этот трюк , кажется, работает нормально.display
свойство - на самом деле нет причин для этого. И даже если бы они сделали , почему анимация тогда работала? Вы также не можете использовать этоdisplay
свойство в CSS-анимации.Я подозреваю, что причина, по которой переходы отключены, если они
display
изменены, заключается в том, что на самом деле делает дисплей. Это не меняет ничего, что можно было бы плавно анимировать.display: none;
иvisibility: hidden;
это две совершенно разные вещи.И то и другое делает элемент невидимым, но
visibility: hidden;
он все равно отображается в макете, но не так заметно .Скрытый элемент по-прежнему занимает место и по-прежнему отображается как встроенный, либо как блок, либо как inline-блок, либо как таблица, или независимо от того, какой
display
элемент говорит ему отображать, и соответственно занимает пространство.Другие элементы не перемещаются автоматически, чтобы занять это пространство. Скрытый элемент просто не отображает свои фактические пиксели на выходе.
display: none
с другой стороны, фактически предотвращает рендеринг элемента полностью .Это не занимает никакого места расположения.
Другие элементы, которые занимали бы часть или все пространство, занимаемое этим элементом, теперь корректируются, чтобы занимать это пространство, как если бы элемент просто не существовал вообще .
display
это не просто еще один визуальный атрибут.Он устанавливает режим визуализации всего элемента, например, является ли это
block
,inline
,inline-block
,table
,table-row
,table-cell
,list-item
, или что угодно!Каждый из них имеют очень разные последствия компоновки, и не было бы никакого разумного способа одушевленные или плавно переходить их (попробуйте представить себе плавный переход от
block
кinline
или наоборот, к примеру!).Вот почему переходы отключаются, если отображаемые изменения (даже если изменение относится к или от
none
-none
это не просто невидимость, это собственный режим рендеринга элементов, который вообще не означает рендеринга!).источник
display
не могут плавно переходить, как другие свойства, но это не означает, что время не имеет значения. Умение контролировать, когда происходит переход от одногоdisply:block
кdisplay:none
другому, очень важно. Точно так же, как @CurtisYallop описал это. Если я хочу , чтобы переход отopacity:1
кopacity:0
и затем изменить ,display:block
чтобыdisplay:none
я должен быть в состоянии сделать это.Вместо обратных вызовов, которых нет в CSS, мы можем использовать
transition-delay
свойство.Итак, что здесь происходит?
Когда
visible
класс добавляется, какheight
иopacity
начать анимацию без задержки (0 мс), тем не менееheight
занимает 0 мс до полной анимации (эквивалентdisplay: block
) иopacity
занимает 600 мс.Когда
visible
класс удаляется,opacity
запускается анимация (задержка 0 мс, длительность 400 мс), а высота ожидает 400 мс и только затем мгновенно (0 мс) восстанавливает начальное значение (эквивалентноdisplay: none
обратному вызову анимации).Обратите внимание, этот подход лучше, чем те, которые используют
visibility
. В таких случаях элемент все еще занимает место на странице, и это не всегда подходит.Для большего количества примеров, пожалуйста, обратитесь к этой статье .
источник
height:100%
что может разрушить макет в некоторых случаях. Отличное решение, если это не проблема. Один из немногих работающих двунаправленных.transition: height 0ms 0ms, opacity 600ms 0ms
, я просто использовалtransition-delay: 0s
.display
не является одним из свойств, над которыми работает переход.См. Свойства анимируемых CSS для списка свойств CSS, к которым могут быть применены переходы. См. « Значения и единицы измерения CSS», уровень 4, «Объединение значений: интерполяция, сложение и накопление», чтобы узнать, как они интерполируются.
До CSS 3 был указан в 9.1. Свойства из CSS (просто закройте всплывающее окно с предупреждением)
В прошлый раз, когда мне пришлось это сделать, я использовал
max-height
вместо этого свойство, которое можно анимировать (хотя это было немного хаком, оно работало), но имейте в виду, что это может быть очень неудобно для сложных страниц или пользователей с низким уровнем мобильности устройства.источник
Теперь вы можете добавить собственную анимацию в свойство блока.
демонстрация
В этой демонстрации подменю изменяется с
display:none
наdisplay:block
и все еще удается исчезнуть.источник
myfirst
бытьshowNav
здесь? А как насчет Firefox? К сожалению, я не могу найти что-то связанное на демонстрационной странице, которую вы упоминаете.Согласно рабочему проекту W3C от 19 ноября 2013 года,
display
объект не подлежит анимации . К счастью,visibility
это анимация. Вы можете связать его переход с переходом непрозрачности ( JSFiddle ):HTML:
CSS:
JavaScript для тестирования:
Обратите внимание, что если вы просто сделаете ссылку прозрачной, без настроек
visibility: hidden
, тогда она останется кликабельной.источник
0
на0s
. Судя по всему, в прошлом браузер, который я использовал для тестирования, поддерживал единичные ноль раз. Тем не менее, единичные времена не являются частью Рекомендации кандидата W3C от 29 сентября 2016 года .Редактировать: отображение не применяется в этом примере.
Что происходит выше, так это то, что на 99% анимации дисплей блокируется, а прозрачность исчезает. В последний момент свойство display установлено в none.
И самый важный бит - сохранить последний кадр после окончания анимации, используя animation-fill-mode: forwards
Вот два примера: https://jsfiddle.net/qwnz9tqg/3/
источник
display: none
не работает то?display: none
, фактически никогда не реализуется. jsfiddle.net/3e6sduqhМой хитрый трюк с JavaScript состоит в том, чтобы разделить весь сценарий на две разные функции !
Для подготовки объявляется одна глобальная переменная и определяется один обработчик события:
Затем, когда скрываю элемент, я использую что-то вроде этого:
Для повторного появления элемента я делаю что-то вроде этого:
Это работает, пока!
источник
Я столкнулся с этим сегодня, с
position: fixed
модалом, который я использовал повторно. Я не мог сохранить этоdisplay: none
и затем оживить это, поскольку это просто появилось, и иz-index
(отрицательные ценности, и т.д.) также сделал странные вещи.Я также использовал
height: 0
toheight: 100%
, но он работал только когда появился модал. Это так же, как если бы вы использовалиleft: -100%
или что-то.Тогда меня поразило, что был простой ответ. И вуаля:
Во-первых, ваш скрытый модал. Обратите внимание на
height
is0
и проверьтеheight
объявление в переходах ... оно имеет значение500ms
, которое длиннее, чем мойopacity
переход . Помните, что это влияет на исходящий переход затухания: возврат модального в его состояние по умолчанию.Во-вторых, ваш видимый модал. Скажем, вы устанавливаете
.modal-active
наbody
. Теперьheight
это100%
и мой переход тоже изменился. Я хочу,height
чтобы это было немедленно изменено, иopacity
чтобы взять300ms
.Вот и все, это работает как шарм.
источник
Принимая во внимание некоторые из этих ответов и некоторые предложения в других местах, следующее прекрасно подходит для всплывающих меню (я использую это с Bootstrap 3, в частности):
Вы также можете использовать
height
вместо,max-height
если вы указываете оба значения, такheight:auto
как не допускается сtransition
s. Значение наведенияmax-height
должно быть больше, чемheight
может быть меню.источник
Я нашел лучший способ решить эту проблему, вы можете использовать CSS-анимацию и сделать свой удивительный эффект для отображения элементов.
источник
Я сталкивался с этой проблемой несколько раз, и теперь просто пошел с:
При добавлении класса
block--invisible
целые элементы не будут кликабельными, но все элементы за ним будут из-за того,pointer-events:none
что поддерживается всеми основными браузерами (нет IE <11).источник
pointer-events
Изменить
overflow:hidden
наoverflow:visible
. Это работает лучше. Я использую так:visible
лучше, потому чтоoverflow:hidden
действовать так же, какdisplay:none
.источник
JavaScript не требуется, и не требуется огромная максимальная высота. Вместо этого установите свои
max-height
текстовые элементы и используйте относительную единицу шрифта, такую какrem
илиem
. Таким образом, вы можете установить максимальную высоту больше, чем ваш контейнер, избегая задержки или «всплывающих окон» при закрытии меню:HTML
CSS
Смотрите пример здесь: http://codepen.io/mindfullsilence/pen/DtzjE
источник
После написания принятого ответа от Гильермо спецификация CSS-перехода 2012-04-03 изменила поведение перехода видимости, и теперь можно решить эту проблему более коротким способом , без использования transition-delay:
Время выполнения, указанное для обоих переходов, обычно должно быть идентичным (хотя немного более длительное время для видимости не является проблемой).
Работающую версию см. В моем блоге CSS Transition Visibility .
Напишите название вопроса «Переходы на дисплее: собственность» и в ответ на комментарии Руи Маркеса и Джоша к принятому ответу:
Это решение работает в тех случаях, когда оно не имеет значения, если используется свойство display или visibility (как, вероятно, имело место в этом вопросе).
Он не удалит элемент полностью
display:none
, просто сделает его невидимым, но он все равно останется в потоке документа и повлияет на положение следующих элементов.Переходы, которые полностью удаляют элемент, подобный элементу,
display:none
могут быть выполнены с использованием высоты (как указано в других ответах и комментариях), max-height или margin-top / bottom, но также см. Как я могу изменить высоту: 0; по высоте: авто; используя CSS? и мой пост в блоге Временные решения для переходов CSS на свойствах Display и Height .В ответ на комментарий от GeorgeMillo: необходимы оба свойства и оба перехода: свойство opacity используется для создания анимации постепенного появления и исчезновения, а также свойства видимости, чтобы элемент не реагировал на события мыши. Необходимы переходы по непрозрачности для визуального эффекта и по видимости, чтобы отложить скрытие до завершения затухания.
источник
Я наконец нашел решение для меня, комбинируя
opacity
сposition absolute
(не занимать место, когда спрятано).источник
Я подозреваю, что любой, кто только начинает переходы CSS, быстро обнаруживает, что они не работают, если вы одновременно изменяете свойство display (block / none). Одним из обходных путей, который еще не был упомянут, является то, что вы можете продолжать использовать,
display:block/none
чтобы скрыть / показать элемент, но установите его непрозрачность равной 0, чтобы, даже когда он былdisplay:block
, он все еще невидим.Затем, чтобы добавить его, добавьте еще один класс CSS, например «on», который устанавливает непрозрачность равной 1 и определяет переход для непрозрачности. Как вы могли себе представить, вам придется использовать JavaScript, чтобы добавить этот класс «on» к элементу, но по крайней мере вы все еще используете CSS для фактического перехода.
PS Если вы оказались в ситуации, когда вам нужно выполнить оба действия
display:block
и добавить класс «on», в то же время отложите последнее с помощью setTimeout. В противном случае браузер просто видит обе вещи как происходящие одновременно и отключает переход.источник
display:none
.Это так же просто, как следующее :)
Получите, чтобы это исчезло, и затем сделайте это
height 0;
. Также обязательно используйте форварды, чтобы они оставались в конечном состоянии.источник
Это решение имеет отличную совместимость, и я еще не видел его:
Объяснение : он использует
visibility: hidden
хитрость (которая совместима с «покажи и анимируй» за один шаг), но он использует комбинацию,position: absolute; z-index: -1; pointer-events: none;
чтобы убедиться, что скрытый контейнер не занимает место и не отвечает на взаимодействия с пользователем .источник
position
все равно заставит элемент дергаться, не так ли?position: absolute
означает, что элемент не занимает места, как описано в объяснении. Когда он переключаетсяposition: static
и появляется, он будет занимать пространство, как обычный элемент, что является точкой этого вопроса. Я предлагаю вам попробовать!Вы можете заставить это работать так, как вы ожидали - используя отображение, - но вам нужно настроить браузер, чтобы заставить его работать, используя либо Javascript, либо, как другие предлагали причудливый трюк с одним тегом внутри другого. Мне плевать на внутренний тег, так как он еще больше усложняет CSS и размеры, поэтому вот решение Javascript:
https://jsfiddle.net/b9chris/hweyecu4/17/
Начиная с коробки вроде:
Скрытая коробка.
Мы собираемся использовать трюк, найденный в соответствующем вопросе, проверяя offsetHeight, чтобы мгновенно регулировать скорость браузера:
https://stackoverflow.com/a/16575811/176877
Во-первых, библиотека, формализующая вышеупомянутый трюк:
Далее, мы собираемся использовать его, чтобы показать коробку, и добавить ее:
Это исчезает из коробки и выходит. Так,
.noTrnsn()
выключает переходы, то мы удаляемhidden
класс, который переворачиваетdisplay
сnone
его умолчаниюblock
. Затем мы устанавливаем непрозрачность на 0, чтобы подготовиться к появлению. Теперь, когда мы установили сцену, мы снова включаем переходы с помощью.resumeTrnsn()
. И, наконец, начните переход, установив непрозрачность на 1.Без библиотеки и отображение, и изменение непрозрачности получили бы нежелательные результаты. Если бы мы просто удалили вызовы библиотеки, мы бы вообще не получили переходов.
Обратите внимание, что вышеприведенное не устанавливает display снова в none в конце анимации затухания. Мы можем полюбоваться, хотя. Давайте сделаем это с тем, который вырастает и растет в высоту от 0.
Необычные!
https://jsfiddle.net/b9chris/hweyecu4/22/
Сейчас мы переносим как высоту, так и непрозрачность. Обратите внимание, что мы не устанавливаем высоту, что означает, что это значение по умолчанию
auto
. Традиционно это не может быть перенесено - переход от автоматического значения к пикселю (например, 0) не даст вам никакого перехода. Мы собираемся обойти это с библиотекой и еще одним библиотечным методом:Это удобный метод, который позволяет нам участвовать в существующей очереди jQuery fx / animation, не требуя какой-либо инфраструктуры анимации, которая теперь исключена в jQuery 3.x. Я не собираюсь объяснять, как работает jQuery, но достаточно сказать, что
.queue()
и возможности.stop()
, предоставляемые jQuery, помогают нам не допустить, чтобы наши анимации наступали друг на друга.Давайте оживим эффект слайда.
Этот код начинается с проверки
#box
того, скрыт ли он в данный момент, с проверки его класса. Но он выполняет больше, используяwait()
библиотечный вызов, добавляяhidden
класс в конце анимации скольжения / затухания, которую вы ожидаете найти, если она на самом деле скрыта - чего не мог сделать вышеупомянутый простой пример. Это также позволяет снова и снова отображать / скрывать элемент, что было ошибкой в предыдущем примере, поскольку скрытый класс никогда не восстанавливался.Вы также можете увидеть изменения CSS и класса, вызываемые после,
.noTrnsn()
чтобы в целом установить сцену для анимации, включая измерение, например, измерение конечной высоты#box
без показа пользователю, перед вызовом.resumeTrnsn()
и анимацию этого полностью настроенного набора. этап к своей цели CSS значения.Старый ответ
https://jsfiddle.net/b9chris/hweyecu4/1/
Вы можете сделать это при клике:
CSS это то, что вы догадались бы:
Ключ регулирует свойство экрана. Удаляя скрытый класс и затем ожидая 50 мс, затем начиная переход с помощью добавленного класса, мы заставляем его появляться и затем расширяться, как мы хотели, вместо того, чтобы просто перелистываться на экран без какой-либо анимации. Подобное происходит иначе, за исключением того, что мы ждем, пока анимация не закончится, прежде чем применять скрытый.
Примечание: я злоупотребляю
.animate(maxWidth)
здесь, чтобы избежатьsetTimeout
условий гонки.setTimeout
быстро вводить скрытые ошибки, когда вы или кто-то другой обнаруживает код, не подозревая об этом..animate()
может быть легко убит с.stop()
. Я просто использую его, чтобы поместить задержку в 50 мс или 2000 мс в стандартную очередь fx, где легко найти / решить другие кодеры, основанные на этом.источник
У меня была похожая проблема, на которую я не мог найти ответ. Несколько поисков в Google позже привели меня сюда. Учитывая, что я не нашел простой ответ, на который надеялся, я наткнулся на решение, которое было бы элегантным и эффективным.
Оказывается,
visibility
свойство CSS имеет значение,collapse
которое обычно используется для элементов таблицы. Однако, если он используется с любыми другими элементами, он фактически делает их скрытыми , почти так же, какdisplay: hidden
с добавленной возможностью, что элемент не занимает места, и вы все равно можете анимировать рассматриваемый элемент.Ниже приведен простой пример этого в действии.
источник
Самое простое универсальное решение проблемы: не стесняйтесь указывать
display:none
в своем CSS, однако вам придется изменить его наblock
(или что-то еще) с помощью JavaScript, а затем вам также нужно будет добавить класс к вашему элементу, который на самом деле выполняет переход с помощью setTimeout () . Это все.То есть:
Это было проверено в последних нормальных браузерах. Очевидно, что это не должно работать в Internet Explorer 9 или более ранней версии.
источник
Я думаю, у SalmanPK есть самый близкий ответ. Он выцветает или исчезает с помощью следующих CSS-анимаций. Однако свойство display не анимирует плавно, только непрозрачность.
Если вы хотите анимировать элемент, перемещающийся из блока отображения, чтобы ничего не отображать, я не вижу, чтобы это было возможно только с помощью CSS. Вы должны получить высоту и использовать CSS-анимацию, чтобы уменьшить высоту. Это возможно с помощью CSS, как показано в примере ниже, но было бы сложно узнать точные значения высоты, которые нужно анимировать для элемента.
jsFiddle пример
CSS
JavaScript
источник
Вы можете сделать это с событиями перехода, поэтому вы создаете два CSS-класса для перехода, один из которых содержит анимацию, а другой - отображение состояния отсутствия. И вы переключаете их после окончания анимации? В моем случае я могу снова показать div, если я нажму кнопку, и удаляю оба класса.
Попробуйте фрагмент ниже ...
источник
Если вы используете jQuery для установки классов, это будет работать на 100%:
Конечно, вы можете просто использовать jQuery
.fadeIn()
и.fadeOut()
функции, но преимущество установки классов вместо этого в том случае, если вы хотите перейти к отображаемому значению, отличному отblock
(как это по умолчанию с.fadeIn()
и.fadeOut()
).Здесь я перехожу к отображению
flex
с хорошим эффектом затухания.источник
Вместо использования
display
вы можете хранить элемент «вне экрана» до тех пор, пока он вам не понадобится, а затем установить его положение там, где вам нужно, и одновременно преобразовать его. Это поднимает целый ряд других проблем дизайна, поэтому ваш пробег может варьироваться.Вы, вероятно, не захотите использовать в
display
любом случае, так как вы хотите, чтобы контент был доступен для программ чтения с экрана, которые по большей части стараются подчиняться правилам для наглядности - то есть, если он не должен быть видимым для глаз, он не будет отображаться как контент для агента.источник
Вы можете просто использовать видимость CSS : скрытый / видимый вместо отображения : нет / блок
источник
Я запустил скелетный проект с открытым исходным кодом под названием Toggle Display Animate .
Этот каркасный помощник позволит вам легко имитировать jQuery show / hide, но с анимацией перехода в CSS 3.
Он использует переключатели классов, поэтому вы можете использовать любые методы CSS для элементов, кроме display: none | block | table | inline и т. Д., А также другие альтернативные варианты использования, которые можно придумать.
Его основное предназначение - для состояний переключения элементов, и он поддерживает состояние возврата, при котором скрытие объекта позволяет запускать ключевой кадр в обратном порядке или воспроизводить альтернативную анимацию для скрытия элемента.
Большая часть разметки для концепции, над которой я работаю, - это CSS, и на самом деле очень мало JavaScript используется.
Здесь есть демо: http://marcnewton.co.uk/projects/toggle-display-animate/
источник