Is it possible to draw lines/shapes (see example) within a :before pseudo-element?
I was thinking about the canvas uses in CSS, but after some research, I came to the conclusion that canvas within pseudo elements is just not possible.
Is there another way?
            Asked
            
        
        
            Active
            
        
            Viewed 172 times
        
    0
            
            
        2 Answers
0
            
            
        I solved the problem by creating a canva element at the beginning of my div and giving it the same properties as the ::before would have, so I could draw on it and stretch the width and height of the canva to 100% through the css. Here's the code(I used 2000 width and height on canva element to not result in a drawing with low resolution):
Put this inside the div:
<canvas id="myCanvas" width="2000" height="2000">
        <script>
        var canvas = document.getElementById("myCanvas");
        var ctx = canvas.getContext("2d");
        
        // Create gradient
        var grd = ctx.createLinearGradient(0, 2000, 2000, 0);
        grd.addColorStop(0, "#121214");
        grd.addColorStop(1, "#580082");
        ctx.fillStyle = grd;
        
        // Path
        ctx.beginPath()
        ctx.lineWidth = "1";
        ctx.moveTo(0, 0);
        ctx.lineTo(2000, 0);
        ctx.lineTo(2000, 1920);
        ctx.lineTo(1000, 1998);
        ctx.lineTo(0, 1920);
        ctx.lineTo(0, 0);
        ctx.fill()
        </script>
    </canvas>
then, the css:
canvas {
      position: absolute;
      left: 0;
      bottom: 0;
      width: 100%;
      height: 120%;
      z-index: -1;
  }
The result was this beautiful background with purple gradient and V shape that saved me 1.2MB compared to the PNG i was using:
 
    
    
        xandekoch
        
- 11
- 1
0
            
            
        You can't use <canvas> in the pseudo element, but you can use an SVG. See this answer: https://stackoverflow.com/a/19255455/7172604
 
    
    
        Stuart Nichols
        
- 1,026
- 1
- 8
- 11

 
     
    