Hay muchas formas CSS diferentes en CSS Tricks - Formas de CSS y estoy particularmente perplejo con un triángulo:
#triangle-up {
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 100px solid red;
}
<div id="triangle-up"></div>
¿Cómo y por qué funciona?
css
geometry
polygon
css-shapes
Stanislav Shabalin
fuente
fuente
Respuestas:
Triángulos CSS: una tragedia en cinco actos
Como dijo alex , los bordes de igual ancho se topan entre sí en ángulos de 45 grados:
Cuando no tiene un borde superior, se ve así:
Entonces le das un ancho de 0 ...
... y una altura de 0 ...
... y finalmente, haces que los dos bordes laterales sean transparentes:
Eso da como resultado un triángulo.
fuente
:before
o:after
pseudo clases.left-border
yright-border
no isósceles se puede hacer. Y cuando se combinan muchos triángulos ... jsfiddle.net/zRNgzLos bordes usan un borde en ángulo donde se cruzan (ángulo de 45 ° con bordes de igual ancho, pero cambiar los anchos de los bordes puede sesgar el ángulo).
Echa un vistazo a jsFiddle .
Al ocultar ciertos bordes, puede obtener el efecto de triángulo (como puede ver arriba haciendo que las diferentes porciones sean de diferentes colores).
transparent
a menudo se usa como color de borde para lograr la forma del triángulo.fuente
Comience con un cuadrado básico y bordes. Cada borde recibirá un color diferente para que podamos distinguirlos:
que te da esto :
Pero no hay necesidad del borde superior, por lo tanto, establezca su ancho en
0px
. Ahora nuestro borde inferior200px
hará que nuestro triángulo tenga 200px de altura.y conseguiremos esto :
Luego, para ocultar los dos triángulos laterales, configure el color del borde como transparente. Dado que el borde superior se ha eliminado efectivamente, también podemos establecer el color superior del borde en transparente.
finalmente obtenemos esto :
fuente
There's another way to draw ..
, que resulta ser de la misma manera :) Sin embargoEnfoque diferente:
Triángulos CSS3 con transformación rotar
La forma triangular es bastante fácil de hacer usando esta técnica. Para las personas que prefieren ver una animación que explica cómo funciona esta técnica aquí es:
De lo contrario, aquí hay una explicación detallada en 4 actos (esto no es una tragedia) de cómo hacer un triángulo rectángulo isósceles con un elemento.
<div class="tr"></div>
PASO 1: Haz un div
Fácil, solo asegúrate de eso
width = 1.41 x height
. Puede usar cualquier techinque ( ver aquí ), incluido el uso de porcentajes y relleno de fondo para mantener la relación de aspecto y hacer un triángulo sensible . En la siguiente imagen, el div tiene un borde amarillo dorado.En ese div, inserte un pseudo elemento y dele el 100% de ancho y alto de padre. El pseudo elemento tiene un fondo azul en la siguiente imagen.
En este punto, tenemos este CSS :
PASO 2: Rotemos
Primero, lo más importante: definir un origen de transformación . El origen predeterminado está en el centro del pseudo elemento y lo necesitamos en la parte inferior izquierda. Al agregar este CSS al pseudo elemento:
transform-origin:0 100%;
otransform-origin: left bottom;
Ahora podemos rotar el pseudo elemento 45 grados en sentido horario con
transform : rotate(45deg);
En este punto, tenemos este CSS :
PASO 3: ocultarlo
Para ocultar las partes no deseadas del pseudo elemento (todo lo que desborda el div con el borde amarillo) solo necesita configurarlo
overflow:hidden;
en el contenedor. después de quitar el borde amarillo, obtienes ... ¡un TRIÁNGULO ! :MANIFESTACIÓN
CSS:
PASO 4: ve más allá ...
Como se muestra en la demostración , puede personalizar los triángulos:
skewX()
.¿Por qué usar esta técnica?
¿Por qué no usar esta técnica?
fuente
skewX
sería útil mencionar cómo se derivaron los diferentes anchos para usar .Aquí hay una animación en JSFiddle que creé para demostración.
Ver también el fragmento a continuación.
Este es un GIF animado hecho de un Screencast
Mostrar fragmento de código
Versión aleatoria
Mostrar fragmento de código
Versión a la vez
Mostrar fragmento de código
fuente
Digamos que tenemos el siguiente div:
Ahora edite el CSS paso a paso, para que tenga una idea clara de lo que está sucediendo.
PASO 1: Enlace JSfiddle:
Este es un simple div. Con un CSS muy simple. Para que un laico pueda entender. Div tiene dimensiones de 150 x 150 píxeles con el borde de 50 píxeles. Se adjunta la imagen:
PASO 2: JSfiddle Link:
Ahora acabo de cambiar el color del borde de los 4 lados. La imagen está adjunta.
PASO: 3 Enlace JSfiddle:
Ahora acabo de cambiar la altura y el ancho de div de 150 píxeles a cero. Se adjunta la imagen
PASO 4: JSfiddle:
Ahora he hecho todos los bordes transparentes, aparte del borde inferior. La imagen se adjunta a continuación.
PASO 5: Enlace JSfiddle:
Ahora acabo de cambiar el color de fondo a blanco. La imagen está adjunta.
Por lo tanto, obtuvimos el triángulo que necesitábamos.
fuente
Y ahora algo completamente diferente ...
En lugar de usar trucos css, no se olvide de soluciones tan simples como entidades html:
Resultado:
▲
Ver: ¿Cuáles son las entidades HTML para los triángulos arriba y abajo?
fuente
Considera el siguiente triángulo
Esto es lo que se nos da:
¿Por qué salió en esta forma? El siguiente diagrama explica las dimensiones, tenga en cuenta que se utilizaron 15 píxeles para el borde inferior y 10 píxeles para la izquierda y la derecha.
Es bastante fácil hacer un triángulo rectángulo también quitando el borde derecho.
fuente
Yendo un paso más allá, usando CSS basado en esto, agregué flechas a mis botones Atrás y Siguiente (sí, sé que no es 100% de navegador cruzado, pero de todos modos resbaladizo).
fuente
OK, este triángulo se creará debido a la forma en que los bordes de los elementos funcionan juntos en HTML y CSS ...
Como usualmente usamos bordes de 1 o 2 píxeles, nunca notamos que los bordes forman ángulos de 45 ° entre sí con el mismo ancho y si el ancho cambia, el grado del ángulo también cambia, ejecuta el código CSS que creé a continuación:
Luego, en el siguiente paso, no tenemos ancho ni alto, algo como esto:
Y ahora hacemos invisibles los bordes izquierdo y derecho para hacer nuestro triángulo deseable como se muestra a continuación:
Si no está dispuesto a ejecutar el fragmento para ver los pasos, he creado una secuencia de imágenes para ver todos los pasos en una imagen:
fuente
Enfoque diferente. Con gradiente lineal (para IE, solo IE 10+). Puedes usar cualquier ángulo:
Aquí está jsfiddle
fuente
CSS
clip-path
Esto es algo que siento que esta pregunta se ha perdido;
clip-path
clip-path
utilizará el elemento en sí en lugar de sus bordes para cortar la forma que especifique en sus parámetros. Utiliza un sistema de coordenadas basado en porcentajes súper simple que hace que la edición sea muy fácil y significa que puede recogerlo y crear formas extrañas y maravillosas en cuestión de minutos.Ejemplo de forma de triángulo
Abajo
Tiene una desventaja importante en este momento, una de ellas es su gran falta de soporte, solo está realmente cubierto en los
-webkit-
navegadores y no tiene soporte en IE y solo es muy parcial en FireFox.Recursos
Aquí hay algunos recursos y materiales útiles para ayudar a comprender mejor
clip-path
y también comenzar a crear los suyos.clip-path
generadorclip-path
Documentación de MDNclip-path
Soporte de navegadorfuente
Esta es una vieja pregunta, pero creo que valdrá la pena compartir cómo crear una flecha usando esta técnica de triángulo.
Paso 1:
Vamos a crear 2 triángulos, para el segundo utilizaremos la
:after
pseudo clase y la colocaremos justo debajo del otro:Paso 2
Ahora solo tenemos que establecer el color del borde predominante del segundo triángulo al mismo color del fondo:
Mostrar fragmento de código
Violín con todas las flechas:
http://jsfiddle.net/tomsarduy/r0zksgeu/
fuente
Mezcla triangular SASS (SCSS)
Escribí esto para que sea más fácil (y SECO) generar automáticamente un triángulo CSS:
ejemplo de caso de uso:
Página de juegos
Nota importante:
si el triángulo parece pixelado en algunos navegadores, pruebe uno de los métodos descritos aquí .
fuente
Si desea aplicar un borde al triángulo, lea esto: ¿ Crear un triángulo con CSS?
Casi todas las respuestas se centran en el triángulo construido usando el borde, así que voy a elaborar el
linear-gradient
método (como se inició en la respuesta de @lima_fil ).Usar un valor de grado como
45°
nos obligará a respetar una proporción específica deheight/width
para obtener el triángulo que queremos y esto no responderá:Mostrar fragmento de código
En lugar de hacer esto, deberíamos considerar valores predefinidos de dirección como
to bottom
,to top
etc. En este caso podemos obtener cualquier tipo de forma de triángulo mientras lo mantenemos receptivo.1) triángulo rectángulo
Para obtener dicha triángulo necesitamos uno lineal-gradiente y una dirección diagonal como
to bottom right
,to top left
,to bottom left
, etcMostrar fragmento de código
2) triángulo isósceles
Para este, necesitaremos 2 gradientes lineales como el anterior y cada uno tomará la mitad del ancho (o la altura). Es como si creáramos una imagen especular del primer triángulo.
Mostrar fragmento de código
3) triángulo equilátero
Este es un poco complicado de manejar ya que necesitamos mantener una relación entre la altura y el ancho del gradiente. Tendremos el mismo triángulo que el anterior pero haremos que el cálculo sea más complejo para transformar el triángulo isósceles en uno equilátero.
Para facilitarlo, consideraremos que se conoce el ancho de nuestro div y que la altura es lo suficientemente grande como para poder dibujar nuestro triángulo dentro (
height >= width
).Tenemos nuestros dos gradientes
g1
yg2
, la línea azul es el ancho deldiv
w
y cada gradiente tendrá el 50% (w/2
) y cada lado del triángulo debería ser igual aw
. La línea verde es la altura de ambos gradienteshg
y podemos obtener fácilmente la siguiente fórmula:(w/2)² + hg² = w²
--->hg = (sqrt(3)/2) * w
--->hg = 0.866 * w
Podemos confiar
calc()
para hacer nuestro cálculo y obtener el resultado necesario:Mostrar fragmento de código
Otra forma es controlar la altura de div y mantener la sintaxis de gradiente fácil:
Mostrar fragmento de código
4) triángulo aleatorio
Para obtener un triángulo aleatorio, es fácil ya que simplemente necesitamos eliminar la condición del 50% de cada uno, PERO debemos mantener dos condiciones (ambas deben tener la misma altura y la suma de ambas anchuras debe ser del 100%).
Mostrar fragmento de código
Pero, ¿qué pasa si queremos definir un valor para cada lado? ¡Simplemente necesitamos hacer el cálculo nuevamente!
Definamos
hg1
yhg2
como la altura de nuestro gradiente (ambos son iguales a la línea roja) entonceswg1
ywg2
como el ancho de nuestro gradiente (wg1 + wg2 = a
). No voy a detallar el cálculo pero al final tendremos:Ahora hemos alcanzado el límite de CSS, ya que incluso con
calc()
no podremos implementar esto, así que simplemente necesitamos recopilar el resultado final manualmente y usarlo como tamaño fijo:Mostrar fragmento de código
Prima
No debemos olvidar que también podemos aplicar rotación y / o sesgo y tenemos más opciones para obtener más triángulo:
Mostrar fragmento de código
Y, por supuesto, debemos tener en cuenta la solución SVG que puede ser más adecuada en alguna situación:
Mostrar fragmento de código
fuente
Aquí hay otro violín:
https://jsfiddle.net/qdhvdb17/
fuente
Otros ya lo han explicado bien. Déjame darte una animación que explicará esto rápidamente: http://codepen.io/chriscoyier/pen/lotjh
Aquí hay un código para que juegues y aprendas los conceptos.
HTML:
CSS:
Juega con esto y mira qué pasa. Establezca la altura y el ancho en cero. Luego quite el borde superior y haga transparente a la izquierda y a la derecha, o simplemente mire el código a continuación para hacer un triángulo css:
fuente
Si quieres jugar con
border-size
,width
yheight
para ver cómo los que pueden crear diferentes formas, intente lo siguiente:fuente
Prueba esto:-
fuente
Sé que este es antiguo, pero me gustaría agregar a esta discusión que hay al menos 5 métodos diferentes para crear un triángulo usando solo HTML y CSS.
borders
linear-gradient
conic-gradient
transform
yoverflow
clip-path
Creo que todos se han cubierto aquí, excepto el método 3, que usa el
conic-gradient
, así que lo compartiré aquí:fuente