ข้อความสามารถซ่อนและแสดงโดยใช้แค่ CSS (ไม่มีโค้ด JavaScript) ได้หรือไม่ [ปิด]


86

เป็นไปได้หรือไม่ที่จะแสดงและซ่อนข้อความโดยใช้ลิงก์ที่มี CSS เพียงอย่างเดียวโดยไม่ต้องใช้ JavaScript เลย?

ตัวอย่างเช่นในหน้านี้

สังเกตลิงก์ "เพิ่มเติม" เมื่อคุณคลิกมันจะยกเลิกการซ่อนข้อความ ตัวอย่างนี้คือ JavaScript แต่ฉันไม่แน่ใจว่าสามารถทำได้ด้วย CSS บริสุทธิ์หรือไม่


2
อีกตัวอย่างหนึ่งของเว็บไซต์ CSS เท่านั้น (พร้อมเมนู) คือgrc.com (Steve Gibson จากSecurity Now )
Peter Mortensen

1
อาจซ้ำกันได้: 1 2
user202729


ดูที่นั่น: สลับแถบด้านข้างด้วย CSS เท่านั้นมีสองตัวอย่างหนึ่งต้องคลิก (โดยใช้ช่องทำเครื่องหมายที่ซ่อนอยู่) และอีกรายการหนึ่งใช้โฮเวอร์ )
F. Hauri

@ ปิดผู้มีสิทธิเลือกตั้ง: อธิบายตัวเอง
Boann

คำตอบ:


107

มี<details>องค์ประกอบซึ่งยังไม่ได้ติดตั้งใน Edge:

<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

7
งงว่าทำไมคุณถึงคิดว่า:checkedหรือ:targetไม่เหมาะสม พวกเขามีอยู่จริงหลังจากทั้งหมด
Konrad Rudolph

@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>โดยตรง

สิ่งต่อไปนี้ใช้ประโยชน์จากCombinator พี่น้องที่อยู่ติดกัน ( +)เพื่อสลับคลาส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 และถือว่า Turing สมบูรณ์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 ฉันสามารถแสดงความคิดเห็นเกี่ยวกับวิธีปรับปรุงคำตอบของคุณได้หรือไม่? รหัสของคุณทำงานได้ดีมาก (อย่างน้อยก็ในเบราว์เซอร์ของฉัน) แต่ด้วยบริบทบางอย่างมันจะให้คำตอบที่ดีกว่า ตัวอย่างเช่นคุณสามารถอธิบายได้ว่าการเปลี่ยนแปลงที่เสนอนี้จะแก้ไขปัญหาของผู้ถามได้อย่างไรและทำไมอาจรวมถึงลิงก์ไปยังเอกสารที่เกี่ยวข้อง นั่นจะทำให้มีประโยชน์มากขึ้นสำหรับพวกเขาและยังมีประโยชน์มากขึ้นสำหรับผู้อ่านไซต์อื่น ๆ ที่กำลังมองหาวิธีแก้ปัญหาที่คล้ายกัน
Vince Bowdren

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>


-3

ใช้ "display: none;" attribute.


สวัสดี @Ajay ขอบคุณสำหรับการสนับสนุนของคุณ อย่างไรก็ตามดูเหมือนว่าคุณจะตอบคำถามได้เพียงครึ่งเดียวเท่านั้น: คุณได้แสดงวิธีซ่อนแล้ว แต่ไม่สามารถยกเลิกการซ่อนได้อย่างไรและสลับไปมาระหว่างสองสถานะด้วย CSS
Charlie Harding

แสดง: บล็อก; จะยกเลิกการซ่อน
Ajay Munugala

และคุณใช้ CSS เพื่อจัดการกับการคลิกเพื่อสลับไปมาระหว่างสถานะตามที่คำถามถามได้อย่างไร
Charlie Harding
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.