переход не работает ко всем элементам [дубликат]

Я решил это, выведя div, сделав его скрытым и вызвав div id jQuery, когда мне это нужно.

например

<div id="UniqueID" style="display:none;">
     Strings
     On
     Multiple
     Lines
     Here
</div>

Тогда, когда мне нужно получить строку, я просто использую следующий jQuery:

$('#UniqueID').html();

Который возвращает мой текст на нескольких строках. Если я назову

alert($('#UniqueID').html());

, я получаю:

enter image description here [/g0]

1079
задан Brian Burns 20 April 2018 в 10:44
поделиться

27 ответов

Вы можете объединить два перехода или больше, а visibility - это то, что пригодится на этот раз.

div {
  border: 1px solid #eee;
}
div > ul {
  visibility: hidden;
  opacity: 0;
  transition: visibility 0s, opacity 0.5s linear;
}
div:hover > ul {
  visibility: visible;
  opacity: 1;
}
<div>
  <ul>
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
  </ul>
</div>

( Не забывайте, что префиксы поставщика к свойству transition)

Подробнее в в этой статье

1031
ответ дан Nathan Arthur 16 August 2018 в 14:28
поделиться
  • 1
    visibility работал очень хорошо для меня - наконец, для этого свойства хорошо использовать :) – Kobi 4 March 2012 в 15:54
  • 2
    Да, проблема с этим - это что-то позади, оно будет перекрываться, даже если оно не видно. Я нашел, используя высоту: 0 намного лучшее решение – Josh Bedo 3 September 2013 в 00:34
  • 3
    Это хорошо, но проблема заключается в том, что «видимость скрыта» элементы по-прежнему занимают пространство, а «показывать нет» не. – Rui Marques 14 November 2013 в 12:48
  • 4
    Я, вероятно, что-то пропустил, но почему вы изменяете видимость и непрозрачность? Не установит непрозрачность, чтобы скрыть элемент - зачем вам нужно также скрывать видимость? – GMA 3 July 2014 в 12:14
  • 5
    @GeorgeMillo, если вы установите только непрозрачность, элемент на самом деле остается на странице рендеринга (например, вы не можете щелкнуть мышью). – Grsmto 26 August 2014 в 20:37

Его можно обрабатывать с помощью функций синхронизации времени step-end и step-start

Например: https://jsfiddle.net/y72h8Lky/

$(".run").on("click", function() {
    $(".popup").addClass("show");
});
$(".popup").on("click", function() {
    $(".popup").removeClass("show");
})
.popup {
    opacity: 0;
    display: block;
    position: absolute;
    top: 100%;
    bottom: 0;
    left: 0;
    right: 0;
    z-index: 1450;
    background-color: rgba(0, 175, 236, 0.6);
    transition: opacity 0.3s ease-out, top 0.3s step-end;
}
.popup.show {
    transition: opacity 0.3s ease-out, top 0.3s step-start;
    opacity: 1;
    top: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="popup"></div>
<button class="run" style="font-size: 24px;">Click on me</button>

0
ответ дан Andrey Izman 16 August 2018 в 14:28
поделиться

Вы можете заставить это работать естественным образом, как вы ожидали, - используя дисплей, - но вам нужно активировать браузер, чтобы заставить его работать, используя JS или, как другие, предложили фантастический трюк с одним тегом внутри другого. Мне не нужен внутренний тег, поскольку он еще более усложняет CSS и размеры, поэтому вот решение JS:

https://jsfiddle.net/b9chris/hweyecu4/1/

Начиная с поля типа:

<div class="box hidden">Lorem</div>

Скрытое поле. Вы можете переключиться на клик с помощью:

function toggleTransition() {
  var el = $("div.box1");

  if (el.length) {
    el[0].className = "box";
    el.stop().css({maxWidth: 10000}).animate({maxWidth: 10001}, 2000, function() {    
        el[0].className = "box hidden";
    });
  } else {
    el = $("div.box");
    el[0].className = "box";
    el.stop().css({maxWidth: 10001}).animate({maxWidth: 10000}, 50, function() {    
        el[0].className = "box box1";
    });
  }

  return el;
}

someTag.click(toggleTransition);

. CSS - это то, что вы догадались:

.hidden {
  display: none;
}
.box {
    width: 100px;
    height: 100px;
    background-color: blue;
    color: yellow;
    font-size: 18px;
    left: 20px;
    top: 20px;
    position: absolute;
    -webkit-transform-origin: 0 50%;
    transform-origin: 0 50%;
    -webkit-transform: scale(.2);
    transform: scale(.2);
  -webkit-transition: transform 2s;
  transition: transform 2s;
}
.box1{
    -webkit-transform: scale(1);
    transform: scale(1);
}

Ключ регулирует свойство отображения. Удалив скрытый класс, а затем ожидая 50 мс, , затем , начиная переход через добавленный класс, мы получим его, чтобы он появился, а затем развернулся, как мы хотели, вместо того, чтобы просто накладывать на экран без какой-либо анимации. Аналогично происходит другой путь, за исключением того, что мы ожидаем завершения анимации перед применением скрытых.

Примечание: я злоупотребляю .animate(maxWidth) здесь, чтобы избежать условий гонки setTimeout. setTimeout быстро вводит скрытые ошибки, когда вы или кто-то другой захватывает код, не подозревая об этом. .animate() можно легко убить с помощью .stop(). Я просто использую его для установки задержки 50 мс или 2000 мс в стандартной очереди fx, где ее легко найти / разрешить другими конструкторами кодов поверх этого.

0
ответ дан Chris Moschini 16 August 2018 в 14:28
поделиться

Я почти не отвечаю на вопрос с множеством ответов, но это решение имеет отличную совместимость, и я еще не видел его:

.hidden-element {
  position: absolute;
  z-index: -1;
  pointer-events: none;
  visibility: hidden;
  opacity: 0;
  transition: visibility 0s, opacity .5s ease-out;
}

.hidden-element.visible {
  position: static;
  z-index: auto;
  pointer-events: auto;
  visibility: visible;
  opacity: 1;
}

Объяснение: он использует трюк visibility: hidden (который совместим с «show-and-animate» за один шаг), но использует комбинацию position: absolute; z-index: -1; pointer-events: none;, чтобы убедиться, что скрытый контейнер не занимает места и не отвечает на взаимодействия пользователя.

2
ответ дан Christophe Marois 16 August 2018 в 14:28
поделиться
  • 1
    Но изменение position все равно заставит элемент дрочить, нет? – Arsylum 18 February 2018 в 18:31
  • 2
    Ну, конечно: position: absolute означает, что элемент не занимает никакого места, как описано в объяснении. Когда он переключится на position: static и появится, это займет пространство, как обычный элемент, что является точкой этого вопроса. Я предлагаю вам попробовать! – Christophe Marois 19 February 2018 в 16:49
  • 3
    Я сделал. Но если я правильно понял, вопрос касался переходов . Как и в «гладкой анимации». – Arsylum 19 February 2018 в 22:50

После того, как принятый ответ Гильермо был написан, переход CSS-перехода от 3 апреля 2012 года изменил поведение перехода видимости, и теперь можно решить эту проблему короче, без использования задержки перехода:

.myclass > div { 
                   transition:visibility 1s, opacity 1s; 
                   visibility:hidden;  opacity:0
               }
.myclass:hover > div 
               {   visibility:visible; opacity:1 }

Время выполнения, указанное для обоих переходов, должно быть, как правило, одинаковым (хотя немного более длительное время для видимости не является проблемой). Для текущей версии см. Мой блог http://www.taccgl.org/blog/css-transition-visibility.html#visibility-opacity .

W.r.t. название вопроса «Переходы на дисплее: свойство» и в ответ на комментарии Rui Marques и josh к принятому ответу: это решение работает в тех случаях, когда это не имеет значения, если свойство отображения или видимости (как это, вероятно, имело место в этом вопросе). Он не будет полностью удалять элемент как отображение: none, просто сделать его невидимым, но он все еще остается в потоке документа и влияет на положение следующих элементов. Переходы, которые полностью удаляют элемент, похожий на отображение: ни один не может быть выполнен с использованием высоты (как указано другими ответами и комментариями), максимальной высотой или краем-сверху / снизу, но также см. . Как я могу перейти на высоту: 0 ; высота: авто; используя CSS? и мой блог http://www.taccgl.org/blog/css_transition_display.html .

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

661
ответ дан Community 16 August 2018 в 14:28
поделиться
  • 1
    Спасибо Джим за подробный ответ. Вы абсолютно правы в том, что если свойство display: свойство вообще меняется, тогда ВСЕ ваши переходы не будут работать. Какой позор - мне интересно, что это за рассуждение. На боковой ноте, по той же ссылке, которую я опубликовал в исходном вопросе, вы можете видеть, где я нахожусь. Единственная (маленькая) проблема, которая у меня есть, - это Chrome [5.0.375.125], когда страница загружается, вы можете увидеть, как меню быстро исчезает, когда элементы загружаются на страницу. Firefox 4.0b2 и Safari 5.0 абсолютно прав ... ошибка или что-то, что я пропустил? – RichardTape 28 July 2010 в 20:45
  • 2
    Я согласен, что это правильно и будет способствовать этому; голова к будущим путешественникам. Я нашел рабочее решение в Chrome, но обнаружил, что он не работает на iPhone 4: visibility:hidden; opacity:0; -webkit-transition: all .2s ease-in-out; Это не только неправильно, но и целевой элемент никогда не появится. QA не даст вам, мне и вашей маме. – SimplGy 5 April 2011 в 20:37
  • 3
    Вы также можете изменить свойство видимости. – Cu7l4ss 8 December 2012 в 23:10
  • 4
    Если вы установите свое скрытое состояние на height: 0; и не переходите к нему, переход не будет работать. Я попробовал это, просто пытаясь перекрыть непрозрачность. Мне пришлось удалить height: 0; – chovy 27 June 2013 в 01:00
  • 5
    вы только что выиграли голосование из-за overflow: hidden большое спасибо! – thiagoh 18 December 2015 в 15:33

Наконец, я нашел решение для меня, объединив opacity с position absolute (не занимая пространство, когда скрыто).

.toggle {
  opacity: 0;
  position: absolute;
  transition: opacity 0.8s;
}

.parent:hover .toggle {
  opacity: 1;
  position: static;
}
3
ответ дан Damjan Pavlica 16 August 2018 в 14:28
поделиться

Исходя из некоторых из этих ответов и некоторых предложений в другом месте, следующее прекрасно работает для меню наведения (я использую это с помощью bootstrap 3, в частности):

nav .dropdown-menu {
    display: block;
    overflow: hidden;
    max-height: 0;
    opacity: 0;
    transition: max-height 500ms, opacity 300ms;
    -webkit-transition: max-height 500ms, opacity 300ms;
}
nav .dropdown:hover .dropdown-menu {
    max-height: 500px;
    opacity: 1;
    transition: max-height 0, opacity 300ms;
    -webkit-transition: max-height 0, opacity 300ms;
}

Вы также можете использовать height вместо max-height, если вы укажете оба значения, так как height:auto не разрешено с transition s. Значение зависания max-height должно быть больше, чем height меню может быть.

203
ответ дан dippas 16 August 2018 в 14:28
поделиться
  • 1
    Спасибо за это. height: 0 трюк (для переходов), упомянутый выше, не работает, потому что высота получает значение 0 при переходе на постепенный переход, но этот трюк, похоже, работает нормально. – Elliot Winkler 14 March 2012 в 22:42
  • 2
    Спасибо, очень полезно. Но как это угасать? – Illiou 15 October 2012 в 03:37
  • 3
    Первый абзац этого ответа не имеет смысла. Браузеры не просто отключают все переходы сразу после использования свойства display - на самом деле нет причин. И даже если они сделали , почему бы анимации работать тогда? Вы также не можете использовать свойство display в анимации CSS. – BoltClock♦ 11 July 2014 в 11:17
  • 4
    Должен ли myfirst быть showNav здесь? А как насчет Firefox? К сожалению, я не могу найти что-то, что связано с демонстрационной страницей, о которой вы упоминаете. – Sebastian vom Meer 16 September 2014 в 10:31
  • 5
    Спасибо @SebastianG. Я сделал исправление и добавил дополнительную информацию выше. – Manish Pradhan 16 September 2014 в 18:59
  • 6
    @Sebastian vom Meer: более старые версии Firefox нуждаются в & quot; -moz- & quot; префикс поставщика, см. отредактированный код – Herr_Schwabullek 18 June 2015 в 10:17
  • 7
    Если я не пропущу что-то, то "демо" ссылка больше не отображает переход подменю. – Realistic 17 November 2015 в 00:11
  • 8
    Это хороший трюк, но есть недостаток. Время перехода зависит от высоты. Если есть несколько меню с переменной высотой, те элементы с высотой, ближе к максимальной высоте, будут хорошо анимировать. Однако более короткие из них ожидают слишком быстро, давая непоследовательный опыт. – user 14 February 2016 в 09:00
  • 9
    Лучший ответ, невозможно с переходами, но да с анимацией. – Mikel 24 March 2016 в 16:13
  • 10
    Эй, ваша демонстрационная ссылка следует за developers.google.com – Green 23 May 2016 в 06:55
  • 11
    Как насчет обратной анимации, то есть когда элемент должен медленно исчезать? – Green 23 May 2016 в 06:57

Я столкнулся с этой проблемой несколько раз и теперь просто пошел с:

.block {
  opacity: 1;
  transition: opacity 250ms ease;
}

.block--invisible {
  pointer-events: none;
  opacity: 0;
}

Добавив класс block--invisible, все элементы не будут доступны для клика, но все элементы за ним будут связаны с тем, что из pointer-events:none, который поддерживается всеми основными браузерами (без IE и 11).

2
ответ дан DominikAngerer 16 August 2018 в 14:28
поделиться
  • 1
    Можете ли вы привести это в пример, пожалуйста? – GarethAS 5 September 2017 в 15:56
  • 2
    Это хорошо работает, но следует отметить, что указатели-события не работают с IE ниже 11 – user1702965 3 June 2018 в 17:39
  • 3
    добавлено примечание для IE ниже 11 – DominikAngerer 4 June 2018 в 07:33

Согласно Рабочий проект W3C 19 ноября 2013 г. display не является анимационным свойством . К счастью, visibility является анимированным. Вы можете связать его переход с переходом непрозрачности ( JSFiddle ):

  • HTML:
    <a href="http://example.com" id="foo">Foo</a>
    <button id="hide-button">Hide</button>
    <button id="show-button">Show</button>
    
  • CSS:
    #foo {
        transition-property: visibility, opacity;
        transition-duration: 0s, 1s;
    }
    
    #foo.hidden {
        opacity: 0;
        visibility: hidden;
        transition-property: opacity, visibility;
        transition-duration: 1s, 0s;
        transition-delay: 0s, 1s;
    }
    
  • JavaScript для тестирования:
    var foo = document.getElementById('foo');
    
    document.getElementById('hide-button').onclick = function () {
        foo.className = 'hidden';
    };
    
    document.getElementById('show-button').onclick = function () {
        foo.className = '';
    };
    

Обратите внимание, что если вы просто сделаете ссылку прозрачной, не установив visibility: hidden, она останется кликабельной.

17
ответ дан feklee 16 August 2018 в 14:28
поделиться
  • 1
    я вообще не вижу никакого перехода в примере jsfiddle – Gino 26 October 2016 в 14:11
  • 2
    @Gino Я исправил это, изменив 0 на 0s. По-видимому, в прошлом браузер, который я использовал для тестирования, поддерживал единичные нулевые времена. Тем не менее, единичные времена являются not частью Рекомендации кандидата №3 W3C от 29 сентября 2016 года . – feklee 27 October 2016 в 16:19
  • 3
    Это должно быть увеличено. Я нашел это одним из лучших решений. – Arthur Tarasov 13 July 2017 в 13:08
  • 4
    STOP отвечает, что дисплей не является анимационным свойством. Просто пожалуйста, STOP. Это совершенно не имеет значения. В стандарте говорится, что сам дисплей не может быть анимирован. Он не говорит, что его изменение должно препятствовать работе анимации всех других свойств. Это совершенно другой симптом. – Szczepan Hołyszewski 11 September 2017 в 13:28

Вы можете просто использовать видимость css: скрытый / видимый вместо отображения: none / block

div {
    visibility:hidden;
    -webkit-transition: opacity 1s ease-out;
    -moz-transition: opacity 1s ease-out;
    -o-transition: opacity 1s ease-out;
    transition: opacity 1s ease-out;
    opacity: 0; 
}

parent:hover > div {
    opacity: 1;
    visibility: visible;
}
0
ответ дан foxdanni 16 August 2018 в 14:28
поделиться
  • 1
    Однако это оставляет пространство, оставляя пустое отверстие. Если вы хотите свернуть пространство, вы должны оживить высоту или другое свойство. – Marcy Sutton 17 September 2013 в 22:47

Я столкнулся с этим сегодня, с модальным position: fixed, который я использовал повторно. Я не смог сохранить его display: none, а затем оживить его, поскольку он просто вскочил на внешний вид, а также z-index (отрицательные значения и т. Д.) Тоже сделали странные вещи.

Я также использовал height: 0 до height: 100%, но он работал только тогда, когда появился модальный. Это то же самое, что если вы использовали left: -100% или что-то в этом роде.

Тогда мне показалось, что был простой ответ. Et voila:

Во-первых, ваш скрытый модальный. Обратите внимание, что height есть 0, и проверьте декларацию height в переходах ... у него есть 500ms, , который длиннее моего opacity перехода . Помните, что это влияет на переход к постепенному исчезновению: возвращение модального состояния в состояние по умолчанию.

#modal-overlay {
    background: #999;
    background: rgba(33,33,33,.2);
    display: block;
    overflow: hidden;
    height: 0;
    width: 100%;
    position: fixed;
    top: 0;
    left: 0;
    opacity: 0;
    z-index: 1;
    -webkit-transition: height 0s 500ms, opacity 300ms ease-in-out;
       -moz-transition: height 0s 500ms, opacity 300ms ease-in-out;
            -ms-transition: height 0s 500ms, opacity 300ms ease-in-out;
         -o-transition: height 0s 500ms, opacity 300ms ease-in-out;
        transition: height 0s 500ms, opacity 300ms ease-in-out;
}

Во-вторых, ваш видимый модальный. Предположим, вы устанавливаете .modal-active на body. Теперь height - 100%, и мой переход также изменился. Я хочу, чтобы height был немедленно изменен, а opacity - 300ms.

.modal-active #modal-overlay {
    height: 100%;
    opacity: 1;
    z-index: 90000;
    -webkit-transition: height 0s, opacity 300ms ease-in-out;
       -moz-transition: height 0s, opacity 300ms ease-in-out;
        -ms-transition: height 0s, opacity 300ms ease-in-out;
         -o-transition: height 0s, opacity 300ms ease-in-out;
            transition: height 0s, opacity 300ms ease-in-out;
}

Вот и все, это работает как прелесть.

9
ответ дан hotmeteor 16 August 2018 в 14:28
поделиться
  • 1
    Упрощение для вашего стиля выравнивания свойств префиксов поставщика – George Green 17 May 2017 в 11:30

Я подозреваю, что причина , что переходы отключены, если «отображение» изменено, связано с тем, что на самом деле делает дисплей. Он не не изменяет ничего, что могло бы быть плавно анимировано.

«display: none» и «visibility: hidden;» - это два полностью разные вещи. Оба имеют эффект, делающий элемент невидимым, но с «видимостью: скрытым», он по-прежнему отображается в макете, но только не заметно . Скрытый элемент по-прежнему занимает пробел и по-прежнему отображается как встроенный или как блок или блок-строка или таблица, или что-либо, что элемент «display» сообщает ему, чтобы отображать как, и соответственно занимает место. Другие элементы not автоматически переместятся, чтобы занять это пространство. Скрытый элемент просто не отображает фактические пиксели на выходе.

«display: none», с другой стороны, фактически полностью предотвращает элемент от рендеринга . Это не занимает любое пространство макета . Другие элементы, которые заняли бы некоторое или все пространство, занимаемое этим элементом, теперь будут зависеть от этого пространства, как будто элемент просто вообще не существовал .

«Display» - это не просто еще один визуальный атрибут. Он устанавливает весь режим рендеринга элемента, например, будь то блок, встроенный, встроенный блок, таблица, таблица-строка, таблица-ячейка, список-элемент или что-то еще! У каждого из них очень разные разметки разметки, и не было бы разумного способа оживить или плавно перевести их (попробуйте представить плавный переход от «блока» к «встроенному» или наоборот, например!).

Вот почему переходы отключены, если отображение изменяется (даже если изменение имеет значение «none» или «нет» - «none» - это не просто invisiblity, это его собственный режим рендеринга элементов, что означает отсутствие рендеринга вообще!),

54
ответ дан Joel_MMCC 16 August 2018 в 14:28
поделиться
  • 1
    Это верно. Это не сразу очевидно, но как только вы об этом подумаете, вам не потребуется много времени, чтобы понять, что переход к свойству display не может работать . – BoltClock♦ 11 July 2014 в 11:20
  • 2
    Как и в случае с вышеприведенными решениями, было очень приятно получить разумное объяснение относительно того, почему переходы не применяются к отображаемым атрибутам. – kqr 17 September 2014 в 15:27
  • 3
    Я не согласен. Это может иметь смысл. Если отображение: none для отображения: блок произошел мгновенно в начале перехода, это было бы здорово. И для перехода назад, если бы он шел с экрана: блок для отображения: ни один в конце перехода, это было бы идеально. – Curtis Yallop 2 June 2015 в 17:08
  • 4
    Если вы не представляете, как выглядит анимация от точки до прямоугольника, у вас проблемы. Переход от занимаемого пространства до занимаемого прямоугольного пространства ОЧЕНЬ очевиден, например, вы делаете это каждый раз, когда вы перетаскиваете прямоугольник с помощью мыши, как и любое приложение. В результате этого сбоя существует так много хаков, в которых макс-высота и отрицательные поля являются смешными. Единственное, что работает, это кэширование «реальной» высоты, а затем анимация от нуля до кешированного значения с помощью JavaScript. Грустный. – Triynko 16 March 2017 в 03:36
  • 5
    Tryniko: display: none не меняет размер элемента на прямоугольник 0 x 0 - он удаляет его из DOM. Вы можете анимировать от прямоугольника до точки, анимируя свойства ширины и высоты до нуля, а затем другие элементы будут обтекать его, как если бы он имел «display: none», но атрибут «display» оставался бы «блоком»; элемент все еще находится в DOM. Концепция анимации между дисплеем: блок и отображение: нет смешно: промежуточных состояний нет. Элемент либо существует в DOM, либо нет, независимо от того, насколько он мал или невидим. – Steve Thorpe 7 May 2017 в 01:42

Я подозреваю, что кто-то только начинает переходы CSS быстро обнаруживает, что они не работают, если вы одновременно модифицируете свойство display (block / none). Одна работа, о которой еще не упоминалось, заключается в том, что вы можете продолжать использовать display: block / none, чтобы скрыть / показать элемент, но установить его непрозрачность в 0, чтобы даже когда он отображается: блок, он все еще невидим. Затем, чтобы угаснуть его, добавьте еще один класс CSS, такой как «on», который устанавливает непрозрачность в 1 и определяет переход для непрозрачности. Как вы могли себе представить, вам придется использовать JavaScript, чтобы добавить этот класс «on» к элементу, но по крайней мере вы все еще используете CSS для фактического перехода.

P.S. Если вы окажетесь в ситуации, когда вам нужно сделать как отображение: блок, так и добавить класс «включено», в то же время отложить последнее, используя setTimeout. В противном случае браузер просто видит, что происходит одновременно, и отключает переход.

4
ответ дан Larry Gerndt 16 August 2018 в 14:28
поделиться
  • 1
    Отлично, спасибо! Я написал еще один ответ с примером, который действительно работает с display:none. – mojuba 30 August 2012 в 21:50

Я начал проект скелетного кода с открытым исходным кодом под названием Toggle Display Animate

https://marcnewton.github.io/Toggle-Display-Animate/

] Этот помощник скелета позволит вам легко подражать jQuery show / hide, но с анимациями перехода в CSS / CSS.

Он использует классные переключатели, поэтому вы можете использовать любые методы css, которые вы хотите использовать для элементов, кроме отображения: none | block | tableline inline и т. д., а также другие альтернативные варианты использования, которые можно придумать.

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

Большая часть разметки для концепции, над которой я работаю, - это CSS, на самом деле используется очень мало javascript.

демо здесь: http://marcnewton.co.uk/projects/toggle-display-animate/

0
ответ дан Marc Newton 16 August 2018 в 14:28
поделиться

Вы можете сделать это с событиями перехода, так что вы так и есть, вы создаете 2 класса css для перехода, один из которых содержит анимацию другой, удерживая дисплей в состоянии none. и вы переключаете их после окончания анимации? В моем случае я могу отображать div снова, если я нажимаю btn и удаляю оба класса.

Попробуйте отрезать ниже ...

$(document).ready(function() {
  //assign transition event
  $("table").on("animationend webkitAnimationEnd", ".visibility_switch_off", function(event) {
    //we check if this is the same animation we want  
    if (event.originalEvent.animationName == "col_hide_anim") {
      //after the animation we assign this new class that basically hides the elements.    
      $(this).addClass("animation-helper-display-none");
    }

  });

  $("button").click(function(event) {

    $("table tr .hide-col").toggleClass(function() {
      //we switch the animation class in a toggle fashion...
      //and we know in that after the animation end, there is will the animation-helper-display-none extra class, that we nee to remove, when we want to show the elements again, depending on the toggle state, so we create a relation between them.
      if ($(this).is(".animation-helper-display-none")) {
        //im toggleing and there is already the above classe, then what we want it to show the elements , so we remove both classes...        
        return "visibility_switch_off animation-helper-display-none";
      } else {
        //here we just want to hide the elements, so we just add the animation class, the other will be added later be the animationend event...        
        return "visibility_switch_off";
      }

    });

  });

});
table th {
  background-color: grey;
}

table td {
  background-color: white;
  padding:5px;
}

.animation-helper-display-none {
  display: none;
}

table tr .visibility_switch_off {
  animation-fill-mode: forwards;
  animation-name: col_hide_anim;
  animation-duration: 1s;
}

@-webkit-keyframes col_hide_anim {
  0% {opacity: 1;}
  100% {opacity: 0;}
}

@-moz-keyframes col_hide_anim {
  0% {opacity: 1;}
  100% {opacity: 0;}
}

@-o-keyframes col_hide_anim {
  0% {opacity: 1;}
  100% {opacity: 0;}
}

@keyframes col_hide_anim {
  0%   {opacity: 1;}
  100% {opacity: 0;}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
  <theader>
    <tr>
      <th>Name</th>
      <th class='hide-col'>Age</th>
      <th>Country</th>
    </tr>
  </theader>
  <tbody>
    <tr>
      <td>Name</td>
      <td class='hide-col'>Age</td>
      <td>Country</td>
    </tr>
  </tbody>
</table>

<button>Switch - Hide Age column with fadeout animation and display none after</button>

1
ответ дан Miguel 16 August 2018 в 14:28
поделиться

Не требуется javascript, и не требуется чрезмерно огромная максимальная высота. Вместо этого установите максимальную высоту в своих текстовых элементах и ​​используйте относительную единицу шрифта, такую ​​как rem или em. Таким образом, вы можете установить максимальную высоту, большую, чем ваш контейнер, избегая при этом задержки или «выскакивания», когда меню закрывается:

HTML

<nav>
  <input type="checkbox" />
  <ul>
    <li>Link 1</li>
    <li>Link 1</li>
    <li>Link 1</li>
    <li>Link 1</li>
  </ul>
</nav>

CSS

nav input + ul li { // notice I set max-height on li, not ul
   max-height: 0;
}

nav input:checked + ul li {
   max-height: 3rem; // a little bigger to allow for text-wrapping - but not outrageous
}

См. пример здесь: http://codepen.io/mindfullsilence/pen/DtzjE

4
ответ дан mindfullsilence 16 August 2018 в 14:28
поделиться
  • 1
    Аналогично этому вы можете установить высоту строки в тексте и преобразовать ее в ноль. Если внутри есть только текст, это скроет контейнер. – vicmortelmans 12 December 2014 в 21:49
  • 2
    Почему так мало голосов? Это действительно хороший ответ, и может быть тот, который я использую. – mwilcox 17 July 2017 в 12:16

Самое простое универсальное решение проблемы: не стесняйтесь указывать display:none в вашем CSS, однако вы можете изменить его на block (или что-то еще) с помощью JavaScript, а затем вам также придется добавить класс для вашего элемента, который действительно делает переход с помощью setTimeout () . Вот и все.

I.e.:

<style>
#el {
    display: none;
    opacity: 0;
}
#el.auto-fade-in {
    opacity: 1;
    transition: all 1s ease-out; /* future, future, please come sooner! */
    -webkit-transition: all 1s ease-out;
    -moz-transition: all 1s ease-out;
    -o-transition: all 1s ease-out;
}
</style>

<div id=el>Well, well, well</div>

<script>
var el = document.getElementById('el');
el.style.display = 'block';
setTimeout(function () { el.className = 'auto-fade-in' }, 0);
</script>

Проверено в последних разумных браузерах. Очевидно, что он не должен работать в IE9 или ранее.

1
ответ дан mojuba 16 August 2018 в 14:28
поделиться

Измените overflow:hidden на overflow:visible. Он работает лучше. Я использую так:

#menu ul li ul {
    background-color:#fe1c1c;
    width:85px;
    height:0px;
    opacity:0;
    box-shadow:1px 3px 10px #000000;
    border-radius:3px;
    z-index:1;
    -webkit-transition:all 0.5s ease;
    -moz-transition:all 0.6s ease;
}

#menu ul li:hover ul  {
    overflow:visible;
    opacity:1;
    height:140px;
}

visible лучше, потому что overflow:hidden действует точно так же, как display:none.

5
ответ дан nhahtdh 16 August 2018 в 14:28
поделиться

Редактировать: в этом примере не применяется ни один символ.

@keyframes hide {
  0% {
    display: block;
    opacity: 1;
  }
  99% {
    display: block;
  }
  100% {
    display: none;
    opacity: 0;
  }
}

Что происходит выше, так это то, что через 99% экрана анимации будет заблокировано, а непрозрачность исчезнет. В последний момент для свойства display установлено значение none.

И самый важный бит - сохранить последний кадр после окончания анимации с использованием режима анимации-заливки: вперед

.hide {
   animation: hide 1s linear;
   animation-fill-mode: forwards;
}

Вот два примера: https://jsfiddle.net/qwnz9tqg/3/

11
ответ дан Pawel 16 August 2018 в 14:28
поделиться
  • 1
    с этим решением display: none не работает? – Bart Calixto 23 January 2016 в 02:56
  • 2
    Должен быть «режим анимации-заливки: вперед», а не «вперед» – Alex 10 March 2016 в 14:18
  • 3
    @Alex вот что такое кнопка & quot; edit & quot; для – Pawel 10 March 2016 в 14:23
  • 4
    @Alex Хорошо. Типично зафиксировано. Что интересно, так это то, что мой ответ даже не работает должным образом, но логично подумать, что так оно и будет, пока браузеры не поддержат его. – Pawel 14 March 2016 в 16:13
  • 5
    Как вы можете видеть в этой скрипте с набором курсоров, display: none никогда не реализуется. jsfiddle.net/3e6sduqh – robstarbuck 18 August 2017 в 10:23

display не является одним из свойств, с которыми работает переход.

См. http://www.w3.org/TR/css3-transitions/#animatable-properties- для списка свойств, которые могут иметь к ним переход.

41
ответ дан robocat 16 August 2018 в 14:28
поделиться

Существует альтернативное решение с анимацией css для скрытого скрытого:

.dropdown{   
  position: relative;
  width: 100%;
 -webkit-animation-name: animatetop;
 -webkit-animation-duration: 0.4s;
 animation-name: animatetop;
 animation-duration: 0.4s
}
/* Add Animation */
@-webkit-keyframes animatetop {
 from {top:-300px; opacity:0} 
 to {top:0; opacity:1}
}

@keyframes animatetop {
 from {top:-300px; opacity:0}
 to {top:0; opacity:1}
}
-2
ответ дан Sanjib Debnath 16 August 2018 в 14:28
поделиться
  • 1
    за исключением того, что это не имеет ничего общего с свойством display – Steven Grant 23 February 2017 в 17:45

Мой аккуратный трюк JavaScript состоит в том, чтобы разделить весь сценарий на две разные функции!

Чтобы подготовить вещи, объявляется одна глобальная переменная и определяется один обработчик событий:

  var tTimeout;
  element.addEventListener("transitionend", afterTransition, true);//firefox
  element.addEventListener("webkitTransitionEnd", afterTransition, true);//chrome

Затем, когда я скрываю элемент, я использую что-то вроде этого:

function hide(){
  element.style.opacity = 0;
}

function afterTransition(){
  element.style.display = 'none';
}

Для повторного появления элемента я делаю что-то вроде этого:

function show(){
  element.style.display = 'block';
  tTimeout = setTimeout(timeoutShow, 100);
}

function timeoutShow(){
  element.style.opacity = 1;
}

Он работает, пока !

12
ответ дан Sasa Milenkovic 16 August 2018 в 14:28
поделиться
  • 1
    Это работает из-за задержки времени, а не потому, что команды javascript находятся в отдельных функциях. Временные задержки кажутся хорошим решением во многих случаях :) – davedadizzel 4 May 2015 в 17:44

Я думаю, что SalmanPK имеет самый близкий ответ, он угасает элемент внутри или вне, со следующими анимациями CSS. Однако свойство отображения не плавно меняется, только непрозрачность.

@-webkit-keyframes fadeIn {
    from { opacity: 0; }
      to { opacity: 1; }
}

@-webkit-keyframes fadeOut {
    from { opacity: 1; }
      to { opacity: 0; }
}

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

jsFiddle example

CSS

@-webkit-keyframes pushDown {
  0% {
    height: 10em;
  }
  25% {
    height: 7.5em;
  }
  50% {
    height: 5em;
  }
  75% {
    height: 2.5em;
  }
  100% {
    height: 0em;
  }
}

.push-down {
    -webkit-animation: pushDown 2s forwards linear;
}

JavaScript

var element = document.getElementById("element");

// push item down
element.className = element.className + " push-down";
2
ответ дан steven iseki 16 August 2018 в 14:28
поделиться

вы также можете использовать это:

.dropdown {
height: 0px;
width: 0px;
opacity: .0;
color: white;
}
.dropdown:hover {
height: 20px;
width: 50px;
opacity: 1;
transition: opacity 200ms;
/* Safari */
-webkit-transition: opacity 200ms;
}
0
ответ дан user 16 August 2018 в 14:28
поделиться

Вместо обратных вызовов, которые не существуют в CSS, мы можем использовать свойство transition-delay.

#selector {
    overflow: hidden; // hide the element content, while height = 0
    height: 0; opacity: 0;
    transition: height 0ms 400ms, opacity 400ms 0ms;
}
#selector.visible {
    height: 100%; opacity: 1;
    transition: height 0ms 0ms, opacity 600ms 0ms;
}

Итак, что здесь происходит?

  1. Когда добавлен класс visible, обе height и opacity запускают анимацию без задержки (0 мс), хотя height принимает 0 мс для завершения анимации (эквивалент display: block), а opacity занимает 600 мс.
  2. Когда класс visible удален, opacity запускает анимацию (0 мс задержка, 400 мс), а высота ждет 400 мс и только затем мгновенно восстанавливает начальное значение (эквивалент display: none в обратном вызове анимации) .

Обратите внимание, что этот подход лучше, чем при использовании visibility. В этом случае элемент все еще занимает пространство на странице, и это не всегда удобно.

Для получения дополнительных примеров обратитесь к этой статье .

6
ответ дан Webars 16 August 2018 в 14:28
поделиться
  • 1
    Удивительно, что у этого нет больше очков - это умное решение как-то прекрасно работает. – fanfare 19 June 2018 в 08:19

Вам нужно скрыть элемент другими способами, чтобы заставить это работать.

Я выполнил эффект, полностью установив оба <div> s и установив скрытый на opacity: 0.

Если вы даже переключили свойство display с none на block, ваш переход на другие элементы не будет происходить.

Чтобы обойти это, всегда позволяйте элементу быть display: block, но скройте элемент, настроив любое из этих средств:

  1. Установите height на 0.
  2. Установите для параметра opacity значение 0.
  3. Поместите элемент вне рамки другого элемента который имеет overflow: hidden.

Возможны больше решений, но вы не можете выполнить переход, если вы переключите элемент на display: none. Например, вы можете попробовать попробовать что-то вроде этого:

div {
    display: none;
    transition: opacity 1s ease-out;
    opacity: 0; 
}
div.active {
    opacity: 1;
    display: block;
}

Но это не сработает. По моему опыту, я нашел это, чтобы ничего не делать.

Из-за этого вам всегда нужно сохранить элемент display: block, но вы можете обойти его, сделав что-то вроде этого:

div {
    transition: opacity 1s ease-out;
    opacity: 0; 
    height: 0;
    overflow: hidden;
}
div.active {
    opacity: 1;
    height: auto;
}
661
ответ дан Community 17 August 2018 в 08:29
поделиться
  • 1
    Спасибо Джим за подробный ответ. Вы абсолютно правы в том, что если свойство display: свойство вообще меняется, тогда ВСЕ ваши переходы не будут работать. Какой позор - мне интересно, что это за рассуждение. На боковой ноте, по той же ссылке, которую я опубликовал в исходном вопросе, вы можете видеть, где я нахожусь. Единственная (маленькая) проблема, которая у меня есть, - это Chrome [5.0.375.125], когда страница загружается, вы можете увидеть, как меню быстро исчезает, когда элементы загружаются на страницу. Firefox 4.0b2 и Safari 5.0 абсолютно прав ... ошибка или что-то, что я пропустил? – RichardTape 28 July 2010 в 20:45
  • 2
    Я согласен, что это правильно и будет способствовать этому; голова к будущим путешественникам. Я нашел рабочее решение в Chrome, но обнаружил, что он не работает на iPhone 4: visibility:hidden; opacity:0; -webkit-transition: all .2s ease-in-out; Это не только неправильно, но и целевой элемент никогда не появится. QA не даст вам, мне и вашей маме. – SimplGy 5 April 2011 в 20:37
  • 3
    Вы также можете изменить свойство видимости. – Cu7l4ss 8 December 2012 в 23:10
  • 4
    Если вы установите свое скрытое состояние на height: 0; и не переходите к нему, переход не будет работать. Я попробовал это, просто пытаясь перекрыть непрозрачность. Мне пришлось удалить height: 0; – chovy 27 June 2013 в 01:00
  • 5
    вы только что выиграли голосование из-за overflow: hidden большое спасибо! – thiagoh 18 December 2015 в 15:33

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

@keyframes showNav {
  from {opacity: 0;}
  to {opacity: 1;}
}
.subnav-is-opened .main-nav__secondary-nav {
  display: block;
  animation: showNav 250ms ease-in-out both;
}

Демо

В этой демонстрации подменю изменяется с display:none на display:block и все еще удается исчезнуть.

203
ответ дан dippas 17 August 2018 в 08:29
поделиться
  • 1
    Спасибо за это. height: 0 трюк (для переходов), упомянутый выше, не работает, потому что высота получает значение 0 при переходе на постепенный переход, но этот трюк, похоже, работает нормально. – Elliot Winkler 14 March 2012 в 22:42
  • 2
    Спасибо, очень полезно. Но как это угасать? – Illiou 15 October 2012 в 03:37
  • 3
    Первый абзац этого ответа не имеет смысла. Браузеры не просто отключают все переходы сразу после использования свойства display - на самом деле нет причин. И даже если они сделали , почему бы анимации работать тогда? Вы также не можете использовать свойство display в анимации CSS. – BoltClock♦ 11 July 2014 в 11:17
  • 4
    Должен ли myfirst быть showNav здесь? А как насчет Firefox? К сожалению, я не могу найти что-то, что связано с демонстрационной страницей, о которой вы упоминаете. – Sebastian vom Meer 16 September 2014 в 10:31
  • 5
    Спасибо @SebastianG. Я сделал исправление и добавил дополнительную информацию выше. – Manish Pradhan 16 September 2014 в 18:59
  • 6
    @Sebastian vom Meer: более старые версии Firefox нуждаются в & quot; -moz- & quot; префикс поставщика, см. отредактированный код – Herr_Schwabullek 18 June 2015 в 10:17
  • 7
    Если я не пропущу что-то, то "демо" ссылка больше не отображает переход подменю. – Realistic 17 November 2015 в 00:11
  • 8
    Лучший ответ, невозможно с переходами, но да с анимацией. – Mikel 24 March 2016 в 16:13
  • 9
    Эй, ваша демонстрационная ссылка следует за developers.google.com – Green 23 May 2016 в 06:55
  • 10
    Как насчет обратной анимации, то есть когда элемент должен медленно исчезать? – Green 23 May 2016 в 06:57