Ik vraag me af of dit mogelijk is. Bijvoorbeeld deze icoontjes:

<a href="#"><span class="fa fa-star" style="color:gold;"></a>
<a href="#"><span class="fa fa-star" style="color:gold;"></a></span>
<a href="#"><span class="fa fa-star" style="color:gold;"></a></span>
<a href="#"><span class="fa fa-star" style="color:gold;"></a></span>
<a href="#"><span class="fa fa-star-o" style="color:gold;"></a></span>

Is het mogelijk als je de muis op het icoontje houd, dat het icoontje in fa fa-star-o verandert wordt?
En als dit mogelijk is. Hoe?
Je moet het aantal gekozen sterren ook door geven. Nu blijft het alleen bij 'eye-candy'.
Dat is deel 2. Maar dat wordt idd javascript (iets met onmouseover of onclick).
Het leuke van jQuery is dat je daarmee vrij makkelijk gedrag kunt definiëren voor HTML-elementen. Hiermee is het vervolgens mogelijk om exotische formulier-elementen te bouwen, die ook nog eens HERBRUIKBAAR zijn.

Bijvoorbeeld als volgt:
<!-- @see https://www.phphulp.nl/php/forum/topic/verander-fa-fa-icon-bij-muis-overlay/102031 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>star rating</title>
<!-- grab jQuery -->
<script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
<!-- some CSS -->
<style type="text/css">
div.rating div.star         { display: block; float: left; width: 50px; height: 50px; border: 1px solid #000000; }
div.rating div.active       { background-color: #ffcc00; }
div.rating div.inactive     { background-color: #ffffff; }
div.clear                   { clear: both; }
</style>
</head>

<body>
<form>
    <!-- start of the star rating form element -->
    <div class="rating" id="rating_one">
        <div class="star" data-rating="1"></div>
        <div class="star" data-rating="2"></div>
        <div class="star" data-rating="3"></div>
        <div class="star" data-rating="4"></div>
        <div class="star" data-rating="5"></div>
        <div class="clear"><!-- clear --></div>
    </div>
    <input type="hidden" name="rating_one" id="rating_one_value" value="0">
    <!-- end of the star rating form element -->
    <!-- you can make as many of these as you like, as long as they can be uniquely identified and are initialised (see below) -->

    <div class="rating" id="rating_two">
        <div class="star" data-rating="1"></div>
        <div class="star" data-rating="2"></div>
        <div class="star" data-rating="3"></div>
        <div class="star" data-rating="4"></div>
        <div class="star" data-rating="5"></div>
        <div class="clear"><!-- clear --></div>
    </div>
    <input type="hidden" name="rating_two" id="rating_two_value" value="0">

    <div class="rating" id="rating_three">
        <div class="star" data-rating="1"></div>
        <div class="star" data-rating="2"></div>
        <div class="star" data-rating="3"></div>
        <div class="star" data-rating="4"></div>
        <div class="star" data-rating="5"></div>
        <div class="clear"><!-- clear --></div>
    </div>
    <input type="hidden" name="rating_three" id="rating_three_value" value="0">
</form>

<script type="text/javascript">
//<![CDATA[
// define behaviour of a star rating form element
function MyStarRating() {
    this.container  = false; // identifying the block, the value is stored in a hidden field with the same name and the suffix _value
    this.valueField = false;
    this.ticked     = 0; // which star is ticked

    var that = this; // reference to this for listeners

    // call with 'id' (required), 'stars' (optional)
    this.init = function(options) {
        // init container id
        this.container = $('#'+options.id);
        // init hidden value field id
        this.valueField = $('#'+options.id+'_value');

        // init selected stars (default none)
        if (options.stars) {
            var stars = options.stars;
            this.selectStar(stars);
            this.drawStars(stars);
        }

        // add listener for hovering
        this.container.on('mouseover', 'div', function(e) {
            var n = $(this).data('rating');
            // if we already ticked something, keep drawing at least as many stars
            if (that.ticked > n) {
                n = that.ticked;
            }
            that.drawStars(n);
        }); // mouseover

        // add listener for clicking
        this.container.on('click', 'div', function(e) {
            var n = $(this).data('rating');
            // did we tick this star before, then reset
            if (n == that.ticked) {
                that.selectStar(0);
            } else {
                that.selectStar(n);
            }
            that.drawStars(that.ticked);
        }); // click

        // add listener for moving out
        this.container.on('mouseout', 'div', function(e) {
            // if we did not click anything, clear all stars (that.ticked will be zero)
            that.drawStars(that.ticked);
        }); // mouseout
    } // init

    // helper function for filling stars
    this.drawStars = function(n) {
        // reset colors
        this.container.children().each(function() {
            if ($(this).data('rating') <= n) {
                $(this).addClass('active');
            } else {
                $(this).removeClass('active');
            }
        });
    } // drawStars

    // helper function for selecting a star
    this.selectStar = function(n) {
        // update ticked
        this.ticked = n;
        // update value field
        this.valueField.val(n);
    } // selectStar
} // MyStarRating

$().ready(function() {
    // create a new star rating
    var rating_one = new MyStarRating();
    // init the star rating form field and hook up listeners
    rating_one.init({'id':'rating_one'});
    // and we are off!

    var rating_two = new MyStarRating();
    rating_two.init({'id':'rating_two'});

    var rating_three = new MyStarRating();
    rating_three.init({'id':'rating_three', 'stars':'5'}); // init with 5 stars
});
//]]>
</script>
</body>
</html>


> werkend voorbeeld

thxcomeagain
@Thomas van den Heuvel mensen die nog een <div class="clear"> gebruiken neem ik niet eens serieus.

@Joakim Broden

Ik heb eerlijk gezegd een beetje moeite met dat soort opmerkingen.

We zitten op een forum om elkaar constructieve feedback te geven, en niet om andere forumleden af te zeiken. En dat laatste is wat jij hier lijkt te doen.

Er zit in jouw opmerking geen enkele vorm van opbouwende kritiek of advies hoe jij het zelf dan zou oplossen. In plaats daarvan ben je alleen maar bezig om iemand naar beneden te halen en dat siert je eerlijk gezegd niet.

Daarnaast geeft de opmerking 'dat je iemand die <div class="clear"> gebruikt niet eens serieus neemt' aan dat je blijkbaar niet in staat bent om de gehele code op waarde te schatten. In plaats daarvan pik je er nu 1 elementje uit waarvan je waarschijnlijk ooit ergens gelezen hebt dat je dat beter niet kunt gebruiken, terwijl het in dit voorbeeld prima volstaat. Kortom datgene wat je zegt, slaat dus ook nog eens totaal nergens op.

Ik vind het prima hoor dat je reageert, maar laat het de volgende keer a.u.b een wat zinvoller opmerking zijn. Hier schiet niemand iets mee op.
** quote knip **
Met jou reactie ook niet, hier heb je moderators voor. En ja, als iemand een een 'clear' div gebruikt weet ik inderdaad voldoende. 'Terwijl het in dit voorbeeld prima volstaat', zou betekenen dat ik het ook in tabellen kan doen. Omdat iets kan betekend niet dat het volstaat. Maar he, jij weet over het algemeen vaak beter :-)

Aangezien ik mijn vorige bericht niet kan wijzigen. Hier een CSS voorbeeldje van hoe het kan zonder gebruik te maken van Javascript (voeg dit samen met het antwoord van Frank Nietbelangrijk en klaar).


<!DOCTYPE html>
<html>
	<head>
		<title>Page Title</title>
		<style type="text/css">
		    .rating {
		        width: 260px;
		    }
		    
		    .rating::after {
		        display: block;
		        height: 0;
		        clear: both;
		    }
		    
            .rating .star {
                float: right;
                display: block;
                width: 50px;
                height: 50px;
                border: 1px solid #000000;
            }
            
            .rating .star:hover {
                background-color: yellow;
            }
            
            .rating .star:hover ~ .star {
                background-color: yellow;
            }
        </style>
	</head>
	<body>
		<div class="rating">
            <div class="star"></div>
            <div class="star"></div>
            <div class="star"></div>
            <div class="star"></div>
            <div class="star"></div>
        </div>
	</body>
</html>


@Thomas want hij wou graag een werkend iets.


<!DOCTYPE html>
<html>
    <head>
        <title>Page Title</title>
        <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css">
        <style type="text/css">
            .rating {
                direction: rtl;
                text-align: left;
            }
            
            .rating .star {
                display: inline-block;
                color: gold;
            }
            
            .rating .star::before,
            .rating .star::before {
              content: '\f006';  
            }

            .rating .star:hover::before,
            .rating .star.active::before {
              content: '\f005';  
            }
            
            .rating .star:hover ~ .star::before,
            .rating .star.active ~ .star::before {
                content: '\f005';
            }
        </style>
        <script src="//code.jquery.com/jquery-3.3.1.min.js"></script>
        <script type="text/javascript">
        	$.fn.rating = function(options) {
                return this.each(function() {
                    var settings = $.extend({
                        star        : '.star',
                        activeCls   : 'active',
                        input       : 'input'
                    }, options);
                
                    var $this   = $(this),
                        $stars  = $(settings.star, $this),
                        $input 	= $(settings.input, $this),
                        current = parseInt($input.val());
                
                    if (current !== 0) {
                        $stars.eq($stars.length - current).addClass(settings.activeCls);
                    }
                
                    $stars.on('mouseover', function() {
                        $stars.removeClass(settings.activeCls).filter(this).addClass(settings.activeCls);
                        
                        $input.val($stars.length - $(this).index());
                    });
                });
            };
            
            $(document).ready(function() {
                $('.rating').rating();
            });
        </script>
    </head>
    <body>
        <div class="rating">
            <i class="fa star"></i>
            <i class="fa star"></i>
            <i class="fa star"></i>
            <i class="fa star"></i>
            <i class="fa star"></i>
            <input type="hidden" name="rating-1" />
        </div>
        <div class="rating">
            <i class="fa star"></i>
            <i class="fa star"></i>
            <i class="fa star"></i>
            <i class="fa star"></i>
            <i class="fa star"></i>
            <input type="hidden" name="rating-2" value="3" />
        </div>
    </body>
</html>
Schitterend, alleen het doét niets. Op den duur zul je dit ergens aan moeten koppelen zodat het ook werkt en niet alleen maar mooi oogt.

De code hierboven (van mij) was een proof-of-concept. Toch een aardige score als je op een lap code van 144 regels enkel je beklag doet over een div hier of daar "teveel". Tenzij je niet verder las dan die regel die je blijkbaar mateloos triggerde. In dat geval doe je jezelf echt tekort of ben je gewoon een beetje snobistisch bezig.

En als je naar de JavaScript had gekeken dan had je hier wellicht een recept in kunnen zien voor het bouwen van andere geavanceerde formulier-elementen die, zoals gezegd, ook nog eens prima herbruikbaar zijn.

Maar nee, die ene HTML-regel, dat is echt onacceptabel... Hoe kortzichtig kun je zijn? Gebruik gewoon de dingen die je wilt gebruiken en doe de rest lekker op je eigen superieure manier.

Reageren