Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

expanding an inline-block jumps to above row

I have a series of articles

<section>
<article>1</article>
<article>2</article>
<article>3</article>
....
<article>999</article>
<section>

arranged in a grid of three per row

section { 
  position: relative 
}
article { 
  display: inline-block; 
  width: 33%;
} 

and I want that they expand horizontally to fully occupy its row when clicked.

so I create an expanded class

.expanded {
  position:absolute;
  left:0px;
  width: 100%;
}

and apply it on click

$("article").click(function(){ 
  $(this).toggleClass("expanded"); 
});

I am almost there, as you can see in the fiddle here http://jsfiddle.net/aqw339r0/1/

When I click on any of the articles they expand to the full width of the row; but the problem is that when I click the first article of a row (except the first row) it "jumps" to the row immediately above.

I have tried changing the position and display attributes of both article and .expanded but I cannot get the behavior I need. For example: When I change the position:absolute of .expanded, the blocks 5 and 6, "jump" to the row below. Similar when I remove display:inline-block and change to float:left.

Do you have any ideas of why this happens and how to correct it?

like image 639
PA. Avatar asked Oct 06 '15 14:10

PA.


People also ask

How do you move inline-block elements to the right?

You can use Flexbox instead and set margin-left: auto on inner div to move it to right. Show activity on this post.

How does inline-block work?

inline-block It's formatted just like the inline element, where it doesn't start on a new line. BUT, you can set width and height values. block The element will start on a new line and occupy the full width available. And you can set width and height values.

Are buttons inline or block?

Most browsers display button elements as inline-block by default, according to the (not normative) Appendix D. Default style sheet for HTML 4. Therefore, you could expect the width property to work, as described in Calculating widths and margins - Inline-block, non-replaced.

What are inline-block elements?

Inline-block elements are similar to inline elements, except they can have padding and margins added on all four sides. You'll have to declare display: inline-block in your CSS code. One common use for using inline-block is for creating navigation links horizontally, as shown below.


1 Answers

Using the solution from @Rick (minus the css top edit) and then toggling an additional element to keep other elements in place, this should do what is needed: Fiddle

  $("article").click(function() { 
        $(this).toggleClass("expanded"); 
        if ($(this).hasClass("expanded"))
        {
            $(this).before("<article class='blank'>&nbsp;</article>");
        }
        else
        {
            $(this).prevAll('.blank').first().remove();
        }
  });

To explain further, when the element is clicked:

if ADDING the class 'expanded', then this will also add a blank article element (before) as a placeholder to keep the flow consistent. This is important because when the element with class 'expanded' becomes position: absolute it is removed from the normal flow of the content.

if REMOVING the class 'expanded', then this will also remove the blank article placeholder element. The prevAll function looks through all previous elements with the class 'blank' and then takes the first() one and removes it. Because it was inserted 'before', this is guaranteed to remove the correct blank article placeholder.

like image 186
deebs Avatar answered Oct 02 '22 10:10

deebs