Hình dạng với một mặt nghiêng (đáp ứng)


90

Tôi đang cố gắng tạo ra một hình dạng như trong hình bên dưới với một cạnh nghiêng chỉ ở một bên (ví dụ: cạnh dưới) trong khi các cạnh khác vẫn thẳng.

CSS div có một cạnh nghiêng

Tôi đã thử sử dụng phương pháp đường viền (mã được đưa ra bên dưới) nhưng kích thước của hình dạng của tôi là động và do đó tôi không thể sử dụng phương pháp này.

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


Tôi cũng đã thử sử dụng gradient cho nền (như trong đoạn mã bên dưới) nhưng nó bị rối khi kích thước thay đổi. Bạn có thể hiểu ý tôi bằng cách di chuột vào hình dạng trong đoạn mã bên dưới.

Làm cách nào để tạo hình dạng này với một mặt nghiêng và cũng có thể hỗ trợ kích thước động ?

Câu trả lời:


125

Có nhiều cách để tạo ra hình dạng với một cạnh xéo chỉ ở một bên.

Các phương pháp sau không thể hỗ trợ kích thước động như đã được đề cập trong câu hỏi:

  • Phương pháp tam giác viền với các giá trị pixel cho border-width.
  • Gradient tuyến tính với cú pháp góc (như 45deg, 30deg, v.v.).

Các phương pháp có thể hỗ trợ kích thước động được mô tả bên dưới.


Phương pháp 1 - SVG

( Khả năng tương thích của trình duyệt )

SVG có thể được sử dụng để tạo ra hình dạng bằng cách sử dụng polygons hoặc paths. Đoạn mã dưới đây sử dụng polygon. Bất kỳ nội dung văn bản nào được yêu cầu đều có thể được đặt trên đầu của hình dạng.

Ưu điểm

  • SVG được thiết kế để tạo ra đồ họa có thể mở rộng và có thể hoạt động tốt với mọi thay đổi về kích thước.
  • Biên giới và hiệu ứng di chuột có thể đạt được với chi phí mã hóa tối thiểu.
  • Hình ảnh hoặc nền gradient cũng có thể được cung cấp cho hình dạng.

Nhược điểm

  • Hỗ trợ trình duyệt có lẽ là nhược điểm duy nhất vì IE8- không hỗ trợ SVG nhưng điều đó có thể được giảm thiểu bằng cách sử dụng các thư viện như Raphael và cả VML. Hơn nữa, hỗ trợ trình duyệt không có cách nào kém hơn các tùy chọn khác.

Phương pháp 2 - Nền Gradient

( Khả năng tương thích của trình duyệt )

Các gradient tuyến tính vẫn có thể được sử dụng để tạo ra hình dạng nhưng không phải với các góc như đã đề cập trong câu hỏi. Chúng ta phải sử dụng to [side] [side]cú pháp (nhờ vals ) thay vì chỉ định góc. Khi các cạnh được chỉ định, các góc độ dốc được tự động điều chỉnh dựa trên kích thước của vùng chứa.

Ưu điểm

  • Hình dạng có thể đạt được và duy trì ngay cả khi kích thước của vật chứa là động.
  • Có thể thêm hiệu ứng di chuột bằng cách thay đổi màu gradient.

Nhược điểm

  • Hiệu ứng di chuột sẽ được kích hoạt ngay cả khi con trỏ ở bên ngoài hình dạng nhưng bên trong vùng chứa.
  • Việc thêm đường viền sẽ yêu cầu các thao tác chuyển màu phức tạp.
  • Gradients được biết đến với việc tạo ra các góc răng cưa khi chiều rộng (hoặc chiều cao) rất lớn.
  • Không thể sử dụng nền hình ảnh trên hình dạng.

Phương pháp 3 - Biến đổi Skew

( Khả năng tương thích của trình duyệt )

Trong phương pháp này, một phần tử giả được thêm vào, làm lệch và định vị theo cách mà nó trông giống như một trong các cạnh bị nghiêng / góc. quay phải dọc theo trục X. Các transform-originnên có điều ngược lại bên này sang phía bên nghiêng.

Ưu điểm

  • Hình dạng có thể đạt được ngay cả với đường viền.
  • Hiệu ứng di chuột sẽ bị hạn chế trong hình dạng.

Nhược điểm

  • Kích thước cần phải tăng theo tỷ lệ để duy trì hình dạng bởi vì khi một phần tử bị lệch, độ lệch của nó trong trục Y sẽ tăng khi widthtăng và ngược lại (hãy thử tăng widthlên 200pxtrong đoạn mã). Bạn có thể tìm thêm thông tin về điều này tại đây .

Phương pháp 4 - Chuyển đổi phối cảnh

( Khả năng tương thích của trình duyệt )

Trong phương pháp này, vùng chứa chính được xoay dọc theo trục X hoặc Y với một chút phối cảnh. Đặt giá trị thích hợp transform-originsẽ chỉ tạo ra một cạnh nghiêng ở một bên.

Nếu mặt trên hoặc mặt dưới bị nghiêng, thì xoay phải dọc theo trục Y, ngược lại, xoay phải theo trục X. Các transform-originnên có điều ngược lại bên này sang phía bên nghiêng.

Ưu điểm

  • Hình dạng có thể đạt được với đường viền.
  • Kích thước không cần phải tăng theo tỷ lệ để hình dạng được duy trì.

Nhược điểm

  • Nội dung cũng sẽ được xoay và do đó chúng phải được xoay ngược để trông bình thường.
  • Định vị văn bản sẽ tẻ nhạt nếu các kích thước không tĩnh.

Phương pháp 5 - Đường dẫn Clip CSS

( Khả năng tương thích của trình duyệt )

Trong phương pháp này, thùng chứa chính được cắt thành hình dạng yêu cầu bằng cách sử dụng một đa giác. Các điểm của đa giác phải được sửa đổi tùy thuộc vào phía mà cạnh nghiêng được yêu cầu.

Ưu điểm

  • Hình dạng có thể được duy trì ngay cả khi vùng chứa đang được thay đổi kích thước động.
  • Hiệu ứng di chuột sẽ bị hạn chế hoàn toàn trong đường viền của hình dạng.
  • Hình ảnh cũng có thể được sử dụng làm nền cho hình dạng.

Nhược điểm

  • Hỗ trợ trình duyệt hiện tại rất kém.
  • Các đường viền có thể được thêm vào bằng cách đặt một phần tử được định vị tuyệt đối trên đầu của hình dạng và tạo cho nó một đoạn clip cần thiết nhưng vượt quá một điểm, nó không vừa vặn khi định lại kích thước động.

Phương pháp 6 - Canvas

( Khả năng tương thích của trình duyệt )

Canvas cũng có thể được sử dụng để tạo ra hình dạng bằng cách vẽ các đường dẫn. Đoạn mã dưới đây có một bản demo. Bất kỳ nội dung văn bản nào được yêu cầu đều có thể được đặt trên đầu của hình dạng.

Ưu điểm

  • Hình dạng có thể đạt được và duy trì ngay cả khi kích thước của vật chứa là động. Các đường viền cũng có thể được thêm vào.
  • Hiệu ứng di chuột có thể được giới hạn trong ranh giới của hình dạng bằng cách sử dụng pointInpathphương pháp.
  • Hình ảnh hoặc nền gradient cũng có thể được cung cấp cho hình dạng.
  • Lựa chọn tốt hơn nếu cần hiệu ứng hoạt ảnh thời gian thực vì nó không yêu cầu thao tác DOM.

Nhược điểm

  • Canvas dựa trên raster và do đó các cạnh góc sẽ trở nên pixel hoặc mờ khi được chia tỷ lệ vượt quá một điểm * .

* - Tránh tạo pixel sẽ cần sửa lại hình dạng bất cứ khi nào khung nhìn được thay đổi kích thước. Có một ví dụ về nó ở đây nhưng đó là một chi phí.


35

Tôi đã thử sử dụng phương pháp đường viền nhưng kích thước của hình dạng của tôi là động và do đó tôi không thể sử dụng phương pháp này.


Phương pháp 7 - Đơn vị khung nhìn (Border Redux )

( Khả năng tương thích của trình duyệt )

Viewport Units là một sự đổi mới tuyệt vời trong CSS3. Mặc dù bạn thường có thể sử dụng các giá trị phần trăm để động các thuộc tính của mình, nhưng bạn không thể làm điều đó đối với border-widths ( cũng như đối với font-sizes ).

Thay vào đó, với Đơn vị khung nhìn, bạn có thể đặt động chiều rộng đường viền của mình cùng với kích thước của các đối tượng so với kích thước khung nhìn.

Lưu ý: các giá trị phần trăm được tham chiếu đến đối tượng mẹ, không phải đến khung nhìn (vùng hiển thị của cửa sổ).

Để kiểm tra phương pháp, hãy khởi chạy Toàn trang đoạn mã sau và thay đổi kích thước theo cả chiều ngang và chiều dọc.

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

Ưu điểm - (1) Mọi thứ đều năng động, phạm vi trình duyệt rộng.

Nhược điểm - (1) Bạn nên chú ý ở cách hệ điều hành của bạn xử lý các thanh cuộn với overflow: auto;.


3
Nó có vẻ lởm chởm trong phiên bản chrome mới nhất.
Mr_Green

Thật! Tôi đoán các công cụ trình duyệt vẫn cần một thời gian để kết xuất điều này một cách suôn sẻ. Firefox cũng gặp vấn đề này khi sử dụng kỹ thuật này với pixel thay vì đơn vị khung nhìn, nhưng có thể khắc phục được bằng cách sử dụng rgba (,,, 0) thay vì trong suốt. May mắn thay, chúng tôi có các lựa chọn khác ngay bây giờ;)
Andrea Ligios

1

Giải pháp của tôi được lấy cảm hứng từ phương pháp có tên Phương pháp 7 - Đơn vị khung nhìn của Andrea Ligios, ở trên trong trang này.

Tôi cũng sử dụng đơn vị "ngang" cho chiều cao ( height:10vw) để giữ tỷ lệ đã cho trong hình thang khi thay đổi kích thước chiều rộng của cửa sổ điều hướng. Chúng ta có thể gọi đây là Phương pháp 7b - Chiều rộng khung nhìn .

Hơn nữa, sử dụng hai chữ cái lồng nhau div, thay vì một cái và :afterbộ chọn, cho phép điều chỉnh tốt hơn các kiểu nội dung văn bản, theo ý kiến ​​của tôi (ví dụ text-align, v.v.).

.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 Chào bạn! Hãy cho tôi biết câu trả lời của tôi có gì sai, để tôi có thể chỉnh sửa hoặc xóa nó nếu điều này hợp lý! Tôi không phải là chuyên gia nhưng Dường như với tôi điều này có thể được áp dụng trong nhiều trang, làm việc với nội dung văn bản dài hơn, tùy thuộc vào chiều rộng chỉ :)
MattAllegro
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.