Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

88
Views
Text appear/disappear on top of image with button toggle

In mobile, I'm trying to create a toggle that appears on top of an image, that when tapped on, makes text appear on top of the image too.

I basically want to recreate how The Guardian newspaper handles the little (i) icon in the bottom right corner on mobile.

And on desktop, the the text is there by default under the image and the (i) icon is gone.

So far I've managed to find a similar solution elsewhere online but it's not quite working right as I need it to.

function toggleText() {
   var text = document.getElementById("demo");
   if (text.style.display === "none") {
      text.style.display = "block";
   } else {
      text.style.display = "none";
   }
}
#blog {
    width: 100%;
}

#blog figure {
    position: relative;
}

#blog figure figcaption {
    display: none;
    position: absolute;
    bottom: 0;
    left: 0;
    box-sizing: border-box;
    width: 100%;
    color: black;
    text-align: left;
    background: rgba(0, 0, 0, 0.5);
}

#blog figure button {
    position: absolute;
    bottom: 0;
    right: 0;
    color: black;
    border: 5px solid black;
}
<div id="blog">
  <figure> 
    <img src="https://cdn2.hubspot.net/hubfs/4635813/marble-around-the-world.jpg" alt="A photo of a slab of marble for example">
    <figcaption id="demo" style='display: none'>A photo of a slab of marble for example</figcaption>
    <button type='button' onclick="toggleText()">(i)</button>
  </figure>
</div>

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

  • Don't use IDs. Your code should be reusable!
  • Don't use inline JS on* handlers, use Element.addEventListener() instead
  • Don't use inline style attributes.
  • Don't use el.style.display === "something" to check for display styles. Use Element.classList.toggle() instead

This straightforward example uses JavaScript to simply toggle a className "is-active" on the button's parent, the figure Element.
Everything else (icon symbol change, caption animation etc...) is handled purely by CSS:

document.querySelectorAll("figure button").forEach(EL_btn => {  
  EL_btn.addEventListener("click", () => {
    EL_btn.closest("figure").classList.toggle("is-active");
  });
});
/* QuickReset */ * {margin: 0; box-sizing: border-box;}

img {
  max-width: 100%; /* Never extend images more than available */
}

figure {
  position: relative;
  overflow: hidden; /* overflow hidden to allow figcaption hide bottom */
}

figure img {
  display: block; /* prevent "bottom space" caused by inline elements */
}

figure figcaption {
  position: absolute;
  width: 100%; 
  bottom: 0;
  padding: 1rem;
  padding-right: 4rem; /* Prevent text going under the button icon */ 
  color: #fff;
  background: rgba(0, 0, 0, 0.5);
  transform: translateY(100%); /* Move down, out of view */
  transition: transform 0.3s; /* Add some transition animation */
}

figure.is-active figcaption {
  transform: translateY(0%); /* Move into view */
}

figure button {
  position: absolute;
  width: 2rem;
  height: 2rem;
  bottom: 0.5rem;
  right: 0.5rem;
  border-radius: 50%;
  color: #fff;
  background: rgba(0, 0, 0, 0.5);
  border: 0;
  cursor: pointer;
}
figure button::before {
  content: "\2139"; /* i icon */
}

figure.is-active button::before {
  content: "\2A09"; /* x icon */
}
<figure>
  <img src="https://cdn2.hubspot.net/hubfs/4635813/marble-around-the-world.jpg" alt="A photo of a slab of marble for example">
  <figcaption>A photo of a slab of marble for example</figcaption>
  <button type="button"></button>
</figure>

The above will work for any number of such elements on your website without the need to add any more CSS or JS.

about 4 years ago · Juan Pablo Isaza Report

0

I see a couple things that could mess this up, one is the fact that there is nothing to make your image adjust to your mobile screen, more-over there is also margin that is there by default, so I suggest these changes to the CSS:

First I'd set box-sizing to border-box and margin to 0, this should be a regular practice by the way.

*{

  box-sizing: border-box;
  margin: 0;

}

Then select the image and make it adjust to your page as such


#blog figure img{
  height: auto;
   width:100%;
}

Finally, for some styling you can add some padding to your blog div to make the image slightly smaller on your screen

#blog {
    width: 100%;
    padding: 35px;
}

This is the Fiddle for it.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!