How to highlight an object when a mouse is hovered over it using FabricJS?


We can create a Polygon object by creating an instance of fabric.Polygon. A polygon object can be characterized by any closed shape consisting of a set of connected straight line segments. Since it is one of the basic elements of FabricJS, we can also easily customize it by applying properties like angle, opacity etc. FabricJS provides us with an extensive set of events with which we can create different effects.

Since we want the change to occur when the mouse is hovered, we will use the mouse:move event which is fired when the mouse is moved. Our second requirement is to highlight an object which can be achieved by using the opacity property, however, when there are many objects on the canvas and we want to highlight the one being hovered over, we need to use the forEachObject method. This method, runs a for-each loop for a given function thereby executing it for each object.

Syntax

forEachObject( callback: function, context: object ): Self

Parameters

  • callback − This property accepts a function which is invoked with current object as first argument, index as the second and an array of all objects as the third.

  • context − This property accepts an Object which denotes the context in which to call the callback function.

Example 1: Displaying Highlight Effect with only One Object

Let’s see a code example to see how we can add the highlight effect when we have only one object on the canvas. We have attached the mouseover and mouseout event onto the polygon object (which in this case is a triangle). mouseover is executed when mouse is moved over object and mouseout is executed when hovered out of the object. As soon as we move the cursor onto the element, its opacity changes from 0.5 to 1 and vice versa.

<!DOCTYPE html>
<html>
<head>
   <!-- Adding the Fabric JS Library-->
   <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/510/fabric.min.js"></script>
</head>
<body>
   <h2>Displaying highlight effect with only one object</h2>
   <p>
      You can see that the object is being highlighted when the cursor is moved onto the element
   </p>
   <canvas id="canvas"></canvas>
   <script>
      
      // Initiate a canvas instance
      var canvas = new fabric.Canvas("canvas");
      canvas.setWidth(document.body.scrollWidth);
      canvas.setHeight(250);
      
      // Initiating a points array
      var points = [
         { x: 30, y: 50 },
         { x: 0, y: 0 },
         { x: 60, y: 0 },
      ];
      
      // Initiating a polygon object
      var triangle = new fabric.Polygon(points, {
         left: 100,
         top: 40,
         fill: "#1e90ff",
         strokeWidth: 4,
         stroke: "green",
         flipY: true,
         scaleX: 2,
         scaleY: 2, 
         opacity: 0.5,
      });
      
      // Adding it to the canvas
      canvas.add(triangle);
      
      // Using mouseover event
      triangle.on("mouseover", () => {
         triangle.set("opacity", 1);
         canvas.renderAll();
      });
      
      // Using mouseout event
      triangle.on("mouseout", () => {
         triangle.set("opacity", 0.5);
         canvas.renderAll();
      });
   </script>
</body>
</html>

Example 2: Displaying Highlight Effect with Multiple Objects

In this example, we will see how we can highlight an object when the mouse is hovered over it. Every time the mouse moves, the mouse:move event is fired. Here we have calculated the distance by using the "x" and "y" positions of the mouse pointer and using the mathematical distance formula to calculate the distance between two points in the coordinate plane. This distance is further divided by 50 which is an arbitrary number which makes the ( dist/50 ) fraction smaller(we know that as the denominator gets bigger, the fraction gets smaller) such that when it is further divided by 1, we get a greater value and the opacity is increased.

<!DOCTYPE html>
<html>
<head>
   <!-- Adding the Fabric JS Library-->
   <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/510/fabric.min.js"></script>
</head>
<body>
   <h2>Displaying highlight effect with multiple objects</h2>
   <p>
      You can see that an object is being highlighted only when the cursor is moved onto the element and is depended on the distance
   </p>
   <canvas id="canvas"></canvas>
   <script>
      
      // Initiate a canvas instance
      var canvas = new fabric.Canvas("canvas");
      canvas.setWidth(document.body.scrollWidth);
      canvas.setHeight(250);
      
      // Initiating a points array
      var points = [
         { x: 30, y: 50 },
         { x: 0, y: 0 },
         { x: 60, y: 0 },
      ];
      
      // Initiating a polygon object
      var triangle = new fabric.Polygon(points, {
         left: 100,
         top: 40,
         fill: "#1e90ff",
         strokeWidth: 4,
         stroke: "green",
         flipY: true,
         scaleX: 2,
         scaleY: 2,
         opacity: 0.5,
      });
      
      // Adding it to the canvas
      canvas.add(triangle);
      
      // Using clone method
      triangle.clone(function (c) {
         canvas.add(
            c.set({
               left: 500,
               top: 79,
               angle: 15,
               scaleX: 0.7,
               scaleY: 0.7,
               fill: "red",
            })
         );
      });
      
      // Using clone method
      triangle.clone(function (c) {
         canvas.add(
            c.set({
               left: 340,
               top: 90,
               angle: -15,
               scaleX: 2,
               scaleY: 2,
               fill: "black",
            })
         );
      });
      
      // Using clone method
      triangle.clone(function (c) {
         canvas.add(
            c.set({
               left: 280,
               top: 190,
               angle: 21,
               scaleX: 0.9,
               scaleY: 0.9,
               fill: "#ffa500",
            })
         );
      });
      
      // Using mouse:move event
      canvas.on("mouse:move", (options) => {
        
        // Get the mouse coordinates
         var p = canvas.getPointer(options.e);
         canvas.forEachObject(function (obj) {
            
            // Get distance between objects and mouse pointer
            var distX = Math.abs(p.x - obj.left),
            distY = Math.abs(p.y - obj.top),
            dist = Math.round(
               Math.sqrt(Math.pow(distX, 2) + Math.pow(distY, 2))
            );
            
            // Update the opacity as a proportion of distance
            obj.set("opacity", 1 / (dist / 50));
         });
         canvas.renderAll();
      });
   </script>
</body>
</html>

Conclusion

In this tutorial, we used two simple examples to demonstrate how to highlight an object when a mouse is hovered over it using FabricJS.

Updated on: 02-Jan-2023

963 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements