Мне нужен метод, который использует только CSS-переходы, чтобы эффективно (и привлекательно) скрывать / показывать контент при наведении.
Предостережение в том, что я хочу сохранить динамическую (авто) высоту.
Кажется, что оптимальным маршрутом будет переход от fixed height:0
к 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 - Взлом Max-Height .content { max-height:0px; }
.activator:hover +.content{ max-height:2000px; }
Минусы
a. Вам нужно будетбитрейльно установите верхний max-height , который при большом динамическом содержании может потенциально обрезать информацию.
b. Если в качестве меры предосторожности (* 1043)* a ), вы прибегаете к установке очень верхнего верхнего max-height , задержка анимации становится неловкой и несостоятельной, так как браузер незаметно перемещается на все расстояние.Также делает ослабление менее визуально эффективным.
Вариация № 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 - Эффективный, но нервный, размер шрифта .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
, все это будет спорным.
А пока какие-нибудь предложения?
Спасибо!Leif