วิธีสร้างลูกศรแฟนซีโดยใช้ CSS


102

โอเคทุกคนรู้ว่าคุณสร้างสามเหลี่ยมได้โดยใช้สิ่งนี้:

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

และนั่นทำให้เกิดของแข็งที่เต็มไปด้วยสามเหลี่ยม แต่คุณจะสร้างสามเหลี่ยมคล้ายลูกศรกลวงแบบนี้ได้อย่างไร?

ลูกศรที่มีเพียงสองเส้นที่ตัดกันที่จุดนั้น  เหมือนเครื่องหมายมากกว่า:>


3
รูปสี่เหลี่ยมที่หมุนได้สองรูป
SLaks


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หมุนและวางตำแหน่งของแต่ละแท่งให้เป็นแท่งใดแท่งหนึ่ง วิธีการแก้ปัญหาได้ง่ายขึ้นคือการเพิ่มสองเส้นขอบให้เพียงองค์ประกอบและหมุนได้โดยใช้beforetransform: 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คุณสามารถใช้เคล็ดลับเดียวกันกับองค์ประกอบปกติได้เช่นกัน สำหรับรายการด้านบนจะสะดวกเพราะคุณไม่ต้องการมาร์กอัปเพิ่มเติม แต่บางครั้งคุณอาจต้องการ (หรือต้องการ) มาร์กอัปอยู่ดี คุณสามารถใช้ a 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 แล้วตั้งค่าระยะขอบบนสุด แต่ก็ทำให้ทุกอย่างลดลงรวมถึงข้อความด้วย 2. ฉันต้องการให้มันเปลี่ยนสีเมื่อวางเมาส์เหนือ ตอนนี้มีเพียงข้อความเท่านั้นที่เปลี่ยนสี ฉันจะเปลี่ยนทั้งข้อความและลูกศรได้อย่างไร
พรุ่งนี้

ในการเปลี่ยนสีของลูกศรคุณจะต้องเปลี่ยนborder-colorเนื่องจากลูกศรเป็นตัวแสดงไม่ใช่อักขระ แต่เป็นเส้นขอบ สำหรับตำแหน่งที่คุณสามารถเพิ่มposition: relativeไปที่ลูกศรและย้ายไปรอบ ๆ ใช้และtop leftฉันได้แสดงทั้งในตัวอย่างแรกที่แก้ไขแล้วและการวางตำแหน่งด้วยเช่นกันในตัวอย่างที่สอง สังเกตชุดค่าผสมที่ดีli:hover::beforeซึ่งอ้างถึงbeforeองค์ประกอบหลอกของรายการที่วางเมาส์ไว้
GolezTrol

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

ฉันไม่แน่ใจว่าคุณหมายถึงอะไร แต่องค์ประกอบหลอกนั้นมีระยะขอบของ0ตัวมันเองอยู่แล้วดังนั้นคุณจะต้องมีระยะขอบลบเพื่อยกเลิกช่องว่างใด ๆ ตัวอย่างเช่นในตัวอย่างข้อมูลที่สองคุณสามารถเพิ่มmargin-left: -0.4em;เพื่อวางลูกศรถัดจากคำก่อนหน้าโดยไม่ต้องเว้นวรรค
GolezTrol

ฉันโพสต์คำถามใหม่ที่stackoverflow.com/questions/27549099/…
Tommay

71

สิ่งนี้สามารถแก้ไขได้ง่ายกว่าคำแนะนำอื่น ๆ

เพียงวาดรูปสี่เหลี่ยมจัตุรัสและใช้borderคุณสมบัติกับ 2 ด้านที่ต่อกัน

จากนั้นหมุนสี่เหลี่ยมตามทิศทางที่คุณต้องการให้ลูกศรชี้สำหรับ exaple: 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
นี่คือคำตอบที่สมบูรณ์แบบจำเป็นต้องเป็นคำตอบที่ได้รับการยอมรับจริงๆ ง่ายมากและทุกบิตมีประสิทธิภาพ
Andrew Faulkner

@AndrewFaulkner ดีใจที่ช่วยได้
Alan Dunning

38

เชฟรอน / ลูกศรที่ตอบสนอง

พวกเขาปรับขนาดโดยอัตโนมัติกับข้อความและสีที่มีสีเดียวกัน Plug and play :)
jsBin demo playground

ป้อนคำอธิบายภาพที่นี่

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

ทำให้ผอมลงได้ไหม? แทนที่จะอ้วนขนาดนี้? การเปลี่ยน font-weight ไม่ได้ทำอะไรเลย
James111

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

เพียงใช้ก่อนและหลัง องค์ประกอบ Pseudo - 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 ไว้ข้างหน้าแล้วจัดรูปแบบ

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


2
นั่นคือสัญลักษณ์ "มากกว่า" ไม่ใช่ลูกศร
Mark Knol

@MarkKnol อะไรคือความแตกต่างระหว่างสิ่งนี้กับลูกศรของคนอื่น ๆ ? นี่ดูเหมือนจะเป็นทางออกที่ดีที่สุดสำหรับฉัน
dallin

2

ลูกศรซ้ายขวาพร้อมเอฟเฟกต์โฮเวอร์โดยใช้เคล็ดลับเงากล่อง 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

ฉันต้องการเปลี่ยน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 แต่ควบคุมขนาดและตำแหน่งได้มากกว่าเล็กน้อย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.