Metin gizlenebilir ve yalnızca CSS kullanılarak gösterilebilir mi (JavaScript kodu olmadan)? [kapalı]


86

JavaScript kullanmadan sadece CSS içeren bir bağlantı kullanarak metin göstermek ve gizlemek mümkün mü?

Örneğin: Bu sayfada

"Daha Fazla" bağlantısına dikkat edin. Tıkladığınızda metni görünür hale getirir. Bu özel örnek JavaScript, ancak saf CSS ile yapılıp yapılamayacağından emin değilim.


2
Yalnızca CSS içeren bir web sitesinin başka bir örneği (menülerle) grc.com'dur (Steve Gibson of Security Now ).
Peter Mortensen

1
Olası kopyalar: 1 2
user202729


Şuraya bir göz atın: Kenar Çubuğunu Yalnızca CSS ile Değiştirin İki örnek var, biri tıklama gerektiren (gizli onay kutusunu kullanarak) ve diğeri üzerine gelme kullanarak )
F. Hauri

@ Yakın seçmenler: Kendinizi açıklayın.
Boann

Yanıtlar:


107

Henüz Edge'de yerleşik olmayan bir <details>öğe var :

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

Tarayıcılar arasında tutarlı bir şekilde stil oluşturmanın ne kadar zor olduğundan emin değilim.

Yaygın bir onay kutusu saldırısı vardır (burada onay kutusu gizlenebilir ve etiket herhangi bir şeye benzeyecek şekilde tasarlanabilir):

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

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

ama her zaman (belki hiç? hmm) kullanmak uygun değildir; JavaScript yüklenemediğinde genellikle içeriği göstermeye geri dönebilir ve "daha fazla" bağlantısına sahip olabilirsiniz.

Bir de var :target, ama muhtemelen daha az uygun çünkü kapatma mekanizmasını inşa etmek daha zor.

#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
Onay kutusu yönteminin büyük yasal kullanımları vardır. Alay ettiğim bu örnek gibi bir formu düşünün .
misterManSam

7
Neden düşündüğünü :checkedya :targetda asla uygun olmayacağını şaşırdın . Sonuçta varlar.
Konrad Rudolph

@KonradRudolph Aklıma gelen tek şey idgereksinim, dinamik sayfalar için kullanımı zorlaştırıyor. IMO'ya rağmen iyi bir neden değil - bu gizli onay kutusu kalıbı oldukça eski, anlaşılması zor değil ve dinamik durumlarda kimliğin bir parçası olarak bir hash kullanabilirsiniz.
Izkata

3
@KonradRudolph: İçeriği "daha fazla" bağlantıyla genişletmek hiçbir zaman uygun olmayabilir . Özellikle :target- başka bir yere bağlanırsanız içerik kaybolur. :checkedgenişletmenin içine bağlanamayacağınız anlamına gelir ve onay kutusunu gizlerseniz, etiketi klavyeye odaklanabilir yapmanız gerekir. Bunların her ikisinin de çalışması için içeriğin zaten orada olması gerektiğinden, bunu varsayılan olarak gösterir ve çoğu durumda geliştirmeyi sağlamak için JavaScript kullanırdım.
Ry-

@misterManSam: Bu bir "daha fazla" bağlantı değil, bu gerçek bir form.
Ry-

39

Evet , bu saf CSS ile mümkündür. Bir onay kutusu en yararlanarak bir elementin tıklayın edebiliyoruz :checkedbir kombinasyon halinde özniteliği <label>elementin forözniteliği.

Onay kutusu olabileceğinden kontrolsüz , sadece ekleyerek geçiş görünürlük için kullanabilir visibility: hiddenkaynaklanan bir öğeye :checked(onay kutusunu tekrar tıklandığında kez, bu sözde seçici geçersiz olacak ve CSS seçici artık hedef eşleşir).

Bu <label>, forözniteliğin kullanımıyla genişletilebilir , böylece onay kutusunun kendisini tamamen gizleyebilir ve kendi stilinizi <label>doğrudan.

Aşağıdakiler , öğe tıklandığında sınıfı değiştirmek için bitişik kardeş birleştiriciyi ( +) kullanır :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'nin kural 110'u geçmesine izin veren ve Turing complete eli.fox-epste.in/rule110
ESR

17

Evet, bunu yalnızca CSS kullanarak kolayca yapabilirsiniz. Lütfen aşağıdaki koda bakın:

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

Bir onay kutusunu gizleyebilir, ancak ilişkili <label>öğesi aracılığıyla işaretlenmesine / işaretinin kaldırılmasına izin verebilirsiniz .

Onay kutusunun işaretlenip işaretlenmediğine bağlı olarak, ek metni gizleyebilir / gösterebilir ve hatta etiketin metnini "Daha Fazla" dan "Daha Az" a değiştirebilirsiniz.

CSS'ye bazı ek ayrıntılar ekledim, böylece her bir tanımın amacı biraz daha net olabilir.

1. Tek geçişli "Daha Fazla" / "Daha Az" düğmesiyle:

.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. Üstte "Daha Fazla" düğmesi ve altta "Daha Az" düğmesi ile:

.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

Teknik olarak konuşursak, aşağıda gösterildiği gibi, bir düğmeye veya bağlantıya tıkladığınızda metnin görünürlüğünü değiştirmek mümkündür:

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

Bununla birlikte, bunun gibi bir şey için JavaScript kullanarak çözüm olarak çok daha basit ve daha fazla esneklik sağladığından JavaScript'i öğrenmenizi şiddetle tavsiye ederim.


Bu, tarayıcının bağlantıya tıkladığınızda, standardın gerektirmediği (en azından son kontrol ettiğimde) ve tüm tarayıcıların yapmadığı (örneğin, bu Safari'de çalışmıyor) bağlantıya odaklanan tarayıcıya bağlıdır. Bunun yerine: işaretlendi veya: hedef kullanılması muhtemelen daha iyi olacaktır.
chridd

10

Evet, bunu yalnızca HTML ve CSS kullanarak yapabilirsiniz.

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
Merhaba monir alhussini, Stack Overflow'a hoş geldiniz. Cevabınızı nasıl geliştirebileceğime dair bir yorum yapabilir miyim? Kodunuz çok iyi çalışıyor (en azından benim tarayıcımda), ancak bazı bağlamlarda daha iyi bir cevap olabilir; örneğin, önerilen bu değişikliğin soruyu soran kişinin sorununu nasıl ve neden çözeceğini açıklayabilirsiniz, belki ilgili belgelere bir bağlantı da ekleyerek. Bu, onlar için daha yararlı ve aynı zamanda benzer sorunlara çözüm arayan diğer site okuyucuları için daha yararlı olacaktır.
Vince Bowdren

3

artık sadece CSS kullanarak da metni gizleyebilir / gösterebilirsiniz! Metin girişi kullanıyorsanız ve giriş kutusunun durumuna bağlı olarak metni göstermek / gizlemek istiyorsanız, veya :placeholder-showniçin yeni CSS sözde sınıfını kullanabilirsiniz . İşte yukarıda bahsedilen sözde sınıfın bir örneği / demosu !:<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>

İşte MDN Dokümanlarına Bağlantı .

Bu deneysel bir teknolojidir Bunu üretimde kullanmadan önce Tarayıcı uyumluluk tablosunu dikkatlice kontrol edin.


-1

Belki birileri bu çözümü daha sezgisel ve uygulaması daha kolay bulacaktır. Bunun mekaniği, bağlantının kendisini hedeflemesidir ve bu durumda, DOM'da sonraki her şeyi seçmenin kolay olmasıdır.

.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

Kullanım "display: none;" attribute.


Merhaba @Ajay, katkınız için teşekkürler. Ancak, sorunun yalnızca yarısını yanıtlamış görünüyorsunuz: nasıl gizleyeceğinizi gösterdiniz, ancak nasıl göstereceğinizi göstermediniz ve CSS ile iki durum arasında geçiş
Charlie Harding

Ekran bloğu; onu gösterecek.
Ajay Munugala

Ve soru sorulduğunda, bir tıklamayı işlemek, durumlar arasında geçiş yapmak için CSS'yi nasıl kullanıyorsunuz?
Charlie Harding
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.