【问题标题】:Anchor links to start below the header which is fixed at the top锚链接从固定在顶部的标题下方开始
【发布时间】:2012-10-23 17:38:55
【问题描述】:

我有一个页面,顶部有一个固定的标题,高度为 63 像素。 在此之下,我有页面的不同部分(div),它们本质上是单独的页面。 每个部分都在标题中链接为相关 div id 的锚链接。 我遇到的问题是,当单击锚链接时,div 的顶部从文档顶部开始,而不是在标题下方。 任何解决方案都会非常有帮助。

标题的 CSS 代码:

#headercontainer{
position:fixed;
background-color:#1a1813; 
top:0px;
left:0px;
width:100%;
height:63px;
z-index:1;}
#headercontent{
position:relative;
background-image:no-repeat; 
top:0px;
left:0px;
width:1280px;
margin-left:auto;
margin-right:auto;}

第一部分的 CSS 代码(点击锚点时应位于标题下方:

#landingcontainer{
margin-top:63px;
position:relative;
width:100%;
height:700px;
background-color:#000000;}

#landingcontent{
position:relative;
width:1280px;
height:700px;
margin-left:auto;
margin-right:auto;
background-image:url("../images/landing/landing_bg.png");
background-repeat:no-repeat;

}

需要的HTML UP:

<!-- START BODY CONTAINER -->
<div id="bodycontainer">
    <!-- START HEADER -->
    <div id="headercontainer">
        <!-- START HEADER CONTENT -->
        <div id="headercontent">
            <div id="headerbg">
                <a href="#landingcontainer"><div id="headerlogo"></div></a>
                <div id="headercard"></div>
                <div id="headernavigation">
                    <ul>
                        <a href="#menucontainer"><li>Menu</li></a>
                        <li>Sauces</li>
                        <li>Ranches</li>
                        <li>Order</li>
                        <li>Franchise</li>
                        <li>About</li>
                    </ul>
                </div>
                <div id="headersociallinks"></div>
            </div>
        </div>
        <!-- END HEADER CONTENT -->
    </div>
    <!-- END HEADER -->

    <!-- START LANDING SECTION -->
    <div id="landingcontainer">

【问题讨论】:

  • margin-top: 63px on landingcontainer 应该可以工作。您是否尝试过制作padding-top: 63px?如果这不起作用,我怀疑你在某处有一些无效的 HTML。
  • 我尝试过填充和边距。它们都在页面加载时工作。标题下方的部分从它应该开始的地方开始,这很好,但是问题是当单击锚链接时,该部分会直接推到文档的顶部。即顶部缺少 63 像素。
  • 虽然有更好的方法来完成我认为您正在尝试完成的事情,但您的测试代码按您说的那样工作。我没有看到任何问题。您还有可能影响结果的代码吗?
  • 有没有办法用 Jquery 偏移量做到这一点?

标签: html css


【解决方案1】:

我有一个更好的解决方案。

• 首先在 css 中可以创建一个类(随便你怎么称呼它)

.anchor{
   display:block;
   height:63px; /* this is the height of your header */
   margin-top:-63px; /* this is again negative value of the height of your header */
   visibility:hidden;
}

• 在您的实际 div 部分开始之前的 HTML 中,例如我的是 #landingcontainer,您应该添加一个 span 标签,其中包含锚类(我们在上面制作)和任何您想要的 id。对我来说,我这样做了:

<span class="anchor" id="landing"></span>

那么实际链接现在将不会链接到您想要将它们带到的部分的实际 div id,而是必须在链接中给出 span 标签的 id。

<a href="#landing">HOME</a>

你有它!

我们在这里所做的本质上是让浏览器在跨度开始的地方停止,这正是标题的高度,这使得查看器变得不聪明;)

【讨论】:

  • 这是一个伟大的!不会在部分之间留下任何不必要的间距。太棒了!谢谢
  • 我喜欢这个建议,但我没有使用 span 标签,而是使用&lt;a name="landing" class="anchor"&gt;&lt;/a&gt; 将其直接放在我需要锚定的位置上方。它与您的 CSS 完美搭配。谢谢!
  • 如果你做 margin-top:-63px; 效果会更好填充顶部:63px;那么你所锚定的东西的高度就不必改变了。
  • 效果很好。
  • 您可以使用a ::before pseudo-element 更进一步——无需特殊标记! :-)
【解决方案2】:

只需将padding-top: 63px; 添加到您要锚链接的元素。即假设的&lt;div id="sauceslanding"&gt; 将具有#sauceslanding { padding-top: 63px; } 的CSS 和&lt;a href="#sauceslanding"&gt;Sauces&lt;/a&gt; 的链接。

测试过,这对我有用。如果它对您不起作用,请创建一个 jsfiddle 或一些我们可以玩的实时测试,看看您的代码是否有问题。

更新

你有这个:

#menucontainer{
    position:relative;
    width:100%;
    height:700px;
    background-color:#1d0f00;
    padding-top:63px;
}
/* END MENU CONTAINER */

/* MENU CONTENT */
#menucontent{
    position:relative;
    width:1280px;
    height:700px;
    margin-left:auto;
    margin-right:auto;
    background-image:url("../images/menu/menu_bg.png");
    background-size:cover; 
    background-repeat:no-repeat;
}

将其更新为:

#menucontainer{
    position:relative;
    width:100%;
    height:700px;
    background-color:#1d0f00;
    padding-top:63px;
    background-image:url("../images/menu/menu_bg.png");
}
/* END MENU CONTAINER */

/* MENU CONTENT */
#menucontent{
    position:relative;
    width:1280px;
    height:700px;
    margin-left:auto;
    margin-right:auto;
    background-size:cover; 
    background-repeat:no-repeat;
}

然后您可能会看到图像的顶部随后被切断,就好像没有填充一样。然后您需要做的是修改您的背景图像以增加 63px 的死区(将栅栏图案向北延伸)。那你就可以走了。

【讨论】:

  • 好吧,我到了某个地方,我注意到添加填充很好,当单击锚点时,它被放置在正确的位置。但是现在该部分有一个 63px 的空间,它只是背景颜色,并且背景图像不存在于 div 的该区域
  • 你的背景图片是 700px 高吗?背景图像应延伸通过填充区域。填充是否应用到与应用背景图像相同的元素?您是否也申请了top-margin
  • 代码和我上面的完全一样。背景图片的高度正好是 800px,而不是 div 的高度 700px。
  • 您的问题是背景应用于#menucontent,但填充应用于其包含的#menucontainer。要解决您的问题,请尽可能将填充和背景图像应用于同一元素。好看的网站,顺便说一句。
  • 非常感谢。我仍然没有运气将填充应用于具有背景图像的 div。使用此方法,锚链接位于标题下方。但是填充问题很好。
【解决方案3】:

我有一页&lt;p class="paragraph" id="#uniqueid"&gt; 标签,因此元素上没有预设/可预测的高度。效果最好的解决方案——不会对已建立的 CSS/布局的其余部分造成严重破坏——是来自CSS-tricks 的解决方案:

div#container p.paragraph:before {
  content: " "; 
  margin-top: -180px; 
  height: 180px; 
  visibility: hidden; 
}

不需要其他任何东西。

(仅供考虑使用此解决方案的任何人使用:只要您不需要受影响元素中的任何内容即可单击/选择,它就可以工作,因为此方法似乎会干扰事物的实际屏幕位置。但适合随意浏览。)

【讨论】:

  • 这实际上对我有用,但只有在我也添加了display:block; 之后
【解决方案4】:

Muhammed Bhikha's solution 的基础上,您可以完全避免额外的标记,方法是将其应用于您想用作锚目标的任何元素的::before 元素。例如,此版本对所有带有id 的元素和所有带有namea 元素使用::before 伪元素(例如,通常的目标)。 (你可能想用一个类来缩小范围,这取决于你是否在使用ids 的某些元素上使用::before 来做其他事情。)

a[name]::before,
[id]::before {
    content: '';
    display: block;
    visibility: hidden;
    height: 63px;      /* this is the height of your header */
    margin-top: -63px; /* this is the height of your header, negated */
}

例子:

header {
    position: fixed;
    min-height: 63px;
    top: 0;
    width: 100%;
    height: 63px;
    background-color: blue;
}

main {
    margin-top: 63px;
}

a[name]::before,
[id]::before {
    content: '';
    display: block;
    visibility: hidden;
    height: 63px;      /* this is the height of your header */
    margin-top: -63px; /* this is the height of your header, negated */
}
<header>
    Header
</header>
<main>
<ul>
    <li><a href="#one">One</a></li>
    <li><a href="#two">Two</a></li>
    <li><a href="#three">Three</a></li>
    <li><a href="#four">Four</a></li>
    <li><a href="#five">Five</a></li>
</ul>
<p id="one">One: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p><a name="two"></a>Two: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p id="three">Three: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p><a name="four"></a>Four: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p id="five">Five: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<!-- So there's room to scroll at the bottom -->
<div style="min-height: 100vh"></div>
</main>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2016-05-17
    • 1970-01-01
    相关资源
    最近更新 更多