Làm thế nào để tạo một mũi tên lạ mắt bằng CSS?


102

Được rồi, mọi người đều biết bạn có thể tạo hình tam giác bằng cách sử dụng:

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

Và điều đó tạo ra một hình tam giác rắn, đầy. Nhưng làm thế nào bạn có thể tạo ra một hình tam giác giống mũi tên rỗng, như thế này?

một mũi tên chỉ có hai đường thẳng cắt nhau tại điểm.  Giống như một dấu hiệu lớn hơn:>


3
Hai hình chữ nhật xoay.
SLaks


5
Sử dụng một phông chữ rất lớn?
GolezTrol

2
AAAAAHHHH. j08691 đã hiểu. Cảm ơn!
Tommay

4
Kiểm tra @ j08691 Fiddle quyền của nó trên tiền. Một cách khác để đạt được điều này là sử dụng một gói phông chữ như tạo ảnh vui nhộn Fonts fortawesome.github.io/Font-Awesome/icon/chevron-right
crazymatt

Câu trả lời:


93

Bạn có thể sử dụng phần tử beforehoặc aftergiả và áp dụng một số CSS cho nó. Có nhiều cách khác nhau. Bạn có thể thêm cả hai beforeafter, và xoay và định vị từng cái để tạo thành một trong các thanh. Một giải pháp dễ dàng hơn là thêm hai đường viền vào chỉ beforephần tử và xoay nó bằng cách sử dụng transform: rotate.

Cuộn xuống để tìm một giải pháp khác sử dụng một phần tử thực thay vì các phần tử pseuso

Trong trường hợp này, tôi đã thêm các mũi tên làm dấu đầu dòng trong danh sách và sử dụng các emkích thước để làm cho chúng có kích thước phù hợp với phông chữ của danh sách.

ul {
    list-style: none;
}

ul.big {
    list-style: none;
    font-size: 300%
}

li::before {
    position: relative;
    /* top: 3pt; Uncomment this to lower the icons as requested in comments*/
    content: "";
    display: inline-block;
    /* By using an em scale, the arrows will size with the font */
    width: 0.4em;
    height: 0.4em;
    border-right: 0.2em solid black;
    border-top: 0.2em solid black;
    transform: rotate(45deg);
    margin-right: 0.5em;
}

/* Change color */
li:hover {
  color: red; /* For the text */
}
li:hover::before {
  border-color: red; /* For the arrow (which is a border) */
}
<ul>
    <li>Item1</li>
    <li>Item2</li>
    <li>Item3</li>
    <li>Item4</li>
</ul>

<ul class="big">
    <li>Item1</li>
    <li>Item2</li>
    <li>Item3</li>
    <li>Item4</li>
</ul>

Tất nhiên bạn không cần phải sử dụng beforehoặc after, bạn cũng có thể áp dụng thủ thuật tương tự cho một phần tử bình thường. Đối với danh sách trên, nó là thuận tiện, vì bạn không cần đánh dấu bổ sung. Nhưng đôi khi bạn có thể muốn (hoặc cần) đánh dấu. Bạn có thể sử dụng một divhoặc spancho điều đó, và tôi thậm chí đã thấy mọi người thậm chí tái chế iphần tử cho 'biểu tượng'. Vì vậy, đánh dấu đó có thể trông giống như bên dưới. Việc sử dụng <i>cho điều này có đúng hay không còn phải bàn cãi, nhưng bạn cũng có thể sử dụng span cho điều này để an toàn.

/* Default icon formatting */
i {
  display: inline-block;
  font-style: normal;
  position: relative;
}

/* Additional formatting for arrow icon */
i.arrow {
    /* top: 2pt; Uncomment this to lower the icons as requested in comments*/
    width: 0.4em;
    height: 0.4em;
    border-right: 0.2em solid black;
    border-top: 0.2em solid black;
    transform: rotate(45deg);
}
And so you can have an <i class="arrow" title="arrow icon"></i> in your text.
This arrow is <i class="arrow" title="arrow icon"></i> used to be deliberately lowered slightly on request.
I removed that for the general public <i class="arrow" title="arrow icon"></i> but you can uncomment the line with 'top' <i class="arrow" title="arrow icon"></i> to restore that effect.

Nếu bạn tìm kiếm thêm cảm hứng, hãy nhớ xem thư viện tuyệt vời gồm các biểu tượng CSS thuần túy của Nicolas Gallagher . :)


Điều này hoạt động khá tốt nhưng có một vài điều cần sửa đổi. 1. Làm cách nào để di chuyển mũi tên xuống một chút mà không di chuyển phần còn lại của văn bản xuống cùng với nó? Tôi đã thử #arrow :: after và sau đó đặt margin-top, nhưng điều đó đã di chuyển mọi thứ xuống, bao gồm cả văn bản. 2. Tôi cần nó để thay đổi màu khi di chuột qua. Ngay bây giờ, chỉ có văn bản thay đổi màu sắc. Làm cách nào để thay đổi cả văn bản và mũi tên?
Tommay

Để thay đổi màu sắc của mũi tên, bạn sẽ cần phải thay đổi border-color, vì mũi tên chỉ là một ký tự mà không phải là một ký tự mà là một đường viền. Để định vị, bạn có thể thêm position: relativevào mũi tên và di chuyển nó xung quanh bằng cách sử dụng topleft. Tôi đã hiển thị cả trong đoạn mã đầu tiên được sửa đổi và vị trí cũng như trong đoạn mã thứ hai. Lưu ý sự kết hợp tuyệt vời li:hover::befoređề cập đến beforephần tử giả của một mục danh sách được di chuột qua.
GolezTrol

Trên thực tế, một điều nữa: vì vậy tôi đang cố căn giữa văn bản này ngay bây giờ (với phần tử đứng sau). Vấn đề là phần tử sau này dường như chiếm rất nhiều không gian vô hình, và kết quả là văn bản có vẻ rất lệch tâm. Làm cách nào để tôi đặt không gian vô hình đó thành 0? Tôi đã thử left: 0 và right: 0, cùng với margin-left: 0 và margin-right: 0, đều không hoạt động.
Tommay

Tôi không chắc chính xác ý bạn là gì, nhưng phần tử giả đã có một lề 0riêng, vì vậy bạn sẽ cần một lề âm để loại bỏ bất kỳ khoảng trắng nào. Ví dụ: trong đoạn mã thứ hai, bạn có thể thêm margin-left: -0.4em;để đặt mũi tên bên cạnh từ trước đó mà không có bất kỳ khoảng trống nào.
GolezTrol

Tôi đã đăng một câu hỏi mới tại stackoverflow.com/questions/27549099/…
Tommay

71

Điều này có thể được giải quyết dễ dàng hơn nhiều so với các đề xuất khác.

Đơn giản chỉ cần vẽ một hình vuông và áp dụng một thuộc bordertính cho chỉ 2 cạnh nối.

Sau đó, xoay hình vuông theo hướng mà bạn muốn mũi tên trỏ tới, đối với ngoại hình: transform: rotate(<your degree here>)

.triangle {
    border-right: 10px solid; 
    border-bottom: 10px solid;
    height: 30px;
    width: 30px;
    transform: rotate(-45deg);
}
<div class="triangle"></div>


1
Đây là câu trả lời hoàn hảo, nó thực sự cần được chấp nhận. Rất đơn giản và hiệu quả từng chút một.
Andrew Faulkner

@AndrewFaulkner Rất vui vì nó đã hữu ích.
Alan Dunning,

38

Dấu chữ V / mũi tên đáp ứng

họ thay đổi kích thước tự động với bạn văn bản và được màu cùng màu. Cắm và chạy :)
Sân chơi demo jsBin

nhập mô tả hình ảnh ở đây

body{
  font-size: 25px; /* Change font and  see the magic! */
  color: #f07;     /* Change color and see the magic! */
} 

/* RESPONSIVE ARROWS */
[class^=arr-]{
  border:       solid currentColor;
  border-width: 0 .2em .2em 0;
  display:      inline-block;
  padding:      .20em;
}
.arr-right {transform:rotate(-45deg);  -webkit-transform:rotate(-45deg);}
.arr-left  {transform:rotate(135deg);  -webkit-transform:rotate(135deg);}
.arr-up    {transform:rotate(-135deg); -webkit-transform:rotate(-135deg);}
.arr-down  {transform:rotate(45deg);   -webkit-transform:rotate(45deg);}
This is <i class="arr-right"></i> .arr-right<br>
This is <i class="arr-left"></i> .arr-left<br>
This is <i class="arr-up"></i> .arr-up<br>
This is <i class="arr-down"></i> .arr-down


1
Chà, biểu tượng đó thực sự được gọi là "Góc trên cùng bên phải" ! Đẹp. :) Kiểm soát chiều rộng ít hơn so với đường viền, nhưng vẫn +1 để hiển thị khả năng của phông chữ. Đối với các biểu tượng khác, điều này có thể tốt hơn một thủ thuật định dạng CSS.
GolezTrol

Lưu ý rằng các biểu tượng phông chữ sẽ không hoạt động tốt nếu người dùng không có phông chữ, vì vậy bạn phải đảm bảo có dự phòng thích hợp cho các phông chữ có sẵn cho hầu hết các hệ thống. Bạn cũng có thể chọn tải xuống phông chữ thông qua CSS, nhưng thật lãng phí băng thông để làm điều đó cho một vài biểu tượng. Tuy nhiên, nếu bạn có nhiều biểu tượng hoặc bạn muốn có chúng theo phong cách của riêng mình, bạn có thể chọn thêm tất cả chúng vào phông chữ biểu tượng của riêng mình và tải chúng thông qua CSS. Bằng cách đó, bạn (gần như) chắc chắn có sẵn phông chữ phù hợp mà không cần phải tải xuống các phông chữ khổng lồ cho một số ít ký hiệu.
GolezTrol

Quay lại HTML 4.0, tổng số tập hợp đã được thông qua chứa 38887 ký tự. kể từ v. 6.2.0 September 2012 1Unicode UTF-8ký tự thiết lập tăng đến 110.182, và Bây giờ có HTML5 và mặc định UTF-8 và trông nhân vật của chúng tôi là tìm kiếm tốt: unicode.org/Public/UNIDATA/UnicodeData.txt
Roko C. Buljan

Thực tế là ký tự tồn tại không có nghĩa là nó có thể được hiển thị. Bạn sẽ cần phông chữ thích hợp để hiển thị nó. Đó là lý do tại sao các ký tự trong phiên bản đầu tiên của câu trả lời của bạn không thành công: vì phông chữ mặc định của trình duyệt của tôi không bao gồm các ký tự đó. Vì vậy, để sử dụng một ký tự như thế này, bạn sẽ cần chỉ định phông chữ nào sẽ sử dụng và bạn phải cung cấp dự phòng thích hợp cho các phông chữ khác nếu chúng không có sẵn trên tất cả các nền tảng. Ví dụ: \231dký tự có thể có ở đây, nhưng không có trên máy Mac hoặc thiết bị Android. Phiên bản HTML và mã hóa phản hồi không liên quan gì đến nó.
GolezTrol

Bạn có thể làm cho nó mỏng hơn? Thay vì nó rất béo? Thay đổi trọng lượng phông chữ không làm bất cứ điều gì.
James111

14

Đây là một cách tiếp cận khác:

1) Sử dụng ký tự nhân: &times; ×

2) Ẩn một nửa của nó với overflow:hidden

3) Sau đó, thêm một tam giác làm phần tử giả cho đầu nhọn.

Ưu điểm ở đây là không cần biến đổi. (Nó sẽ hoạt động trong IE8 +)

VĨ CẦM

.arrow {
  position: relative;
}
.arrow:before {
  content: '×';
  display: inline-block;
  position: absolute;
  font-size: 240px;
  font-weight: bold;
  font-family: verdana;
  width: 103px;
  height: 151px;
  overflow: hidden;
  line-height: 117px;
}
.arrow:after {
  content: '';
  display: inline-block;
  position: absolute;
  left: 101px;
  top: 51px;
  width: 0;
  height: 0;
  border-style: solid;
  border-width: 25px 0 25px 24px;
  border-color: transparent transparent transparent black;
}
<div class="arrow"></div>


2
Hoạt động trong Internet explorer, chrome và firefox.
Thomas

11

Chỉ sử dụng trướcsau phần tử giả - CSS

*{box-sizing: border-box; padding: 0; margin: 0}
:root{background: white; transition: background .3s ease-in-out}
:root:hover{background: red }
div{
  margin: 20px auto;
  width: 150px;
  height: 150px;
  position:relative
}

div:before, div:after{
  content: '';
  position: absolute;
  width: 75px;
  height: 20px;
  background: black;
  left: 40px
}

div:before{
  top: 45px;
  transform: rotateZ(45deg)
}

div:after{
  bottom: 45px;
  transform: rotateZ(-45deg)
}
<div/>


8

Một cách tiếp cận khác sử dụng đường viền và không có thuộc tính CSS3 :

div, div:after{
    border-width: 80px 0 80px 80px;
    border-color: transparent transparent transparent #000;
    border-style:solid;
    position:relative;
}
div:after{
    content:'';
    position:absolute;
    left:-115px; top:-80px;
    border-left-color:#fff;
}
<div></div>


4

>chính nó là mũi tên rất tuyệt vời! Chỉ cần thêm một div với nó và tạo kiểu cho nó.

div{
  font-size:50px;
}
div::before{
  content:">";
  font: 50px 'Consolas';
  font-weight:900;
}
<div class="arrowed">Hatz!</div>


2
Đó là một biểu tượng "lớn hơn", không phải là một mũi tên.
Mark Knol

@MarkKnol Sự khác nhau giữa mũi tên này và mũi tên của mọi người khác như thế nào? Đây dường như là giải pháp tốt nhất cho tôi.
dallin

2

Mũi tên trái phải với hiệu ứng di chuột bằng cách sử dụng thủ thuật tạo bóng hộp Roko C. Buljan

.arr {
  display: inline-block;
  padding: 1.2em;
  box-shadow: 8px 8px 0 2px #777 inset;
}
.arr.left {
  transform: rotate(-45deg);
}
.arr.right {
  transform: rotate(135deg);
}
.arr:hover {
  box-shadow: 8px 8px 0 2px #000 inset
}
<div class="arr left"></div>
<div class="arr right"></div>


1

Tôi cần thay đổi inputmột mũi tên trong dự án của mình. Dưới đây là công việc cuối cùng.

#in_submit {
  background-color: white;
  border-left: #B4C8E9;
  border-top: #B4C8E9;
  border-right: 3px solid black;
  border-bottom: 3px solid black;
  width: 15px;
  height: 15px;
  transform: rotate(-45deg);
  margin-top: 4px;
  margin-left: 4px;
  position: absolute;
  cursor: pointer;
}
<input id="in_submit" type="button" class="convert_btn">

Đây Fiddle


Mã tuyệt vời! Nó chỉ sử dụng một yếu tố đó là khó khăn để làm :)
www139

0

.arrow {
  display : inline-block;
  font-size: 10px; /* adjust size */
  line-height: 1em; /* adjust vertical positioning */
  border: 3px solid #000000;
  border-left: transparent;
  border-bottom: transparent;
  width: 1em; /* use font-size to change overall size */
  height: 1em; /* use font-size to change overall size */
}

.arrow:before {
  content: "\00a0"; /* needed to hook line-height to "something" */
}

.arrow.left {
  margin-left: 0.5em;
  -webkit-transform: rotate(225deg);
  -moz-transform: rotate(225deg);
  -o-transform: rotate(225deg);
  -ms-transform: rotate(225deg);
  transform: rotate(225deg);
}

.arrow.right {
  margin-right: 0.5em;
  -webkit-transform: rotate(45deg);
  -moz-transform: rotate(45deg);
  -o-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  transform: rotate(45deg);
}

.arrow.top {
  line-height: 0.5em; /* use this to adjust vertical positioning */
  margin-left: 0.5em;
  margin-right: 0.5em;
  -webkit-transform: rotate(-45deg);
  -moz-transform: rotate(-45deg);
  -o-transform: rotate(-45deg);
  -ms-transform: rotate(-45deg);
  transform: rotate(-45deg);
}

.arrow.bottom {
  line-height: 2em;
  /* use this to adjust vertical positioning */
  margin-left: 0.5em;
  margin-right: 0.5em;
  -webkit-transform: rotate(135deg);
  -moz-transform: rotate(135deg);
  -o-transform: rotate(135deg);
  -ms-transform: rotate(135deg);
  transform: rotate(135deg);
}
<div>
  here are some arrows
  <div class='arrow left'></div> space
  <div class='arrow right'></div> space
  <div class='arrow top'></div> space
  <div class='arrow bottom'></div> space with proper spacing?
</div>

Tương tự như Roko C, nhưng kiểm soát nhiều hơn một chút về kích thước và vị trí.

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.