รูปร่างเอียงข้าง (ตอบสนอง)


93

ฉันกำลังพยายามสร้างรูปร่างเหมือนในภาพด้านล่างโดยมีขอบเอียงเพียงด้านเดียว (เช่นด้านล่าง) ในขณะที่ขอบอีกด้านยังคงตรง

CSS div ที่มีด้านเอียง

ฉันลองใช้วิธีการเส้นขอบ (ระบุรหัสด้านล่าง) แต่ขนาดของรูปร่างของฉันเป็นแบบไดนามิกดังนั้นฉันจึงไม่สามารถใช้วิธีนี้ได้

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


ฉันได้ลองใช้การไล่ระดับสีสำหรับพื้นหลังด้วย (เช่นในโค้ดด้านล่าง) แต่มันยุ่งเหยิงเมื่อขนาดเปลี่ยนไป คุณสามารถดูความหมายของฉันได้โดยการวางเมาส์บนรูปร่างในตัวอย่างด้านล่าง

ฉันจะสร้างรูปทรงนี้โดยเอียงด้านและรองรับขนาดไดนามิกได้อย่างไร

คำตอบ:


128

มีหลายวิธีในการสร้างรูปร่างที่มีขอบเอียงเพียงด้านเดียว

วิธีการต่อไปนี้ไม่สามารถรองรับขนาดไดนามิกตามที่กล่าวไว้แล้วในคำถาม:

  • วิธีสามเหลี่ยมชายแดนพร้อมค่าพิกเซลสำหรับborder-width.
  • การไล่ระดับสีเชิงเส้นด้วยไวยากรณ์ของมุม (เช่น 45deg, 30deg เป็นต้น)

วิธีการที่สามารถรองรับขนาดไดนามิกได้อธิบายไว้ด้านล่าง


วิธีที่ 1 - SVG

( ความเข้ากันได้ของเบราว์เซอร์ )

SVG สามารถใช้เพื่อสร้างรูปร่างได้โดยใช้polygons หรือpaths polygonข้อมูลโค้ดด้านล่างทำให้การใช้ เนื้อหาข้อความใด ๆ ที่ต้องการสามารถวางไว้ด้านบนของรูปร่างได้

ข้อดี

  • SVG ได้รับการออกแบบมาเพื่อสร้างกราฟิกที่ปรับขนาดได้และสามารถทำงานได้ดีกับการเปลี่ยนแปลงมิติทั้งหมด
  • เส้นขอบและเอฟเฟกต์โฮเวอร์สามารถทำได้โดยมีค่าใช้จ่ายในการเข้ารหัสน้อยที่สุด
  • ภาพหรือพื้นหลังไล่ระดับสีให้กับรูปร่างได้

จุดด้อย

  • การรองรับเบราว์เซอร์อาจเป็นข้อเสียเพียงอย่างเดียวเนื่องจาก IE8- ไม่รองรับ SVG แต่สามารถลดลงได้โดยใช้ไลบรารีเช่น Raphael และ VML ยิ่งไปกว่านั้นการรองรับเบราว์เซอร์ก็ไม่เลวร้ายไปกว่าตัวเลือกอื่น ๆ

วิธีที่ 2 - พื้นหลังไล่ระดับสี

( ความเข้ากันได้ของเบราว์เซอร์ )

การไล่ระดับสีเชิงเส้นยังสามารถใช้เพื่อสร้างรูปร่างได้ แต่ไม่สามารถใช้กับมุมตามที่กล่าวไว้ในคำถาม เราต้องใช้to [side] [side]ไวยากรณ์ (ขอบคุณvals ) แทนการระบุมุม เมื่อระบุด้านข้างมุมการไล่ระดับสีจะถูกปรับโดยอัตโนมัติตามขนาดของคอนเทนเนอร์

ข้อดี

  • รูปร่างสามารถทำได้และคงไว้แม้ว่าขนาดของคอนเทนเนอร์จะเป็นแบบไดนามิก
  • สามารถเพิ่มเอฟเฟกต์โฮเวอร์ได้โดยการเปลี่ยนสีไล่ระดับ

จุดด้อย

  • เอฟเฟกต์โฮเวอร์จะถูกทริกเกอร์แม้ว่าเคอร์เซอร์จะอยู่นอกรูปร่าง แต่อยู่ในคอนเทนเนอร์
  • การเพิ่มเส้นขอบจะต้องมีการปรับแต่งการไล่ระดับสีที่ยุ่งยาก
  • การไล่ระดับสีเป็นที่ทราบกันดีในการสร้างมุมหยักเมื่อความกว้าง (หรือความสูง) ใหญ่มาก
  • ไม่สามารถใช้พื้นหลังรูปภาพกับรูปร่างได้

วิธีที่ 3 - Skew Transforms

( ความเข้ากันได้ของเบราว์เซอร์ )

ในวิธีนี้จะมีการเพิ่มองค์ประกอบหลอกเอียงและวางตำแหน่งในลักษณะที่ดูเหมือนว่าขอบด้านใดด้านหนึ่งเอียง / ทำมุมหากขอบด้านบนหรือด้านล่างเอียงการเอียงควรอยู่ตามแกน Y หรือไม่เช่นนั้น การหมุนควรเป็นไปตามแกน X transform-originควรมีด้านตรงข้ามไปทางด้านเป๋

ข้อดี

  • รูปร่างสามารถทำได้แม้จะมีเส้นขอบ
  • เอฟเฟกต์โฮเวอร์จะถูก จำกัด ให้อยู่ภายในรูปร่าง

จุดด้อย

  • ขนาดต้องเพิ่มสัดส่วนสำหรับรูปร่างที่จะได้รับการรักษาเพราะเมื่อองค์ประกอบเป็นเบ้ของการชดเชยในแกน Y เพิ่มขึ้นตามwidthการเพิ่มขึ้นและในทางกลับกัน (ลองเพิ่มwidthไป200pxในข้อมูลโค้ด) คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่

วิธีที่ 4 - การแปลงมุมมอง

( ความเข้ากันได้ของเบราว์เซอร์ )

ในวิธีนี้คอนเทนเนอร์หลักจะหมุนไปตามแกน X หรือ Y ด้วยมุมมองเล็กน้อย การตั้งค่าที่เหมาะสมtransform-originจะทำให้เกิดขอบเอียงเพียงด้านเดียว

หากด้านบนหรือด้านล่างเอียงการหมุนควรอยู่ตามแกน Y มิฉะนั้นการหมุนควรอยู่ตามแกน X transform-originควรมีด้านตรงข้ามไปทางด้านเป๋

ข้อดี

  • รูปร่างสามารถทำได้โดยมีเส้นขอบ
  • ขนาดไม่จำเป็นต้องเพิ่มขึ้นตามสัดส่วนเพื่อรักษารูปร่าง

จุดด้อย

  • เนื้อหาจะถูกหมุนเวียนด้วยและด้วยเหตุนี้จึงต้องหมุนตัวนับเพื่อให้ดูเป็นปกติ
  • ข้อความการวางตำแหน่งจะน่าเบื่อหากขนาดไม่คงที่

วิธีที่ 5 - CSS Clip Path

( ความเข้ากันได้ของเบราว์เซอร์ )

ในวิธีนี้คอนเทนเนอร์หลักจะถูกตัดเป็นรูปร่างที่ต้องการโดยใช้รูปหลายเหลี่ยม ควรแก้ไขจุดของรูปหลายเหลี่ยมขึ้นอยู่กับด้านที่ต้องการขอบเอียง

ข้อดี

  • สามารถรักษารูปร่างได้แม้ว่าจะมีการปรับขนาดคอนเทนเนอร์แบบไดนามิก
  • เอฟเฟกต์โฮเวอร์จะถูก จำกัด อย่างสมบูรณ์ภายในขอบเขตของรูปร่าง
  • ภาพยังสามารถใช้เป็นพื้นหลังสำหรับรูปร่างได้

จุดด้อย

  • การรองรับเบราว์เซอร์นั้นแย่มากในปัจจุบัน
  • คุณสามารถเพิ่มเส้นขอบได้โดยการวางองค์ประกอบที่อยู่ในตำแหน่งที่แน่นอนไว้ด้านบนของรูปร่างและให้คลิปที่จำเป็น แต่เกินจุดนั้นจะไม่พอดีเมื่อปรับขนาดใหม่แบบไดนามิก

วิธีที่ 6 - ผ้าใบ

( ความเข้ากันได้ของเบราว์เซอร์ )

ผ้าใบยังสามารถใช้เพื่อสร้างรูปร่างโดยการวาดเส้นทาง ตัวอย่างด้านล่างมีการสาธิต เนื้อหาข้อความใด ๆ ที่ต้องการสามารถวางไว้ด้านบนของรูปร่างได้

ข้อดี

  • รูปร่างสามารถทำได้และคงไว้แม้ว่าขนาดของคอนเทนเนอร์จะเป็นแบบไดนามิก สามารถเพิ่มเส้นขอบได้
  • เอฟเฟกต์โฮเวอร์สามารถ จำกัด ให้อยู่ภายในขอบเขตของรูปร่างได้โดยใช้pointInpathวิธีการ
  • ภาพหรือพื้นหลังไล่ระดับสีให้กับรูปร่างได้
  • ทางเลือกที่ดีกว่าหากต้องการเอฟเฟ็กต์ภาพเคลื่อนไหวแบบเรียลไทม์เนื่องจากไม่ต้องใช้การจัดการ DOM

จุดด้อย

  • ผ้าใบเป็นไปตามแรสเตอร์และด้วยเหตุนี้ขอบมุมจะกลายเป็นตัวหนังสือหรือเบลอเมื่อปรับขนาดเกินกว่าจุด*

* - การหลีกเลี่ยงการสร้างพิกเซลจะต้องมีการเปลี่ยนรูปร่างใหม่ทุกครั้งที่มีการปรับขนาดวิวพอร์ต มีตัวอย่างอยู่ที่นี่แต่เป็นค่าใช้จ่าย


36

ฉันลองใช้วิธีเส้นขอบแต่ขนาดของรูปร่างของฉันเป็นแบบไดนามิกดังนั้นฉันจึงไม่สามารถใช้วิธีนี้ได้


วิธีที่ 7 - หน่วยวิวพอร์ต (Border Redux )

( ความเข้ากันได้ของเบราว์เซอร์ )

Viewport Unitsเป็นนวัตกรรมที่ยอดเยี่ยมใน CSS3 ในขณะที่คุณสามารถใช้ค่าเปอร์เซ็นต์เพื่อทำให้คุณสมบัติของคุณมีชีวิตชีวา แต่คุณไม่สามารถทำได้สำหรับborder-widths ( หรือสำหรับfont-sizes )

ด้วยหน่วยวิวพอร์ตคุณสามารถตั้งค่าความกว้างของเส้นขอบพร้อมกับขนาดของวัตถุของคุณแบบไดนามิกเมื่อเทียบกับมิติวิวพอร์ต

หมายเหตุ: ค่าเปอร์เซ็นต์ถูกอ้างถึงไปยังออบเจ็กต์หลักไม่ใช่วิวพอร์ต (พื้นที่ที่มองเห็นได้ของหน้าต่าง)

ในการทดสอบวิธีนี้ให้เปิดตัวอย่างเต็มหน้าต่อไปนี้และปรับขนาดทั้งแนวนอนและแนวตั้ง

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

ข้อดี - (1) ทุกอย่างเป็นแบบไดนามิกความครอบคลุมของเบราว์เซอร์กว้าง

จุดด้อย - (1) คุณควรให้ความสนใจในวิธีการจัดการกับระบบปฏิบัติการของคุณแถบเลื่อนoverflow: auto;ด้วย


3
ดูเหมือนว่าจะมีรอยหยักใน Chrome เวอร์ชันล่าสุด
Mr_Green

จริง! ฉันเดาว่าเอ็นจิ้นเบราว์เซอร์ยังคงต้องใช้เวลาในการแสดงผลอย่างราบรื่น Firefox ก็มีปัญหานี้เช่นกันเมื่อใช้เทคนิคนี้กับพิกเซลแทนหน่วยวิวพอร์ต แต่แก้ไขได้โดยใช้ rgba (,,, 0) แทนโปร่งใส โชคดีที่เรามีทางเลือกอื่นในตอนนี้;)
Andrea Ligios

1

โซลูชันของฉันได้รับแรงบันดาลใจจากวิธีที่เรียกว่าMethod 7 - Viewport Unitsโดย Andrea Ligios ด้านบนในหน้านี้

ฉันใช้หน่วย "แนวนอน" สำหรับความสูงด้วย ( height:10vw) เพื่อรักษาสัดส่วนที่กำหนดไว้ในสี่เหลี่ยมคางหมูเมื่อปรับขนาดความกว้างของหน้าต่างนำทาง เราอาจจะเรียกสิ่งนี้7b วิธี - Viewport กว้าง

นอกจากนี้การใช้สองdivs ที่ซ้อนกันแทนที่จะเป็นหนึ่งตัวและ:afterตัวเลือกช่วยให้สามารถปรับแต่งรูปแบบเนื้อหาข้อความได้ดีขึ้นในความคิดของฉัน (เช่นtext-alignฯลฯ )

.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 สวัสดี! แจ้งให้เราทราบว่ามีอะไรผิดปกติกับคำตอบของฉันเพื่อที่ฉันจะได้แก้ไขหรือลบคำตอบนี้ได้หากเหมาะสม! ฉันไม่ใช่ผู้เชี่ยวชาญ แต่สำหรับฉันแล้วดูเหมือนว่าสามารถใช้ได้ในหลาย ๆ หน้าทำงานกับเนื้อหาข้อความที่ยาวขึ้นขึ้นอยู่กับความกว้างเท่านั้น :)
MattAllegro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.