Мне нужен метод, который использует только переходы CSS, чтобы эффективно (и привлекательно) скрывать/показывать содержимое при наведении.
Предостережение заключается в том, что я хочу сохранить динамическую (авто) высоту.
Кажется, что оптимальным маршрутом будет переход между fixed height:0
, a height:auto
, но, увы, это пока не поддерживается переходами в браузерах.
Прояснение в ответ на комментарии:: Это не столько вопрос ожидания, пока все живые браузеры совместимы с CSS3, а скорее рассмотрят предполагаемый недостаток самого CSS3 (например, отсутствие height:0
> height:auto
)
Я изучил несколько других способов, которые можно посмотреть на следующем скрипке (и подробно описано ниже), но ни один из них не удовлетворяет меня, и мне бы хотелось получить отзывы/советы для других подходов.
http://jsfiddle.net/leifparker/PWbXp/1/
Базовый CSS
.content{
-webkit-transition:all 0.5s ease-in-out;
-moz-transition:all 0.5s ease-in-out;
transition:all 0.5s ease-in-out;
overflow:hidden;
}
Вариант № 1 - Макс-высота взлома
.content { max-height:0px; }
.activator:hover +.content{ max-height:2000px; }
против
a. Вам потребуется произвольно установить верхнюю максимальную высоту, которая при обширном динамическом контенте может потенциально отключить информацию.
b. Если в качестве меры предосторожности (a) вы прибегаете к настройке максимальной верхней максимальной высоты , задержка на анимации становится неудобным и несостоятельным, поскольку браузер невидимо переводит все расстояние. Также делает ослабление менее визуально эффективным.
Вариант № 2 - Заполнение и иллюзия роста
.content { padding:0px; height:0px; opacity:0; }
.activator:hover +.content { padding:10px 0px; height:auto; opacity:1; }
против
a. Это сотрясение. Это определенно немного лучше, чем просто вытаскивать контент из ниоткуда, и эффект дополнительно продается, перейдя к непрозрачности, но в целом он не выглядит визуально скользким.
Вариант № 3 - Подход, основанный на ошибочной ширине
.content { width:0%; }
.activator:hover +.content{ width:100%; }
против
a. По мере того, как ширина сжимается, линейный перенос заставляет любой дополнительный текст на последующие строки, и мы получаем супер высокий невидимый div, который все еще требует недвижимости.
Вариант № 4 - Эффективный, но Jittery, размер шрифта
.content { font-size:0em; opacity:0; }
.activator:hover +.content{ font-size:1em; opacity:1; }
против
a. Несмотря на то, что это имеет приятный, потрясающий эффект, смещение линейного обтекания по мере роста шрифта вызывает непривлекательный джиттер.
b. Это работает только для контента, состоящего из текста. Другие переходы должны быть добавлены для управления масштабированием входов и изображений, а в то же время вполне жизнеспособными, это подорвет простоту.
Вариант № 5 - Масштабирование линейной высоты
.content { line-height:0em; opacity:0; }
.activator:hover +.content{ line-height:1.2em; opacity:1; }
против
a. Мой любимый эстетически, но как и в случае С# 4, это работает наиболее просто с текстовым контентом.
Вариант № 6 - Анти-маржа (как предлагается @graphicdivine)
.wrapper_6 { min-height: 20px }
.wrapper_6 .activator {z-index:10; position: relative}
.wrapper_6 .content { margin-top: -100%; }
.wrapper_6 .activator:hover +.content{ margin-top: 0 }
против
a. Задержка при наведении не является оптимальной. Это результат того, что .content
невидимо скрывается на экране и занимает время, чтобы анимировать вниз перед появлением.
b. margin-top: -100%
относится к ширине содержащего элемента. Таким образом, при разработке флюидов существует вероятность того, что, когда окно будет сжато довольно мало, margin-top
не будет достаточным для скрытия .content
.
Как я уже говорил раньше, если бы мы только могли переходить между
height:0
и height:auto
, это все будет спорный вопрос.
До тех пор любые предложения?
Спасибо! Лейф