如何在 CSS 的选择输入字段中同时制作上/下箭头?

Posted

技术标签:

【中文标题】如何在 CSS 的选择输入字段中同时制作上/下箭头?【英文标题】:How to make both up/down arrow in select input field in CSS? 【发布时间】:2019-03-05 11:36:35 【问题描述】:

我正在开发一个website(基于 Wordpress,自定义主题),我想在其中添加 在 CSS 的选择输入字段中的向上/向下箭头 .我用来为选择输入字段创建向上/向下箭头的 html 代码是:

<p>
   <select name="filter_31" id="search-box-filter_31">
      <option value="Vancouver Island University">University of A</option>
      <option value="Western University">University of B</option>
      <option value="Wilfrid Laurier University">University of C</option>
      <option value="York University">University of D</option>
   </select>
</p>

这是上述代码的完整小提琴https://jsfiddle.net/ovp8Lxjw/4/embedded/result。此时,它只有向下箭头。

在上面的小提琴中,我想添加蓝色的向上/向下箭头。此时,它只显示向下箭头。

问题陈述:

我想知道我需要在上面的小提琴中添加什么 CSS 代码,以便我可以看到 向上/向下箭头如下面的屏幕截图所示,用箭头标记 strong>) 在 css 的选择输入字段中。我无法对 HTML 代码进行任何更改,因为它来自 wordpress website 的检查。

【问题讨论】:

***.com/questions/14218307/select-arrow-style-change 这会帮助你 @Francesco Fortin 没有多大帮助。我需要在 css 的选择输入字段中创建向上/向下箭头。上述问题只有一个向下箭头。 您发布的屏幕截图来自 OSX,您希望它在 Windows 等其他操作系统上也显示相同的向上/向下箭头吗? @FrancescoFortin 看起来是正确的,但您需要提供图片才能在此处显示向上和向下箭头。 【参考方案1】:

默认选择箭头图标由浏览器绘制。没有 API 可以告诉浏览器替换箭头图标,因此您需要重新设置选择元素的样式并覆盖您自己的箭头。您可以自己绘制与浏览器箭头样式相同的箭头,但请记住,其他浏览器和操作系统的默认图标会有所不同。

要仅使用 CSS 重新设置选择项的样式,您需要同时定位选择项及其父 p 元素。 select 有一个易于定位的 ID,但仅从您提供的代码中定位特定的 p 元素并不容易。但是查看提供的 Wordpress 站点链接,在 p 之前有一个标签,格式为 &lt;label for="search-box-filter_31"&gt;Name of Institution&lt;/label&gt;。这意味着可以使用 CSS 选择器 label[for=search-box-filter_31] + p 定位 p 元素。

您首先需要确保有足够的空间放置新箭头。这是通过将选择的宽度增加新箭头的宽度,并将相同的数量添加到父 p 的右填充来实现的。更改选择宽度的一种方法是使用calc(100% + 30px)。如果您的新箭头与默认图标的宽度相同,您可能不需要这样做,但在某些配置中,您的箭头可能会与选择的内容重叠。

此外,p 元素必须缩小以适应其内容。有几种方法可以做到这一点,但在您的情况下,最不可能破坏格式的一种方法是设置 display: table

最后,您可以使用p 上的::after 伪元素创建所需的箭头,并将其覆盖在选择元素的末尾,隐藏默认箭头。在下面的示例中,我使用内联 SVG 创建了箭头,但您可以使用最适合您情况的任何背景图像。将::after 元素设置为具有position:absolute 并将其样式设置为正好适合选择的右侧。要在图像中的箭头下方创建蓝色渐变背景,请使用多个背景,第一个是箭头,第二个是 CSS 渐变。

请注意,由于::after 元素位于选择的顶部,因此单击箭头不会显示选项。您可以设置pointer-events: none; 来传递点击,但这在 IE 上不起作用。

CSS 在下方,或者您可以在 codepen https://codepen.io/jla-/pen/ZqbWMj 看到它

#search-box-filter_31 
    width: calc(100% + 30px);

label[for=search-box-filter_31] + p 
    position: relative;
    display: table;
    border-radius: 5px;
    padding-right: 30px;

label[for=search-box-filter_31] + p::after 
    content: "";
    position: absolute;
    top: 0;
    right: 0;
    height: 100%;
    width: 30px;
    border-radius: 0 5px 5px 0;
    pointer-events: none;
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='30' height='30'><polyline points='8,12,15,8,22,12' fill='none' style='stroke:white;stroke-width:2'/><polyline points='8,18,15,22,22,18' fill='none' style='stroke:white;stroke-width:2'/></svg>"),
        linear-gradient(to bottom, #a0d8ff 0%, #2591dd 100%);
    background-repeat: no-repeat;
    background-position: center center;
    background-size: cover;

结果(后跟在 Linux 上的 Firefox 中出现的默认选择):

当然,箭头和它们的蓝色背景可以按您希望的任何其他方式设置样式。请注意,向选择箭头添加自定义样式将使其看起来与默认浏览器样式不同。您可以对其进行样式设置以无缝适应一个浏览器,例如Chrome,但另一种浏览器,例如Firefox 会以不同的方式显示内容,并且您的自定义样式将不匹配。要在所有浏览器和操作系统中获得无缝外观,您需要确保所有选择/输入元素的样式都相互匹配。

【讨论】:

【参考方案2】:

这是一个简单直接的示例,使用 base64 编码的 Font Awesome 图标作为选择框的背景图像。

select 
  background-color: white;
  border: thin solid grey;
  border-radius: 4px;
  display: inline-block;
  font: inherit;
  line-height: 1.5em;
  padding: 0.5em 3.5em 0.5em 1em;
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  -webkit-appearance: none;
  -moz-appearance: none;

select.arrows 
  background-image:    url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAA3klEQVRIS+3VMU9CMRTF8d8zBL+aizoQFhx0kUk33RzdYMNFXUFnYeGrYYyaJiUxJHDLSxodbNKpfeffc9/pbaPyaCrr+3OA++z4rtT5Pg5GuMnCY9yWQEoBE1xhlUUP8YDrCBIB0vojLvGO0yz4hm4JJAKcYYoPHGOZAUdYoIMBXrc5iQAHeMlzviFygj7O8dkWEJU4XI8chALRhn9AVKHf70VRTHu4wFfbmKZLNKt50dLBnna0imcMd/2I0phWa3Y/D1e1Xa9BCZJG0VuQNpaWKMx72xS1Fl5/WN3BN+AgJhnZQlq4AAAAAElFTkSuQmCC');
  background-position: calc(100% - .5rem), 100% 0;
  background-size:  1.5em 1.5em;
  background-repeat: no-repeat;


select.arrows:focus 
  border-color: blue;
  outline: 0;
<p>
  <select class="arrows">
      <option value="Vancouver Island University">Vancouver Island University</option>
      <option value="Western University">Western University</option>
      <option value="Wilfrid Laurier University">Wilfrid Laurier University</option>
      <option value="York University">York University</option>
   </select>
</p>

你可以在jsFiddle查看这个

另外一个Icomoon App的链接,用于创建使用的图标的png图片。

【讨论】:

检查。敬请期待。 @john 我认为你不会有问题。如果不是全部,它在大多数浏览器上看起来都是一样的。已在 Edge、FF、Opera 和 Chrome(适用于 Win 桌面)上进行了检查。 我已接受您的回答。我认为它奏效了。我也颁发了赏金。我还有一个类似的question。我想知道你是否可以看看。它是与 wordpress 插件 css 相关的东西。从过去的 24 小时开始,我一直坚持这一点【参考方案3】:

我会在 p 元素上使用 after: 选择器。

p:after
content: url("path/to/image");
 

【讨论】:

我们的选项有限,因为我们无法更改 html。剩下的唯一选项是 css。 我贴的例子是CSS。 是的,我知道。我只是说说而已。 您使用的是箭头图像,对吗?这绝对适合你。 这一切都来自 wordpress 表单。我什么都没用。【参考方案4】:

纯 CSS / HTML 的解决方案是可用的,但是当我们通过 html size = "2" 扩展高度然后再次通过高度将其缩小时通过 hack 工作:

<p>
   <select name="filter_31" id="search-box-filter_31" size="2" style="font-size:16px; height:24px;">
      <option value="Vancouver Island University">University of Arizona</option>
      <option value="Western University">University of B</option>
      <option value="Wilfrid Laurier University">University of C</option>
      <option value="York University">University of D</option>
   </select>
</p>

但我不会为工作项目编写这样的代码,而是使用 js 库更好,例如: https://github.hubspot.com/select/docs/welcome/

【讨论】:

我无法对 html 代码进行任何更改,因为这些都是在进行检查后来自 wordpress。我唯一可以进行更改的地方是 CSS。我想知道你是否知道可以解决它的 CSS。 这个任务仅靠 CSS 是无法解决的。无论如何,您将需要 javascript。任何仅使用 CSS 解决此问题的方法都会在不同的浏览器和操作系统中引起问题。 我们先来决定,是不是只需要右边有一个带有上下箭头的图标,这样当你点击箭头时就会出现一个下拉菜单?或者您是否需要这些箭头成为成熟的工人,即这两个箭头的单独行为?如果您在网络上找到您想要的工作示例会更好,也许在某个网站上并添加一个链接到您的问题。 你的第一点对我来说很有意义。我需要一个带有蓝色上下箭头的图标,当我们点击箭头时应该会出现一个下拉菜单。【参考方案5】:

当你说你不能触摸 HTML 时,这可能会给你一些安慰。我在玩 CSS!

#search-box-filter_32 
            background-color: white !important;
            font-size: 11px !important;
            background: url('https://cdn3.iconfinder.com/data/icons/trico-arrows-1/24/ExpandUpDownSmall-512.png') no-repeat right #ddd;
            background-position: 98%;
            padding: 2px 20px 2px 8px;
            padding-right: 20px;
            background-size: 14px;
            -moz-appearance: none;
            -o-appearance: none;
            -ms-appearance: none;
            -webkit-appearance: none;
            outline: none !important;
            -webkit-border-radius: 4px;
            border: 1px  solid #cccccc;
        

https://codepen.io/mohan-wijesena/pen/dgMBLY

【讨论】:

以上是关于如何在 CSS 的选择输入字段中同时制作上/下箭头?的主要内容,如果未能解决你的问题,请参考以下文章

如何始终在移动设备和 iPad 上显示数字输入微调器

将 ACF 字段插入 CSS 伪元素

如何对 FLTK 中的小部件进行排序以使箭头键导航正常工作?

CSS:将元素定位在悬停或焦点上,但不能同时定位

excel数据透视表如何生成柱状图表

是否可以纯粹在css中制作一个带有1个尖边的1px边框输入字段?