Eğimli bir tarafla şekil verin (duyarlı)


93

Aşağıdaki resimdeki gibi sadece bir tarafta (örneğin alt tarafta) eğimli kenar diğer kenarlar düz kalırken bir şekil oluşturmaya çalışıyorum .

Eğik kenarlı CSS div

Border yöntemini kullanmayı denedim (kod aşağıda verilmiştir) ancak şeklimin boyutları dinamik ve bu nedenle bu yöntemi kullanamıyorum.

.shape {
    position: relative;
    height: 100px;
    width: 200px;
    background: tomato;
}
.shape:after {
    position: absolute;
    content: '';
    height: 0px;
    width: 0px;
    left: 0px;
    bottom: -100px;
    border-width: 50px 100px;
    border-style: solid;
    border-color: tomato tomato transparent transparent;
}
<div class="shape">
    Some content
</div>


Ayrıca arka plan için degradeler kullanmayı denedim (aşağıdaki kodda olduğu gibi), ancak boyutlar değiştikçe karışıyor. Aşağıdaki parçadaki şeklin üzerine gelerek ne demek istediğimi anlayabilirsiniz.

Bu şekli eğimli bir tarafla nasıl oluşturabilirim ve aynı zamanda dinamik boyutları destekleyebilir miyim?

Yanıtlar:


128

Sadece bir tarafta eğimli kenarlı bir şekil oluşturmanın birçok yolu vardır.

Aşağıdaki yöntemler, soruda daha önce belirtildiği gibi dinamik boyutları destekleyemez:

  • İçin piksel değerleri ile sınır üçgeni yöntemi border-width.
  • Açı sözdizimine sahip doğrusal degradeler (45deg, 30deg gibi).

Dinamik boyutları destekleyebilecek yöntemler aşağıda açıklanmıştır.


Yöntem 1 - SVG

( Tarayıcı Uyumluluğu )

SVG, polygons veya paths kullanılarak şekli oluşturmak için kullanılabilir . Aşağıdaki kod parçacığı kullanır polygon. Gerekli herhangi bir metin içeriği şeklin üstüne yerleştirilebilir.

Artıları

  • SVG, ölçeklenebilir grafikler üretmek için tasarlanmıştır ve tüm boyut değişiklikleriyle iyi çalışabilir.
  • Sınırlar ve gezinme efekti, minimum kodlama ek yükü ile elde edilebilir.
  • Şekle görüntü veya gradyan arka planı da sağlanabilir.

Eksileri

  • Tarayıcı desteği muhtemelen tek dezavantajıdır çünkü IE8 SVG'yi desteklemiyor ancak bu, Raphael ve ayrıca VML gibi kütüphaneler kullanılarak azaltılabilir. Dahası, tarayıcı desteği hiçbir şekilde diğer seçeneklerden daha kötü değildir.

Yöntem 2 - Gradyan Arka Planı

( Tarayıcı Uyumluluğu )

Doğrusal gradyanlar yine de şekli üretmek için kullanılabilir, ancak soruda belirtildiği gibi açılarla kullanılamaz. Biz kullanmak zorunda to [side] [side](sayesinde sözdizimi vals yerine açıları belirleme). Kenarlar belirtildiğinde, gradyan açıları kabın boyutlarına göre otomatik olarak ayarlanır.

Artıları

  • Kabın boyutları dinamik olsa bile şekil elde edilebilir ve korunabilir.
  • Gradyan rengi değiştirilerek üzerine gelme efekti eklenebilir.

Eksileri

  • İmleç şeklin dışında ancak kabın içinde olduğunda bile fareyle üzerine gelme efekti tetiklenecektir.
  • Kenarlık eklemek, zor degrade manipülasyonları gerektirir.
  • Genişlik (veya yükseklik) çok büyük olduğunda gradyanların pürüzlü köşeler ürettiği bilinmektedir.
  • Şekil üzerinde resim arka planı kullanılamaz.

Yöntem 3 - Eğriltme Dönüşümleri

( Tarayıcı Uyumluluğu )

Bu yöntemde, bir sözde eleman eklenir, eğrilir ve kenarlardan biri eğimli / açılı görünecek şekilde konumlandırılır.Üst veya alt kenar eğimli ise, eğim Y ekseni boyunca olmalıdır, aksi takdirde dönüş X ekseni boyunca olmalıdır. transform-originEğimli tarafa yan tersini sahip olmalıdır.

Artıları

  • Sınırlarla bile şekil elde edilebilir.
  • Fareyle üzerine gelme efekti, şeklin içindekilerle sınırlı olacaktır.

Eksileri

  • Şekilin korunması için boyutların orantılı olarak artması gerekir, çünkü bir öğe eğik olduğunda, Y eksenindeki ofseti arttıkça widthartar ve bunun tersi de geçerlidir ( parçacığın içindeki widthdeğerini artırmayı deneyin 200px). Bununla ilgili daha fazla bilgiyi burada bulabilirsiniz .

Yöntem 4 - Perspektif Dönüşümleri

( Tarayıcı Uyumluluğu )

Bu yöntemde, ana kap, biraz perspektifle X veya Y ekseni boyunca döndürülür. Uygun değerin olarak ayarlanması, transform-originyalnızca bir tarafta eğimli bir kenar oluşturacaktır.

Üst veya alt taraf eğimli ise, dönüş Y ekseni boyunca olmalı, aksi takdirde dönüş X ekseni boyunca olmalıdır. transform-originEğimli tarafa yan tersini sahip olmalıdır.

Artıları

  • Kenarlıklar ile şekil elde edilebilir.
  • Şeklin korunması için boyutların orantılı olarak artması gerekmez.

Eksileri

  • İçerik de döndürülecek ve bu nedenle normal görünmeleri için ters çevrilmeleri gerekecek.
  • Boyutlar statik değilse konumlandırma metni sıkıcı olacaktır.

Yöntem 5 - CSS Klip Yolu

( Tarayıcı Uyumluluğu )

Bu yöntemde, ana kap, bir çokgen kullanılarak istenen şekle kırpılır. Poligonun noktaları, eğimli kenarın gerekli olduğu tarafa bağlı olarak değiştirilmelidir.

Artıları

  • Kapsayıcı dinamik olarak yeniden boyutlandırılırken bile şekil korunabilir.
  • Fareyle üzerine gelme efekti, şeklin sınırları içinde mükemmel şekilde sınırlandırılacaktır.
  • Resim, şekil için arka plan olarak da kullanılabilir.

Eksileri

  • Tarayıcı desteği şu anda çok zayıf.
  • Şeklin üstüne kesinlikle konumlandırılmış bir eleman yerleştirilerek ve ona gerekli klibi verilerek sınırlar eklenebilir, ancak bir noktanın ötesinde dinamik olarak yeniden boyutlandırılırken iyi uymaz.

Yöntem 6 - Tuval

( Tarayıcı Uyumluluğu )

Kanvas, yolları çizerek şekli oluşturmak için de kullanılabilir. Aşağıdaki kod parçasının bir demosu var. Gerekli herhangi bir metin içeriği şeklin üstüne yerleştirilebilir.

Artıları

  • Kabın boyutları dinamik olsa bile şekil elde edilebilir ve korunabilir. Kenarlıklar da eklenebilir.
  • Fareyle üzerine gelme efekti, pointInpathyöntem kullanılarak şeklin sınırları dahilinde sınırlandırılabilir .
  • Şekle görüntü veya gradyan arka planı da sağlanabilir.
  • DOM manipülasyonu gerektirmediğinden gerçek zamanlı animasyon efektlerine ihtiyaç duyulursa daha iyi bir seçimdir.

Eksileri

  • Tuval raster tabanlıdır ve bu nedenle, bir noktanın ötesine ölçeklendiğinde açılı kenarlar pikselleşir veya bulanıklaşır * .

* - Görüntü alanı yeniden boyutlandırıldığında pikselleşmeden kaçınmak için şeklin yeniden boyanması gerekir. Burada bir örneği var ama bu bir ek yük.


36

Border yöntemini kullanmayı denedim ama şeklimin boyutları dinamik ve bu yüzden bu yöntemi kullanamıyorum.


Yöntem 7 - Görüntü Alanı Birimleri (Kenarlık Redux )

( Tarayıcı Uyumluluğu )

Viewport Units , CSS3'te büyük bir yeniliktir. Özelliklerinizi dinamikleştirmek için genellikle yüzde değerlerini kullanabilirsiniz, ancak bunu border-widths ( veya font-sizes ) için yapamazsınız .

Bunun yerine Viewport Units ile nesnelerinizin boyutları ile birlikte çerçeve genişliklerinizi görünüm alanı boyutuna göre dinamik olarak ayarlayabilirsiniz .

Not: yüzde değerleri, görünüm alanına (pencerenin görünür alanı) değil, ana nesneye atıfta bulunur.

Yöntemi test etmek için, aşağıdaki kod parçacığı Tam Sayfayı başlatın ve hem yatay hem de dikey olarak yeniden boyutlandırın.

.shape {
    position: relative;
    height: 20vh;
    width: 40vw;
    background: tomato;
}
.shape:after {
    position: absolute;
    content: '';
    left: 0px;
    right: 0px;
    top: 20vh;
    border-width: 10vh 20vw;
    border-style: solid;
    border-color: tomato tomato rgba(0,0,0,0) rgba(0,0,0,0);
}
<div class="shape">Some content</div>

Artıları - (1) Her şey dinamiktir, tarayıcı kapsamı geniştir.

Dezavantajları - (1) En dikkat etmelidir OS kaydırma çubuğunu nasıl işleyeceğini ile overflow: auto;.


3
Chrome'un son sürümünde pürüzlü görünüyor.
Mr_Green

Doğru! Sanırım tarayıcı motorlarının bunu sorunsuz bir şekilde işlemek için hala biraz zamana ihtiyacı var. Firefox, bu tekniği görüntü alanı birimleri yerine piksellerle kullanırken de bu sorunu yaşıyor, ancak şeffaf yerine rgba (,,, 0) kullanılarak düzeltilebilir. Neyse ki şu anda başka seçeneklerimiz var;)
Andrea Ligios

1

Benim çözümüm , bu sayfanın yukarısında bulunan Andrea Ligios'un Yöntem 7 - Görüntü Alanı Birimleri adlı çözümden esinlenmiştir .

height:10vwGezinme penceresinin genişliğini yeniden boyutlandırırken yamukta verilen oranları korumak için yükseklik için de "yatay" birimi ( ) kullandım. Bu Yöntem 7b - Görüntü Alanı Genişliği diyebiliriz .

Ayrıca, divbir ve :afterseçici yerine iki iç içe geçmiş s kullanılması, bana göre metin içerik stillerinin daha iyi ayarlanmasını sağlar (örn. text-align, Vb.).

.dtrapz {
  position: relative;
  margin: 10px 40vw;
  width: 0;
  height: 10vw;
  border: none;
  border-right: 20vw solid #f22;
  border-bottom: 5vw solid transparent;
}

.dtcont {
  position: absolute;
  width: 20vw;
  height: 10vw;
  text-align: center;
  color: #fff;/* just aesthetic */
}
<div class="dtrapz">
  <div class="dtcont">Some content</div>
</div>


@ Downvoter Merhaba! Cevabımda neyin yanlış olduğunu bana bildirin, böylece mantıklıysa onu düzenleyebilir veya silebilirim! Ben bir uzman değilim ama bana öyle geliyor ki bu birçok sayfada uygulanabilir, yalnızca genişliğe bağlı olarak daha uzun metin içeriğiyle çalışabilir :)
MattAllegro
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.