Як зробити фантазійну стрілку за допомогою CSS?


102

Гаразд, так що всі знають, що ви можете зробити трикутник за допомогою цього:

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

І це дає суцільний, заповнений трикутником. Але як би ви зробили такий трикутник, який нагадує стрілу, подібний до цього?

стрілка з лише двома лініями, які перетинаються в точці.  Наче більший за знак:>


3
Два обертових прямокутника.
СЛАкс


5
Використовуєте дуже великий шрифт?
GolezTrol

2
AAAAAHHHH. j08691 має. Дякую!
Томмай

4
Перевірте @ j08691 Fiddle право на гроші. Ще один спосіб досягти цього - використовувати пакет шрифтів на зразок Awesome Fonts fortawesome.github.io/Font-Awesome/icon/chevron-right
crazymatt

Відповіді:


93

Ви можете використовувати beforeабо afterпсевдоелемент і застосувати до нього деякі CSS. Існують різні способи. Ви можете додати як beforeі after, так і обертати і розміщувати кожен з них, щоб утворити один з брусків. Простішим рішенням є додавання двох меж просто beforeелементу та обертання його за допомогою transform: rotate.

Прокрутіть униз до іншого рішення, яке використовує фактичний елемент замість елементів pseuso

У цьому випадку я додав стрілки як кулі у списку та використовував emрозміри, щоб зробити їх розмірами належним чином за допомогою шрифту списку.

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>

Звичайно, вам не потрібно використовувати beforeабо after, ви можете застосувати той самий трюк і до звичайного елемента. Для списку вище це зручно, оскільки вам не потрібна додаткова розмітка. Але іноді ви можете хотіти (або потрібно) розмітку в будь-якому випадку. Ви можете використовувати divабо spanдля цього, і я навіть бачив, як люди навіть переробляють iелемент для "іконок". Так що розмітка може виглядати як нижче. Чи <i>правильно використовувати для цього, є дискусійним, але ви можете використовувати проміжок для цього, щоб бути в безпеці.

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

Якщо ви шукаєте більше натхнення, не забудьте перевірити цю дивовижну бібліотеку чистих ікон CSS від Ніколаса Галлахера . :)


Це спрацювало досить добре, але є кілька речей, які потребують модифікації. 1. Як би я трохи перемістив стрілку вниз, не переміщуючи з неї решту тексту вниз? Я спробував #arrow :: after, а потім встановив margin-top, але це перемістило все вниз, включаючи текст. 2. Мені потрібно, щоб змінити колір на миші. Зараз лише текст змінює колір. Як я можу змінити текст і стрілку?
Томмай

Щоб змінити колір стрілки, вам потрібно буде змінити border-color, оскільки стрілка є не всім символом, а рамкою. Для позиціонування можна додати position: relativeстрілку та перемістити її за допомогою topта left. Я показав як у модифікованому першому фрагменті, так і в позиціонуванні, а також у другому фрагменті. Зверніть увагу на приємну комбінацію, li:hover::beforeяка стосується beforeпсевдоелемента елемента, що наближається до списку.
GolezTrol

Насправді, ще одне: тому я намагаюся зараз зосереджувати цей текст (з елементом after). Проблема полягає в тому, що цей після елемент, очевидно, займає багато невидимого простору, і в результаті текст видається надзвичайно нецентричним. Як я встановив би цей невидимий простір на 0? Я спробував ліворуч: 0 і право: 0, разом із краєм ліворуч: 0 і полем праворуч: 0, жодне не працювало.
Томмай

Я не точно впевнений, що ви маєте на увазі, але псевдоелемент вже має власну запас 0, тому вам знадобиться негативний запас, щоб скасувати будь-який пробіл. Наприклад, у другому фрагменті ви можете додати, margin-left: -0.4em;щоб поставити стрілку поруч із попереднім словом без пробілу.
GolezTrol

Я відправив нове питання в stackoverflow.com/questions/27549099 / ...
Tommay

71

Це можна вирішити набагато простіше, ніж інші пропозиції.

Просто намалюйте квадрат і застосуйте borderвластивість лише до двох сторін, що з'єднуються.

Потім поверніть квадрат відповідно до напрямку, на який ви хочете вказати стрілку: 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
Це ідеальна відповідь, вона справді повинна бути прийнятою. Дуже просто, і кожен настільки ж ефективний.
Ендрю Фолкнер

@AndrewFaulkner Радий, що це допомогло.
Алан Даннінг

38

Чуйні шеврони / стріли

вони автоматично змінюють розмір вашого тексту та забарвлюються в один і той же колір. Підключіть і грайте :)
jsBin демонстраційний майданчик

введіть тут опис зображення

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
Ого, цей символ насправді називається "Верхній правий кут" ! Приємно. :) Менше контролю над шириною, ніж за межею, але все одно +1 для показу можливості шрифтів. Для інших символів це може бути краще, ніж фокус у формі CSS.
GolezTrol

Зауважте, що піктограми шрифту не працюватимуть добре, якщо у користувача немає шрифту, тому ви повинні переконатися, що у вас є належні запасні файли для шрифтів, доступних для більшості систем. Ви також можете завантажити шрифт через CSS, але це марно пропускна здатність, щоб зробити це на пару значків. Якщо у вас є багато піктограм або ви хочете мати їх у власному стилі, ви можете додати їх до власного шрифту значка та завантажити його через CSS. Таким чином, ви (майже) впевнені у наявності потрібного шрифту без завантаження величезних шрифтів для кількох символів.
GolezTrol

Ще в HTML 4.0 було прийнято загальний набір, що містить 38887 символів. оскільки v. 6.2.0 September 2012 1символи Unicode UTF-8нарікають на 110182, а тепер HTML5 та UTF-8 за замовчуванням виглядає, наш персонаж виглядає добре: unicode.org/Public/UNIDATA/UnicodeData.txt
Roko C. Buljan

Те, що характер існує, не означає, що він може бути відображений. Вам потрібен відповідний шрифт, щоб показати його. Ось чому причина першої версії вашої відповіді не вдалася: оскільки шрифт у моєму браузері за замовчуванням не містив цих символів. Отже, щоб використовувати такий символ, вам потрібно буде вказати, які шрифти використовувати, і ви повинні надати належні резервні копії для інших шрифтів, якщо вони доступні не на всіх платформах. Наприклад, \231dперсонаж може бути доступний тут, але не на Mac або Android пристрої. Версія HTML та кодування відповідей не мають нічого спільного.
GolezTrol

Ви можете зробити його тоншим? Замість того, щоб бути таким жирним? Зміна ваги шрифту нічого не робить.
Джеймс111

14

Ось інший підхід:

1) Використовуйте символ множення: &times; ×

2) Сховати половину його за допомогою overflow:hidden

3) Потім додайте трикутник як псевдоелемент для наконечника.

Перевага тут полягає в тому, що ніяких перетворень не потрібно. (Він буде працювати в IE8 +)

ПІДТВОРЕННЯ

.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
Працює в Internet Explorer, chrome та firefox.
Томас

11

Просто використовуйте до і після псевдоелементів - 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

Інший підхід із використанням меж та відсутність властивостей 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

>сама по собі дуже чудова стріла! Просто додайте до нього дів і накладіть його на стиль.

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


2
Це символ "більше", а не стрілка.
Марк Кнол

@MarkKnol У чому різниця між цим та як виглядає стрілка всіх інших? Це, здається, найкраще рішення для мене ще.
Даллін

2

Стрілка вліво праворуч із ефектом наведення курсора, використовуючи трюк з тінню для коробки Roko C.

.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

Мені потрібно було змінити inputстрілку на мій проект. Нижче - заключна робота.

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

Тут Фіддл


Дивовижний код! Тут використовується лише один елемент, який важко зробити :)
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>

Подібно до Roko C, але трохи більше контролю над розміром та розміщенням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.