Чи можна приховати та показати текст, використовуючи лише CSS (без коду JavaScript)? [зачинено]


86

Чи можна показувати та приховувати текст за допомогою посилання лише з CSS - без використання JavaScript взагалі?

Наприклад: На цій сторінці

Зверніть увагу на посилання "Більше". При натисканні на ньому текст приховується. Цей конкретний приклад - JavaScript, але я не впевнений, чи можна це зробити за допомогою чистого CSS.


2
Іншим прикладом веб-сайту, що містить лише CSS (з меню), є grc.com (Стів Гібсон, Security Now ).
Пітер Мортенсен

1
Можливі дублікати: 1 2
user202729


Подивіться там: Переключити бічну панель лише з CSS Є два зразки, один вимагає клацання (за допомогою прихованого прапорця), а інший за допомогою наведення курсору )
Ф. Хаурі,

@ Близькі виборці: Поясніть.
Боан,

Відповіді:


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ніколи не буде доречним. Зрештою, вони існують.
Конрад Рудольф

@KonradRudolph Єдине, що я можу придумати, це idвимога, що ускладнює використання для динамічних сторінок. Неправда, хоча IMO - цей прихований шаблон прапорця досить старий, його не важко зрозуміти, і ви можете просто використовувати хеш як частину ідентифікатора в динамічних ситуаціях.
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). Натомість, скоріше за все, було б краще скористатися: check або: 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
Привіт, монір альхуссіні, ласкаво просимо до 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>


-3

Використовуйте "display: none;" attribute.


Привіт @Ajay, дякуємо за твій внесок. Однак ви, мабуть, відповіли лише на половину запитання: ви показали, як це приховати, але не як показати, і перемикаєтесь між двома штатами за допомогою CSS
Чарлі Хардінг,

дисплей: блок; покаже його.
Ajay Munugala

І як ви використовуєте CSS для обробки клацання, перемикання між станами, як задає питання?
Чарлі Хардінг,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.