Подтвердить что ты не робот

Переход CSS не работает на процентную высоту?

У меня есть следующие определения CSS:

.detailsCollapsed
{
   display:none;
   height:0%;
   width:100%;
   -webkit-transition:height 40s ease-in-out;
}

.detailsExpanded
{
    display:block;
    visibility:visible;
    height:100%;
    width:100%;
    -webkit-transition:height 40s ease-in-out;
}

Они применяются к div с некоторым содержимым внутри него.

У меня также есть javascript, который при нажатии на div меняет имя класса на элементе. Это отлично подходит для расширения и рушится, но нет анимации на iphone? (Все остальные переходы, которые я пробовал работать с анимацией жидкости) Любые идеи?

4b9b3361

Ответ 1

Решение (чисто CSS) до сих пор

Если вы оставите height:auto; и используете фиксированные значения max-height, вы можете имитировать переход:

.details-expanded {
    max-height: 300px; /* try to guess a max-height for your content */
}

.details-collapsed {
    height: auto;
    max-height: 0;
    transition: max-height 500ms linear; /* pick a proportional duration */
}

Обратите внимание на продолжительность перехода и max-height, когда элемент расширен. Играйте со значениями, пока не получите желаемое поведение.

Таким образом вы можете получить переход между двумя определенными значениями (в приведенном выше примере, от 0 до 300), в то время как свойство height будет просто следовать за max-height и расти, пока не получит размер содержимого.


Demos

DEMO 1 - рабочий пример этого решения

DEMO 2 - просто демонстрация того, что происходит в DEMO 1


Наблюдения

Теперь переходы реализуются только между предопределенными значениями, и я предполагал, что это связано с тем, что в некоторых случаях двигатель не может угадать начальное или конечное значение. Что делать, если у вас есть переход на высоту, конечное значение которого составляет 50%, но сам переход влияет на родительскую высоту? Вероятно, это потребует нескольких расчетов reflow для каждого кадра, что вызывает проблемы с производительностью.

Как и fabb said, спецификация для переходов CSS определяет, что процентные значения должны поддерживаться, поэтому это может быть просто вопросом времени пока двигатели не решают, в каких случаях они будут поддерживать переходы, используя динамически оцениваемые точки. Тем не менее, я не уверен, что можно считать правильным поведением для auto значений мысли.

Ответ 2

В соответствии с W3C Spec в переходах CSS3 длина и процент должны быть разрешены для перехода на высоту свойства. Поэтому я думаю, что это всего лишь вопрос времени, пока в браузерах не будет поддерживаться процент.

Ответ 3

У меня была такая же проблема. Переход "отлично работал", когда "рушился", но появился без перехода (например, "включен" ) при "расширении", когда раньше был установлен "display: none".

Я случайно пришел к рабочему решению во время отладки: просто запрос "offsetHeight", похоже, заставляет внутреннюю повторную визуализацию элемента.

что-то вроде этого:

    showElement = function(){
       ...
       oEl.style.display = "block";
       var xDump = oEl.offsetHeight;
       oEl.className = "show";
    }

xDump никогда не используется, но имея его, сделал differnce.

Ответ 4

Я использовал следующее решение для элементов, где мне нужно переключаться между отображением none и block и сохранять эффект перехода:

function slidedown(element) {
    ...
    element.style.display = "block";
    var timerId = setTimeout(function(){
        element.style.webkitTransitionProperty = "height";
        element.style.webkitTransitionTiming = "linear";
        element.style.webkitTransitionDuration = "3.5s";
        element.style.height = "500px";
    }, 0);
    ...
}

функция setTimeout заставит короткую задержку разрешить переход после переключения свойства отображения. Надеюсь, что это поможет.

Ответ 5

Это изменение от отображения: none для отображения: блок, который останавливает переход. Попробуйте установить свернутый стиль для отображения: block; высота: 0; переполнение: скрытый;

Примечание: расширенная высота авто также остановит переход. Если на содержащем блоке нет высоты, высота 100% равна высоте авто.

Ответ 6

Надеюсь, вы уже работали над этим, но я просто пишу, чтобы сказать, что столкнулся с одной и той же проблемой: WebKit, по крайней мере, на iOS 4.1, не будет анимировать переход, если бы он был определен в элементе, display: none; ", точно так же, как упомянутый выше Николас.

Если ваша проблема не в рендеринге этого элемента - это производительность, как в моем случае, то я предлагаю другое решение, кроме установки высоты на 0. В вашем обратном вызове bodyLoad вашего тела сохраните элемент в переменной и удалите его из DOM, Затем повторно вставьте его, когда наступит время, чтобы показать его.

Ответ 7

Вот решение для тех, кто хочет использовать проценты.

Трюк состоит в том, чтобы содержать его внутри div с заданной высотой и шириной. Если вы являетесь плавающим контейнером div, это может быть не идеальным, но если вы абсолютно позиционируете контейнеры, это должно работать очень хорошо и до тех пор, пока элементы не перекрываются друг с другом.

вот код

.container {
    width: 500px; 
    height: 500px; 
    background: transparent;
}
.expand-content{
    height: 0%; 
    color: #fff;
    background: green;
}
.expand-content:hover {
    height: 100%; 
    background: orange;
    transition: all 2s ease;
}
.expand-content p  {
    font-size: 35px; 
    text-align: center;     
}
<div class="container">
    <div class="expand-content">
        <p>Expanded Content</p>
    </div>
</div>