CSS üçgenleri nasıl çalışır?


1846

CSS Tricks'te birçok farklı CSS şekli var - Şekiller CSS ve özellikle bir üçgenle şaşkınım:

CSS Üçgeni

#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>

Nasıl ve neden çalışır?


59
Şunları yapabilirsiniz: jsfiddle.net/wbZet
mskfisher

55
Orada olmayan kareye ne dersin? Zgaa
Ry-

1
@mskfisher Eşkenar üçgeninizde alt kenarlığın boyutu tavan olmamalıdır (sqrt (3) * 60)? O zaman birkaç piksel daha!
Niloct

1
@Niloct: Yuvarlak sayılarla hızlıca göz attım. Haklısın, daha doğru eşdeğer ölçümler (yan: 58, alt: 100) veya (yan: 60, alt: 104) olacaktır.
mskfisher

1
İşte her yön ve boyut için harika bir CSS üçgen jeneratörü : apps.eky.hk/css-triangle-generator
Allan

Yanıtlar:


2239

CSS Üçgenleri: Beş İşlemde Bir Trajedi

Olarak Alex bahsedilen , 45 derecelik açılarda birbirine karşı eşit genişlik butt kadar sınırları:

kenarlıklar 45 derecelik açılarda buluşuyor, ortadaki içerik

Üst kenarlığınız yoksa, şuna benzer:

üst kenarlık yok

Sonra ona 0 genişliğini veriyorsunuz ...

genişlik yok

... ve yüksekliği 0 ...

yükseklik de yok

... ve son olarak, iki yan kenarı saydam yaparsınız:

şeffaf yan kenarlıklar

Bu bir üçgen ile sonuçlanır.


10
@Jauzsika, bu üçgenleri sadece sınıflar kullanarak :beforeveya ek öğeler eklemeden bir sayfaya ekleyebilirsiniz :after.
zzzzBov

stackoverflow.com/questions/5623072/… Bence Bay BoltClock'un neyi ifade ettiğini.
thirtydot

99
Animasyonlarla hareket edin: jsfiddle.net/pimvdb/mA4Cu/104 . Sadece benim gibi daha görsel kanıtlara ihtiyaç duyanlar için ...
pimvdb

Farklı left-borderve right-borderikizkenar olmayan üçgenler yapılabilir. Ve birçok üçgen birleştirildiğinde ... jsfiddle.net/zRNgz
JiminP

2
2018'de, bu kesmek kullanmak yerine CSS ile bir üçgen yapmanın daha iyi bir yolu var mı?
Scribblemacher

518

Kenarlıklar kesiştikleri açılı bir kenar kullanır (eşit genişlik sınırlarına sahip 45 ° açı, ancak kenarlık genişliklerini değiştirmek açıyı eğebilir).

Sınır örneği

div {
  width: 60px;
  border-width: 30px;
  border-color: red blue green yellow;
  border-style: solid;
}
<div></div>

JsFiddle'a bir göz atın .

Belirli kenarlıkları gizleyerek üçgen efektini elde edebilirsiniz (yukarıda gördüğünüz gibi farklı bölümleri farklı renkler yaparak). transparentüçgen şeklini elde etmek için genellikle kenar rengi olarak kullanılır.


487

Temel bir kare ve kenarlıklarla başlayın. Her kenarlığa farklı bir renk verilecek, böylece bunları birbirinden ayırabiliriz:

.triangle {
    border-color: yellow blue red green;
    border-style: solid;
    border-width: 200px 200px 200px 200px;
    height: 0px;
    width: 0px;
}

size bunu verir :

dört kenarlıklı kare

Ancak üst kenarlığa gerek yoktur, bu nedenle genişliğini ayarlayın 0px. Şimdi sınırımızın altı 200pxüçgenimizi 200 piksel boyunda yapacak.

.triangle {
    border-color: yellow blue red green;
    border-style: solid;
    border-width: 0px 200px 200px 200px;
    height: 0px;
    width: 0px;
}

ve biz alacak bu :

dört kenarlıklı karenin alt yarısı

Ardından iki yan üçgeni gizlemek için kenarlık rengini saydam olarak ayarlayın. Üst kenarlık etkili bir şekilde silindiği için, kenar üst rengini de saydam olarak ayarlayabiliriz.

.triangle {
    border-color: transparent transparent red transparent;
    border-style: solid;
    border-width: 0px 200px 200px 200px;
    height: 0px;
    width: 0px;
}

sonunda bunu elde ederiz :

üçgen alt kenarlık


21
Harika, ama bu aynı şekilde değil mi? :-)
Stanislav Shabalin

5
There's another way to draw .., aynı şekilde olduğu ortaya çıkıyor :) Güzel bir açıklama olsa
Hammad Khan

16
Büyük eserler içeren JPEG'leri kullanmak için -1. Ancak +1, gelecekte caydırmak için bağlanabileceğim JPEG'lerin ne zaman kullanılmayacağına harika bir örnek oluşturmak için. ;)
Henrik Heimbuerger

3
neden burada bir gif kullanılmıyor?
pruswan

4
Üzgünüm @hheimbuerger, resimleri düzelterek örneğinizi berbat ettim. Gelecekte bu cevabın 2. düzeltmesine bağlantı vermeniz gerekecek .
Rory O'Kane

263

Farklı yaklaşım:

Dönüş döndürmeli CSS3 üçgenleri

Bu tekniği kullanarak üçgen şekil yapmak oldukça kolaydır. Bu tekniğin burada nasıl çalıştığını açıklayan bir animasyon görmeyi tercih edenler için:

gif animasyon: dönüşüm döndürme ile bir üçgen nasıl yapılır

Aksi takdirde, bir unsurla ikizkenar dik açılı bir üçgenin nasıl yapılacağına dair 4 eylemde (bu bir trajedi değildir) ayrıntılı açıklama.

  • Not 1: İkizkenar olmayan üçgenler ve süslü şeyler için 4. adımı görebilirsiniz .
  • Not 2: aşağıdaki snippet'lere satıcı önekleri dahil değildir. kodlama demolarına dahil edilirler .
  • Not 3: Aşağıdaki açıklama için HTML her zaman: <div class="tr"></div>

ADIM 1: Bir div yapın

Kolay, sadece emin ol width = 1.41 x height. En boy oranını korumak ve duyarlı bir üçgen yapmak için yüzdeler ve dolgu tabanı kullanımı da dahil olmak üzere herhangi bir tekniği ( buraya bakın ) kullanabilirsiniz . Aşağıdaki görüntüde div altın sarısı bir kenarlığa sahiptir.

Bu div'e, bir sözde öğe ekleyin ve bu öğeye % 100 genişlik ve üst öğe yüksekliği verin. Sözde öğenin aşağıdaki görüntüde mavi bir arka planı vardır.

Dönüşüm roate adım 1 ile bir CSS üçgen yapma

Bu noktada, şu CSS'ye sahibiz :

.tr {
    width: 30%;
    padding-bottom: 21.27%; /* = width / 1.41 */
    position: relative;
}

.tr: before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: #0079C6;
}

ADIM 2: Dönelim

İlk olarak, en önemlisi: bir dönüşüm kaynağını tanımlayın . Varsayılan kökenli sözde elemanının merkezinde ve biz sol alt tarafta olması gerekiyor. Bu CSS'yi ekleyerek sözde öğeye :

transform-origin:0 100%; veya transform-origin: left bottom;

Şimdi sözde elemanı saat yönünde 45 derece döndürebiliriz transform : rotate(45deg);

CSS3 adım 2 ile üçgen oluşturma

Bu noktada, şu CSS'ye sahibiz :

.tr {
    width: 30%;
    padding-bottom: 21.27%; /* = width / 1.41 */
    position: relative;
}

.tr:before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: #0079C6;
    transform-origin: 0 100%;        
    transform: rotate(45deg);
}

3.ADIM: saklayın

Sözde öğenin istenmeyen bölümlerini (div'ı sarı kenarlıkla taşan her şey) gizlemek overflow:hidden;için kapta ayarlamanız gerekir . sarı kenarlığı kaldırdıktan sonra ... bir ÜÇGEN olsun ! :

DEMO

CSS üçgeni

CSS:

.tr {
    width: 30%;
    padding-bottom: 21.27%; /* = width / 1.41 */
    position: relative;
    overflow: hidden;
}

.tr:before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: #0079C6;
    transform-origin: 0 100%;
    transform: rotate(45deg);
}

4.ADIM: daha ileri gidin ...

Demoda gösterildiği gibi , üçgenleri özelleştirebilirsiniz:

  1. İle oynayarak onları daha ince veya düz hale getirin skewX().
  2. Dönüştürme origni ve rotasyon yönü ile oynayarak onları sola, sağa veya başka bir yöne doğrultun.
  3. 3D dönüşüm özelliği ile biraz yansıma yapın .
  4. Üçgen kenarlıkları verin
  5. Üçgenin içine bir resim koyun
  6. Çok daha fazlası ... CSS3'ün güçlerini serbest bırakın !

Neden bu tekniği kullanıyorsunuz?

  1. Üçgen kolayca tepki verebilir.
  2. Kenarlıklı bir üçgen yapabilirsiniz .
  3. Üçgenin sınırlarını koruyabilirsiniz. Bu, fareyle üzerine gelme durumunu veya tıklama olayını yalnızca imleç üçgenin içindeyken tetikleyebileceğiniz anlamına gelir . Bunun gibi bazı durumlarda bu çok kullanışlı olabilir her üçgen, bu kendi vurgulu durumu vardır böylece her üçgen 's komşuları bindirmek mümkün değil.
  4. Yansımalar gibi bazı süslü efektler yapabilirsiniz .
  5. 2d ve 3d dönüşüm özelliklerini anlamanıza yardımcı olacaktır.

Neden bu tekniği kullanmıyorsunuz?

  1. Ana dezavantajı tarayıcı uyumluluğudur , 2d dönüşüm özellikleri IE9 + tarafından desteklenir ve bu nedenle IE8'i desteklemeyi planlıyorsanız bu tekniği kullanamazsınız. Daha fazla bilgi için CanIuse'a bakın . Yansıma tarayıcı desteği gibi 3d dönüşümleri kullanan bazı süslü efektler için IE10 + ( daha fazla bilgi için canIuse'a bakın ).
  2. Duyarlı bir şeye ihtiyacınız yoktur ve sizin için düz bir üçgen iyidir, o zaman burada açıklanan sınır tekniği için gitmelisiniz: buradaki şaşırtıcı mesajlar sayesinde daha iyi tarayıcı uyumluluğu ve daha kolay anlaşılır.

16
Muhtemelen 1.41'in √2'nin bir yaklasımı ve oluşturduğunuz üçgenin hipotenüsünün uzunluğu olduğunu belirtmek gerekir, bu yüzden (en azından) bu genişliğe ihtiyacınız var.
KRyan

Cevabı basit tutmak istedim ama haklısın, @KRyan'dan bahsetmeliyim
web-tiki

Aslında, bunu kullanmaya çalışırken, kullanım için farklı genişliklerin nasıl skewXtüretildiğinden bahsetmek faydalı olacaktır.
KRyan

1
Üçgen için 1 piksellik düz kenarlığa ihtiyacınız olduğunda bu yöntem daha iyi çalışır.
Roman Losev

Bu, üçgen için sınırlar oluşturmak istediğiniz durum için, bu ek açıklama kutusunu oluşturmak istediğimde sınırlar yolu ile sıkışmıştım AnnotationBox
vanduc1102

182

JSFiddle'da gösteri için oluşturduğum bir animasyon .

Ayrıca aşağıdaki snippet'e bakın.

Bu bir Screencast yapılmış bir Animasyonlu GIF

Üçgen Hareketli Gif


Rastgele sürüm


Hepsi bir kerede sürüm


49

Diyelim ki şu div var:

<div id="triangle" />

Şimdi CSS'yi adım adım düzenleyin, böylece etrafta neler olduğu hakkında net bir fikir edinebilirsiniz.

ADIM 1: JSfiddle Bağlantısı:

 #triangle {
        background: purple;
        width :150px;
        height:150PX;
        border-left: 50px solid black ;
        border-right: 50px solid black;
        border-bottom: 50px solid black;
        border-top: 50px solid black;
    }

Bu basit bir div. Çok basit bir CSS ile. Böylece bir meslekten olmayan kimse anlayabilir. Div, kenarlığı 50 piksel olan 150 x 150 piksel boyutlarına sahiptir. Görüntü eklenmiştir:

resim açıklamasını buraya girin

ADIM 2: JSfiddle Bağlantısı:

#triangle {
    background: purple;
    width :150px;
    height:150PX;
    border-left: 50px solid yellow ;
    border-right: 50px solid green;
    border-bottom: 50px solid red;
    border-top: 50px solid blue;
}

Şimdi 4 tarafın da sınır rengini değiştirdim. Görüntü eklenmiştir.

resim açıklamasını buraya girin

ADIM: 3 JSfiddle Bağlantısı:

#triangle {
    background: purple;
    width :0;
    height:0;
    border-left: 50px solid yellow ;
    border-right: 50px solid green;
    border-bottom: 50px solid red;
    border-top: 50px solid blue;
}

Şimdi div'in yüksekliğini ve genişliğini 150 pikselden sıfıra değiştirdim. Görüntü ekli

resim açıklamasını buraya girin

ADIM 4: JSfiddle:

#triangle {
    background: purple;
    width :0px;
    height:0px;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-bottom: 50px solid red;
    border-top: 50px solid transparent;
}

Şimdi alt kenarlık dışında tüm sınırları şeffaflaştırdım. Görüntü aşağıda eklenmiştir.

resim açıklamasını buraya girin

5.ADIM : JSfiddle Bağlantısı:

#triangle {
    background: white;
    width :0px;
    height:0px;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-bottom: 50px solid red;
    border-top: 50px solid transparent;
}

Şimdi arka plan rengini beyaz olarak değiştirdim. Görüntü eklenmiştir.

resim açıklamasını buraya girin

Bu yüzden ihtiyacımız olan üçgeni aldık.


3
İlk adım için neden bir Nether Portalı kullandınız?
LuizLoyola

38

Ve şimdi tamamen farklı bir şey ...

Css hileleri kullanmak yerine html varlıkları kadar basit çözümleri unutmayın:

&#9650;

Sonuç:

Bkz: Yukarı ve aşağı üçgenler için HTML varlıkları nelerdir?


2
Burada "dayak" kelimesinin uygun bir kelime olduğunu düşünmüyorum. Çözüm, yazı tipi metriklerine dayanır, bu nedenle şekil üzerinde hiçbir kontrolünüz olmadığını belirtmemek için kesin konumlandırma oldukça şüphelidir.
user776686

32

Aşağıdaki üçgeni düşünün

.triangle {
    border-bottom:15px solid #000;
    border-left:10px solid transparent;
    border-right:10px solid transparent;
    width:0;
    height:0;
}

Bize verilen budur:

Küçük üçgen çıktı

Neden bu şekilde çıktı? Aşağıdaki şema boyutları açıklar, alt kenarlık için 15 piksel ve sol ve sağ için 10 piksel kullanıldığını unutmayın.

Büyük üçgen

Doğru kenarlığı kaldırarak da dik açılı üçgen yapmak oldukça kolaydır.

Dik açılı üçgen


29

Bir adım daha ileri giderek, buna dayalı css kullanarak arka ve sonraki düğmelerime oklar ekledim (evet,% 100 çapraz tarayıcı olmadığını biliyorum, ancak daha az kaygan değilim).

.triangle {
  width: 0;
  height: 0;
  border-left: 50px solid transparent;
  border-right: 50px solid transparent;
  border-bottom: 100px solid red;
  margin:20px auto;
}

.triangle-down {
  border-bottom:none;
  border-top: 100px solid red;
}

.triangle-left {
  border-left:none;
  border-right: 100px solid red;
  border-bottom: 50px solid transparent;
  border-top: 50px solid transparent;
}

.triangle-right {
  border-right:none;
  border-left: 100px solid red;
  border-bottom: 50px solid transparent;
  border-top: 50px solid transparent;
}

.triangle-after:after {
  width: 0;
  height: 0;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
  border-bottom: 5px solid red;
  margin:0 5px;
  content:"";
  display:inline-block;
}

.triangle-after-right:after {
  border-right:none;
  border-left: 5px solid blue;
  border-bottom: 5px solid transparent;
  border-top: 5px solid transparent;

}

.triangle-before:before {
  width: 0;
  height: 0;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
  border-bottom: 5px solid blue;
  margin:0 5px;
  content:"";
  display:inline-block;
}

.triangle-before-left:before {
  border-left:none;
  border-right: 5px solid blue;
  border-bottom: 5px solid transparent;
  border-top: 5px solid transparent;

}
<div class="triangle"></div>
<div class="triangle triangle-down"></div>
<div class="triangle triangle-left"></div>
<div class="triangle triangle-right"></div>

<a class="triangle-before triangle-before-left" href="#">Back</a>
<a class="triangle-after triangle-after-right" href="#">Next</a>


1
bu çapraz tarayıcı nasıl değil? üçgenler IE6'ya geri dönmelidir.
chriscauley

4
: before ve: after kullanımı% 100 desteklenmez.
PseudoNinja

2
Psuedo öğeleri desteklenmez <IE8.
alex

19

Tamam, bu üçgen, öğelerin kenarlıklarının HTML ve CSS'de birlikte çalışma şekli nedeniyle oluşturulacak ...

Genellikle 1 veya 2 piksel kenarlık kullandığımızdan, kenarlıkların aynı genişliğe sahip birbirleriyle 45 ° açılar oluşturduğunu ve genişlik değişirse, açı derecesi de değiştiğinde, aşağıda oluşturduğum CSS kodunu çalıştırmayın:

.triangle {
  width: 100px;
  height: 100px;
  border-left: 50px solid black;
  border-right: 50px solid black;
  border-bottom: 100px solid red;
}
<div class="triangle">
</div>

Sonra bir sonraki adımda, böyle bir genişliğe veya yüksekliğe sahip değiliz:

.triangle {
  width: 0;
  height: 0;
  border-left: 50px solid black;
  border-right: 50px solid black;
  border-bottom: 100px solid red;
}
<div class="triangle">
</div>

Ve şimdi sol ve sağ kenarlıkları arzu edilen üçgeni aşağıdaki gibi yapmak için görünmez yapıyoruz:

.triangle {
  width: 0;
  height: 0;
  border-left: 50px solid transparent;
  border-right: 50px solid transparent;
  border-bottom: 100px solid red;
}
<div class="triangle"></div>

Snippet'i adımları görmek için çalıştırmak istemiyorsanız, bir resimdeki tüm adımlara göz atmak için bir görüntü dizisi oluşturdum:

resim açıklamasını buraya girin


18

Farklı yaklaşım. Doğrusal renk geçişli (IE için, yalnızca IE 10+). Herhangi bir açıyı kullanabilirsiniz:

.triangle {
    margin: 50px auto;
    width: 100px;
    height: 100px;
/* linear gradient */
    background: -moz-linear-gradient(-45deg,  rgba(255,0,0,0) 0%, rgba(255,0,0,0) 50%, rgba(255,0,0,1) 50%, rgba(255,0,0,1) 100%);
 /* FF3.6+ */
    background: -webkit-gradient(linear, left top, right bottom, color-stop(0%,rgba(255,0,0,0)), color-stop(50%,rgba(255,0,0,0)), color-stop(50%,rgba(255,0,0,1)), color-stop(100%,rgba(255,0,0,1)));
 /* Chrome,Safari4+ */
    background: -webkit-linear-gradient(-45deg,  rgba(255,0,0,0) 0%,rgba(255,0,0,0) 50%,rgba(255,0,0,1) 50%,rgba(255,0,0,1) 100%);
 /* Chrome10+,Safari5.1+ */
    background: -o-linear-gradient(-45deg,  rgba(255,0,0,0) 0%,rgba(255,0,0,0) 50%,rgba(255,0,0,1) 50%,rgba(255,0,0,1) 100%);
 /* Opera 11.10+ */
    background: -ms-linear-gradient(-45deg,  rgba(255,0,0,0) 0%,rgba(255,0,0,0) 50%,rgba(255,0,0,1) 50%,rgba(255,0,0,1) 100%);
 /* IE10+ */
    background: linear-gradient(135deg,  rgba(255,0,0,0) 0%,rgba(255,0,0,0) 50%,rgba(255,0,0,1) 50%,rgba(255,0,0,1) 100%);
 /* W3C */;
}
<div class="triangle"></div>

İşte jsfiddle


Bu güzel bir çözüm, ancak sadece IE 10+ olduğu unutulmamalıdır.
Eric Hu

13

CSS clip-path

Bu sorunun cevapsız olduğunu düşündüğüm bir şey; clip-path

clip-path kısaca

Kırpma clip-pathözelliği ile dikdörtgen bir kağıt parçasından bir şekli (daire veya beşgen gibi) kesmeye benzer. Tesis, “ CSS Maskeleme Modülü Seviye 1 ” spesifikasyonuna aittir . Spesifikasyonlar, “CSS maskeleme, görsel öğelerin kısımlarını kısmen veya tamamen gizlemek için iki yol sağlar: maskeleme ve kırpma”.


clip-pathparametrelerinde belirttiğiniz şekli kesmek için öğenin kenarlıkları yerine kendisini kullanır. Düzenlemeyi çok kolaylaştıran süper basit bir yüzde tabanlı koordinat sistemi kullanır ve birkaç dakika içinde alıp tuhaf ve harika şekiller oluşturabileceğiniz anlamına gelir.


Üçgen Şekli Örneği

div {
  -webkit-clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
  clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
  background: red;
  width: 100px;
  height: 100px;
}
<div></div>


Dezavantaj

Şu anda büyük bir dezavantajı var, biri büyük destek eksikliği, sadece gerçekten -webkit-tarayıcılar içinde kapsanıyor ve IE'de desteklenmiyor ve FireFox'ta çok kısmi.


kaynaklar

İşte daha iyi anlamanıza clip-pathve kendinizinkini oluşturmaya başlamanıza yardımcı olacak bazı yararlı kaynaklar ve materyaller .


11

Bu eski bir soru, ama bence bu üçgen tekniğini kullanarak bir ok oluşturmayı paylaşmaya değecek.

Aşama 1:

2 üçgen oluşturalım, ikincisi için :aftersözde sınıfı kullanacağız ve diğerinin hemen altına yerleştireceğiz:

2 üçgen

.arrow{
    width: 0;
    height: 0;
    border-radius: 50px;
    display: inline-block;
    position: relative;
}

    .arrow:after{
        content: "";
        width: 0;
        height: 0;
        position: absolute;
    }


.arrow-up{
     border-left: 50px solid transparent;
     border-right: 50px solid transparent;
     border-bottom: 50px solid #333;
}
    .arrow-up:after{
         top: 5px;
         border-left: 50px solid transparent;
         border-right: 50px solid transparent;
         border-bottom: 50px solid #ccc;
         right: -50px;
    }
<div class="arrow arrow-up"> </div>

Adım 2

Şimdi sadece ikinci üçgenin baskın kenarlık rengini arka planın aynı rengine ayarlamalıyız:

resim açıklamasını buraya girin

Tüm oklarla uğraş :
http://jsfiddle.net/tomsarduy/r0zksgeu/


9

SASS (SCSS) üçgen karışımı

Bunu otomatik olarak bir CSS üçgeni oluşturmayı (ve KURU) kolaylaştırmak için yazdım:

// Triangle helper mixin (by Yair Even-Or)
// @param {Direction} $direction - either `top`, `right`, `bottom` or `left`
// @param {Color} $color [currentcolor] - Triangle color
// @param {Length} $size [1em] - Triangle size
@mixin triangle($direction, $color: currentcolor, $size: 1em) {
  $size: $size/2;
  $transparent: rgba($color, 0);
  $opposite: (top:bottom, right:left, left:right, bottom:top);

  content: '';
  display: inline-block;
  width: 0;
  height: 0;
  border: $size solid $transparent;
  border-#{map-get($opposite, $direction)}-color: $color;
  margin-#{$direction}: -$size;
}

kullanım örneği:

span {
  @include triangle(bottom, red, 10px);
}

Bahçesi sayfası


Önemli not:
üçgen bazı tarayıcılarda pikselli görünüyorsa , burada açıklanan yöntemlerden birini deneyin .


8

Üçgene kenarlık uygulamak istiyorsanız şunu okuyun: CSS ile üçgen mi oluşturuyorsunuz?

Hemen hemen tüm cevaplar sınır kullanılarak oluşturulan üçgene odaklanır, bu yüzden linear-gradientyöntemi ( @lima_fil yanıtında başladığı gibi) ayrıntılı olarak açıklayacağım .

Gibi bir derece değeri kullanmak, istediğimiz üçgeni elde etmek için 45°bizi belirli bir orana saygı göstermeye zorlar height/widthve bu duyarlı olmayacaktır:

Bunun yerine bunu yapmanın biz gibi yönünün önceden tanımlı değerleri dikkate almalıdır to bottom, to topduyarlı tutarken biz üçgen şeklin her türlü elde edebilirsiniz Bu durumda, vb.

1) Dikdörtgen üçgen

Örneğin üçgen elde etmek için biz, bir doğrusal gradyan ve benzerleri gibi bir çapraz yön mi to bottom right, to top left, to bottom left, vs

2) ikizkenar üçgen

Bunun için yukarıdaki gibi 2 doğrusal gradyana ihtiyacımız olacak ve her biri genişliğin (veya yüksekliğin) yarısını alacak. Sanki ilk üçgenin ayna görüntüsünü oluşturuyoruz.

3) eşkenar üçgen

Gradyanın yüksekliği ve genişliği arasında bir ilişki sürdürmemiz gerektiğinden, bu işlemek biraz zor. Yukarıdaki ile aynı üçgene sahip olacağız, ancak ikizkenar üçgeni eşkenar üçgene dönüştürmek için hesaplamayı daha karmaşık hale getireceğiz.

Bunu kolaylaştırmak için, div bölümümüzün genişliğinin bilindiğini ve yüksekliğin üçgenimizi ( height >= width) içine çekebilecek kadar büyük olduğunu düşüneceğiz .

Gradyanlı CSS üçgeni

İki gradyanımız var g1ve g2mavi çizgi genişliğidir div wve her gradyan% 50'sine ( w/2) sahip olacak ve üçgenin her bir tarafı eşit olacaktır w. Yeşil çizgi her iki eğimin yüksekliğidirhg ve aşağıdaki formülü kolayca elde edebiliriz:

(w/2)² + hg² = w²---> hg = (sqrt(3)/2) * w--->hg = 0.866 * w

calc()Hesaplamamızı yapmak ve gerekli sonucu elde etmek için güvenebiliriz :

Başka bir yol, div yüksekliğini kontrol etmek ve degradenin sözdizimini kolay tutmaktır:

4) Rastgele üçgen

Rastgele bir üçgen elde etmek için, her birinin% 50'sini kaldırmamız gerektiğinden kolaydır, ancak iki koşulu korumalıyız (her ikisi de aynı yüksekliğe sahip olmalı ve her iki genişliğin toplamı% 100 olmalıdır).

Ama ya her bir taraf için bir değer tanımlamak istersek? Tekrar hesap yapmamız gerekiyor!

Gradyanlı CSS üçgeni

En tanımlayalım hg1ve hg2sonra bizim gradyanı yüksekliği olarak (her ikisi de kırmızı çizgi eşittir) wg1ve wg2bizim gradyan eni olarak ( wg1 + wg2 = a). Hesaplamayı detaylandıramayacağım, ancak sonunda sahip olacağız:

wg2 = (a²+c²-b²)/(2a)
wg1 = a - wg2
hg1 = hg2 = sqrt(b² - wg1²) = sqrt(c² - wg2²)

Şimdi, CSS sınırına ulaştık, çünkü calc()bunu uygulayamayacağız, bu yüzden sadece nihai sonucu manuel olarak toplamamız ve sabit boyut olarak kullanmamız gerekiyor:

Bonus

Döndürme ve / veya eğim uygulayabileceğimizi ve daha fazla üçgen elde etmek için daha fazla seçeneğimiz olduğunu unutmamalıyız:

Ve elbette , bazı durumlarda daha uygun olabilecek SVG çözümünü aklımızda tutmalıyız :


4

İşte başka bir keman:

.container:after {
    position: absolute;
    right: 0;
    content: "";
    margin-right:-50px;
    margin-bottom: -8px;
    border-width: 25px;
    border-style: solid;
    border-color: transparent transparent transparent #000;
    width: 0;
    height: 0;
    z-index: 10;
    -webkit-transition: visibility 50ms ease-in-out,opacity 50ms ease-in-out;
    transition: visibility 50ms ease-in-out,opacity 50ms ease-in-out;
    bottom: 21px;
}
.container {
    float: left;
    margin-top: 100px;
    position: relative;
    width: 150px;
    height: 80px;
    background-color: #000;
}

.containerRed {
    float: left;
    margin-top: 100px;
    position: relative;
    width: 100px;
    height: 80px;
    background-color: red;
}

https://jsfiddle.net/qdhvdb17/


4

Diğerleri bunu zaten iyi açıkladı. Size bunu hızlı bir şekilde açıklayacak bir animasyon vereyim : http://codepen.io/chriscoyier/pen/lotjh

İşte oyun oynamak ve kavramları öğrenmek için bazı kod.

HTML:

<html>
  <body>
    <div id="border-demo">
    </div>
  </body>
</html>

CSS:

/*border-width is border thickness*/
#border-demo {
    background: gray;
    border-color: yellow blue red green;/*top right bottom left*/
    border-style: solid;
    border-width: 25px 25px 25px 25px;/*top right bottom left*/
    height: 50px;
    width: 50px;
}

Bununla oynayın ve ne olduğunu görün. Yüksekliği ve genişliği sıfıra ayarlayın. Ardından üst kenarlığı kaldırın ve sol ve sağ şeffaf olun veya bir css üçgeni yapmak için aşağıdaki koda bakın:

#border-demo {
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-bottom: 100px solid blue;
}

2

Eğer uğraşmak istiyorsanız border-size, widthve heightve bu farklı şekiller yaratabilirsiniz nasıl, şunu deneyin:

const sizes = [32, 32, 32, 32];
const triangle = document.getElementById('triangle');

function update({ target }) {
  let index = null;
  
  if (target) {
    index = parseInt(target.id);

    if (!isNaN(index)) {
      sizes[index] = target.value;
    }
  }
  
  window.requestAnimationFrame(() => {
    triangle.style.borderWidth = sizes.map(size => `${ size }px`).join(' ');
    
    if (isNaN(index)) {
      triangle.style[target.id] = `${ target.value }px`;
    }
  });
}

document.querySelectorAll('input').forEach(input => {
  input.oninput = update;
});

update({});
body {
  margin: 0;
  min-height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
  overflow: hidden;
}

#triangle {
    border-style: solid;
    border-color: yellow magenta blue black;
    background: cyan;
    height: 0px;
    width: 0px;
}

#controls {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  background: white;
  display: flex;
  box-shadow: 0 0 32px rgba(0, 0, 0, .125);
}

#controls > div {
  position: relative;
  width: 25%;
  padding: 8px;
  box-sizing: border-box;
  display: flex;
}

input {
  margin: 0;
  width: 100%;
  position: relative;
}
<div id="triangle" style="border-width: 32px 32px 32px 32px;"></div>

<div id="controls">
  <div><input type="range" min="0" max="128" value="32" id="0" /></div>
  <div><input type="range" min="0" max="128" value="32" id="1" /></div>
  <div><input type="range" min="0" max="128" value="32" id="2" /></div>
  <div><input type="range" min="0" max="128" value="32" id="3" /></div>
  <div><input type="range" min="0" max="128" value="0" id="width" /></div>
  <div><input type="range" min="0" max="128" value="0" id="height" /></div>
</div>


1

Bunu dene:-

.triangle {
    border-color: transparent transparent red transparent;
    border-style: solid;
    border-width: 0px 200px 200px 200px;
    height: 0px;
    width: 0px;
}
<div class="triangle"></div>


0

Bunun eski olduğunu biliyorum, ancak bu tartışmaya, yalnızca HTML ve CSS kullanarak üçgen oluşturmak için en az 5 farklı yöntem olduğunu eklemek istiyorum .

  1. kullanma borders
  2. kullanma linear-gradient
  3. kullanma conic-gradient
  4. kullanılması transformveoverflow
  5. kullanma clip-path

Bence, burada yöntem 3 dışında, burada ele conic-gradientalınacak, bu yüzden burada paylaşacağım düşünüyorum:

.triangle{
        width: 40px;
        height: 40px;
        background: conic-gradient(at 50% 50%,transparent 135deg,green 0,green 225deg, transparent 0);
    }
<div class="triangle"></div>

Konik Degradeyi Kullanarak CSS Üçgenleri Oluşturma

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.