Czy tekst można ukryć i wyświetlić za pomocą samego CSS (bez kodu JavaScript)? [Zamknięte]


86

Czy można pokazać i ukryć tekst za pomocą linku z samym CSS - bez używania JavaScript w ogóle?

Na przykład: Na tej stronie

Zwróć uwagę na link „Więcej”. Po kliknięciu odsłania tekst. Ten konkretny przykład to JavaScript, ale nie jestem pewien, czy można to zrobić za pomocą czystego CSS.


2
Innym przykładem strony internetowej zawierającej tylko CSS (z menu) jest grc.com (Steve Gibson z Security Now ).
Peter Mortensen

1
Możliwe duplikaty: 1 2
user202729


Spojrzeć tam: Przegubowe Sidebar z CSS tylko Istnieją dwie próbki, jedna wymaga kliknięcia (za pomocą ukrytego pola wyboru), a inny za pomocą aktywowania )
F. Hauri

@ Bliscy wyborcy: Wyjaśnijcie sobie.
Boann

Odpowiedzi:


107

Jest <details>element , który nie jest jeszcze wbudowany w Edge:

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

Nie jestem pewien, jak trudno jest konsekwentnie stylizować w różnych przeglądarkach.

Istnieje powszechny hack dotyczący pól wyboru (w którym pole wyboru można ukryć, a etykieta może wyglądać jak cokolwiek):

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

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

ale nie zawsze (może kiedykolwiek? hmm) jego użycie jest właściwe; zwykle możesz po prostu wrócić do wyświetlania treści, gdy JavaScript się nie ładuje, i mieć do niej link „więcej”.

Jest też :target, ale prawdopodobnie jest to jeszcze mniej odpowiednie, ponieważ trudniej jest wbudować mechanizm zamykający.

#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
Metoda pola wyboru ma wiele uzasadnionych zastosowań. Rozważ formularz, taki jak ten, który wymyśliłem .
misterManSam

7
Zdziwiony, dlaczego myślisz :checkedlub :targetnigdy nie byłbyś odpowiedni. W końcu istnieją.
Konrad Rudolph

@KonradRudolph Jedyne, o czym przychodzi mi do głowy, to idwymóg, który utrudnia korzystanie z dynamicznych stron. Nie jest to dobry powód, chociaż IMO - ten ukryty wzorzec pola wyboru jest dość stary, nietrudny do zrozumienia i możesz po prostu użyć skrótu jako części identyfikatora w dynamicznych sytuacjach.
Izkata

3
@KonradRudolph: rozszerzenie treści za pomocą linku „więcej” może nigdy nie być odpowiednie . W szczególności :target- treść znika, jeśli umieścisz link w innym miejscu. :checkedoznacza, że ​​nie możesz połączyć się wewnątrz rozszerzenia, a jeśli ukryjesz pole wyboru, musisz ustawić fokus na etykiecie za pomocą klawiatury. Ponieważ aby którekolwiek z nich działało, zawartość musi już tam być, po prostu pokazuję ją domyślnie i używam JavaScript, aby zapewnić ulepszenie w większości przypadków.
Ry-

@misterManSam: To nie jest link „więcej”, to jest rzeczywista forma.
Ry-

39

Tak , jest to możliwe z czystym CSS. Możesz kliknąć element, używając :checkedatrybutu pola wyboru w połączeniu z atrybutem <label>elementu for.

Ponieważ pole wyboru można odznaczyć , możesz użyć tego do przełączania widoczności, po prostu dodając visibility: hiddendo elementu pochodzącego z :checked(po ponownym kliknięciu pola wyboru ten pseudo-selektor będzie nieprawidłowy, a selektor CSS nie będzie już pasował do celu).

Można to rozszerzyć do a <label>za pomocą foratrybutu, dzięki czemu można całkowicie ukryć samo pole wyboru i zastosować własny styl <label>bezpośrednio do.

Poniższe wykorzystuje sąsiedni kombinator rodzeństwa ( +) do przełączania klasy togglepo <label>kliknięciu elementu:

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
To właśnie pozwala CSS przejść regułę 110 i zostać uznanym za kompletne Turinga eli.fox-epste.in/rule110
ESR

17

Tak, możesz to łatwo zrobić używając tylko CSS. Proszę zapoznać się z poniższym kodem:

* {
  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

Możesz ukryć pole wyboru, ale pozwolić na jego zaznaczenie / odznaczenie za pomocą skojarzonego z nim <label>elementu.

W zależności od tego, czy pole wyboru jest zaznaczone, czy nie, możesz ukryć / pokazać dodatkowy tekst, a nawet zmienić tekst etykiety z „Więcej” na „Mniej”.

Dodałem kilka dodatkowych szczegółów do CSS, aby intencje każdej definicji były nieco bardziej jasne.

1. Za pomocą jednego przełącznika „Więcej” / „Mniej”:

.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. Z przyciskiem „Więcej” u góry i przyciskiem „Mniej” u dołu:

.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

Z technicznego punktu widzenia możliwe jest przełączanie widoczności tekstu na podstawie kliknięcia przycisku lub łącza, jak pokazano poniżej:

.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>

Biorąc to pod uwagę, zdecydowanie zalecamy zapoznanie się z JavaScriptem, ponieważ rozwiązanie wykorzystujące JavaScript do czegoś takiego jest znacznie prostsze i zapewnia dodatkową elastyczność.


Zależy to od przeglądarki, która skupia się na odnośniku po kliknięciu na niego, czego standard nie wymaga (przynajmniej ostatnio sprawdzałem), a nie wszystkie przeglądarki tak (np. To nie działa w Safari). Zamiast tego prawdopodobnie lepiej byłoby użyć: zaznaczone lub: target.
chridd

10

Tak, możesz to zrobić używając tylko HTML i 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
Cześć monir alhussini, witamy w Stack Overflow. Czy mogę skomentować, jak poprawić swoją odpowiedź? Twój kod działa bardzo dobrze (przynajmniej w mojej przeglądarce), ale w pewnym kontekście dałby lepszą odpowiedź; na przykład, możesz wyjaśnić, w jaki sposób i dlaczego ta proponowana zmiana miałaby rozwiązać problem pytającego, być może dołączając link do odpowiedniej dokumentacji. To uczyniłoby go bardziej użytecznym dla nich, a także bardziej przydatnym dla innych czytelników witryny, którzy szukają rozwiązań podobnych problemów.
Vince Bowdren

3

teraz możesz ukryć / pokazać tekst używając tylko CSS! Jeśli korzystasz z wprowadzania tekstu i chcesz wyświetlić / ukryć tekst na podstawie stanu pola wprowadzania, możesz użyć nowej pseudoklasy CSS :placeholder-showndla <input>lub <textarea>. Oto przykład / demo wspomnianej pseudoklasy !:

/* 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>

Oto link do dokumentów MDN.

Jest to technologia eksperymentalna Przed użyciem jej w środowisku produkcyjnym należy dokładnie zapoznać się z tabelą zgodności przeglądarki.


-1

Może ktoś uzna to rozwiązanie za bardziej intuicyjne i łatwiejsze do wdrożenia. Mechanizm tego polega na tym, że łącze jest skierowane do samego siebie iw takim przypadku łatwo jest wybrać cokolwiek, co będzie następne w 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

Posługiwać się "display: none;" attribute.


Cześć @Ajay, dziękuję za twój wkład. Wydaje się jednak, że odpowiedziałeś tylko na połowę pytania: pokazałeś, jak to ukryć, ale nie jak to odkryć, i przełączać się między dwoma stanami za pomocą CSS
Charlie Harding

Blok wyświetlacza; odkryje to.
Ajay Munugala

A jak używasz CSS do obsługi kliknięcia, do przełączania się między stanami, o których mowa w pytaniu?
Charlie Harding
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.