【问题标题】:How to Make A Chevron Arrow Using CSS?如何使用 CSS 制作雪佛龙箭头?
【发布时间】:2015-02-14 00:43:02
【问题描述】:

好的,所以大家都知道你可以用这个来做一个三角形:

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

这会产生一个实心的填充三角形。但是你会如何制作一个像这样的空心箭头状三角形呢?

【问题讨论】:

标签: html css css-shapes


【解决方案1】:

您可以使用beforeafter 伪元素并对其应用一些CSS。有多种方式。您可以同时添加beforeafter,并旋转和定位它们中的每一个以形成其中一个条形。一个更简单的解决方案是为 before 元素添加两个边框并使用 transform: rotate 旋转它。

向下滚动查看使用实际元素而不是伪元素的不同解决方案

在这种情况下,我将箭头作为项目符号添加到列表中,并使用 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>

当然,您不需要使用beforeafter,您也可以将相同的技巧应用于普通元素。对于上面的列表,它很方便,因为您不需要额外的标记。但有时您可能仍然想要(或需要)标记。您可以为此使用divspan,我什至看到人们甚至将i 元素用于“图标”。所以该标记可能如下所示。使用&lt;i&gt; 是否正确是有争议的,但为了安全起见,您也可以使用 span。

/* 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 icons by Nicolas Gallagher 库。 :)

【讨论】:

  • 这工作得很好,但有几件事需要修改。 1.我如何将箭头稍微向下移动而不将其余文本向下移动?我尝试了#arrow::after,然后设置了一个margin-top,但这将所有内容都向下移动,包括文本。 2. 我需要它在鼠标悬停时改变颜色。现在,只有文本改变颜色。如何同时更改文本和箭头?
  • 要更改箭头的颜色,您需要更改border-color,因为箭头实际上不是字符而是边框。对于定位,您可以将position: relative 添加到箭头并使用topleft 移动它。我已经在修改后的第一个 sn-p 和第二个 sn-p 中显示了定位。请注意 li:hover::before 的完美组合,它指的是悬停列表项的 before 伪元素。
  • 实际上,还有一件事:所以我现在尝试将这个文本居中(使用 after 元素)。问题是这个后元素显然占用了很多不可见的空间,因此文本似乎非常偏离中心。我如何将那个不可见的空间设置为 0?我尝试了left:0和right:0,以及margin-left:0和margin-right:0,都没有成功。
  • 我不太确定你的意思,但是伪元素本身已经有 0 的边距,所以你需要一个负边距来抵消任何空白。例如,在第二个 sn-p 中,您可以添加 margin-left: -0.4em; 以将箭头放在前一个单词旁边,不留任何空格。
  • 我在stackoverflow.com/questions/27549099/…发布了一个新问题
【解决方案2】:

这比其他建议更容易解决。

只需绘制一个正方形并将border 属性应用于两个连接边。

然后根据你希望箭头指向的方向旋转正方形,例如:transform: rotate(&lt;your degree here&gt;)

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

【讨论】:

  • 这是一个完美的答案,它确实需要被接受。非常简单,而且每一点都一样有效。
  • @AndrewFaulkner 很高兴它有帮助。
【解决方案3】:

响应式雪佛龙/箭头

它们会根据您的文本自动调整大小,并且着色颜色相同。 即插即用:)
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);}
.arr-left  {transform:rotate(135deg);}
.arr-up    {transform:rotate(-135deg);}
.arr-down  {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

【讨论】:

  • 哇,那个符号居然叫"Top right corner"!好的。 :) 对宽度的控制比使用边框要少,但仍然 +1 以显示字体的可能性。对于其他符号,这可能比 CSS 形状技巧更好。
  • 请注意,如果用户没有字体,字体图标将无法正常工作,因此您必须确保对大多数系统可用的字体进行适当的后备。你也可以选择通过 CSS 下载字体,但是为几个图标这样做是浪费带宽。但是,如果您有很多图标,或者您希望它们具有自己的风格,您可能会选择将所有图标添加到您自己的图标字体中并通过 CSS 加载。这样,您(几乎)可以确定拥有正确的字体,而无需为少数符号下载巨大的字体。
  • 在 HTML 4.0 中采用了总共包含 38887 个字符的集合。因为v. 6.2.0 September 2012 1 Unicode UTF-8 字符集上升到 110182,现在有了 HTML5 和默认 UTF-8,看起来我们的字符看起来不错:unicode.org/Public/UNIDATA/UnicodeData.txt
  • 角色存在不代表可以显示。您需要正确的字体来显示它。这就是您答案的第一个版本中的字符失败的原因:因为我的浏览器的默认字体不包含这些字符。因此,要使用这样的字符,您需要指定要使用的字体,并且如果其他字体并非在所有平台上都可用,您必须提供适当的备用字体。例如,\231d 字符可能在此处可用,但在 Mac 或 Android 设备上不可用。 HTML版本和响应编码与它无关。
  • 你能把它做得更薄吗?而不是这么胖?更改字体粗细没有任何作用。
【解决方案4】:

这是一种不同的方法:

1) 使用乘号:&amp;times;×

2) 用overflow:hidden 隐藏一半

3) 然后添加一个三角形作为提示的伪元素。

这里的优点是不需要转换。 (在 IE8+ 下可以使用)

FIDDLE

.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;
}
&lt;div class="arrow"&gt;&lt;/div&gt;

【讨论】:

  • 适用于 Internet Explorer、chrome 和 firefox。
【解决方案5】:

只需使用beforeafter Pseudo-elements - 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)
}
&lt;div/&gt;

【讨论】:

    【解决方案6】:

    另一种使用 borders 且没有 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;
    }
    &lt;div&gt;&lt;/div&gt;

    【讨论】:

      【解决方案7】:

      &gt;本身就是很奇妙的箭头!只需在前面加上一个 div 并设置它的样式。

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

      【讨论】:

      • 这是一个“大于”符号,而不是箭头。
      • @MarkKnol 这和其他人的箭头看起来有什么不同?这对我来说似乎是最好的解决方案。
      【解决方案8】:

      使用 Roko C. Buljan box-shadow 技巧的具有悬停效果的左右箭头

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

      【讨论】:

        【解决方案9】:

        我需要在我的项目中将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;
        }
        &lt;input id="in_submit" type="button" class="convert_btn"&gt;

        这里Fiddle

        【讨论】:

        • 很棒的代码!它只使用一个难以做到的元素:)
        【解决方案10】:

        .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,但对大小和位置的控制更多。

        【讨论】:

          猜你喜欢
          • 2021-11-23
          • 2014-10-08
          • 2021-08-10
          • 1970-01-01
          • 2019-10-30
          • 2021-03-11
          • 1970-01-01
          • 2023-03-28
          相关资源
          最近更新 更多