CSS3 эквивалент jQuery slideUp и slideDown?

88

Мое приложение плохо работает с jQuery slideDown и slideUp. Я хочу использовать эквивалент CSS3 в браузерах, которые его поддерживают.

Возможно ли, используя переходы CSS3, изменить элемент с display: none;на display: block;при перемещении элемента вниз или вверх?

Майк
источник
Думаю, вы бы сохранили display: block, но просто отрегулируете ширину с желаемого значения до 0.
Dunhamzzz

Ответы:

37

Вы можете сделать что-то вроде этого:

#youritem .fade.in {
    animation-name: fadeIn;
}

#youritem .fade.out {
    animation-name: fadeOut;
}

@keyframes fadeIn {
    0% {
        opacity: 0;
        transform: translateY(startYposition);
    } 
    100% {
        opacity: 1;
        transform: translateY(endYposition);
    }
}

@keyframes fadeOut {
    0% {
        opacity: 1;
        transform: translateY(startYposition);
    } 
    100% {
        opacity: 0;
        transform: translateY(endYposition);
    }
}

Пример - скольжение и затухание:

Это сдвигает и анимирует непрозрачность - не в зависимости от высоты контейнера, а по верхней / координате. Посмотреть пример

Пример - автоматическая высота / без Javascript: вот живой образец, не требующий высоты - имеет дело с автоматической высотой и без javascript.
Посмотреть пример

TNC
источник
Можете ли вы сделать демонстрацию на jsFiddle?
Шиме Видас
@ Šime С первого взгляда на это, я бы сказал, просто дайте вашему элементу class = "fade" и добавьте класс, когда вам нужно плавное появление, и погаснет, когда вы захотите исчезнуть.
lsuarez
@ Šime - Я включил два образца, чтобы вы могли их использовать
TNC
Vsync - посмотрите ниже и следите за темой, прежде чем просто публиковать подобные комментарии
TNC
3
Я изменил второй пример (автоматическая высота / без JavaScript), поэтому для получения эффекта использовались только стили barebones. jsfiddle.net/OlsonDev/nB5Du/251
Olson.dev
14

Я изменил ваше решение, чтобы оно работало во всех современных браузерах:

css фрагмент:

-webkit-transition: height 1s ease-in-out;
-moz-transition: height 1s ease-in-out;
-ms-transition: height 1s ease-in-out;
-o-transition: height 1s ease-in-out;
transition: height 1s ease-in-out;

js фрагмент:

    var clone = $('#this').clone()
                .css({'position':'absolute','visibility':'hidden','height':'auto'})
                .addClass('slideClone')
                .appendTo('body');

    var newHeight = $(".slideClone").height();
    $(".slideClone").remove();
    $('#this').css('height',newHeight + 'px');

вот полный пример http://jsfiddle.net/RHPQd/

JensT
источник
9

Итак, я пошел дальше и ответил на свой вопрос :)

Ответ @ True касался преобразования элемента на определенную высоту. Проблема в том, что я не знаю высоты элемента (она может колебаться).

Я нашел другие решения, в которых в качестве перехода использовалась максимальная высота, но это произвело для меня очень резкую анимацию.

Мое решение ниже работает только в браузерах WebKit.

Хотя это не чисто CSS, он включает в себя изменение высоты, которое определяется некоторым JS.

$('#click-me').click(function() {
  var height = $("#this").height();
  if (height > 0) {
    $('#this').css('height', '0');
  } else {
    $("#this").css({
      'position': 'absolute',
      'visibility': 'hidden',
      'height': 'auto'
    });
    var newHeight = $("#this").height();
    $("#this").css({
      'position': 'static',
      'visibility': 'visible',
      'height': '0'
    });
    $('#this').css('height', newHeight + 'px');
  }
});
#this {
  width: 500px;
  height: 0;
  max-height: 9999px;
  overflow: hidden;
  background: #BBBBBB;
  -webkit-transition: height 1s ease-in-out;
}

#click-me {
  cursor: pointer;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>

<p id="click-me">click me</p>
<div id="this">here<br />is<br />a<br />bunch<br />of<br />content<br />sdf</div>
<div>always shows</div>

Посмотреть на JSFiddle

Майк
источник
Да, мой код ниже не требует высоты, поскольку он использует координату y. Но вы не упомянули, что вам нужно что-то с зависимостью от высоты :) Вы всегда можете сделать переход полей и т.д .. Но, похоже, у вас есть то, что вы ищете, не так ли?
TNC
@ Правда, как вы думаете, вы могли бы объяснить, что вы имеете в виду под переходом маржи?
Майк
Добавлен образец для позиционирования, добавлю отступы
TNC
Также добавлены поля / пример без javsacript
TNC
8

почему бы не воспользоваться преимуществами перехода css в современных браузерах и упростить и ускорить работу, используя больше css и меньше jquery

Вот код для скольжения вверх и вниз

Вот код для скольжения слева направо

Точно так же мы можем изменить скольжение сверху вниз или справа налево, изменив transform-origin и transform: scaleX (0) или transform: scaleY (0) соответственно.

манас
источник
1
Я знаю, что эти ответы были размещены в 2014 году, но я не могу рекомендовать использовать этот ответ, если вы хотите подтолкнуть элементы под ним вниз или вверх, поскольку родительский контейнер будет увеличивать высоту в браузере
Эллисан
6

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

Вот что я придумал:

используйте такой стиль:

    .slideup, .slidedown {
        max-height: 0;            
        overflow-y: hidden;
        -webkit-transition: max-height 0.8s ease-in-out;
        -moz-transition: max-height 0.8s ease-in-out;
        -o-transition: max-height 0.8s ease-in-out;
        transition: max-height 0.8s ease-in-out;
    }
    .slidedown {            
        max-height: 60px ;  // fixed width                  
    }

Оберните ваш контент в другой контейнер, чтобы у контейнера, который вы перемещаете, не было отступов / полей / границ:

  <div id="Slider" class="slideup">
    <!-- content has to be wrapped so that the padding and
            margins don't effect the transition's height -->
    <div id="Actual">
            Hello World Text
        </div>
  </div>

Затем используйте какой-нибудь сценарий (или декларативную разметку в каркасах привязки) для запуска классов CSS.

  $("#Trigger").click(function () {
    $("#Slider").toggleClass("slidedown slideup");
  });

Пример здесь: http://plnkr.co/edit/uhChl94nLhrWCYVhRBUF?p=preview

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

$.fn.slideUpTransition = function() {
    return this.each(function() {
        var $el = $(this);
        $el.css("max-height", "0");
        $el.addClass("height-transition-hidden");
    });
};

$.fn.slideDownTransition = function() {
    return this.each(function() {
        var $el = $(this);
        $el.removeClass("height-transition-hidden");

        // temporarily make visible to get the size
        $el.css("max-height", "none");
        var height = $el.outerHeight();

        // reset to 0 then animate with small delay
        $el.css("max-height", "0");

        setTimeout(function() {
            $el.css({
                "max-height": height
            });
        }, 1);
    });
};

который может быть запущен следующим образом:

$ ("# Триггер"). Click (function () {

    if ($("#SlideWrapper").hasClass("height-transition-hidden"))
        $("#SlideWrapper").slideDownTransition();
    else
        $("#SlideWrapper").slideUpTransition();
});

против такой разметки:

<style>
#Actual {
    background: silver;
    color: White;
    padding: 20px;
}

.height-transition {
    -webkit-transition: max-height 0.5s ease-in-out;
    -moz-transition: max-height 0.5s ease-in-out;
    -o-transition: max-height 0.5s ease-in-out;
    transition: max-height 0.5s ease-in-out;
    overflow-y: hidden;            
}
.height-transition-hidden {            
    max-height: 0;            
}
</style>
<div id="SlideWrapper" class="height-transition height-transition-hidden">
    <!-- content has to be wrapped so that the padding and
        margins don't effect the transition's height -->
    <div id="Actual">
     Your actual content to slide down goes here.
    </div>
</div>

Пример: http://plnkr.co/edit/Wpcgjs3FS4ryrhQUAOcU?p=preview

Я недавно написал об этом в блоге, если вас интересуют более подробные сведения:

http://weblog.west-wind.com/posts/2014/Feb/22/Using-CSS-Transitions-to-SlideUp-and-SlideDown

Рик Страл
источник
На мой взгляд, это самое элегантное решение. А при необходимости jQuery можно легко удалить. Можно переключить класс в vanila JS как:document.getElementById("Slider").classList.toggle("slidedown");
hypers
5

Я бы порекомендовал использовать плагин jQuery Transit, который использует свойство преобразования CSS3, которое отлично работает на мобильных устройствах, поскольку большинство из них поддерживает аппаратное ускорение, чтобы придать такой естественный вид.

Пример скрипта JS

HTML:

<div class="moveMe">
    <button class="moveUp">Move Me Up</button>
    <button class="moveDown">Move Me Down</button>
    <button class="setUp">Set Me Up</button>
    <button class="setDown">Set Me Down</button>
 </div>

Javascript:

$(".moveUp").on("click", function() {
    $(".moveMe").transition({ y: '-=5' });
});

$(".moveDown").on("click", function() {
    $(".moveMe").transition({ y: '+=5' });
});

$(".setUp").on("click", function() {
    $(".moveMe").transition({ y: '0px' });
});

$(".setDown").on("click", function() {
    $(".moveMe").transition({ y: '200px' });
});
ROFLwTIME
источник
Позволяет ли это перейти к естественной высоте элемента с помощью авто? например. $ (". moveMe"). transition ({height: 'auto'})
monkeyboy
2
Я хотел бы они переопределить slideUp()и slideDown()методы с помощью этого плагина. Было бы здорово
Стив
Это потрясающе, кстати. Спасибо, что добавили этот ответ!
Стив
2

Итак, после некоторых исследований и экспериментов я думаю, что лучший подход - это иметь высоту предмета на уровне 0pxи позволить ей переходить на точную высоту. Вы получите точную высоту с помощью JavaScript. JavaScript не выполняет анимацию, он просто меняет значение высоты. Проверь это:

function setInfoHeight() {
  $(window).on('load resize', function() {
    $('.info').each(function () {
      var current = $(this);
      var closed = $(this).height() == 0;
      current.show().height('auto').attr('h', current.height() );
      current.height(closed ? '0' : current.height());
    });
  });

Каждый раз, когда страница загружается или изменяется размер, элемент с классом обновляет infoсвой hатрибут. Затем у вас может быть кнопка, запускающая, style="height: __"чтобы установить это ранее установленное hзначение.

function moreInformation() {
  $('.icon-container').click(function() {
    var info = $(this).closest('.dish-header').next('.info'); // Just the one info
    var icon = $(this).children('.info-btn'); // Select the logo

    // Stop any ongoing animation loops. Without this, you could click button 10
    // times real fast, and watch an animation of the info showing and closing
    // for a few seconds after
    icon.stop();
    info.stop();

    // Flip icon and hide/show info
    icon.toggleClass('flip');

    // Metnod 1, animation handled by JS
    // info.slideToggle('slow');

    // Method 2, animation handled by CSS, use with setInfoheight function
    info.toggleClass('active').height(icon.is('.flip') ? info.attr('h') : '0');

  });
};

Вот стиль infoкласса.

.info {
  display: inline-block;
  height: 0px;
  line-height: 1.5em;
  overflow: hidden;
  padding: 0 1em;
  transition: height 0.6s, padding 0.6s;
  &.active {
    border-bottom: $thin-line;
    padding: 1em;
  }
}

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

Стиль может не поддерживаться кросс-браузером. Прекрасно работает в хроме.

Ниже приведен живой пример этого кода. Просто нажмите на ?значок, чтобы запустить анимацию

CodePen

Круз Нуньес
источник
1

Вариант без JavaScript. Только CSS.

CSS:

.toggle_block {
    border: 1px solid #ccc;
    text-align: left;
    background: #fff;
    overflow: hidden;
}
.toggle_block .toggle_flag {
    display: block;
    width: 1px;
    height: 1px;
    position: absolute;
    z-index: 0;
    left: -1000px;
}
.toggle_block .toggle_key {
    font-size: 16px;
    padding: 10px;
    cursor: pointer;
    -webkit-transition: all 300ms ease;
       -moz-transition: all 300ms ease;
        -ms-transition: all 300ms ease;
         -o-transition: all 300ms ease;
            transition: all 300ms ease;
}
.toggle_block .content {
    padding: 0 10px;
    overflow: hidden;
    max-height: 0;
    -webkit-transition: all 300ms ease;
       -moz-transition: all 300ms ease;
        -ms-transition: all 300ms ease;
         -o-transition: all 300ms ease;
            transition: all 300ms ease;
}
.toggle_block .content .toggle_close {
    cursor: pointer;
    font-size: 12px;
}
.toggle_block .toggle_flag:checked ~ .toggle_key {
    background: #dfd;
}
.toggle_block .toggle_flag:checked ~ .content {
    max-height: 1000px;
    padding: 10px 10px;
}

HTML:

<div class="toggle_block">
    <input type="checkbox" id="toggle_1" class="toggle_flag">
    <label for="toggle_1" class="toggle_key">clicker</label>
    <div class="content">
        Text 1<br>
        Text 2<br>
        <label for="toggle_1" class="toggle_close">close</label>
    </div>
</div>

Для следующего блока измените только атрибуты ID и FOR в html.

Szen
источник
0

вы не можете легко сделать слайд-вверх с помощью css3, поэтому я превратил JensT-скрипт в плагин с резервным и обратным вызовом javascript.

таким образом, если у вас есть современный brwowser, вы можете использовать css3 csstransition. если ваш браузер не поддерживает его, изящно используйте старомодный slideUp slideDown.

 /* css */
.csstransitions .mosneslide {
  -webkit-transition: height .4s ease-in-out;
  -moz-transition: height .4s ease-in-out;
  -ms-transition: height .4s ease-in-out;
  -o-transition: height .4s ease-in-out;
  transition: height .4s ease-in-out;
  max-height: 9999px;
  overflow: hidden;
  height: 0;
}

плагин

(function ($) {
$.fn.mosne_slide = function (
    options) {
    // set default option values
    defaults = {
        delay: 750,
        before: function () {}, // before  callback
        after: function () {} // after callback;
    }
    // Extend default settings
    var settings = $.extend({},
        defaults, options);
    return this.each(function () {
        var $this = $(this);
        //on after
        settings.before.apply(
            $this);
        var height = $this.height();
        var width = $this.width();
        if (Modernizr.csstransitions) {
            // modern browsers
            if (height > 0) {
                $this.css(
                    'height',
                    '0')
                    .addClass(
                        "mosne_hidden"
                );
            } else {
                var clone =
                    $this.clone()
                    .css({
                        'position': 'absolute',
                        'visibility': 'hidden',
                        'height': 'auto',
                        'width': width
                    })
                    .addClass(
                        'mosne_slideClone'
                )
                    .appendTo(
                        'body'
                );
                var newHeight =
                    $(
                        ".mosne_slideClone"
                )
                    .height();
                $(
                    ".mosne_slideClone"
                )
                    .remove();
                $this.css(
                    'height',
                    newHeight +
                    'px')
                    .removeClass(
                        "mosne_hidden"
                );
            }
        } else {
            //fallback
            if ($this.is(
                ":visible"
            )) {
                $this.slideUp()
                    .addClass(
                        "mosne_hidden"
                );
            } else {
                $this.hide()
                    .slideDown()
                    .removeClass(
                        "mosne_hidden"
                );
            }
        }
        //on after
        setTimeout(function () {
            settings.after
                .apply(
                    $this
            );
        }, settings.delay);
    });
}
})(jQuery);;

как это использовать

/* jQuery */
$(".mosneslide").mosne_slide({
    delay:400,
    before:function(){console.log("start");},
    after:function(){console.log("done");}
});

вы можете найти демонстрационную страницу здесь http://www.mosne.it/playground/mosne_slide_up_down/

Mosne
источник
Это не ответ, ответ содержит больше, чем просто ссылку.
Макс
Это не дает ответа на вопрос. Чтобы критиковать или запрашивать разъяснения у автора, оставьте комментарий под его сообщением - вы всегда можете комментировать свои собственные сообщения, и когда у вас будет достаточная репутация, вы сможете комментировать любое сообщение .
Четвертый
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится.
sashkello 04
0
    try this for slide up slide down with animation 
give your **height

        @keyframes slide_up{
            from{
                min-height: 0;
                height: 0px;
                opacity: 0;
            }
            to{
                height: 560px;
                opacity: 1;
            }
        }

        @keyframes slide_down{
            from{
                height: 560px;
                opacity: 1;
            }
            to{
                min-height: 0;
                height: 0px;
                opacity: 0;
            } 
        }
Ума Махеш
источник