【问题标题】:Content of div partially hidden behind header when the link to the div on same page is clicked单击同一页面上 div 的链接时,div 的内容部分隐藏在标题后面
【发布时间】:2021-09-18 01:40:44
【问题描述】:

当我向下滚动到页面底部后单击 btnAbout 链接时,我需要 <div a id="contentAbout"> 的内容完全显示,但是当单击链接时,页面跳回顶部,内容的顶部隐藏在 <header> 元素后面(几行),该元素始终保持在页面顶部的位置(根据 css 中的 position: sticky;)。我需要contentAbout div 的顶部显示在标题下。我使用纯 javascript 在单击链接或按钮时显示每个 div 块。无论它是带有指向同一页面上 div 的锚的链接,还是没有锚链接的按钮,它只是执行 javascript 以显示块,都会出现此问题。我相信问题在于css,但不确定在哪里或研究什么来解决这个问题。使用 Chrome。

HTML:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="./style.css" type="text/css" rel="stylesheet" />
    <script src="./script.js" type="text/javascript"></script>
    <title></title>
</head>

<body>
    <div id="content-wrapper">
        <header>
            <nav class="nav">
                <h1><a href="index.html">website name</a> | <span id="contentHeading"></span></h1>

                <a href="index.html#contentAbout" id="btnAbout" name="btnNav" value="about"
                    onclick="contentAbout();">about</a>

                <input type="button" id="btnPortfolio" name="btnNav" value="portfolio" onclick="contentPortfolio();" />

                <input type="button" id="btnResume" name="btnNav" value="resume" onclick="contentResume();" />

                <input type="button" id="btnContact" name="btnNav" value="contact" onclick="contentContact();" />

                <input type="button" id="btnBlog" name="btnNav" value="blog" onclick="contentBlog();" />
            </nav>
        </header>

        <main>
            <div id="hidden"></div>

            <div a id="contentAbout">
                Lorem ipsum dolor, sit amet consectetur adipisicing elit. Et pariatur doloribus nemo temporibus dolor
                earum iure. Consequuntur consectetur inventore aperiam quae sed, quis doloremque fugit iste placeat
                dignissimos fuga, saepe nemo, maiores ipsum aliquid voluptas? Ut ea ex iusto. Asperiores eligendi
                assumenda corporis aspernatur laborum animi quas impedit. Molestias quos fugit, exercitationem sequi
                blanditiis, dolores maxime numquam illo nesciunt delectus nihil quis est quia sit facilis quod. Officia
                ipsam minima voluptatibus distinctio esse cum repellendus obcaecati? Tempore consectetur blanditiis
                alias sequi aspernatur sunt architecto recusandae ratione, numquam aperiam quasi sit asperiores delectus
                praesentium minima quo voluptates nihil reprehenderit. Fugiat nulla assumenda laudantium reiciendis
                enim? Ut iste, magni voluptates, aut quo earum obcaecati nemo voluptas enim nam voluptatem impedit vero
                debitis quasi similique. Nam eveniet est aperiam magni odit necessitatibus architecto a nobis deleniti
                saepe quas fugit numquam sed cumque, culpa molestias ratione temporibus exercitationem, ex sapiente!
                Optio iste laboriosam dolores repellat eveniet, id enim rem provident porro est corporis minima nulla
                mollitia ex cum quidem neque? Omnis quas tempora vel odio. Commodi, reiciendis iure! Voluptatibus,
                sequi. Impedit ad sed est aperiam laboriosam eligendi veniam nobis perspiciatis optio labore sapiente
                cum quos tenetur minus, ipsam ducimus quod eius eum qui. Aut tempora, excepturi dignissimos delectus
                voluptate consequatur qui! Consequatur, saepe modi quo, ipsam sunt eum tempora aperiam, nemo tenetur
                totam possimus repellendus ex minus laudantium! Accusamus fugiat id aliquam, quos eos exercitationem
                dolor, officia ea officiis enim libero ab dolores adipisci eligendi iure labore nam. Nobis, totam
                voluptatem! Itaque adipisci, explicabo corporis perspiciatis provident at doloremque nesciunt odio
                facilis error maiores culpa nemo vitae, exercitationem dolorum facere officia sequi optio enim et alias!
                Nihil suscipit delectus libero, repellendus rem quas eius neque cum vel esse tempora incidunt sed earum,
                veritatis voluptate fugiat praesentium rerum perspiciatis alias voluptatibus dicta. Id debitis eos,
                excepturi delectus deleniti ad omnis consequuntur reiciendis reprehenderit molestiae eligendi ratione et
                ipsa, cumque similique incidunt voluptas magnam, iure quas dolorum aliquid? Quia culpa doloremque
                nostrum eligendi consequatur iste similique hic qui eos illum non commodi numquam beatae deserunt, odio
                facere deleniti consectetur? Enim dignissimos at dolore eum, velit, nesciunt culpa ad fugit sunt
                corrupti asperiores obcaecati! Ex in molestias itaque! Autem necessitatibus modi debitis, deserunt
                quisquam quasi sapiente molestiae eaque et dolores sint voluptas, amet quod sed. Eaque numquam porro
                molestiae quae consequuntur commodi harum, non impedit veniam beatae vitae reiciendis, nulla aut libero!
                Mollitia cupiditate, minus corporis temporibus neque quisquam itaque unde consequuntur maiores eum
                pariatur esse culpa odit nobis voluptates architecto harum impedit ducimus iste earum tenetur nesciunt
                veritatis! Modi officiis voluptas eaque repudiandae suscipit aut ipsa itaque. Facilis perspiciatis
                eligendi a blanditiis rem earum omnis suscipit voluptate nisi minima laudantium perferendis est aperiam,
                hic similique doloribus. Necessitatibus blanditiis magnam nostrum ipsa aliquid voluptates molestiae
                aperiam. Ullam, consectetur, minus atque deserunt consequatur libero possimus quaerat repellat veniam
                officia magni quos, est perferendis sunt cupiditate dolores nulla aspernatur iste? Quas cum, magnam
                possimus eveniet quisquam sapiente vel hic sit cupiditate, recusandae iste atque quam aperiam veniam
                temporibus voluptatum assumenda ut eius est odio, perspiciatis nisi commodi. Eos mollitia rem dolores
                voluptatum optio nihil corrupti doloremque numquam. Iure ratione inventore eaque? Numquam ducimus id
                porro tempora sapiente laborum voluptate recusandae soluta. Iste placeat ipsa officia autem sequi
                consequuntur commodi, quibusdam maxime debitis facere animi temporibus pariatur veritatis molestiae enim
                reiciendis tempora omnis aspernatur ea ullam atque error vel vero? Cum quibusdam, illum, quam
                perspiciatis sunt earum maiores itaque est, repellendus minima et. Laboriosam, nulla facere esse nihil
                ut dolore rerum odit asperiores? Quam quo amet alias sit fugiat repellendus sed, iusto voluptatibus,
                assumenda nihil eaque aperiam laudantium quasi expedita error autem ullam, impedit quidem odit quas
                delectus quos provident. Provident, ea iusto alias, libero qui iste voluptatum laborum saepe rerum
                veniam sit dolorum, quam nemo minus ratione nesciunt eaque eius. Dolores iusto suscipit eius fuga ut
                nemo libero quam, aperiam alias facere magnam, necessitatibus iure cupiditate voluptas? Ducimus nihil
                assumenda quam fugit ea pariatur sint, fuga reprehenderit incidunt neque, qui animi alias iure? Harum
                fuga aperiam, voluptatibus est adipisci reprehenderit quos assumenda ipsam, saepe ad nisi ut alias
                molestias voluptas at facilis quod maiores ratione dolorum eos aliquid iure! Ut itaque repellat,
                doloribus deleniti quaerat voluptas, cupiditate aperiam eum error sunt vel quis iusto inventore iste
                sint esse. Deleniti natus impedit sunt, assumenda et atque earum minus fugiat excepturi consectetur
                harum tenetur eos eum labore eaque dolorum quaerat omnis sequi maxime! Incidunt, dignissimos expedita?
                Eum, non ducimus deserunt quod veritatis minus sunt animi ab nostrum dolorem impedit sint officia
                tempora alias obcaecati perspiciatis hic quisquam molestias! Expedita itaque praesentium cupiditate
                possimus rem earum optio natus ut. Nobis voluptatum inventore ex, laborum a voluptates dolorum ullam
                corrupti, voluptatem nostrum voluptate. A error eveniet, natus veritatis illo eos accusantium labore
                repudiandae exercitationem ex modi omnis eligendi mollitia dignissimos ipsam deserunt obcaecati soluta
                molestias dolores rerum velit porro. Aperiam totam inventore, accusantium molestiae ex assumenda dolore
                ratione molestias vel. Modi molestias harum, id distinctio labore eius deserunt rerum illo, magni esse
                quis quibusdam sit sed. Nisi facilis quibusdam ullam veniam aliquam quae labore unde a, dignissimos
                rerum magnam esse. Ipsam temporibus dolorum error adipisci suscipit iusto? Nemo illo velit molestias et
                at esse nisi. Dolore explicabo, ut nemo earum repellendus, pariatur, inventore eligendi nobis provident
                corrupti delectus! Veniam voluptate ratione deserunt modi blanditiis corporis aliquid, nisi facilis ex
                similique dolorum magnam! Explicabo provident voluptatum, enim ipsam ullam adipisci amet suscipit veniam
                in consectetur voluptates dolorum repellendus deleniti facilis. Debitis molestiae rem, facere eaque
                doloremque perferendis voluptas sed molestias sint ipsam odit eius placeat, libero, tempora numquam
                illum iure? A debitis sint in veritatis, atque adipisci distinctio quaerat eligendi cupiditate
                recusandae labore quod minima tempora, voluptates fugiat! Nostrum est consequatur ullam corporis,
                recusandae atque, obcaecati quibusdam totam quae similique in minus error. Voluptate unde adipisci neque
                molestias illum debitis. Aliquam, assumenda? Quisquam commodi consequuntur pariatur reprehenderit minus
                harum sunt labore accusantium quibusdam! Aliquid iusto quaerat architecto culpa aliquam mollitia
                pariatur, assumenda nostrum suscipit fugit modi perspiciatis beatae accusantium quis voluptatum, alias
                explicabo unde.
            </div>

            <div id="contentPortfolio">
                Here are my projects.
            </div>

            <div id="contentResume">
                My work experience.
            </div>

            <div a id="contentContact">
                My email.
            </div>

            <div a id="contentBlog">
                Here are blog post listings
            </div>
        </main>



        <footer>
            &copy; all rights reserved
            <div id="nav2" class="nav">
                <a href="index.html#terms">[terms]</a>
                <a href="index.html#privacy">[privacy]</a>
                <a href="index.html#disclaimer">[disclaimer]</a>
                <a href="index.html#webmaster">[webmaster]</a>
            </div>
        </footer>
    </div>
</body>

</html>

CSS:

#content-wrapper {
  margin-right: auto;
  margin-left: auto;
  max-width: 960px;
  text-align: justify;
  align-content: center;
}

  header {
    left: 0;
    right: 0;
    margin: 0 auto;
    position: sticky;
    text-align: center;
    top: 0;
    background: white;
    padding-bottom: 1rem;
    display: block;
  }

  main {
    display: block;
    padding-top: 1rem;
  }

  #contentAbout, #contentPortfolio, #contentResume, #contentContact, #contentBlog {
    display: none;

  }

  footer {
    left: 0;
    right: 0;
    bottom: 0;
    position: fixed;
    text-align: center;
    background: white;
    padding-bottom: 1rem;
    display: block;
  }

Javascript:

function contentAbout() {
        if (document.getElementById("btnAbout").click) {

            document.getElementById('contentHeading').innerHTML = "About";
            document.getElementById('contentAbout').style.display = "block";
            document.getElementById('contentPortfolio').style.display = "none";
            document.getElementById('contentResume').style.display = "none";
            document.getElementById('contentContact').style.display = "none";
            document.getElementById('contentBlog').style.display = "none";

        }
    }

    function contentPortfolio() {
        if (document.getElementById("btnPortfolio").click) {

            document.getElementById('contentHeading').innerHTML = "Portfolio";
            document.getElementById('contentPortfolio').style.display = "block";
            document.getElementById('contentAbout').style.display = "none";
            document.getElementById('contentResume').style.display = "none";
            document.getElementById('contentContact').style.display = "none";
            document.getElementById('contentBlog').style.display = "none";
            

        }
    }

    function contentResume() {
        if (document.getElementById("btnResume").click) {

            document.getElementById('contentHeading').innerHTML = "Resume";
            document.getElementById('contentResume').style.display = "block";
            document.getElementById('contentAbout').style.display = "none";
            document.getElementById('contentPortfolio').style.display = "none";
            document.getElementById('contentContact').style.display = "none";
            document.getElementById('contentBlog').style.display = "none";
            
        }
    }

    function contentContact() {
        if (document.getElementById("btnContact").click) {

            document.getElementById('contentHeading').innerHTML = "Contact";
            document.getElementById('contentContact').style.display = "block";
            document.getElementById('contentAbout').style.display = "none";
            document.getElementById('contentPortfolio').style.display = "none";
            document.getElementById('contentResume').style.display = "none";
            document.getElementById('contentBlog').style.display = "none";
            
        }
    }

    
    function contentBlog() {
        if (document.getElementById("btnBlog").click) {

            document.getElementById('contentHeading').innerHTML = "Blog";
            document.getElementById('contentBlog').style.display = "block";
            document.getElementById('contentAbout').style.display = "none";
            document.getElementById('contentPortfolio').style.display = "none";
            document.getElementById('contentResume').style.display = "none";
            document.getElementById('contentContact').style.display = "none";

        }
    }

【问题讨论】:

  • 嗨,有没有理由引入锚元素(它也有一个 onclick 事件监听器),还有使用输入元素而不是普通按钮元素的理由吗?顺便说一句,就定位而言,恢复到仅输入而不是锚元素似乎是正确的做法。

标签: javascript html css


【解决方案1】:

我看到,当我滚动 div 的内容然后更改选项卡时,div 的内容被隐藏了,因为窗口滚动到一个位置,并且即使我更改了选项卡,窗口的滚动位置也保持不变,所以内容似乎被部分隐藏了。 要解决这个问题,您可以在单击按钮时调用的所有函数中添加它:

window.scroll({
    top: 0,
    left: 0,
    behavior: "smooth"
  });

例如:

function contentAbout() {
  if (document.getElementById("btnAbout").click) {
    document.getElementById("contentHeading").innerHTML = "About";
    document.getElementById("contentAbout").style.display = "block";
    document.getElementById("contentPortfolio").style.display = "none";
    document.getElementById("contentResume").style.display = "none";
    document.getElementById("contentContact").style.display = "none";
    document.getElementById("contentBlog").style.display = "none";
    window.scroll({
      top: 0,
      left: 0,
      behavior: "smooth"
    });
  }
}

只是意见: 当您单击这些按钮时,无需调用不同的函数,您可以像这样创建 1 个函数:

function tabChange(value) {
  switch (value) {
    case "about":
      document.getElementById("contentHeading").innerHTML = "About";
      document.getElementById("contentAbout").style.display = "block";
      document.getElementById("contentPortfolio").style.display = "none";
      document.getElementById("contentResume").style.display = "none";
      document.getElementById("contentContact").style.display = "none";
      document.getElementById("contentBlog").style.display = "none";
      break;
    case "portfolio":
      document.getElementById("contentHeading").innerHTML = "Portfolio";
      document.getElementById("contentPortfolio").style.display = "block";
      document.getElementById("contentAbout").style.display = "none";
      document.getElementById("contentResume").style.display = "none";
      document.getElementById("contentContact").style.display = "none";
      document.getElementById("contentBlog").style.display = "none";
      break;
    case "contact":
      document.getElementById("contentHeading").innerHTML = "Contact";
      document.getElementById("contentContact").style.display = "block";
      document.getElementById("contentAbout").style.display = "none";
      document.getElementById("contentPortfolio").style.display = "none";
      document.getElementById("contentResume").style.display = "none";
      document.getElementById("contentBlog").style.display = "none";
      break;
    case "resume":
      document.getElementById("contentHeading").innerHTML = "Resume";
      document.getElementById("contentResume").style.display = "block";
      document.getElementById("contentAbout").style.display = "none";
      document.getElementById("contentPortfolio").style.display = "none";
      document.getElementById("contentContact").style.display = "none";
      document.getElementById("contentBlog").style.display = "none";
      break;
    case "blog":
      document.getElementById("contentHeading").innerHTML = "Blog";
      document.getElementById("contentBlog").style.display = "block";
      document.getElementById("contentAbout").style.display = "none";
      document.getElementById("contentPortfolio").style.display = "none";
      document.getElementById("contentResume").style.display = "none";
      document.getElementById("contentContact").style.display = "none";
      break;
    default:
      break;
  }
  window.scroll({
    top: 0,
    left: 0,
    behavior: "smooth"
  });
}

& 然后在 html 上这样做:

<input type="button" id="btnAbout" name="btnNav" value="about" onclick="tabChange('about')" />

     <input type="button" id="btnPortfolio" name="btnNav" value="portfolio" onclick="tabChange('portfolio')" />

     <input type="button" id="btnResume" name="btnNav" value="resume" onclick="tabChange('resume');" />

     <input type="button" id="btnContact" name="btnNav" value="contact" onclick="tabChange('contact');" />

     <input type="button" id="btnBlog" name="btnNav" value="blog" onclick="tabChange('blog');" />

希望这会有所帮助?Codepen link

【讨论】:

  • 谢谢@abhikb ..这正是我所需要的!你教会了我一些新东西,我感谢你的贡献。我尝试支持您的答案,但 SO 说我需要 15 个代表点才能这样做。但是,还是谢谢你们——真的很有帮助。
  • 很高兴知道我的回答对您有帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 2018-09-08
  • 1970-01-01
相关资源
最近更新 更多