简体   繁体   English

纯 css 下拉菜单 - 单击菜单外时关闭下拉菜单

[英]Pure css dropdown menu - Close dropdown menu when clicked outside menu

 <ul id="menu"> <li> <input id="check01" type="checkbox" name="menu"/> <label for="check01">Tasto menu 01</label> <ul class="submenu"> <li><a href="#">Sotto menu 1</a></li> <li><a href="#">Sotto menu 2</a></li> </ul> </li> <li> <input id="check02" type="checkbox" name="menu"/> <label for="check02">Tasto menu 02</label> <ul class="submenu"> <li><a href="#">Sotto menu 3 (long text)</a></li> <li><a href="#">Sotto menu 4</a></li> <li><a href="#">Sotto menu 5</a></li> </ul> </li> </ul> <article> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate earum nulla asperiores corrupti eius maxime laboriosam voluptates sequi at iure consequatur suscipit voluptatibus magnam alias harum incidunt quis. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quam officia labore maiores perspiciatis nulla aperiam magnam dicta commodi debitis distinctio temporibus in saepe unde. Incidunt vel labore accusamus voluptas eligendi. </p> </article> <style> /*General styles for body*/ body{ margin:0; padding:3em 0; font-family:Helvetica, Arial, sans-serif; background:#eee; color:#222; } article{margin:10px;} /*Style for the first level menu bar*/ ul#menu{ position:fixed; top:0; width:100%; height:3em; margin:0; padding:0 10px; background:#333; color:#eee; box-shadow:0 -1px rgba(0,0,0,.5) inset; } ul#menu > li{ float:left; list-style-type:none; position:relative; } label{ position:relative; display:block; padding:0 18px 0 12px; line-height:3em; transition:background 0.3s; cursor:pointer; } label:after{ content:""; position:absolute; display:block; top:50%; right:5px; width:0; height:0; border-top:4px solid rgba(255,255,255,.5); border-bottom:0 solid rgba(255,255,255,.5); border-left:4px solid transparent; border-right:4px solid transparent; transition:border-bottom.1s, border-top.1s.1s; } label:hover, input:checked ~ label{background:rgba(0,0,0,.3);} input:checked ~ label:after{ border-top:0 solid rgba(255,255,255,.5); border-bottom:4px solid rgba(255,255,255,.5); transition:border-top.1s, border-bottom.1s.1s; } /*hide the inputs*/ input{display:none} /*show the second levele menu of the selected voice*/ input:checked ~ ul.submenu{ max-height:300px; transition:max-height 0.5s ease-in; } /*style for the second level menu*/ ul.submenu{ max-height:0; padding:0; overflow:hidden; list-style-type:none; background:#444; box-shadow:0 0 1px rgba(0,0,0,.3); transition:max-height 0.5s ease-out; position:absolute; min-width:100%; } ul.submenu li a{ display:block; padding:12px; color:#ddd; text-decoration:none; box-shadow:0 -1px rgba(0,0,0,.5) inset; transition:background.3s; white-space:nowrap; } ul.submenu li a:hover{ background:rgba(0,0,0,.3); } </style>

I'm building a pure css dropdown menu with pure css with this concept https://codepen.io/Tont/pen/hdsev我正在用这个概念https://codepen.io/Tont/pen/hdsev 构建一个纯 css 下拉菜单和纯 css

The menu works as expected and the dropdown toggles when user clicks on the top menu item.菜单按预期工作,当用户单击顶部菜单项时,下拉菜单会切换。

I want to close any dropdown if there is a click anywhere outside of the menu.如果在菜单外的任何地方单击,我想关闭任何下拉菜单。

How can I achieve this with pure css no JavaScript?我怎样才能用纯 css 没有 JavaScript 来实现这一点?

I know how achieve this with JavaScript, looking for Css solution我知道如何使用 JavaScript 实现这一目标,正在寻找 Css 解决方案

CSS can't be used for this purpose. CSS 不能用于此目的。 You are trying to essentially "listen" for when the user clicks outside of the selected area.当用户在所选区域之外单击时,您试图从本质上“监听”。

To listen for that, you will need an event listener from Javascript.要监听它,您需要来自 Javascript 的事件监听器。 You can then add a style property of display:none or whatever suits your purpose.然后,您可以添加display:none或任何适合您目的的样式属性。

This solution would only require a few lines of JavaScript, but there is no way to listen for a click without a JavaScript eventlistener.此解决方案只需要几行 JavaScript,但如果没有 JavaScript 事件监听器,就无法监听点击。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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