【问题标题】:How to hide or show the desired block when clicking on an element?单击元素时如何隐藏或显示所需的块?
【发布时间】:2021-07-08 23:02:44
【问题描述】:

我有一个 list-menu .sidebar-menu 并且这个列表的每个 li 都有自己的 id。还有一个 .services-info 块,块所在的位置,当您单击与此块对应的 .sidebar-menu 中的一项时,应该会出现其中一个。在 .services-info 中的块上,我挂了 .invisible 类,它隐藏了它们,并且有一个带有 display: block 属性的 .visible 类。 问题:如何使当您单击 .sidebar-menu 项目之一时,出现相应的块,而不需要的块消失?例如,我点击了“名片网站”项,在 .services-info(图中红色圈出)中出现了相应的块(带有 .business-card 类)而前一个块消失了,或者我点击了“在线商店”项目,它也出现在相应的块(与类.market)。并且不必要的消失了。

网站 ct03638.tmweb.ru

代码 jsfiddle.net/qhfs7jmb/

.invisible{
    display:  none;
}


.visible {
    display: block;
}
<section class="services" id="services">
            <div class="services-info-bg"></div>
            <div class="wrapper">
                <div class="content">
                    <div class="sidebar">
                        <h3>Наши услуги</h3>
                        <ul class="sidebar-menu">
                            <li id="business-card"><a href="#">Сайт-визитка</a></li>
                            <li id="landing"><a href="#">Landing page</a></li>
                            <li id="market"><a href="#">Интернет-магазин</a></li>
                            <li id="corp"><a href="#">Корпоративный сайт</a></li>
                            <li id="bitrix"><a href="#">1C Битрикс</a></li>
                            <li id="advertising"><a href="#">Контекстная реклама</a></li>
                            <li id="seo"><a href="#">SEO оптимизация</a></li>
                            <li id="promotion"><a href="#">Продвижение в соц. сетях</a></li>
                            <li id="marketing"><a href="#">Контент-маркетинг</a></li>
                        </ul>
                        <ul class="sidebar-nav">
                            <li></li>
                            <li></li>
                            <li></li>
                            <li></li>
                            <li></li>
                            <li></li>
                            <li></li>
                            <li></li>
                            <li></li>
                        </ul>
                    </div>
                    <div class="services-info">
                        <div class="content">
                            <div class="business-card invisible">Сайт-визитка</div>
                            <div class="landin invisible">Landing page</div>
                            <div class="market">
                                <div class="services-info-title">
                                    Созданные экспертами «Inter-web» сайты интернет-магазинов имеют функциональность, необходимую для успешной онлайн-торговли.
                                </div>
                                <p>Что входит в нашу работу:</p>
                                <div class="services-info-block">
                                    <ul>
                                        <li>+ Подготовка технического задания</li>
                                        <li>+ Разработка прототипа</li>
                                        <li>+ Верстка макета</li>
                                        <li>+ Интеграция дизайна</li>
                                    </ul>
                                    <ul>
                                        <li>+ Написание уникальных текстов</li>
                                        <li>+ Сбор семантики</li>
                                        <li>+ Тестирование и запуск</li>
                                        <li>+ Подключение веб-аналитики</li>
                                    </ul>
                                </div>
                                <div class="services-info-footer">
                                    <a class="order" href="#">Сделать заказ</a>
                                    <a href="#" class="details">Узнать подробнее &rarr;</a>
                                </div>
                            </div>
                           
                        </div>
                    </div>
                </div>
            </div>
        </section>

【问题讨论】:

  • 您似乎遗漏了 JavaScript。这回答了你的问题了吗? Javascript show/hide div onclick
  • 这是一个很好的解决方案,但由于某种原因它对我不起作用而且我还需要显示第一个元素,它们都隐藏在这里,如果你把 display: block,那么当其他方块处于活动状态时它不会消失
  • 不确定您的意思,因为该帖子中有几种不同的解决方案。但是,您可以编辑您的问题并向我们展示您尝试了什么以及具体出了什么问题。

标签: javascript html jquery css


【解决方案1】:

在侧边栏&lt;ul&gt;添加一个事件监听器来监听侧边栏元素的点击。

当用户单击侧边栏元素时,事件侦听器会查找被单击元素的 ID,并使用它来构造查询选择器以选择所需的内容 &lt;div&gt;。

然后添加invisible类并删除所有内容&lt;div&gt;上的'visible'类,最后在需要的内容&lt;div&gt;上设置'visible'类

您可以只搜索 visible 内容块并更改它,但过去的经验告诉我无论如何都要隐藏我不想要的所有内容。

您需要的代码应包含在&lt;script&gt; 标签内,并添加到页面底部。

    document.querySelector('ul.sidebar-menu').addEventListener('click',function(e){
        e.preventDefault();
        // The <a> element was clicked, but we need the ID from the enclosing <li> element
        let clickedId = e.target.closest('li').id;
        // Set all the content elements to invisible (saves trying to find the visible one)
        let contentDivs = document.querySelectorAll('div.services-info>div.content>div');
        contentDivs.forEach((el)=>{el.classList.remove('visible'); el.classList.add('invisible')});
        // Now, using the ID from the <li>, create a query selector to find the content <div>
        let targetSelector = 'div.services-info>div.content>div.'+clickedId;
        // Set that element visible
        document.querySelector(targetSelector).classList.add('visible');
    });
.invisible{
    display:  none;
}


.visible {
    display: block;
}
<section class="services" id="services">
            <div class="services-info-bg"></div>
            <div class="wrapper">
                <div class="content">
                    <div class="sidebar">
                        <h3>Наши услуги</h3>
                        <ul class="sidebar-menu">
                            <li id="business-card"><a href="#">Сайт-визитка</a></li>
                            <li id="landing"><a href="#">Landing page</a></li>
                            <li id="market"><a href="#">Интернет-магазин</a></li>
                            <li id="corp"><a href="#">Корпоративный сайт</a></li>
                            <li id="bitrix"><a href="#">1C Битрикс</a></li>
                            <li id="advertising"><a href="#">Контекстная реклама</a></li>
                            <li id="seo"><a href="#">SEO оптимизация</a></li>
                            <li id="promotion"><a href="#">Продвижение в соц. сетях</a></li>
                            <li id="marketing"><a href="#">Контент-маркетинг</a></li>
                        </ul>
                        <ul class="sidebar-nav">
                            <li></li>
                            <li></li>
                            <li></li>
                            <li></li>
                            <li></li>
                            <li></li>
                            <li></li>
                            <li></li>
                            <li></li>
                        </ul>
                    </div>
                    <div class="services-info">
                        <div class="content">
                            <div class="business-card invisible">Сайт-визитка</div>
                            <div class="landing invisible">Landing page</div>
                            <div class="market">
                                <div class="services-info-title">
                                    Созданные экспертами «Inter-web» сайты интернет-магазинов имеют функциональность, необходимую для успешной онлайн-торговли.
                                </div>
                                <p>Что входит в нашу работу:</p>
                                <div class="services-info-block">
                                    <ul>
                                        <li>+ Подготовка технического задания</li>
                                        <li>+ Разработка прототипа</li>
                                        <li>+ Верстка макета</li>
                                        <li>+ Интеграция дизайна</li>
                                    </ul>
                                    <ul>
                                        <li>+ Написание уникальных текстов</li>
                                        <li>+ Сбор семантики</li>
                                        <li>+ Тестирование и запуск</li>
                                        <li>+ Подключение веб-аналитики</li>
                                    </ul>
                                </div>
                                <div class="services-info-footer">
                                    <a class="order" href="#">Сделать заказ</a>
                                    <a href="#" class="details">Узнать подробнее &rarr;</a>
                                </div>
                            </div>
                           
                        </div>
                    </div>
                </div>
            </div>
        </section>

【讨论】:

  • 我是否正确理解了代码的逻辑? 1) 向 ul.sidebar-menu 添加一个事件监听器来监听列表项的点击。 2) 在变量 clickedId 中,包含被点击元素的父级的 id 3) 在变量 contentDivs 中我们将所有块包装在 .services-info .content
  • 4) 对于 contentDivs,启动 forEach 方法,在其中迭代每个元素,它删除可见类并添加不可见 5) targetSelector = 'div.servicesinfo> div.content> div.' + ClickedId。这里我不明白写的是什么。是否在 .services-info .content 中搜索块类名称与 .sidebar-menu 中按下的“li”的标识符匹配,如果它们匹配,则该块变为可见?
  • @Outif 你说得对,你已经正确理解了 5) 的逻辑。查询选择器比它们可能涉及的更多,因为您几乎在所有地方都使用过类,因此选择器必须非常具体地针对类。选择器的格式搜索子代而不是后代。这是一个更具体的搜索。如果business-card、landing、market等类在页面上只使用过一次,那么您可以直接搜索它们。
  • 另一个问题 - 如果在函数 (e) 中删除了 'e' 并且在函数内部删除了 e.preventDefault (),为什么代码会停止工作?
  • 所以我理解正确,在变量 targetSelector 中比较了按下的 li 的 id 和 .content 块内的类?如果它们的名称相似,那么所需的块就会变得可见?
【解决方案2】:

一种方法是在body 元素上设置具有选定菜单项ID 的属性,并在CSS 中显示具有相同类名的元素。 单击菜单项时要显示的部分必须与&lt;li&gt; item 的 id 具有相同的类名:

const menu = document.querySelectorAll(".sidebar-menu li > a"),
      onClick = e =>
      {
        e.preventDefault();
        //get ID from <li> element and add to the body "show" attribute
        document.body.setAttribute("show", e.target.parentNode.id);
      };

for(let i = 0; i < menu.length; i++)
  menu[i].addEventListener("click", onClick);
.services-info .content > div
{
  display: none;
}

body[show="business-card"] .business-card,
body[show="landing"] .landing,
body[show="market"] .market,
body[show="corp"] .corp,
body[show="bitrix"] .bitrix,
body[show="advertising"] .advertising,
body[show="seo"] .seo,
body[show="promotion"] .promotion,
body[show="marketing"] .marketing
{
  display: block;
}
<section class="services" id="services">
            <div class="services-info-bg"></div>
            <div class="wrapper">
                <div class="content">
                    <div class="sidebar">
                        <h3>Наши услуги</h3>
                        <ul class="sidebar-menu">
                            <li id="business-card"><a href="#">Сайт-визитка</a></li>
                            <li id="landing"><a href="#">Landing page</a></li>
                            <li id="market"><a href="#">Интернет-магазин</a></li>
                            <li id="corp"><a href="#">Корпоративный сайт</a></li>
                            <li id="bitrix"><a href="#">1C Битрикс</a></li>
                            <li id="advertising"><a href="#">Контекстная реклама</a></li>
                            <li id="seo"><a href="#">SEO оптимизация</a></li>
                            <li id="promotion"><a href="#">Продвижение в соц. сетях</a></li>
                            <li id="marketing"><a href="#">Контент-маркетинг</a></li>
                        </ul>
                        <ul class="sidebar-nav">
                            <li></li>
                            <li></li>
                            <li></li>
                            <li></li>
                            <li></li>
                            <li></li>
                            <li></li>
                            <li></li>
                            <li></li>
                        </ul>
                    </div>
                    <div class="services-info">
                        <div class="content">
                            <div class="business-card invisible">Сайт-визитка</div>
                            <div class="landing invisible">Landing page</div>
                            <div class="market">
                                <div class="services-info-title">
                                    Созданные экспертами «Inter-web» сайты интернет-магазинов имеют функциональность, необходимую для успешной онлайн-торговли.
                                </div>
                                <p>Что входит в нашу работу:</p>
                                <div class="services-info-block">
                                    <ul>
                                        <li>+ Подготовка технического задания</li>
                                        <li>+ Разработка прототипа</li>
                                        <li>+ Верстка макета</li>
                                        <li>+ Интеграция дизайна</li>
                                    </ul>
                                    <ul>
                                        <li>+ Написание уникальных текстов</li>
                                        <li>+ Сбор семантики</li>
                                        <li>+ Тестирование и запуск</li>
                                        <li>+ Подключение веб-аналитики</li>
                                    </ul>
                                </div>
                                <div class="services-info-footer">
                                    <a class="order" href="#">Сделать заказ</a>
                                    <a href="#" class="details">Узнать подробнее &rarr;</a>
                                </div>
                            </div>
                           
                        </div>
                    </div>
                </div>
            </div>
        </section>

【讨论】:

  • 我是否正确理解了代码的逻辑? 1) 在 const 变量中,我们添加 .sidebar-menu li 内的所有链接 2) 当您单击其中一个 'li' 时,会发生事件 3) 使用 document.body.setAttribute ("show", e .target.parentNode.id) 添加属性“show”,里面是预先写好的body [show = "business-card"] .business-card, body [show = "landing"] .landing等,这里的值"show" 是 .sidebar-menu li 中按下的 li 的 id,对吗?即body [show = "被按下元素的id li"] .business-card.
  • 4) 使用e.target.parentNode.id我们得到被点击的.sidebar-menu li的id,即:e.target是被点击对象的链接,parentNode.id返回被点击的元素的父元素的id。将它们捆绑在一起,结果是当我点击链接时,我得到了我点击的 li 的 id,对吧?由于链接在 li. 5)我运行“for”循环,在其中检查 .sidebar-menu li 中的每个链接是否有点击。问题:是否可以通过document.getElementById()获取被按下的.sidebar-menu li的id?
  • 是的,你分析得很好,除了 5) - 它不检查点击,它注册一个点击事件监听器,当点击链接时触发。从技术上讲,使用这种方法,您实际上并不需要 &lt;li&gt; 中的 &lt;a&gt; 链接,您可以在 5) 中直接在 &lt;li&gt; 元素上添加事件侦听器并摆脱 &lt;a&gt;。我把它们留在那里,以防你有一些特定的风格。我不太明白最后一个问题...由于li 元素具有 id 属性,您可以使用document.getElementById() 单独检索它们中的每一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
相关资源
最近更新 更多