可以仅使用CSS(无需JavaScript代码)隐藏和显示文本吗?[关闭]


86

是否可以仅使用CSS链接显示和隐藏文本-完全不使用JavaScript?

例如:在此页面上

注意“更多”链接。当您单击它时,它将取消隐藏文本。这个特定的示例是JavaScript,但是我不确定是否可以使用纯CSS来完成。


2
纯CSS网站(带有菜单)的另一个示例是grc.comSecurity Now的Steve Gibson )。
彼得·莫滕森

1
可能重复:1 2
user202729 '18


看看:仅使用CSS切换侧边栏有两个示例,一个需要单击(使用隐藏的复选框),另一个需要使用悬停
F. Hauri

// @亲密的选民:自我解释。
Boann

Answers:


107

还有的<details>元素,这是尚未建成的边缘:

<details>
  <summary>more <!-- a bad summary --></summary>
  <p>Some content</p>
</details>

我不确定跨浏览器保持样式一致有多么困难。

有一个常见的复选框黑客(可以隐藏复选框,并且可以将标签设置为看起来像任何东西的样式):

#more:not(:checked) ~ #content {
  display: none;
}
<input id="more" type="checkbox" /> <label for="more">more</label>

<p id="content">Some content</p>

但是它并不总是(也许曾经?嗯)适合使用;您通常可以在JavaScript无法加载时重新显示内容,并具有“更多”链接链接。

还有:target,但它可能更不合适,因为在关闭机制中很难构建。

#content {
  display: none;
}

#content:target {
  display: block;
}

#less {
  display: none;
}

#content:target ~ #less {
  display: block;
}
<a href="#content" id="more">More</a>
<p id="content">Lorem ipsum</p>
<a href="#" id="less">Less</a>


8
复选框方法有很多合法用途。考虑这样的表格,例如我所模拟的示例
misterManSam '18

7
困惑为什么您认为:checked:target永远不合适。毕竟它们存在。
康拉德·鲁道夫

@KonradRudolph我唯一能想到的就是id要求,这使得它对于动态页面的使用更加困难。尽管是IMO,但这不是一个很好的理由-这种隐藏的复选框模式非常古老,不难理解,在动态情况下,您可以仅使用哈希作为ID的一部分。
Izkata

3
@KonradRudolph:可能永远都不适合使用“更多”链接来扩展内容。特别是:target–如果您链接到其他任何地方,内容就会消失。:checked表示您无法在扩展内部进行链接,并且如果您隐藏了该复选框,则必须使标签可键盘聚焦。因为要使这两种方法中的任何一种都能正常工作,所以在默认情况下,我只显示它并使用JavaScript提供增强功能。
Ry-

@misterManSam:这不是一个“更多”链接,而是一种实际形式。
Ry-

39

是的,纯CSS可以做到这一点。您可以通过结合使用复选框的:checked属性和<label>元素的for属性来单击元素。

由于可以取消选中该复选框,因此您可以通过简单地将其添加visibility: hidden到源于该元素的元素:checked(一旦再次单击该复选框,此伪选择器将无效,并且CSS选择器将不再与目标匹配)来切换可见性 。

可以<label>使用for属性将其扩展为,这样您就可以完全隐藏复选框本身,并<label>直接将自己的样式应用于。

以下内容在单击元素时利用相邻的同级组合器(+来切换类:toggle<label>

input[type="checkbox"] {
  display: none; /* Hide the checkbox */
}

/* This is tied to the invisible checkbox */
label {
    background-color: #4CAF50;
    border: 2px solid black;
    border-radius: 20px;
    color: white;
    padding: 15px 32px;
    text-align: center;
    font-size: 16px;
    display: inline-block;
    margin-bottom: 20px;
    cursor: pointer;
    user-select: none;
}

/* The target element to toggle */
input[type="checkbox"]:checked + label + .toggle {
  visibility: hidden;
}
<input type="checkbox" id="checkbox" />
<label for="checkbox">Click me to toggle the content</label>
<div class="toggle">CONTENT</div>


3
这就是CSS可以通过规则110并被视为图灵完整eli.fox-epste.in/rule110
ESR,

17

是的,您仅使用CSS即可轻松完成此操作。请参考以下代码:

* {
  box-sizing: border-box;
}

body {
  background-color: #646464;
  color: #fff;
}

header {
  background-color: rgba(0, 0, 0, 0.5);
  font-size: 1.5em;
  text-align: center;
  padding: 1em;
}

.panel-wrapper {
  position: relative;
}

.btn {
  color: #fff;
  background: #000;
  border-radius: 1.5em;
  left: 30%;
  padding: 1em;
  text-decoration: none;
  width: 40%;
}

.show,
.hide {
  position: absolute;
  bottom: -1em;
  z-index: 100;
  text-align: center;
}

.hide {
  display: none;
}

.show:target {
  display: none;
}

.show:target~.hide {
  display: block;
}

.show:target~.panel {
  max-height: 2000px;
}

.show:target~.fade {
  margin-top: 0;
}

.panel {
  position: relative;
  margin: 2em auto;
  width: 70%;
  max-height: 100px;
  overflow: hidden;
  transition: max-height .5s ease;
}

.fade {
  background: linear-gradient(to bottom, rgba(100, 100, 100, 0) 0%, #646464 75%);
  height: 100px;
  margin-top: -100px;
  position: relative;
}
<!DOCTYPE html>
<html lang='en' class=''>

<head>
  <link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css'>
</head>

<body>
  <header>CSS Only: Show More</header>
  <div class="panel-wrapper">
    <a href="#show" class="show btn" id="show">Show Full Article</a>
    <a href="#hide" class="hide btn" id="hide">Hide Full Article</a>
    <div class="panel">
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In pharetra consectetur accumsan. Vestibulum vitae ipsum euismod, tempus ligula non, tempus lacus. Phasellus at pellentesque ex. Praesent at ipsum dui. Cras lectus neque, bibendum ac diam
        a, elementum tristique felis. Sed iaculis, diam at vehicula lacinia, odio urna tincidunt felis, sit amet scelerisque urna erat non leo. Pellentesque vel leo vitae tellus bibendum viverra.</p>
      <p>Donec id ultrices mi. Suspendisse potenti. Pellentesque cursus sagittis lacinia. Mauris elit sem, eleifend nec facilisis eget, fermentum sed odio. Nam aliquam massa nec leo tincidunt rhoncus. Integer tincidunt finibus tincidunt. Maecenas aliquam
        fermentum nisi, vitae mattis neque vehicula vitae.</p>
      <p>Nam orci purus, consequat sed lorem id, lacinia efficitur lorem. Vestibulum id quam ut elit congue varius. Donec justo augue, rhoncus non nisl ut, consectetur consequat velit. In hac habitasse platea dictumst. In hac habitasse platea dictumst. Aliquam
        auctor sapien lorem, at vestibulum justo congue vel. Duis volutpat, lorem quis tincidunt ornare, felis tortor posuere tellus, nec pretium neque velit vulputate libero.</p>
      <p>Morbi tortor tortor, auctor porttitor felis in, eleifend cursus ante. Nullam pellentesque lorem ipsum, in fringilla enim suscipit cursus. Pellentesque feugiat volutpat congue. Donec ac ante elit. Quisque ornare lacus dui, id commodo tortor lacinia
        nec. Curabitur dignissim magna sagittis neque aliquam porttitor. Aenean sit amet tincidunt risus.</p>
      <p>Cras feugiat, sapien luctus congue gravida, enim enim tristique nisl, vel porta lacus ante vitae dolor. Duis at nisl sed lectus imperdiet congue. Vestibulum pellentesque finibus ligula, sit amet elementum enim dignissim eget. Nullam bibendum justo
        eros, in placerat est ullamcorper nec. Donec blandit accumsan venenatis. Vivamus nec elit arcu. Morbi ultrices blandit sapien eget aliquam. Pellentesque placerat et libero a sodales. Donec eget erat ac velit maximus ullamcorper. Nulla laoreet
        dolor in purus sollicitudin varius. Duis eu erat ut magna lobortis rhoncus ac at lacus. Nullam in mi sed sem porttitor molestie. Aenean auctor dui in neque vulputate, in mattis purus tristique. Aliquam egestas venenatis ultricies. Nam elementum
        ante libero, nec dictum erat mollis dapibus. Phasellus pharetra euismod nibh, sit amet lobortis odio.</p>
      <p>Sed bibendum dapibus leo eu facilisis. Cras interdum malesuada diam id lobortis. Phasellus tristique odio eget placerat ornare. Phasellus nisl nulla, auctor convallis turpis tempus, molestie blandit urna. Nullam accumsan tellus massa, at tincidunt
        metus imperdiet sed. Donec sed imperdiet quam, id dignissim dolor. Curabitur mollis ultricies tempor. Morbi porttitor, turpis et dignissim aliquam, nunc lacus dignissim massa, a consequat nibh est vel turpis. Pellentesque blandit, ante vehicula
        sollicitudin imperdiet, tellus urna fringilla diam, id tempor neque augue eu nisl. Quisque eu sem posuere, vehicula risus ut, ullamcorper massa. Fusce vulputate bibendum erat, vel dapibus dui consectetur nec. Donec mauris mauris, egestas non malesuada
        non, finibus nec lacus. Duis at mauris tincidunt, accumsan augue non, vestibulum libero.</p>
      <p>Vestibulum fermentum vulputate lectus, at sollicitudin diam laoreet vitae. Aliquam erat volutpat. Nulla condimentum, arcu nec suscipit ultrices, urna tortor rutrum purus, sed mollis lacus ligula vitae justo. Duis vitae malesuada sem, eget finibus
        nibh. Etiam facilisis, urna ac blandit molestie, quam velit congue nibh, ac.</p>

    </div>
    <!-- end panel -->
    <div class="fade"></div>
  </div>
  <!-- end panel-wrapper -->

</body>

</html>


14

您可以隐藏一个复选框,但可以通过关联的复选框对其进行选中/取消选中 <label>元素。

根据是否选中该复选框,您可以隐藏/显示其他文本,甚至可以将标签的文本从“更多”更改为“更少”。

我在CSS中包含了一些其他详细信息,以便使每个定义的意图更加明确。

1.使用一个切换“更多” /“减少”按钮:

.more-text, #more-checkbox {          /* Hide the second paragraph and checkbox */
  display: none;
}

input:checked ~ .more-text {          /* Show the second paragraph when checked */
  display: block;
}

.more-label::after {                  /* Label underline, hand cursor, color */
  cursor: pointer;
  text-decoration: underline;
  color: #666;
}

input ~ .more-label::after {          /* Set label text to "More" by default */
  content: 'More';
}

input:checked ~ .more-label::after {  /* Set label text to "Less" when checked */
  content: 'Less';
}
<p>
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ullamcorper, arcu ut facilisis interdum, lacus felis fringilla nulla, vel scelerisque massa quam vel leo.
</p>

<input type="checkbox" id="more-checkbox" />
<label class="more-label" for="more-checkbox"></label>

<p class="more-text">
  Sed a ullamcorper ex. In elementum purus ullamcorper justo gravida aliquet. Aliquam erat volutpat. Maecenas in ante quam.
</p>


2.使用顶部的“更多”按钮和底部的“减少”按钮:

.more-text, #more-checkbox, .less-label {
  display: none;
}

.more-label, .less-label {          
  cursor: pointer;
  text-decoration: underline; 
  color: #666;
}

input:checked ~ .more-text, input:checked ~ .less-label {
  display: block;
}

input:checked ~ .more-label {
  display: none;
}
<p>
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ullamcorper, arcu ut facilisis interdum, lacus felis fringilla nulla, vel scelerisque massa quam vel leo.</p>

<input type="checkbox" id="more-checkbox" />
<label class="more-label" for="more-checkbox">More</label>

<p class="more-text">
  Sed a ullamcorper ex. In elementum purus ullamcorper justo gravida aliquet. Aliquam erat volutpat. Maecenas in ante quam.
</p>

<label class="less-label" for="more-checkbox">Less</label>


11

从技术上讲,可以根据单击按钮或链接的时间来切换文本的可见性,如下所示:

.hidden-text {
  display: none;
}

.toggle-text:focus + .hidden-text {
  display: block;
}
<p>
  This is an example with no hidden content until you... <a href="#" class="toggle-text">read more</a>!
  <span class="hidden-text">Now I'm visible!!!</span>
</p>

话虽如此,我强烈建议您熟悉JavaScript,因为使用JavaScript的解决方案要简单得多,并且可以提供更多的灵活性。


这取决于浏览器在单击链接时将焦点对准链接,标准不需要(至少我上次检查),并且并不是所有浏览器都需要(例如,在Safari上不起作用)。使用:checked或:target可能会更好。
chridd

10

是的,您只能通过使用HTML和CSS来做到这一点。

body { padding: 20px; }

div { margin-top: 10px; border: 1px solid black; width: 200px; height: 100px;
    padding: 5px;
}
input:checked + label + div { display: none; }
input + label:after { content: " To Hide"; }
input:checked + label:after { content: " To Show"; }

label {
    background-color: yellow;
    box-shadow: inset 0 2px 3px rgba(255,255,255,0.2), inset 0 -2px 3px rgba(0,0,0,0.2);
    border-radius: 4px;
    font-size: 16px;
    display: inline-block;
    padding: 2px 5px;
    cursor: pointer;
}
<input type='checkbox' style='display: none' id=cb>
<label for=cb>Click Here</label>
<div>
    Hello. This is some stuff.
</div>


4
嗨,monir alhussini,欢迎来到Stack Overflow。我可以对如何改善答案发表评论吗?您的代码运行良好(至少在我的浏览器中),但是在某些情况下,它会提供更好的答案;例如,您可以解释此提议的更改如何以及为什么解决了提问者的问题,也许还包括相关文档的链接。这将使其对他们更有用,对正在寻找类似问题的解决方案的其他站点读者也将更有用。
文斯·鲍德伦

3

现在,您也可以仅使用CSS隐藏/显示文本!如果您正在使用文本输入,并且想根据输入框的状态显示/隐藏文本,则可以将新的CSS伪类:placeholder-shown用于<input><textarea>。这是上述伪类的示例/演示!

/* Some base style  */
.app {
  margin: 10px auto;
  padding: 10px;
}

code {
  background-color: lightgray;
  padding: 4px;
}

input {
  padding: 5px 10px;
}

input:focus {
  outline: none;
}

/* When there is something in input box give 
  it a solid blue border */

input:not(:placeholder-shown) {
  border: solid 2px #42A5F5
}

/* Hide the p initially */
p {
  background-color: #F0F4C3;
  padding: 5px;
  opacity: 0;
  transition: all 300ms ease-in-out;
}


/* Show the p when the placeholder is not shown. 
  i.e. Something is in the input box and placeholder is gone */
input:not(:placeholder-shown)+p {
  opacity: 1
}
<div class="app">
  <h1>Hide/Show Text using input's <code>:placehoder-shown</code> psuedo class!</h1>
  <label for="name">Enter your name</label>
  <input type="text" id="name" placeholder="Your Name">
  <p class="msg">Well done!</p>
</div>

这是指向MDN文档的链接

这是一项实验性技术,请在生产中使用它之前仔细检查浏览器兼容性表。


-1

也许有人会发现此解决方案更直观,更易于实现。这样做的机制是链接以自身为目标,在这种情况下,很容易选择DOM接下来的内容。

.toggle-hide,
.toggle-content {
  display: none;
}
.toggle-show:target + .toggle-hide,
.toggle-show:target + .toggle-hide + .toggle-content {
  display: block;
}
.toggle-show:target {
  display: none;
}
<a id="target" class="toggle-show" href="#target">Show</a>
<a class="toggle-hide" href="#" >Hide</a>
<p class="toggle-content">Lorem ipsum</p>


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.