Actualmente estoy diseñando un menú 'mega desplegable' de CSS, básicamente un menú desplegable regular solo de CSS, pero que contiene diferentes tipos de contenido.
Por el momento, parece que las transiciones CSS 3 no se aplican a la propiedad 'display' , es decir, no se puede hacer ningún tipo de transición de display: none
a display: block
(o cualquier combinación).
¿Hay alguna forma de que el menú de segundo nivel del ejemplo anterior se desvanezca cuando alguien pasa el cursor sobre uno de los elementos del menú de nivel superior?
Soy consciente de que puede usar transiciones en la visibility:
propiedad, pero no puedo pensar en una forma de usar eso de manera efectiva.
También intenté usar la altura, pero eso simplemente falló miserablemente.
También soy consciente de que es trivial lograr esto usando JavaScript, pero quería desafiarme a mí mismo para usar solo CSS, y creo que me estoy quedando un poco corto.
fuente
z-index:0
como también.visibility: hidden
menos que desee que los lectores de pantalla lo lean (mientras que los navegadores típicos no lo harán). Solo define la visibilidad del elemento (como deciropacity: 0
), y aún se puede seleccionar, hacer clic y lo que solía ser; Simplemente no es visible.pointer-events
IE 8,9,10, por lo que no siempre está bienRespuestas:
Puede concatenar dos transiciones o más, y
visibility
esta vez es lo que resulta útil.(No olvide los prefijos de proveedor de la
transition
propiedad).Más detalles están en este artículo .
fuente
Debe ocultar el elemento por otros medios para que esto funcione.
Logré el efecto colocando ambos
<div>
s absolutamente y configurando el oculto enopacity: 0
.Si incluso alterna la
display
propiedad denone
ablock
, su transición en otros elementos no ocurrirá.Para evitar esto, siempre permita que el elemento sea
display: block
, pero oculte el elemento ajustando cualquiera de estos medios:height
a0
.opacity
a0
.overflow: hidden
.Es probable que haya más soluciones, pero no puede realizar una transición si cambia el elemento a
display: none
. Por ejemplo, puede intentar probar algo como esto:Pero eso no funcionará. Desde mi experiencia, he encontrado que esto no hace nada.
Debido a esto, siempre necesitarás mantener el elemento
display: block
, pero puedes evitarlo haciendo algo como esto:fuente
visibility:hidden; opacity:0; -webkit-transition: all .2s ease-in-out;
no solo no hace la transición correctamente, sino que el elemento de destino nunca aparecerá. QA te fallará a ti, a mí y a tu madre.height: 0;
y no lo hace, la transición no funcionará. Intenté esto solo tratando de hacer la transición de la opacidad. Tuve que quitar elheight: 0;
overflow: hidden
gracias!En el momento de esta publicación, todos los principales navegadores deshabilitan las transiciones CSS si intenta cambiar la
display
propiedad, pero las animaciones CSS aún funcionan bien para que podamos usarlas como una solución alternativa.Código de ejemplo (puede aplicarlo a su menú en consecuencia) Demostración :
Agregue el siguiente CSS a su hoja de estilo:
Luego aplique la
fadeIn
animación al niño en el desplazamiento del padre (y, por supuesto, establecidodisplay: block
):Actualización 2019: método que también admite la desaparición gradual:
(Se requiere algún código JavaScript)
fuente
height: 0
truco (para las transiciones) mencionado anteriormente no parece funcionar porque la altura se establece en 0 en la transición de desvanecimiento, pero este truco parece funcionar bien.display
propiedad, realmente no hay razón para hacerlo. E incluso si lo hicieran , ¿por qué funcionarían las animaciones entonces? Tampoco puedes usar ladisplay
propiedad en animaciones CSS.Sospecho que la razón por la que las transiciones se desactivan si
display
se cambia es por lo que realmente hace la pantalla. No , no cambia nada que posiblemente podría ser animado sin problemas.display: none;
yvisibility: hidden;
son dos cosas completamente diferentes.Ambos tienen el efecto de hacer que el elemento sea invisible, pero
visibility: hidden;
aún se representa en el diseño, pero no de manera visible .El elemento oculto todavía ocupa espacio, y todavía se representa en línea o como un bloque o bloque en línea o tabla o lo que sea que el
display
elemento le indique que represente, y ocupa espacio en consecuencia.Otros elementos no se mueven automáticamente para ocupar ese espacio. El elemento oculto simplemente no representa sus píxeles reales en la salida.
display: none
por otro lado, en realidad evita que el elemento se procese por completo .No ocupa ningún espacio de diseño.
Otros elementos que habrían ocupado parte o la totalidad del espacio ocupado por este elemento ahora se ajustan para ocupar ese espacio, como si el elemento simplemente no existiera en absoluto .
display
No es solo otro atributo visual.Establece todo el modo de representación del elemento, como por ejemplo si se trata de un
block
,inline
,inline-block
,table
,table-row
,table-cell
,list-item
, o lo que sea!Cada uno de los que tienen muy diferentes ramificaciones de diseño y no habría ninguna forma razonable de animado o sin problemas la transición de ellos (trate de imaginar una transición suave de
block
ainline
o viceversa, por ejemplo!).Esta es la razón por la cual las transiciones se deshabilitan si la visualización cambia (incluso si el cambio es hacia o desde
none
,none
no es simplemente invisibilidad, ¡es su propio modo de representación de elementos que significa que no hay representación en absoluto!).fuente
display
no se pueden hacer una transición suave como otras propiedades, pero eso no significa que el tiempo no sea importante. Poder controlar cuándo ocurre la transición dedisply:block
adisplay:none
es muy importante. Tal como lo describió @CurtisYallop. Si quiero transición deopacity:1
aopacity:0
y luego cambiodisplay:block
adisplay:none
que debería ser capaz de hacerlo.En lugar de devoluciones de llamada, que no existen en CSS, podemos usar la
transition-delay
propiedad.Entonces, ¿qué está pasando aquí?
Cuando
visible
se agrega la clase, ambosheight
eopacity
inician la animación sin demora (0 ms), aunqueheight
tarda 0 ms en completar la animación (equivalente adisplay: block
) yopacity
600 ms.Cuando
visible
se elimina la clase,opacity
comienza la animación (retraso de 0 ms, duración de 400 ms), y la altura espera 400 ms y solo entonces instantáneamente (0 ms) restaura el valor inicial (equivalente adisplay: none
en la devolución de llamada de animación).Tenga en cuenta que este enfoque es mejor que los que usan
visibility
. En tales casos, el elemento todavía ocupa el espacio en la página, y no siempre es adecuado.Para más ejemplos, consulte este artículo .
fuente
height:100%
que puede destruir el diseño en algunos casos. Gran solución, si eso no es un problema. Uno de los pocos bidireccionales de trabajo.transition: height 0ms 0ms, opacity 600ms 0ms
, acabo de usartransition-delay: 0s
.display
no es una de las propiedades sobre las que funciona la transición.Consulte Propiedades CSS animables para ver la lista de propiedades CSS que pueden tener transiciones aplicadas. Consulte el Módulo 4 de valores y unidades CSS, Combinación de valores: interpolación, adición y acumulación para ver cómo se interpolan.
Hasta CSS 3 figuraba en 9.1. Propiedades de CSS (solo cierre la ventana emergente de advertencia)
La última vez que tuve que hacer esto, utilicé en su
max-height
lugar, que es una propiedad animable (aunque fue un truco, funcionó), pero tenga en cuenta que puede ser muy molesto para páginas complejas o usuarios con dispositivos móviles de gama baja. dispositivos.fuente
Puede agregar una animación personalizada a la propiedad de bloque ahora.
Manifestación
En esta demostración los cambios sub-menú de
display:none
adisplay:block
y se las arregla para desvanecerse.fuente
myfirst
estarshowNav
aquí? ¿Y qué hay de Firefox? Lamentablemente, no puedo encontrar algo relacionado en la página de demostración que está mencionando.Según el borrador de trabajo del W3C, el 19 de noviembre de 2013
display
no es una propiedad animable . Afortunadamente,visibility
es animable. Puede encadenar su transición con una transición de opacidad ( JSFiddle ):HTML:
CSS:
JavaScript para probar:
Tenga en cuenta que si solo hace que el enlace sea transparente, sin configuración
visibility: hidden
, entonces se podrá hacer clic en él.fuente
0
a0s
. Aparentemente, en el pasado el navegador que usaba para probar soportaba cero unidades sin unidad. Sin embargo, los tiempos sin unidades no forman parte de la Recomendación del candidato del W3C, 29 de septiembre de 2016 .Editar: mostrar ninguno no se aplica en este ejemplo.
Lo que sucede arriba es que hasta el 99% de la visualización de la animación está configurada para bloquear mientras la opacidad se desvanece. En el último momento, la propiedad de visualización se establece en none.
Y lo más importante es retener el último cuadro después de que la animación termine usando el modo de relleno de animación: adelante
Aquí hay dos ejemplos: https://jsfiddle.net/qwnz9tqg/3/
fuente
display: none
no funciona entonces?display: none
, nunca se implementa realmente. jsfiddle.net/3e6sduqh¡Mi truco ordenado de JavaScript es separar todo el escenario en dos funciones diferentes !
Para preparar las cosas, se declara una variable global y se define un controlador de eventos:
Luego, cuando oculto el elemento, uso algo como esto:
Para reaparecer el elemento, estoy haciendo algo como esto:
Funciona, hasta ahora!
fuente
Me encontré con esto hoy, con un
position: fixed
modal que estaba reutilizando. No pude mantenerlodisplay: none
y luego animarlo, ya que simplemente apareció yz-index
(valores negativos, etc.) también hicieron cosas raras.También estaba usando un
height: 0
toheight: 100%
, pero solo funcionó cuando apareció el modal. Esto es lo mismo que si usarasleft: -100%
o algo así.Entonces me di cuenta de que había una respuesta simple. Et voila:
Primero, tu modal oculto. Observe el
height
es0
y revise laheight
declaración en las transiciones ... tiene un500ms
, que es más largo que miopacity
transición . Recuerde, esto afecta la transición de desvanecimiento de salida: devolver el modal a su estado predeterminado.Segundo, tu modal visible. Digamos que está configurando un
.modal-active
abody
. Ahora elheight
es100%
, y mi transición también ha cambiado. Quieroheight
que se cambie al instante yopacity
que se tome300ms
.Eso es todo, funciona como un encanto.
fuente
Tomando algunas de estas respuestas y algunas sugerencias en otros lugares, lo siguiente funciona muy bien para los menús emergentes (estoy usando esto con Bootstrap 3, específicamente):
También puede usar
height
en lugar demax-height
si especifica ambos valores, yaheight:auto
que no está permitido contransition
s. El valor de desplazamiento demax-height
necesita ser mayor que elheight
del menú.fuente
Encontré una mejor manera para este problema, puedes usar CSS Animation y hacer tu increíble efecto para mostrar elementos.
fuente
Me he encontrado con este problema varias veces y ahora simplemente fui con:
Al agregar la clase
block--invisible
, no se podrá hacer clic en los Elementos completos, pero todos los Elementos detrás de él seránpointer-events:none
compatibles con todos los principales navegadores (sin IE <11).fuente
pointer-events
Cambiar
overflow:hidden
aoverflow:visible
. Funciona mejor Yo uso así:visible
es mejor porqueoverflow:hidden
actuar exactamente como adisplay:none
.fuente
No se requiere JavaScript, y no se necesita una altura máxima escandalosamente enorme. En su lugar, configure sus
max-height
elementos de texto y use una unidad relativa de fuente comorem
oem
. De esta forma, puede establecer una altura máxima mayor que su contenedor, evitando un retraso o "estallido" cuando se cierra el menú:HTML
CSS
Vea un ejemplo aquí: http://codepen.io/mindfullsilence/pen/DtzjE
fuente
Después de que se escribió la respuesta aceptada de Guillermo, la especificación de transición CSS de 2012-04-03 cambió el comportamiento de la transición de visibilidad y ahora es posible resolver este problema de una manera más corta , sin el uso del retraso de transición:
El tiempo de ejecución especificado para ambas transiciones generalmente debe ser idéntico (aunque un tiempo un poco más largo para la visibilidad no es un problema).
Para una versión en ejecución, vea mi publicación de blog Visibilidad de transición CSS .
Escriba el título de la pregunta "Transiciones en la pantalla: propiedad" y en respuesta a los comentarios de Rui Marques y josh a la respuesta aceptada:
Esta solución funciona en casos donde es irrelevante si se utiliza la propiedad de visualización o visibilidad (como probablemente fue el caso en esta pregunta).
No eliminará completamente el elemento
display:none
, solo lo hará invisible, pero aún permanecerá en el flujo del documento e influirá en la posición de los siguientes elementos.Las transiciones que eliminan por completo el elemento similar
display:none
se pueden hacer usando height (como lo indican otras respuestas y comentarios), max-height o margin-top / bottom, pero también vea Cómo puedo hacer la transición de height: 0; a la altura: auto; usando CSS? y mi blog publica soluciones para transiciones CSS en las propiedades de visualización y altura .En respuesta al comentario de GeorgeMillo: se necesitan ambas propiedades y ambas transiciones: la propiedad de opacidad se usa para crear una animación de aumento gradual y la característica de visibilidad para evitar que el elemento siga reaccionando en eventos del mouse. Se necesitan transiciones en la opacidad para el efecto visual y en la visibilidad para retrasar la ocultación hasta que finalice el desvanecimiento.
fuente
Finalmente encontré una solución para mí, combinándome
opacity
conposition absolute
(no ocupar espacio cuando está oculto).fuente
Sospecho que cualquiera que esté comenzando las transiciones CSS descubre rápidamente que no funcionan si está modificando la propiedad de visualización (bloque / ninguno) al mismo tiempo. Una solución alternativa que aún no se ha mencionado es que puede seguir utilizando
display:block/none
para ocultar / mostrar el elemento, pero establecer su opacidad en 0 para que, incluso cuando lo seadisplay:block
, siga siendo invisible.Luego, para atenuarlo, agregue otra clase CSS como "on", que establece la opacidad en 1 y define la transición para la opacidad. Como puede haber imaginado, tendrá que usar JavaScript para agregar esa clase "on" al elemento, pero al menos todavía está usando CSS para la transición real.
PD: si se encuentra en una situación en la que necesita hacer ambas cosas
display:block
y agregar la clase "on", al mismo tiempo, difiera la última utilizando setTimeout. De lo contrario, el navegador solo ve que ambas cosas suceden a la vez y desactiva la transición.fuente
display:none
.Es tan simple como lo siguiente :)
Haz que se desvanezca y luego hazlo
height 0;
. También asegúrese de usar los reenvíos para que permanezca en el estado final.fuente
Esta solución tiene una excelente compatibilidad, y aún no la he visto:
Explicación : utiliza el
visibility: hidden
truco (que es compatible con "mostrar y animar" en un solo paso), pero utiliza la combinaciónposition: absolute; z-index: -1; pointer-events: none;
para asegurarse de que el contenedor oculto no ocupe espacio y no responda a las interacciones del usuario .fuente
position
todavía hará que el elemento se mueva, ¿no?position: absolute
significa que el elemento no ocupa espacio, como se describe en la explicación. Cuando cambiaposition: static
y aparece, ocupará espacio como un elemento normal, que es el punto de esta pregunta. ¡Te sugiero que lo intentes!Puede hacer que esto funcione de la manera natural que esperaba, usando la pantalla, pero debe acelerar el navegador para que funcione, ya sea usando Javascript o como otros han sugerido un truco elegante con una etiqueta dentro de otra. No me importa la etiqueta interna, ya que complica aún más el CSS y las dimensiones, así que aquí está la solución de Javascript:
https://jsfiddle.net/b9chris/hweyecu4/17/
Comenzando con un cuadro como:
Una caja escondida.
Vamos a usar un truco que se encuentra en un q / a relacionado, verificando offsetHeight para estrangular el navegador instantáneamente:
https://stackoverflow.com/a/16575811/176877
Primero, una biblioteca que formaliza el truco anterior:
A continuación, lo usaremos para revelar un cuadro y desvanecerlo en:
Esto desvanece la caja dentro y fuera. Entonces,
.noTrnsn()
apaga las transiciones, luego eliminamos elhidden
clase, que volteadisplay
a partirnone
de su valor por defecto,block
. Luego establecemos la opacidad en 0 para prepararnos para desvanecernos. Ahora que hemos preparado el escenario, activamos las transiciones nuevamente con.resumeTrnsn()
. Y finalmente, inicie la transición estableciendo la opacidad en 1.Sin la biblioteca, tanto el cambio para mostrar como el cambio para la opacidad nos hubieran dado resultados indeseables. Si simplemente elimináramos las llamadas a la biblioteca, no obtendríamos ninguna transición.
Tenga en cuenta que lo anterior no establece la visualización en ninguno nuevamente al final de la animación de desvanecimiento. Sin embargo, podemos ser más elegantes. Hagámoslo con uno que se desvanece y crece en altura desde 0.
¡Lujoso!
https://jsfiddle.net/b9chris/hweyecu4/22/
Ahora estamos haciendo la transición tanto de altura como de opacidad. Tenga en cuenta que no tenemos intención de altura, lo que significa que es el valor por defecto,
auto
. Convencionalmente, esto no se puede hacer la transición: pasar de automático a un valor de píxel (como 0) no conseguirá ninguna transición. Vamos a solucionar eso con la biblioteca y un método de biblioteca más:Este es un método conveniente que nos permite participar en la cola fx / animación existente de jQuery, sin requerir ninguno del marco de animación que ahora está excluido en jQuery 3.x. No voy a explicar cómo funciona jQuery, pero basta con decir, el
.queue()
y.stop()
plomería que jQuery proporciona ayuda a prevenir las animaciones de pisar el uno al otro.Animamos el efecto deslizante hacia abajo.
Este código comienza verificando
#box
y si está actualmente oculto, verificando su clase. Pero logra más utilizando lawait()
llamada a la biblioteca, al agregar elhidden
clase al final de la animación de deslizamiento / desvanecimiento, que esperaría encontrar si de hecho está oculta, algo que el ejemplo más simple anterior no podría hacer. Esto también permite mostrar / ocultar el elemento una y otra vez, lo cual fue un error en el ejemplo anterior, porque la clase oculta nunca se restauró.También puede ver los cambios de clase y CSS que se solicitan después
.noTrnsn()
para establecer generalmente el escenario para las animaciones, incluida la toma de medidas, como medir cuál será la altura final#box
sin mostrar eso al usuario, antes de llamar.resumeTrnsn()
, y animarlo desde ese conjunto completo etapa a sus valores de CSS objetivo.Vieja respuesta
https://jsfiddle.net/b9chris/hweyecu4/1/
Puede hacer la transición al hacer clic con:
El CSS es lo que adivinarías:
La clave es limitar la propiedad de visualización. Al eliminar la clase oculta y luego esperar 50 ms, luego comenzar la transición a través de la clase agregada, hacemos que aparezca y luego se expanda como quisiéramos, en lugar de que simplemente aparezca en la pantalla sin ninguna animación. Similar ocurre al revés, excepto que esperamos hasta que termine la animación antes de aplicar oculta.
Nota: Estoy abusando
.animate(maxWidth)
aquí para evitar lassetTimeout
condiciones de carrera.setTimeout
es rápido para introducir errores ocultos cuando usted u otra persona recoge el código sin darse cuenta..animate()
se puede matar fácilmente con.stop()
. Solo lo estoy usando para poner un retraso de 50 ms o 2000 ms en la cola de fx estándar, donde es fácil de encontrar / resolver por otros codificadores que se basan en esto.fuente
Tuve un problema similar al que no pude encontrar la respuesta. Algunas búsquedas en Google más tarde me llevaron aquí. Teniendo en cuenta que no encontré la respuesta simple que esperaba, me topé con una solución elegante y efectiva.
Resulta que la
visibility
propiedad CSS tiene un valorcollapse
que generalmente se usa para los elementos de la tabla. Sin embargo, si se usa en cualquier otro elemento, los convierte efectivamente en ocultos , más o menos igual,display: hidden
pero con la capacidad adicional de que el elemento no ocupa ningún espacio y aún puede animar el elemento en cuestión.A continuación se muestra un ejemplo simple de esto en acción.
fuente
La solución universal más simple para el problema es: siéntase libre de especificar
display:none
en su CSS, sin embargo, tendrá que cambiarloblock
(o cualquier otra cosa) usando JavaScript, y luego también tendrá que agregar una clase a su elemento en cuestión que realmente realiza la transición con setTimeout () . Eso es todo.Es decir:
Esto se probó en los últimos navegadores sanos. Obviamente no debería funcionar en Internet Explorer 9 o anterior.
fuente
Creo que SalmanPK tiene la respuesta más cercana. Se desvanece un elemento dentro o fuera, con las siguientes animaciones CSS. Sin embargo, la propiedad de visualización no se anima suavemente, solo la opacidad.
Si desea animar el elemento que se mueve desde el bloque de visualización para mostrar ninguno, no puedo ver que actualmente sea posible solo con CSS. Tienes que obtener la altura y usar una animación CSS para disminuir la altura. Esto es posible con CSS como se muestra en el siguiente ejemplo, pero sería difícil saber los valores exactos de altura que necesita animar para un elemento.
jsFiddle Ejemplo de
CSS
JavaScript
fuente
Puede hacer esto con eventos de transición, por lo que crea dos clases CSS para la transición, una con la animación y otra sin mostrar el estado. ¿Y los cambias después de que termina la animación? En mi caso, puedo mostrar los divs nuevamente si presiono un botón y elimino ambas clases.
Prueba el fragmento a continuación ...
fuente
Si está utilizando jQuery para configurar sus clases, esto funcionará al 100%:
Por supuesto, podría usar jQuery
.fadeIn()
y las.fadeOut()
funciones, pero la ventaja de establecer clases en su lugar es en caso de que desee realizar la transición a un valor de visualización distinto deblock
(como es el valor predeterminado con.fadeIn()
y.fadeOut()
).Aquí estoy
flex
haciendo la transición para mostrar con un agradable efecto de desvanecimiento.fuente
En lugar de usarlo
display
, puede almacenar el elemento 'fuera de pantalla' hasta que lo necesite, y luego establecer su posición donde lo desee y transformarlo al mismo tiempo. Sin embargo, esto plantea una gran cantidad de otros problemas de diseño, por lo que su kilometraje puede variar.Probablemente no quiera usar de
display
todos modos, ya que desearía que el contenido fuera accesible para los lectores de pantalla, que en su mayor parte intentan obedecer las reglas de visibilidad, es decir, si no debería ser visible a simple vista, no se mostrará como contenido al agente.fuente
Simplemente puede usar la visibilidad CSS : oculto / visible en lugar de mostrar : ninguno / bloque
fuente
Comencé un proyecto de esqueleto de código abierto llamado Toggle Display Animate .
Este asistente de esqueleto le permitirá imitar fácilmente jQuery show / hide, pero con animaciones de transición CSS 3 in / out.
Utiliza conmutadores de clase para que pueda usar cualquier método CSS que desee en los elementos además de mostrar: ninguno | bloque | tabla | en línea, etc., así como otros usos alternativos que se puedan pensar.
Su propósito de diseño principal es para estados de alternancia de elementos, y admite un estado de reversión donde ocultar el objeto le permite ejecutar su fotograma clave en reversa o reproducir una animación alternativa para ocultar el elemento.
La mayor parte del marcado para el concepto en el que estoy trabajando es CSS, y realmente se usa muy poco JavaScript.
Hay una demostración aquí: http://marcnewton.co.uk/projects/toggle-display-animate/
fuente