jquery html css svg css-shapes

jquery - Creación de una etiqueta con punta ''nueva'' con ráfaga de punto 24 o superior



html css (4)

Estoy tratando de hacer que un punto explote como la imagen a continuación:

Actualmente, he intentado esto usando pseudo elementos, sin embargo, solo pude generar una ráfaga de 12 puntos y no refleja lo que se muestra dentro de la imagen.

¿Hay alguna forma de crear una explosión de puntos con solo unos pocos elementos?

A continuación se muestra el código que he usado para intentar esta solución:

div{ width:100px; height:100px; background:grey; transform:rotate(45deg); margin:50px; } div:after{ position:absolute; content:""; background:grey; width:100px; height:100px; transform:rotate(135deg); } div:before{ position:absolute; content:""; background:grey; width:100px; height:100px; transform:rotate(250deg); }

<div></div>


SVG

Utilicé una sola punta como la forma (La forma roja) Ponla dentro de defs para que no se muestre.
Luego reutilizó la forma de la punta varias veces y la giró con su origen de rotación establecido en la parte inferior de la forma.
Esto crea un círculo como forma con bordes afilados.

.POW { width: 250px; height: 250px; border: 1px solid black; }

<svg class="POW" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <defs> <polygon id="spike" points="0,0, -10,-25 0,-50 10,-25"></polygon> </defs> <g class="spikes"> <use x="50" y="50" xlink:href="#spike" transform="rotate(20 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(40 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(60 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(80 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(100 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(120 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(140 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(160 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(180 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(200 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(220 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(240 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(260 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(280 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(300 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(320 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(340 50 50)" /> <use x="50" y="50" fill="red" xlink:href="#spike" transform="rotate(360 50 50)" /> </g> </svg>

Puede crear fácilmente cualquier cantidad de picos con esta solución. Solo tiene la división apropiada en la rotación:

24 puntos

.POW { width: 250px; height: 250px; border: 1px solid black; }

<svg class="POW" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <defs> <polygon id="spike" points="0,0, -10,-25 0,-50 10,-25"></polygon> </defs> <g class="spikes"> <use x="50" y="50" xlink:href="#spike" transform="rotate(0 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(15 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(30 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(45 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(60 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(75 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(90 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(105 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(120 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(135 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(150 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(165 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(180 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(195 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(210 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(225 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(240 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(240 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(255 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(270 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(285 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(300 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(315 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(330 50 50)" /> <use x="50" y="50" fill="red" xlink:href="#spike" transform="rotate(345 50 50)" /> </g> </svg>

48 puntos

.POW { width: 250px; height: 250px; border: 1px solid black; }

<svg class="POW" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <defs> <polygon id="spike" points="0,0, -10,-25 0,-50 10,-25"></polygon> </defs> <g class="spikes"> <use x="50" y="50" xlink:href="#spike" transform="rotate(7.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(15 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(22.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(30 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(37.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(45 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(52.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(60 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(67.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(75 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(82.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(90 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(97.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(105 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(112.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(120 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(127.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(135 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(142.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(150 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(157.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(165 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(172.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(180 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(187.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(195 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(202.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(210 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(217.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(225 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(232.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(240 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(247.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(255 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(262.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(270 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(277.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(285 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(292.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(300 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(307.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(315 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(322.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(330 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(337.5 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(345 50 50)" /> <use x="50" y="50" xlink:href="#spike" transform="rotate(352.5 50 50)" /> <use x="50" y="50" fill="red" xlink:href="#spike" transform="rotate(360 50 50)" /> </g> </svg>

La forma de calcular el ángulo es dividiendo los puntos con 360.
Como: 360/48 = 7.5, por lo que cada ángulo debe ser 7.5.

  1. 7.5
  2. 15,0
  3. 22,5
  4. 30
  5. 37,5
    etc.

Enfoque de lienzo

También puede lograr esto usando Canvas. Los comandos para dibujar en Canvas son más o menos los mismos que en SVG. El enfoque, en un nivel muy alto, sería encontrar puntos en dos círculos (uno con radio como xy otro con un radio un poco más pequeño) y luego conectarlos para formar un camino. Cuando se llena el camino, da la apariencia de una explosión de n puntos.

En el diagrama a continuación, el círculo verde es el círculo más grande con radio como x y el círculo azul es el círculo interno más pequeño. Al trazar puntos en los círculos y conectarlos (con los comandos lineTo ), obtenemos la ruta que está en rojo. Cuando este camino se llena, tenemos la apariencia de explosión. ( Nota: Los círculos internos y externos son solo para ilustración y no están dibujados en el diagrama real).

Lógica de cálculo

  • Las coordenadas X e Y de cada punto en el círculo se pueden calcular utilizando la siguiente fórmula:
    • x = (Radio del círculo * Cos (ángulo en radianes)) + x coordenada del centro
    • y = (Radio del círculo * Sin (ángulo en radianes)) + coordenada y del centro
  • El ángulo en el que se trazan los puntos en el círculo se determina utilizando la siguiente lógica:
    • Como se usa en las respuestas de usted y Persijn, el ángulo se calcula como (360 / no. De ráfagas). 360 se usa porque es el ángulo total dentro de un círculo.
    • El ángulo de los puntos en el círculo interno debe estar a medio camino entre el punto 1 y el punto 2 en el círculo más grande y, por lo tanto, se le agrega un delta. El delta es la mitad de (360 / no. De ráfagas)
  • Ángulo en radianes = ángulo en grados * π / 180

window.onload = function() { var canvas = document.getElementById(''canvas''); var ctx = canvas.getContext(''2d''); var defaultBurst = 18; var defaultContent = "New"; function paint(numBurst, text) { if (!numBurst) numBurst = defaultBurst; if (!text) text = defaultContent; ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = ''crimson''; var angleInRad = Math.PI * (360 / numBurst) / 180; var deltaAngleInRad = angleInRad / 2; ctx.beginPath(); ctx.moveTo(75, 150); for (i = 0; i <= numBurst; i++) { x1 = 75 * Math.cos(angleInRad * i) + 150; y1 = 75 * Math.sin(angleInRad * i) + 150; x2 = 60 * Math.cos((angleInRad * i) + deltaAngleInRad) + 150; y2 = 60 * Math.sin((angleInRad * i) + deltaAngleInRad) + 150; ctx.lineTo(x1, y1); ctx.lineTo(x2, y2); } ctx.closePath(); /* Add shadow only for shape */ ctx.shadowOffsetX = -5; ctx.shadowOffsetY = 5; ctx.shadowBlur = 5; ctx.shadowColor = "rgba(0, 0, 0, 0.5)"; ctx.fill(); ctx.font = "32px Arial"; ctx.textAlign = "center"; ctx.fillStyle = "gold"; /* Nullify shadow for text */ ctx.shadowOffsetX = 0; ctx.shadowOffsetY = 0; ctx.fillText(text, 150, 160, 120); } paint(); var slider = document.getElementById(''burst''); var textInput = document.getElementById(''content''); slider.addEventListener(''change'', function() { paint(this.value, textInput.value); }); textInput.addEventListener(''blur'', function() { paint(slider.value, this.value); }); }

/* For demo only */ .controls { float: right; padding: 5px; margin: 50px 20px; line-height: 25px; border: 1px solid; box-shadow: 1px 1px 0px #222; } label, input { display: inline-block; vertical-align: middle; text-align: left; } h3 { padding: 10px; text-align: center; } label { width: 100px; } input[type=''range''], input[type=''text''] { width: 100px; } body { font-family: Calibri; background-image: radial-gradient(circle, #3F9CBA 0%, #153346 100%); }

<canvas id=''canvas'' height=''300px'' width=''300px''></canvas> <div class=''controls''> <h3>Controls</h3> <label for="burst">Change Burst:</label> <input id="burst" class="slider" type="range" value="18" min="12" max="36" step=''2'' title="Adjust slider to increase or decrease burst" /> <br/> <label for="content">Text Content:</label> <input type="text" id="content" maxlength="5" /> </div>

Demo avanzada

Eche un vistazo a este CodePen para obtener una demostración avanzada con características como animación de creación de rutas, sombras, control sobre todas las características, etc.

Consejos de uso

Si desea una imagen de tamaño fijo en algún lugar de la página, Canvas es tan bueno como SVG. Sin embargo, si necesita una imagen que se pueda escalar a cualquier tamaño, el lienzo no es la opción correcta porque el lienzo está basado en ráster y se vuelve pixelado o borroso cuando se escala.

Si su forma necesitara un número dinámico de ráfagas y / o texto, Canvas sería más preferible que SVG y CSS porque no tiene que realizar ninguna manipulación DOM.


Con svg es posible con un bucle simple. Estoy usando Snap, ya que lo hace simple.

En primer lugar, cree un círculo con snap y luego con un loop encuentre los puntos que necesitamos del círculo al que hice referencia en esta pregunta para encontrar los puntos. Después de encontrar los puntos, simplemente asigne estos puntos a las líneas. Al cambiar el número en el bucle y se pueden crear puntos de valor rad de cualquier valor

Ráfaga de 24 puntos

var s=Snap(''svg''); var circle=s.circle(50,50,30).attr({ fill:''tomato'', stroke:''tomato'' }) for (var num = 0; num < 24; num++) { var rad1 = num * 15 * (Math.PI / 180); var rad2 = (num+1) * 15 * (Math.PI / 180); var rad3=(num+.5) * 15 * (Math.PI / 180); var x1 = (30 * (Math.cos(rad1)) + 50) var y1 = (30 * (Math.sin(rad1)) + 50) var x2 = (40 * (Math.cos(rad3)) + 50) var y2 = (40 * (Math.sin(rad3)) + 50) var x3 = (30 * (Math.cos(rad2)) + 50) var y3 = (30 * (Math.sin(rad2)) + 50) var line=s.polyline(x1,y1,x2,y2,x3,y3).attr({ ''fill'':''tomato'' }) } var text=s.text(35,50,''New'').attr({ fill:''white'' })

div{ width:100vw; height:100vh;

<script src="https://cdnjs.cloudflare.com/ajax/libs/snap.svg/0.3.0/snap.svg-min.js"></script> <div> <svg width="100%" height="100%" viewbox="0 0 100 100"> </svg> </div>

Explosión de 36 puntos

var s=Snap(''svg''); var circle=s.circle(50,50,30).attr({ fill:''tomato'', stroke:''tomato'' }) for (var num = 0; num < 36; num++) { var rad1 = num * 10 * (Math.PI / 180); var rad2 = (num+1) * 10 * (Math.PI / 180); var rad3=(num+.5) * 10 * (Math.PI / 180); var x1 = (30 * (Math.cos(rad1)) + 50) var y1 = (30 * (Math.sin(rad1)) + 50) var x2 = (40 * (Math.cos(rad3)) + 50) var y2 = (40 * (Math.sin(rad3)) + 50) var x3 = (30 * (Math.cos(rad2)) + 50) var y3 = (30 * (Math.sin(rad2)) + 50) var line=s.polyline(x1,y1,x2,y2,x3,y3).attr({ ''fill'':''tomato'' }) } var text=s.text(35,50,''New'').attr({ fill:''white'' })

div{ width:100vw; height:100vh; }

<script src="https://cdnjs.cloudflare.com/ajax/libs/snap.svg/0.3.0/snap.svg-min.js"></script> <div> <svg width="100%" height="100%" viewbox="0 0 100 100"> </svg> </div>

Ráfaga de 60 puntos

var s=Snap(''svg''); var circle=s.circle(50,50,30).attr({ fill:''tomato'', stroke:''tomato'' }) for (var num = 0; num < 60; num++) { var rad1 = num * 6 * (Math.PI / 180); var rad2 = (num+1) * 6 * (Math.PI / 180); var rad3=(num+.5) * 6 * (Math.PI / 180); var x1 = (30 * (Math.cos(rad1)) + 50) var y1 = (30 * (Math.sin(rad1)) + 50) var x2 = (40 * (Math.cos(rad3)) + 50) var y2 = (40 * (Math.sin(rad3)) + 50) var x3 = (30 * (Math.cos(rad2)) + 50) var y3 = (30 * (Math.sin(rad2)) + 50) var line=s.polyline(x1,y1,x2,y2,x3,y3).attr({ ''fill'':''tomato'' }) } var text=s.text(35,50,''New'').attr({ fill:''white'' })

div{ width:100vw; height:100vh; }

<script src="https://cdnjs.cloudflare.com/ajax/libs/snap.svg/0.3.0/snap.svg-min.js"></script> <div> <svg width="100%" height="100%" viewbox="0 0 100 100"> </svg> </div>

Esto también puede ser animado

var s=Snap(''svg''); var circle=s.circle(50,50,30).attr({ fill:''tomato'', stroke:''tomato'' }) var g=s.g(); for (var num = 0; num < 60; num++) { var rad1 = num * 6 * (Math.PI / 180); var rad2 = (num+1) * 6 * (Math.PI / 180); var rad3=(num+.5) * 6 * (Math.PI / 180); var x1 = (30 * (Math.cos(rad1)) + 50) var y1 = (30 * (Math.sin(rad1)) + 50) var x2 = (40 * (Math.cos(rad3)) + 50) var y2 = (40 * (Math.sin(rad3)) + 50) var x3 = (30 * (Math.cos(rad2)) + 50) var y3 = (30 * (Math.sin(rad2)) + 50) var line=s.polyline(x1,y1,x2,y2,x3,y3).attr({ ''fill'':''tomato'' }) g.add(line); } var text=s.text(35,50,''New'').attr({ fill:''white'' }) function anim(){ g.animate({ transform:''rotate(360 50,50)'' },8000,function(){ g.animate({ transform:''rotate(0 50,50)'' },0,function(){ anim() }) }) } anim()

div{ width:100vw; height:100vh; }

<script src="https://cdnjs.cloudflare.com/ajax/libs/snap.svg/0.3.0/snap.svg-min.js"></script> <div> <svg width="100%" height="100%" viewbox="0 0 100 100"> </svg> </div>

Tenga en cuenta que he usado las unidades vw y vh para la capacidad de respuesta

Esto también se puede hacer con un solo elemento de polilínea

var s=Snap(''svg''); var array=[]; for (var num = 0; num < 24; num++) { var rad1 = num * 15 * (Math.PI / 180); var rad2 = (num+1) * 15 * (Math.PI / 180); var rad3=(num+.5) * 15 * (Math.PI / 180); var x1 = (30 * (Math.cos(rad1)) + 50); var y1 = (30 * (Math.sin(rad1)) + 50); var x2 = (40 * (Math.cos(rad3)) + 50); var y2 = (40 * (Math.sin(rad3)) + 50); var x3 = (30 * (Math.cos(rad2)) + 50); var y3 = (30 * (Math.sin(rad2)) + 50); array.push(x1+'',''+y1+'' ''+x2+'',''+y2+'' ''+x3+'',''+'' ''+y3); } var line=s.polyline(array).attr({ ''fill'':''tomato'' }) var text=s.text(35,50,''New'').attr({ fill:''white'' })

div{ width:100vw; height:100vh; }

<script src="https://cdnjs.cloudflare.com/ajax/libs/snap.svg/0.3.0/snap.svg-min.js"></script> <div> <svg width="100%" height="100%" viewbox="0 0 100 100"> </svg> </div>


Esto es posible con CSS pero después de 12 puntos, requiere más de un div.

Anteriormente he usado la explosión de 12 puntos dentro de los proyectos para alertas y para elementos de estilo de promoción de venta.

Explosión de 12 puntos

div { background: red; width: 80px; height: 80px; position: absolute; text-align: center; top: 20px; left: 20px; } div:before, div:after { content: ""; position: absolute; top: 0; left: 0; height: 80px; width: 80px; background: red; } div:before { -webkit-transform: rotate(30deg); -moz-transform: rotate(30deg); -ms-transform: rotate(30deg); -o-transform: rotate(30deg); } div:after { -webkit-transform: rotate(60deg); -moz-transform: rotate(60deg); -ms-transform: rotate(60deg); -o-transform: rotate(60deg); }

<div></div>

Explosión de 24 puntos

div { background: red; width: 80px; height: 80px; position: absolute; text-align: center; top: 20px; left: 20px; } div:before, div:after { content: ""; position: absolute; top: 0; left: 0; height: 80px; width: 80px; background: red; } div:before { -webkit-transform: rotate(30deg); -moz-transform: rotate(30deg); -ms-transform: rotate(30deg); -o-transform: rotate(30deg); } div:after { -webkit-transform: rotate(60deg); -moz-transform: rotate(60deg); -ms-transform: rotate(60deg); -o-transform: rotate(60deg); } div:nth-child(2) { transform: rotate(15deg) }

<div></div> <div></div>

Explosión de 36 puntos

div { background: red; width: 80px; height: 80px; position: absolute; text-align: center; top: 20px; left: 20px; } div:before, div:after { content: ""; position: absolute; top: 0; left: 0; height: 80px; width: 80px; background: red; } div:before { -webkit-transform: rotate(30deg); -moz-transform: rotate(30deg); -ms-transform: rotate(30deg); -o-transform: rotate(30deg); } div:after { -webkit-transform: rotate(60deg); -moz-transform: rotate(60deg); -ms-transform: rotate(60deg); -o-transform: rotate(60deg); } div:nth-child(2) { transform: rotate(10deg) } div:nth-child(3) { transform: rotate(20deg) }

<div></div> <div></div> <div></div>

Explosión de 48 puntos

div { background: red; width: 80px; height: 80px; position: absolute; text-align: center; top: 20px; left: 20px; } div:before, div:after { content: ""; position: absolute; top: 0; left: 0; height: 80px; width: 80px; background: red; } div:before { -webkit-transform: rotate(30deg); -moz-transform: rotate(30deg); -ms-transform: rotate(30deg); -o-transform: rotate(30deg); } div:after { -webkit-transform: rotate(60deg); -moz-transform: rotate(60deg); -ms-transform: rotate(60deg); -o-transform: rotate(60deg); } div:nth-child(2) { transform: rotate(7.5deg) } div:nth-child(3) { transform: rotate(15deg) } div:nth-child(4) { transform: rotate(22.5deg) }

<div></div> <div></div> <div></div> <div></div>

Para cualquier cosa por encima de 12 puntos, tendría que sugerir seriamente usar una imagen o SVG como muestra la respuesta anterior debido a que solo requiere un elemento.