【问题标题】:Hide Show content-list with only CSS, no javascript used隐藏仅使用 CSS 显示内容列表,不使用 javascript
【发布时间】:2013-07-17 21:00:39
【问题描述】:

我一直在寻找一个好技巧来制作隐藏/显示内容或仅使用 CSS 而没有 javascript 的列表。 我已经成功完成了这个动作:

<!DOCTYPE html>
<head>

   <style>
      #cont {display: none; }
      .show:focus + .hide {display: inline; }
      .show:focus + .hide + #cont {display: block;}
   </style>

</head>
<body>

   <div>
        <a href="#show"class="show">[Show]</a>
        <a href="#hide"class="hide">/ [Hide]</a>
        <div id="cont">Content</div>
   </div>

</body>
</html>

在这里演示:http://jsfiddle.net/6W7XD/ 它正在工作,但不是应该的。这是问题所在: 显示内容时,您可以通过单击“页面上的任意位置”将其隐藏。如何禁用它?如何通过单击隐藏“仅”隐藏内容? 提前谢谢!

【问题讨论】:

  • 行为应该只存在于 JavaScript 领域。
  • 这就是我在这里的原因!假设它也在 CSS3 中!不需要javascript!让我们期待吧! ;)

标签: list css hide show


【解决方案1】:

有一个纯 HTML 解决方案!试试&lt;details&gt; 元素。

来自 MDN 的实现细节:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/summary

还有一个来自 W3 的试用示例:https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_details

浏览器支持信息在这里:https://caniuse.com/details

【讨论】:

    【解决方案2】:

    如今(2020 年),您可以使用纯 HTML5 完成此操作,而无需 JavaScript 或 CSS3。

    <details>
    <summary>Put your summary here</summary>
    <p>Put your content here!</p>
    </details>
    

    【讨论】:

    【解决方案3】:

    只是想说明,在嵌套列表的上下文中,隐藏复选框 &lt;input&gt; 方法 @jeffmcneill 推荐的有用性 — 每个显示/隐藏元素应独立于焦点和显示/隐藏状态保持其状态的上下文页面上的其他元素。

    为用于页面上显示/隐藏元素的所有复选框的id 属性赋予具有一组通用起始字符的值,让您可以使用经济的[id^=""] 选择器方案来切换样式表规则,以切换您的可点击元素的外观和相关的显示/隐藏元素的display 状态来回。在这里,我的ids 是“expanded-1”、“expanded-2”、“expanded-3”。

    请注意,我还使用了 @Diepen 的 :after 选择器理念,以保持 &lt;label&gt; 元素在 html 中没有内容。

    还要注意&lt;input&gt; &lt;label&gt; &lt;div class="collapsible"&gt; 序列很重要,相应的 CSS 使用 + 选择器而不是 ~

    jsfiddle here

    .collapse-below {
        display: inline;
    }
    
    p.collapse-below::after {
        content: '\000A0\000A0';
    }
    
    p.collapse-below ~ label {
        display: inline;
    }
    
    p.collapse-below ~ label:hover {
        color: #ccc;
    }
    
    input.collapse-below,
    ul.collapsible {
        display: none;
    }
    
    input[id^="expanded"]:checked + label::after {
        content: '\025BE';
    }
    
    input[id^="expanded"]:not(:checked) + label::after {
        content: '\025B8';
    }
    
    input[id^="expanded"]:checked + label + ul.collapsible {
        display: block;
    }
    
    input[id^="expanded"]:not(:checked) + label + ul.collapsible {
        display: none;
    }
    <ul>
      <li>single item a</li>
      <li>single item b</li>
      <li>
        <p class="collapse-below" title="this expands">multiple item a</p>
        <input type="checkbox" id="expanded-1" class="collapse-below" name="toggle">
        <label for="expanded-1" title="click to expand"></label>
        <ul class="collapsible">
          <li>sub item a.1</li>
          <li>sub item a.2</li>
        </ul>
      </li>
      <li>single item c</li>
      <li>
        <p class="collapse-below" title="this expands">multiple item b</p>
        <input type="checkbox" id="expanded-2" class="collapse-below" name="toggle">
        <label for="expanded-2" title="click to expand"></label>
        <ul class="collapsible">
          <li>sub item b.1</li>
          <li>sub item b.2</li>
        </ul>
      </li>
      <li>single item d</li>
      <li>single item e</li>
      <li>
        <p class="collapse-below" title="this expands">multiple item c</p>
        <input type="checkbox" id="expanded-3" class="collapse-below" name="toggle">
        <label for="expanded-3" title="click to expand"></label>
        <ul class="collapsible">
          <li>sub item c.1</li>
          <li>sub item c.2</li>
        </ul>
      </li>
    </ul>

    【讨论】:

      【解决方案4】:

      这会让你大吃一惊:Hidden radio buttons

      input#show, input#hide {
          display:none;
      }
      
      span#content {
          display:none;
      }
      input#show:checked ~ span#content {
        display:block;
      }
      
      input#hide:checked ~ span#content {
          display:none;
      }
      <label for="show">
          <span>[Show]</span>
      </label>
      <input type=radio id="show" name="group">
      <label for="hide">
          <span>[Hide]</span> 
      </label>    
      <input type=radio id="hide" name="group">
      <span id="content">Content</span>

      【讨论】:

      • 你确定它有效吗?虽然不适合我(我使用的是 Firefox)
      • 在 FF/Chrome/IE 上为我工作。尝试复制/粘贴到一个新的,这可能会奏效。
      • 是的,成功了!显示了一个复选框,所以我替换了第一行!谢谢朋友! :) 如果没有人提出非复选框解决方案,那么这就是你的全部;)
      • 酷酷。这看起来确实有点作弊,但它完成了工作。
      • 如果用户单击单选按钮以外的内容,此解决方案不会丢失显示设置。它可以用于页面导航。
      【解决方案5】:

      下面的答案包括更改“显示/隐藏”的文本,并使用单个复选框、两个标签、总共四行 html 和五行 css。它还从隐藏的内容开始。

      Try it in JSFiddle

      HTML

      <input id="display-toggle" type=checkbox>
      <label id="display-button" for="display-toggle"><span>Display Content</span></label>
      <label id="hide-button" for="display-toggle"><span>Hide Content</span></label>    
      <div id="hidden-content"><br />Hidden Content</div>
      

      CSS

      label {
        background-color: #ccc;
        color: brown;
        padding: 15px;
        text-decoration: none;
        font-size: 16px;
        border: 2px solid brown;
        border-radius: 5px;
        display: block;
        width: 200px;
        text-align: center;
      }
      
      input,
      label#hide-button,
      #hidden-content {
        display: none;
      }
      
      input#display-toggle:checked ~ label#display-button {
        display: none;
      }
      
      input#display-toggle:checked ~ label#hide-button {
        display: block;
        background-color: #aaa;
        color: #333
      }
      
      input#display-toggle:checked ~ #hidden-content {
        display: block;
      } 
      

      【讨论】:

      • 如果您只有一行,那就太好了。我想让这个概念适用于多行,您单击的每一行都会腾出空间来显示隐藏的内容。例如:codepen.io/Chris_Nielsen/pen/qoGgqB
      • @Diepen 的解决方案jsfiddle.net/a14bztje 值得一看,用于显示/隐藏的多个内容。
      【解决方案6】:

      我使用隐藏的复选框来持久查看某些消息。该复选框可以隐藏(显示:无)或不。这是我可以编写的一小段代码。

      您可以在JSFiddle上查看和测试演示

      HTML:

      <input type=checkbox id="show">
      <label for="show">Help?</label>
      <span id="content">Do you need some help?</span>
      

      CSS:

      #show,#content{display:none;}
      #show:checked~#content{display:block;}
      

      运行代码sn-p:

      #show,#content{display:none;}
      #show:checked~#content{display:block;}
      <input id="show" type=checkbox>
      <label for="show">Click for Help</label>
      <span  id="content">Do you need some help?</span>

      http://jsfiddle.net/9s8scbL7/

      【讨论】:

      • 真的喜欢这样:优雅简单且功能齐全!它甚至不会像复选框 hack 那样跳到屏幕顶部。
      【解决方案7】:

      我知道这是一篇旧帖子,但是这个解决方案怎么样 (I've made a JSFiddle to illustrate it)... 使用 &lt;span&gt;:after 伪元素来显示/隐藏 &lt;span&gt; 开关链接本身的解决方案(除了.alert 必须显示/隐藏的消息)。当伪元素失去焦点时,消息被隐藏。

      初始情况是当&lt;span&gt;:after content : "Show Me"; 聚焦时出现的隐藏消息。当这个&lt;span&gt; 被聚焦时,它的:after content 变为空,而第二个&lt;span&gt;(最初是空的)的:after content 变为“隐藏我”。因此,当您单击第二个&lt;span&gt; 时,第一个会失去焦点,情况会恢复到初始状态。

      我从 @Vector 提供的解决方案开始我保持 DOM 的情况呈现 ky @Frederic Kizar

      HTML:

      <span class="span3" tabindex="0"></span>
      <span class="span2" tabindex="0"></span>
      <p class="alert" >Some message to show here</p>
      

      CSS:

      body {
          display: inline-block;
      }
      .span3 ~ .span2:after{
          content:"";
      }
      .span3:focus ~ .alert  {
          display:block;
      }
      .span3:focus ~ .span2:after  {
          content:"Hide Me";
      }
      .span3:after  {
          content: "Show Me";
      }
      .span3:focus:after  {
          content: "";
      }
      .alert  {
          display:none;
      }
      

      【讨论】:

      • 处理这个想法并阅读@Frederic Kizar 的答案,他说有几个 事情变得一团糟,我已经制作了另一个 JSFiddle [链接] (jsfiddle.net/a14bztje),其中我在 CSS 加号中第一次出现在另一个 ( + ) 之后的元素,以实现结果。注意

        标记保持相同的共享类。我使用 attr(data-something) 作为伪内容来个性化隐藏/显示链接。

      • 一小时后 :-) 我修改了 [link] (jsfiddle.net/a14bztje) JSFiddle 以简化它。我删除了类...只是使用标签样式。它仍然有效!而不是一个新属性(用于显示/隐藏文本),我使用“标题”属性来“嵌入”文本......所以我们赢得了显示工具提示的鼠标悬停优势......其他样式,如边距,位置,背景颜色等是为了视觉目的......“技巧”存在于对象的序列中: + +

      • 好的,为了更清楚,我做了两个 JSFidle 演示。一个只有“CSS的技巧”(与link上方的前一个链接相同)。请注意,我忘记了类,只使用三个&lt; span&gt; 元素的序列,至少由另一个标签分隔。另请注意,我使用Title="something" 属性“嵌入”开关文本(显示/隐藏我),因此我们获得了on hover 效果;-)。您可以使用像 data-text="Something" 这样的个性化属性,而不是 title 属性...(待续...)
      • 在第二个 JSFiddle 示例 link 中,我在 CSS 中进行了一些美学调整,以展示我们可以对所有这些进行的实际用法。请注意,我使用visibility 而不是display,然后添加position:absolute,以允许消息中包含多行文本,而不会破坏“切换链接”的所有对齐方式。 ...(待续...)
      • 有趣的是,您可以添加任意数量的三个&lt;span&gt; 元素的序列,而无需担心类、名称或ID,只需关注元素的内容即可。所有这一切都无需 Javascript 或 checkboxes&lt;ul&gt;&lt;li&gt;&lt;label for &gt; 即可实现。 ;-)
      【解决方案8】:

      首先,感谢威廉。

      第二 - 我需要一个动态版本。它有效!

      一个例子:

      CSS:

      p[id^="detailView-"]
      {
          display: none;
      }
      
      p[id^="detailView-"]:target
      {
          display: block;
      }
      

      HTML:

      <a href="#detailView-1">Show View1</a>
      <p id="detailView-1">View1</p>
      
      <a href="#detailView-2">Show View2</a>
      <p id="detailView-2">View2</p>
      

      【讨论】:

        【解决方案9】:

        这是我最近用的。

        CSS

        div#tabs p{display:none;}
        
        div#tabs p.tab1:target {display:block;}
        div#tabs p.tab2:target {display:block;}
        div#tabs p.tab3:target {display:block;}
        

        HTML

        <div id='tabs'>
          <h2 class="nav-tab-wrapper">
            <a href="#tab1" class="nav-tab tab1">Pages</a>
            <a href="#tab2" class="nav-tab nav-tab-active tab2">Email</a>
            <a href="#tab3" class="nav-tab tab3">Support</a>
          </h2>
        
          <p id='tab1' class='tab1'>Awesome tab1 stuff</p>
          <p id='tab2' class='tab2'>Tab2 stuff</p>
          <p id='tab3' class='tab3'>Tab3 stuff</p>
        
        </div>
        

        https://jsfiddle.net/hoq0djwc/1/

        希望它在某处有所帮助。

        【讨论】:

          【解决方案10】:

          cssportal.com 提供的一个非常简单的解决方案

          如果按下 [show],文本 [show] 将被隐藏或以其他方式隐藏。

          这个例子在 Chrome 中不起作用,我不知道为什么......

          .show {
          	display: none;
          }
          .hide:focus + .show {
          	display: inline;
          }
          .hide:focus {
          	display: none;
          }
          .hide:focus ~ #list { display:none; }
          @media print {
          .hide, .show {
          	display: none;
          }
          }
          <div><a class="hide" href="#">[hide]</a> <a class="show" href="#">[show]</a>
          <ol id="list">
          <li>item 1</li>
          <li>item 2</li>
          <li>item 3</li>
          </ol>
          </div>

          【讨论】:

            【解决方案11】:

            有 3 个使用纯 CSS 和没有 javascript 的快速示例,其中内容显示为“点击时”、“保持点击”和第三个“悬停”(均仅在 Chrome 中测试)。很抱歉这篇文章的出现,但这个问题是第一个 seo 结果,也许我的贡献可以帮助像我这样的初学者

            我认为(未经测试)但参数“内容”的优势在于您可以添加像 Font Awesome (其 \f 代码)或十六进制图标来代替文本“隐藏”和“显示”的大图标" 将技巧国际化。

            示例链接http://jsfiddle.net/MonkeyTime/h3E9p/2/

            <style>
            label { position: absolute; top:0; left:0}
            
            input#show, input#hide {
                display:none;
            }
            
            span#content {
                display: block;
                -webkit-transition: opacity 1s ease-out;
                transition: opacity 1s ease-out;
                opacity: 0; 
                height: 0;
                font-size: 0;
                overflow: hidden;
            }
            
            input#show:checked ~ .show:before {
                content: ""
            }
            input#show:checked ~ .hide:before {
                content: "Hide"
            }
            
            input#hide:checked ~ .hide:before {
                content: ""
            }
            input#hide:checked ~ .show:before {
                content: "Show"
            }
            input#show:checked ~ span#content {
                opacity: 1;
                font-size: 100%;
                height: auto;
            }
            input#hide:checked ~ span#content {
                display: block;
                -webkit-transition: opacity 1s ease-out;
                transition: opacity 1s ease-out;
                opacity: 0; 
                height: 0;
                font-size: 0;
                overflow: hidden;
            }
            </style>
            <input type="radio" id="show" name="group">   
            <input type="radio" id="hide" name="group" checked>
            <label for="hide" class="hide"></label>
            <label for="show" class="show"></label>
            <span id="content">Lorem iupsum dolor si amet</span>
            
            
            <style>
            #show1 { position: absolute; top:20px; left:0}
            #content1 {
                display: block;
                -webkit-transition: opacity 1s ease-out;
                transition: opacity 1s ease-out;
                opacity: 0; 
                height: 0;
                font-size: 0;
                overflow: hidden;
            }
            #show1:before {
                content: "Show"
            }
            #show1:active.show1:before {
                content: "Hide"
            }
            #show1:active ~ span#content1 {
                opacity: 1;
                font-size: 100%;
                height: auto;
            }
            </style>
            
            <div id="show1" class="show1"></div>
            <span id="content1">Ipsum Lorem</span>
            
            
            <style>
            #show2 { position: absolute; top:40px; left:0}
            #content2 {
                display: block;
                -webkit-transition: opacity 1s ease-out;
                transition: opacity 1s ease-out;
                opacity: 0; 
                height: 0;
                font-size: 0;
                overflow: hidden;
            }
            #show2:before {
                content: "Show"
            }
            #show2:hover.show2:before {
                content: "Hide"
            }
            #show2:hover ~ span#content2 {
                opacity: 1;
                font-size: 100%;
                height: auto;
            }
            
            /* extra */
            #content, #content1, #content2 {
                float: left;
                margin: 100px auto;
            }
            </style>
            
            <div id="show2" class="show2"></div>
            <span id="content2">Lorem Ipsum</span>
            

            【讨论】:

              【解决方案12】:

              我有另一个简单的解决方案:

              HTML:

              <a href="#alert" class="span3" tabindex="0">Hide Me</a>
              <a href="#" class="span2" tabindex="0">Show Me</a>
              <p id="alert" class="alert" >Some alarming information here</p>
              

              CSS:

              body { display: block; }
              p.alert:target { display: none; }
              

              来源:http://css-tricks.com/off-canvas-menu-with-css-target/

              【讨论】:

                【解决方案13】:

                我不会使用复选框,我会使用您已有的代码

                演示http://jsfiddle.net/6W7XD/1/

                CSS

                body {
                  display: block;
                }
                .span3:focus ~ .alert {
                  display: none;
                }
                .span2:focus ~ .alert {
                  display: block;
                }
                .alert{display:none;}
                

                HTML

                <span class="span3">Hide Me</span>
                <span class="span2">Show Me</span>
                <p class="alert" >Some alarming information here</p>
                

                这样文本只有在点击隐藏元素时才会隐藏

                【讨论】:

                • 好提示。但是,如果先隐藏文本,那就太好了。按此顺序:先显示,然后隐藏。
                • 我刚刚添加了这个 .alert{display:none;} 并且效果很好。但是当我添加其他一些时,它变得一团糟:jsfiddle.net/6W7XD/12 thx 不管怎样
                • 只要焦点移动到任何一个 SPAN 以外的任何位置,显示设置就会变回。所以如果用户需要点击内容,内容就会发生变化。
                • 在 Chrome 48.0.2564.22 dev-m 中,单击“隐藏我”后,一旦失去焦点(即:单击其他任何地方),内容就会再次出现隐。依赖焦点不是一个好主意,因为它对不同的操作系统、虚拟机等很挑剔。
                • 对于任何无法立即使用它的人 - 确保您的可聚焦元素具有 tabindex 属性集。
                猜你喜欢
                • 2016-04-10
                • 1970-01-01
                • 2010-09-26
                • 1970-01-01
                • 2018-12-14
                • 2012-11-10
                • 1970-01-01
                • 2011-08-15
                • 2011-02-20
                相关资源
                最近更新 更多