开发者

How do I align these links inside inline-blocks to the top?

开发者 https://www.devze.com 2023-02-11 06:21 出处:网络
I\'m having a little CSS problem with a list of thumbnails. Here\'s an example: http://jsfiddle.net/22hs8/

I'm having a little CSS problem with a list of thumbnails. Here's an example: http://jsfiddle.net/22hs8/

The problem is that when the link is too long to fit in the 150px block it will pu开发者_开发百科sh the image down. By using inline-block on the list elements instead of a float I could get the images to line up properly, but now I want to have the links at the same height as well.

One thing I tried is making the links itself a block (or surrounding it by a div) and giving that a height, but that would mean they are always the same height even if none of the links uses two rules. Also, if a link is so long it uses three lines the same problem would occur.

In short: how do I align the links to the top of the list items, without breaking the image alignment?


To address one issue, you can add vertical-align:top; to the <li> tag in order to align the content to the top of the element, but unfortunately, I don't believe there's a way to resolve the issue entirely without also implementing one of the following methods:

  1. Placing all of the tags in a separate
  2. Specifying a height on the tags
  3. Using javascript to equalize heights

Options

1. Separate Div

By moving the anchor tags into a separate div, they could be given the same width as the images and floated or displayed inline accordingly, but your markup becomes less semantic when you separate the anchor from the content (and may also be programmatically more complex if these are being dynamically generated).

2. Specifying a Height

This option can be thrown out almost immediately because, as you've stated, the anchor lengths can fluctuate to multiple lines. You could specify the height the the largest know line length, but then you'll ultimately end up with unnecessary white space with groups of short links.

3. JavaScript (jQuery)

While It would be ideal to resolve this issue without the requirement of JavaScript, I think it may be the only option that would allow you to preserve the semantics of your markup, and also apply an equal height to each of the anchor tags.


Recommended Solution

I would recommend setting a default height on the anchors of the largest known line length, then applying a bit of jQuery to normalize the heights of the anchors. This way, if the JavaScript parsing fails or JavaScript is disabled, the user still sees a uniform layout (albeit with potentially more whitespace), and with JavaScript active the heights are normalized.

  • Apply vertical-align:top; to the <li>
  • Define default height for non-js users
  • Equalize heights using jQuery:

    (function(){
        $.fn.equalizeHeights = function(){
            return this.height( Math.max.apply(this, $(this).map(function(i,e){ return $(e).height() }).get() ))
        }
        $(function(){ $('li a').equalizeHeights(); });
    })();
    

Example: http://jsfiddle.net/Eg7hy/


How is this:

http://jsfiddle.net/22hs8/3/


So you're saying that you want the links to not push the content down? I don't see that as being possible unless you don't allow your content to stretch at all. It's natural flow of a page for something above content to force the content down after it if it needs more space.

Have you thought about chopping off the text after a certain number of characters, with a '...' and providing the full text through a title, and providing the full text through a popup (since I assume you're creating some kind of photo gallery)?


The first answer that came to mind was:

"just use a table, it makes this really easy, and works everywhere"

Live Demo


However, I would probably get down voted into oblivion if I posted an answer only containing a <table> tag version, so here's a version using CSS display: table and friends:

Live Demo

Of course, that won't work in IE7 because that browser doesn't support display: table.

I can't think of a way to do this using code closer to your original and display: inline-block, which would also support an arbitrary number of lines. I'd love to see a better way to do this.

HTML:

<div id="container">
    <div class="row">
        <div class="cell"><a href="#">Some text</a></div>
        <div class="cell"><a href="#">Some more text (too long)</a></div>
        <div class="cell"><a href="#">Some text</a></div>
        <div class="cell"><a href="#">Some text (seriously too long) text text text text text text text text text text text text text</a></div>
    </div>
    <div class="row">
        <div class="cell"><div class="image">image</div></div>
        <div class="cell"><div class="image">image</div></div>
        <div class="cell"><div class="image">image</div></div>
        <div class="cell"><div class="image">image</div></div>
    </div>
</div>

(you could change some of those div tags into ul and li if you wanted to)

CSS:

#container {
    display: table
}
.row {
    display: table-row;
    text-align: center
}
.cell {
    display: table-cell;
    width: 150px
}
.image {
    width: 150px;
    height: 150px;
    background: grey
}


Add vertical-align:top; to the images.

0

精彩评论

暂无评论...
验证码 换一张
取 消