简体   繁体   中英

hr makes the parent div resize to 100% in IE7

I have the following div

<body>
<span style="border:1px solid red; display:inline-block">
    Some text<br />
    <hr />
    some more text
</span>
</body>

In "normal" web browsers, the width of the div is calculated to fit the text. And the hr is 100% of the div. 在此处输入图片说明

But in IE7 the hr causes the div to expand to 100% of the body. 在此处输入图片说明

Is there any clever css I need to add somewhere so it behaves correctly in IE7?

Please note, I can't set any fixed width.

In IE6/7, display:inline-block only works on elements that are inline by default (eg, span). So if you try setting a div to display:inline-block , it won't work in IE6/7.

An inline element will size itself to the width of its content. An inline-block element will do the same by default, if it's not given an explicit width. If the hr is 100% (100% of its parent, which in turn is 100% of the child), then there's a circular definition for the hr width that may not work as expected (100% of what? 100% of itself).

To avoid a circular definition for the width that may not work as expected in some browsers (especially IE6/7), either the container of the hr (div, span, or whatever) should have a defined width (in px, %, or em) or the hr itself should have an explicit width (in px or em). Otherwise, the width is not defined in any identifiable way, and it's left up to the browser to decide what to do by default.

If you can't set any widths, that may rule out using an hr tag. And based on the tests I ran, the options don't look very good for CSS solutions either (without setting a width).

Edit:

I think the only way to do this without setting widths or relying on JavaScript or jQuery, is if it's acceptable to have a horizontal line after every line of text (including any long paragraphs that wrap around to the next line, if there are any). In that case you could add a bg image to the container that contains a horizontal line at increments equal to the line-height of the text, displayed at a vertical offset equal to the line-height so a line doesn't appear at the top of the first line of text.

HTML

<div class="main">
    <p>This is the first line.<br/>
       This is the second line.<br/>
       This is a long line that will wrap around to the next line if the container is not very wide.
    </p>
</div>

CSS

.main {
    background: url(image.png) repeat-x left 15px;
}
p {
    font-size: 12px;
    line-height: 15px;
}

jsfiddle demo

Found a method at a blog. The original one required modernizer.js . I've edited it.

HTML: <div class="hrdemo"><hr /></div>

CSS: .hrdemo hr { display:none }

However, if your div.hrdemo is inside some floated container; you may have to assign a fixed width for it (for IE7).

The width property of the <hr> tag has been deprecated, so you're styling options are limited on the <hr> tag.

A more modern approach is to use the border property of a <div> instead.

Image rendered by IE 7:

在此处输入图片说明

Image rendered by Chrome 19:

在此处输入图片说明

HTML

<body>
  <div style="border:1px solid red; float:left;">
    <p>
      Some text
    </p>
    <p class="border-top">
      some more text
    </p>
  </div>
</body>​​​

CSS

​.border-top{
  border-top:#000 1px solid;
  padding-top:1em;
}​

Note: IE 6 & 7 don't support display:inline-block , so you might need to use float:left instead. The article below compares the use of the aforementioned properties:

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM