45

my target slideToggle() div needs to be display:inline-block instead of display:block when it's open. Is there a way to change the jquery behavior here?

Edit:

i'm using jQuery 1.7.0 at the moment. Also, the <div> is initially at display:none and should expand to display:inline-block after a click on a link; but apparently the default state for slideToggle() in this situation is display:block ...

6 Answers 6

64

A little birdie told me...

$('#my-block').slideToggle('medium', function() {
    if ($(this).is(':visible'))
        $(this).css('display','inline-block');
});
7
  • 3
    $('#my-block').slideToggle('medium', function() { if ($(this).is(':visible')) $('this').css('display','inline-block'); }); Minor edit.
    – user1428660
    Commented Aug 15, 2013 at 22:36
  • 20
    Actually, it's easier to set CSS for #element as display: inline-block; (in <style> block or style sheet) and display: none; as style attribute of field. Then, when it toggles to visible it just takes default style defined
    – K. Weber
    Commented Nov 6, 2013 at 21:57
  • 1
    I know this is pretty necro but could someone explain @K.Weber's comment in a little more depth? Commented Jun 30, 2014 at 5:27
  • 8
    It means use display:none as inline style attribute, this is, <div id="to_toggle" style="display:none"> and set a default style in css stylesheet (display:inline-block), this way, .slideToggle(), when the element turns visible, will take default style defined in stylesheet (display:inline-block)
    – K. Weber
    Commented Jun 30, 2014 at 22:26
  • @K.Weber This doesn't work once DOM (modal window, for instance), has been closed with fadeToggle
    – The Onin
    Commented Oct 9, 2015 at 0:40
15

Just try to hide your block via scripts (dont display:none via styles)

HTML

<div class="ib">inline-block</div> <a href="#" class="toggle">toggle this</a>

CSS

.ib{
    display:inline-block;
    background:red;
}

JavaScript

$(".ib").hide();
$(".toggle").bind("click", function(){
    $(".ib").slideToggle();
    return false;
})

example

1
  • I really like this answer best, the only issue that I had was using an ID instead of a Class. .hide() works great with classes though! Thank you! Commented Apr 20, 2014 at 2:53
14

I needed the display:flex for reordering elements with the order property. Changing to display:flex worked but it had to wait for the animation to complete to rearrange the elements, so there was a moment where everything looked clearly disordered.

What did the trick for me was using the start option (see doc):

$("your-selector").slideToggle({
  duration: 200,
  easing: "easeOutQuad",
  start: function() {
    jQuery(this).css('display','flex');
  }
});
3
  • This worked great for me, although there is a little bit of a content-jump just before the opening animation finishes. Much more desirable than having all my slides animate closed on page load though, +1! Commented Mar 20, 2019 at 4:45
  • Works perfectly. Thank you for this!
    – GeorgeP
    Commented Apr 23, 2019 at 0:27
  • @AbrahamBrookes inside content may jump unless you add display:none in the inline style block (not in the css file). for example : <div class="toggle" style="display:none">your content</div> now slideToggle works find ;)
    – Nader
    Commented Oct 5, 2023 at 7:53
4

If you find yourself seeing an unwanted "Flash of Unstyled Content" you could also use an inline style. The usual wisdom of "don't put style inline" is really meant for your main styling, not for visual effects (JS effects all just add inline styles after all).

Of course, the content won't be seen by JS-disabled search engine spiders, if that's important. If it's not important, you're good!

Update of @fliptheweb's fiddle: http://jsfiddle.net/GregP/pqrdS/3/

2

Are you on an old version of jQuery? This should have been fixed already, see discussion here:

http://bugs.jquery.com/ticket/2185

2
  • Thanks, but i don't think this bug applies here - see my edit. Commented Nov 16, 2011 at 0:55
  • I see. In that case, I recommend @fliptheweb's solution Commented Nov 16, 2011 at 1:00
0

I suggest the following trick. It will allow you to use a class for "hidden" while avoiding any flashes due to layout change happening prematurely or belatedly.

(using display:flex with direction:row to make it clear that it's displayed as flex and not as block)

function toggle() {
  let elem = $(".component")
  if (elem.hasClass("hidden")) {
    elem.css("display", "none");
    elem.removeClass("hidden");
  }
  elem.slideToggle(200);
}
.component {
  display: flex;
  flex-direction: row;
}

.hidden {
  display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<a href="#" class="toggle" onclick="toggle();">toggle this</a>
<div class="component hidden">
  <div>item1</div>
  <div>item2</div>
</div>

Not the answer you're looking for? Browse other questions tagged or ask your own question.