Tanto display: none; como visibility: hidden; son propiedades CSS que se utilizan para ocultar elementos en una página web, pero tienen diferencias cruciales en cómo afectan al diseño (layout) y a la interacción con el elemento:
display: none;
display: none; a un elemento, este se elimina por completo del flujo normal del documento. Es como si el elemento no existiera en la página:display: none al cargar la página.display.visibility: hidden;
visibility: hidden;, el elemento se vuelve invisible, pero sigue ocupando su espacio original en el diseño de la página. Es decir, se crea un «hueco» o espacio vacío donde estaría el elemento si fuera visible.visibility sí puede ser animada o transicionada (por ejemplo, para efectos de aparición/desaparición graduales si se combina con opacity).visibility: hidden;, sus elementos hijos también estarán ocultos. Sin embargo, un elemento hijo puede anular esta herencia estableciendo visibility: visible;, haciéndose visible dentro del espacio que ocupa su padre oculto.En resumen:
display: none; cuando quieras eliminar completamente el elemento del diseño y que no ocupe ningún espacio (ideal para menús desplegables que aparecen y desaparecen, contenido condicional, etc.).visibility: hidden; cuando necesites ocultar un elemento pero mantener el espacio que ocupaba en el layout, o cuando quieras que sus hijos puedan anular la invisibilidad, o para ciertos efectos de transición.La elección entre uno y otro dependerá del efecto específico que quieras lograr en el diseño y la funcionalidad de tu página.