Using CSS :after or :before to access real-time data from HTML elements without the need for JavaScript. Pure CSS magic

Welcome and thank you for taking the time to read this.

Firstly, I want to mention that I am unable to utilize JavaScript. It is against our policy to use any code that requires ongoing maintenance due to the large number of websites we manage for numerous clients internally. Any code that needs regular upkeep is strongly discouraged, and despite my attempts to advocate otherwise, I do not have the authority to change this.

That being said, one of our clients has requested the inclusion of icons to represent different topics. The idea is that when a user hovers over an icon, there will be an overlay displaying the text associated with that particular topic.

For example, if the topic is 'Fruit', there would be an image of a banana representing it. When the mouse hovers over the banana image, an overlay with the word 'Fruit' would appear in the center.

The focus here is not on the overlay or the icon itself.

My question is whether it is possible to retrieve the topic name and display it in the :after pseudo-element:

<div class="topic-icon><img src="icon-image"></div>
<div class="topic-label>Fruit</div>

In hypothetical code, this is what I am attempting to achieve:

.topic-icon:after {content: '[Topic Label]'};

I am working within Drupal and can adjust the HTML as required. Is it feasible to fetch the topic label in the following manner:

<div class="topic-icon" topic="Fruit"><img src=....></div>

Perhaps using CSS similar to the following:

.topic-icon:after {content: '[Topic]'};

I hope I have explained myself clearly.

Please let me know if implementing something like this is a viable option.

Answer №1

To create a pseudo class, use the :hover::after selector and set the content to attr(topic)

.topic-icon {
  position: relative;
  display: inline-block;
}

.topic-icon:hover::after {
  content: attr(topic);

  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  
  background-color: rgba(0, 0, 0, 0.5);
  color: white;
}
<div class="topic-icon" topic="Fruit">
  <img src="https://cdn.iconscout.com/icon/free/png-256/banana-1624204-1375362.png" width="64" height="64">
</div>

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Creating a scrollable table with CSS: A step-by-step guide

My table has too many columns causing it to exceed the width of the screen. I would like to make it scrollable horizontally for a neater and more organized appearance. I believe CSS with the overflow hidden property can achieve this, but I am unsure where ...

Monitor File Tool for JetBrains IDE - CSS Optimization Setup - Streamline CSS Automatically

Utilizing the File Watcher tool in Jetbrains IDE (Webstorm and Rider) to automatically minify .css files and generate corresponding .min.css files for the entire project has been my goal. However, a challenge arises when it starts minifying files that alr ...

Is there a way to shift a button within a div to the right while maintaining alignment?

After spending hours on this problem, I attempted to use "float: right" and successfully moved the button to the right. However, in doing so, the tag is no longer vertically centered. Can someone please assist me with this? Also, if there are multiple sol ...

Using justify-content-between in a div container with only two items will not produce the desired effect

I'm having trouble aligning two elements on opposite ends of a div container using Bootstrap's justify-content-between class. The h4 element is not on the left and the button on the right as expected. I am using Bootstrap 5.2.3. Can anyone help m ...

Can Bootstrap be used to emphasize changed input text?

Is there a feature or customizable tool that can visually highlight input elements when they have been changed? This could involve applying a distinguishing visual cue, such as an orange border, to any input that no longer contains its default value. To ...

When the React js application is opened in a hosted environment, the CSS styling may be overridden

My React js application is hosted within another application. When a jQuery dialog opens, the React application also launches. While the functionality works correctly, some of the CSS styles are appearing incorrectly. I suspect that either the CSS from the ...

Attempting to include a navigation bar within the footer section of my layout page - the master page on my website

Is there a way to add a navigation bar in my footer on the layout page without having to add it to every individual page? I want the icon color for the active page to be red, but only apply this to the current page and not all pages. Currently, when I nav ...

The container is not adjusting to the screen size correctly and the flex-direction: row is not functioning as

Struggling with setting up a basic layout in Angular for my application. While I have experience with Angular, the actual HTML/CSS design is new to me. No matter what I try, I can't seem to get this container to take up the whole screen width. Variou ...

Is it possible to enable the position:sticky property to function within an iframe by synchronizing it with the scrolling of the parent document

One challenge I'm facing is ensuring that the <footer> within an <iframe> remains sticky at the bottom, even when the <iframe> doesn't have a scrollbar. This should be based on the scroll behavior of the parent document. Import ...

Top tips for utilizing CSS in a web component library to support various themes

Our team is currently in the process of developing a comprehensive design system that will be utilized across multiple projects for two distinct products. Each product operates with its own unique brand styleguide which utilizes design tokens, such as: Th ...

Steps to take to save an HTML element as a PNG

Unique content: I am looking to convert a standard HTML element into an image on an HTML canvas for my website project. I am currently working on creating a website that involves displaying various elements on the screen. One of the key requirements is b ...

How can you prevent an element from overflowing when employing window.pageYOffset and using a switch case to alter the background color at specified pixel thresholds?

I want the <body> element's background-color to change every 500px as I scroll down. I've scoured the web for answers, but still can't figure out what's going wrong. Please review the code. However, Firefox Browser indicates that ...

The text in the form's text area refuses to wrap onto multiple lines, it just continues to roll endlessly

I'm encountering an issue with a form on my client's website, specifically in the footer and contact page. For some reason, the text area box in the form does not automatically move to a new line when it reaches the end of the box - it just keeps ...

By default, use jQuery to load the content of a div

Upon page load, I am looking to display the content within #destiny2. This section includes text and images, as well as additional content for three categories. Initially, the first category should be shown without requiring a click. Subsequently, clicking ...

Synchronize two div elements with JavaScript

The demonstration features two parent divs, each containing a child div! The first parent div's child div is draggable and resizable using JQueryUI. There are events for both dragEnd and resizeEnd associated with this div. The goal is to synchronize ...

What is the best way to conceal the jqgrid entirely while it is still loading?

Having an issue with my jqgrid. As I load the table and fetch a large amount of data from the database, the loading process naturally takes a few seconds. However, during this time, I can see the column headers without any rows or styles applied to the jqg ...

Setting the variable to global does not apply styling to the element

Looking for help with styling an element created using document.createElement("img")? let fireball; //global variable fireball = document.createElement("img") //variable on local fireballArray.push(someFunction(fireball, { src: "img.png&qu ...

What is the best way to divide my HTML page in half?

My goal is to display two maps side by side, one on the right and the other on the left. However, when I try to implement this, one map appears on top of the other. I believe that CSS positioning can help me achieve the desired layout, but as a beginner in ...

Troubleshooting a CSS layout problem: Organizing a webpage layout using CSS that includes an

I am currently facing an issue with arranging a container inline and it seems like there is something missing in my CSS code. After applying float:right, the class "second" does not seem to work as expected. Here's how my container is structured: &l ...

What is the best way to align a collection of search bars with HTML and CSS?

Can someone help me align my search bars and submit buttons? I'm new to HTML and struggling with this task. (By the way, this is just a small part of the browser layout, it doesn't usually look so messy!) .center-block{ margin-top: 220px; ...