【问题标题】:How do I stop the FLOAT (without extra markup)?如何停止 FLOAT(无需额外标记)?
【发布时间】:2012-11-20 19:05:31
【问题描述】:

问题
如何让NAV 之后的内容不浮动?

前言:
我正在组合一个可重复使用的 progress-tracker 模块,以插入到一些正在构建的工具中,以便在我们的防火墙内供内部使用。
虽然跨浏览器兼容性很好,但我们只需要针对 Chrome 和 FireFox 编写代码。这些是我们技术团队正式支持的唯一浏览器。
此外,我们随时欢迎任何和所有改进建议。

挑战:漂浮!!
为了使箭头正确显示并直观地表现,我必须浮动li's。
(我的意思是“有”,我的意思是“想不出更好的方法” :)

为了防止整个nav 向右浮动,我不得不向左浮动它。
现在,导航之后出现的任何内容都与它一致。

注意:
您还可以查看和使用代码here on jsFiddle

代码:
HTML:

<nav id="progress_tracker">
    <ul>
        <li><a href='#'>Grab a beer</a></li>
        <li><a href='#'>Work a little more</a></li>
        <li><a href='#' class="current">Take a Nap</a></li>
        <li><a href='#' class="complete">Work like a dog</a></li>
        <li><a href='#' class="complete">Grab a coffee</a></li>
    </ul>
</nav>

CSS:

nav {
    float: left;
}
nav#progress_tracker {
    padding: 0.25em;
    background-color: #1a3340;
    border-radius: 1.75em;
}
nav ul li:last-child{                       /* Remember. We are floating right, so last is furthest left */
    margin-left: -1.7em;
}
nav ul{
    list-style-type: none; 
}
nav ul li{
    display: inline-block;
    float: right;
    position: relative;
    padding: 0;
    margin: 0;
}
nav ul li a{
    display: inline-block;
    vertical-align: middle;
    color: #777;
    background-color: DDD;
    padding-top: 0.75em;                    /* top/btm padding need to be half of line-height */
    padding-bottom: 0.75em;                 /* top/btm padding need to be half of line-height */
    padding-left: 2em;                      /* left padding */
    padding-right: 1em;                     /* right padding is (left-padding - depth-of-arrow (see below) */
    line-height: 1.5em;                     /* line-height needs to be double top/btm padding */
}
nav ul li a:after{
    width: 0;
    height: 0;
    position: absolute;
    top: 0;
    right: -1em;                            /* depth of offset (equal to depth of arrow) */
    border-left: 1em solid #d9d9d9;         /* depth of arrow (equal to depth of offset) */
    border-top: 1.5em inset transparent;    /* border thickness needs to match line-height */
    border-bottom: 1.5em inset transparent; /* border thickness needs to match line-height */
    content: "";                            /* required to make all of this work */
}
nav ul li a:visited{
    color: #888888;
}

nav ul li a.current{
    font-weight: bold;
    color: #777;
    background-color: #FFBB00;
}
nav ul li a.current:after{
    border-left: 1em solid #FFBF00;         /* depth of arrow (equal to depth of offset) */
}

nav ul li a.complete{
    color: #666;
    background-color: #FFFFEE;
}
nav ul li a.complete:after{
    border-left: 1em solid #FFFFEF;         /* depth of arrow (equal to depth of offset) */
}

nav ul li:last-child a{                    /* Remember. We are floating right, so last is furthest left */
    border-top-left-radius: 1.45em;
    border-bottom-left-radius: 1.45em;
}
nav ul li:first-child a{                    /* Remember. We are floating right, so first is furthest rt */
    border-top-right-radius: 1.45em;
    border-bottom-right-radius: 1.45em;
}
nav ul li:first-child a:after{
    border: none;
}

谢谢大家。

【问题讨论】:

  • Ahaaa 令人耳目一新的帖子,感觉就像阅读科学期刊,实验 - 结论等......顺便说一句,答案很简单,只需清除你的花车:p clear: both;tadaa.. 100/100 为我..vuhooo
  • 感谢 .. 的赞美和建议。我确实尝试了clear: both;,但没有得到预期的结果,因为我不确定我应该在哪里确切地进行清理:) ...如果您有任何建议我可以添加我的工具箱,我会很高兴听到他们的声音。再次感谢。

标签: css css-float nav


【解决方案1】:

看起来有点笨拙,但不添加标记,您可以像这样在 p 元素上设置 css 样式:

p {
    clear:both;
}

http://jsfiddle.net/G6J6P/2/

如果你对标记没意见,我会这样做:

<br style="clear:both;" /> 

在您的导航之后。

【讨论】:

  • 我应该澄清一下,我不认为额外的标记有毒,我只是希望尽可能远离它 :) 谢谢
  • 我当然理解保持清洁的愿望;从你的问题来看,你很有条理,也许是强迫症;)无论如何,很高兴能提供帮助!
【解决方案2】:

应用 css 样式

clear: both;

到下一个元素。这将防止它在您浮动的nav 旁边依偎。

【讨论】:

  • 谢谢。您和@stlrick 之间似乎达成了共识。
【解决方案3】:

我知道您说过您希望保持标记不变,但您在使用 display:inline-block; 和在 li 元素之间有空格时遇到了问题。这是一个没有 float 混乱 (example) 的工作版本。它有:before:after,每个都充当前面的 箭头的一半。我添加了:hover 样式,因此您可以测试悬停并查看如何自己设置样式。

注意:包装后看起来不那么漂亮。

HTML

<nav id="progress_tracker">
    <ul>
        <li><a href='#' class="complete">Grab a coffee</a></li><!--
        --><li><a href='#'>Work like a dog</a></li><!--
        --><li><a href='#' class="complete">Take a Nap</a></li><!--
        --><li><a href='#' class="current">Work a little more</a></li><!--
        --><li><a href='#'>Grab a beer</a></li>
    </ul>
</nav>
<p>Some random text</p>

新的 CSS

a:hover,
a:hover:before,
a:hover:after {
    background:lime !important;
}
nav#progress_tracker {
    display:inline-block;
    padding: 0.25em;
    background-color: #1a3340;
    border-radius: 1.75em;
    overflow:hidden;
}
nav ul{
    list-style-type: none;
}
nav ul li{
    display: inline-block;
    position: relative;
    padding: 0;
    margin: 0;
}
nav ul li a{
    display: inline-block;
    vertical-align: middle;
    color: #777;
    background: #1A3340;
    padding-top: 0.75em;                    /* top/btm padding need to be half of line-height */
    padding-bottom: 0.75em;                 /* top/btm padding need to be half of line-height */
    padding-left: 1em;                      /* left padding */
    padding-right: 1.5em;                   /* right padding is (left-padding + 1/2 depth-of-arrow (see below) */
    line-height: 1.5em;                     /* line-height needs to be double top/btm padding */
}
nav ul li a:before,
nav ul li a:after {
    width: 1em;
    height: 1.5em;
    position: absolute;
    left: 0;
    content: "";                            /* required to make all of this work */
    background: #1A3340;
}
nav ul li a:before{
    top: 0;
    -webkit-transform: skewX(33deg) translate(-50%);
    -moz-transform: skewX(33deg) translate(-50%);
    transform: skewX(33deg) translate(-50%);
}
nav ul li a:after{
    bottom: 0;
    -webkit-transform: skewX(-33deg) translate(-50%);
    -moz-transform: skewX(-33deg) translate(-50%);
    transform: skewX(-33deg) translate(-50%);
}
nav ul li a:visited{
    color: #888888;
}

/* .current styles */
nav ul li a.current{
    font-weight: bold;
    color: #777;
    background-color: #FFBB00;
}
nav ul li a.current:before,
nav ul li a.current:after{
    background: #FFBF00;
}

/* .complete styles */
nav ul li a.complete{
    color: #666;
    background-color: #FFFFEE;
}
nav ul li a.complete:before,
nav ul li a.complete:after{
    background: #FFFFEF;
}

/* First/last fixes */
nav ul li:first-child a {
    border-top-left-radius: 1.45em;
    border-bottom-left-radius: 1.45em;
}
nav ul li:last-child a {
    border-top-right-radius: 1.45em;
    border-bottom-right-radius: 1.45em;
}
nav ul li:first-child a:before,
nav ul li:first-child a:after{
    background: none !important;
}

【讨论】:

  • 我喜欢这个解决方案......很多......唯一的问题是箭头的行为不直观。当用户点击其中一个片段的箭头部分时,他们被带到哪里和他们期望被带到哪里是两件不同的事情:) 如果有办法解决这个障碍,这将是一个很好的选择。跨度>
  • @mOrloff 我已经用一种新技术更新了我的答案,它应该按照您的预期方式运行。一个缺点是它在包装时看起来不太好(但要么是原件,所以我假设没关系)。您可能会注意到最初在 jsFiddle 上箭头下方显示的背景——在这种情况下,只需调整框架的大小,它就会解决亚像素路由问题。
  • 这很甜蜜!我从来没有遇到过这样的功能注释括号。如果您有更多信息,将不胜感激。虽然它们是技术上的额外标记,但这并没有让我很困扰。当我有机会时,我将把它重构到我的小插件中。非常感谢。
  • @mOrloff cmets 可以去除多余的空白,这实际上会影响布局(由于display:inline-block;)。解决这个问题的另一种方法是在标签之间根本没有任何空格。
  • @mOrloff 我假设您指的是悬停规则?我已经把它加回来了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
相关资源
最近更新 更多