iHaveacomputer
iHaveacomputer

Reputation: 1437

change slideToggle() behaviour to display:inline-block instead of display:block?

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 ...

Upvotes: 45

Views: 62704

Answers (6)

Tomer
Tomer

Reputation: 630

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>

Upvotes: 0

Eloy Ruiz
Eloy Ruiz

Reputation: 767

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');
  }
});

Upvotes: 15

black
black

Reputation: 664

A little birdie told me...

$('#my-block').slideToggle('medium', function() {
    if ($(this).is(':visible'))
        $(this).css('display','inline-block');
});

Upvotes: 64

fliptheweb
fliptheweb

Reputation: 1166

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

Upvotes: 15

Greg Pettit
Greg Pettit

Reputation: 10830

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/

Upvotes: 4

Alex Peattie
Alex Peattie

Reputation: 27647

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

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

Upvotes: 2

Related Questions