输入文本内的清除图标

IT技术 javascript jquery html css
2021-01-29 18:25:57

有没有一种快速的方法来创建一个带有右侧图标的输入文本元素来清除输入元素本身(如谷歌搜索框)?

我环顾四周,但我只找到了如何将图标作为输入元素的背景。是否有 jQuery 插件或其他东西?

我想要输入文本元素内的图标,例如:

--------------------------------------------------
|                                               X|
--------------------------------------------------
6个回答

type="search"在您的输入中添加一个
支持相当不错,但在 IE<10 中不起作用

<input type="search">


较旧的浏览器

如果您需要IE9 支持,这里有一些解决方法

使用标准<input type="text">和一些 HTML 元素:

/**
 * Clearable text inputs
 */
$(".clearable").each(function() {
  
  const $inp = $(this).find("input:text"),
      $cle = $(this).find(".clearable__clear");

  $inp.on("input", function(){
    $cle.toggle(!!this.value);
  });
  
  $cle.on("touchstart click", function(e) {
    e.preventDefault();
    $inp.val("").trigger("input");
  });
  
});
/* Clearable text inputs */
.clearable{
  position: relative;
  display: inline-block;
}
.clearable input[type=text]{
  padding-right: 24px;
  width: 100%;
  box-sizing: border-box;
}
.clearable__clear{
  display: none;
  position: absolute;
  right:0; top:0;
  padding: 0 8px;
  font-style: normal;
  font-size: 1.2em;
  user-select: none;
  cursor: pointer;
}
.clearable input::-ms-clear {  /* Remove IE default X */
  display: none;
}
<span class="clearable">
  <input type="text" name="" value="" placeholder="">
  <i class="clearable__clear">&times;</i>
</span>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

仅使用一个<input class="clearable" type="text">(无附加元素)

清除输入元素内的图标

设置一个class="clearable"并播放它的背景图像:

/**
 * Clearable text inputs
 */
function tog(v){return v ? "addClass" : "removeClass";} 
$(document).on("input", ".clearable", function(){
    $(this)[tog(this.value)]("x");
}).on("mousemove", ".x", function( e ){
    $(this)[tog(this.offsetWidth-18 < e.clientX-this.getBoundingClientRect().left)]("onX");
}).on("touchstart click", ".onX", function( ev ){
    ev.preventDefault();
    $(this).removeClass("x onX").val("").change();
});

// $('.clearable').trigger("input");
// Uncomment the line above if you pre-fill values from LS or server
/*
    Clearable text inputs
*/
.clearable{
  background: #fff url(http://i.stack.imgur.com/mJotv.gif) no-repeat right -10px center;
  border: 1px solid #999;
  padding: 3px 18px 3px 4px; /* Use the same right padding (18) in jQ! */
  border-radius: 3px;
  transition: background 0.4s;
}
.clearable.x  { background-position: right 5px center; } /* (jQ) Show icon */
.clearable.onX{ cursor: pointer; } /* (jQ) hover cursor style */
.clearable::-ms-clear {display: none; width:0; height:0;} /* Remove IE default X */
<input class="clearable" type="text" name="" value="" placeholder="" />

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

诀窍是为 设置一些正确的填充(我使用 18px)input并将背景图像向右推,看不见(我使用right -10px center)。
18px 填充将防止文本隐藏在图标下方(可见时)。
jQuery 将添加显示清除图标的类"x"(如果input有值)。
现在我们只需要用 jQ 将输入作为目标,x然后检测mousemove鼠标是否在 18px 的“x”区域内;如果在里面,添加 class onX
单击onX类将删除所有类、重置输入值并隐藏图标。


7x7px gif: 清除图标 7x7

Base64 字符串:

data:image/gif;base64,R0lGODlhBwAHAIAAAP///5KSkiH5BAAAAAAALAAAAAAHAAcAAAIMTICmsGrIXnLxuDMLADs=
哇,非常好的解决方案。这就是我正在寻找的。谢谢你。但是,如何将“x”图像更改为使用 Bootstrap 3 字形图标?由于字形是字体,因此缩小时显示效果更好。
2021-03-24 18:25:57
@RokoC.Buljan 我刚刚再次测试,这是我的发现 1) 在输入文本框中输入几个字符 2) 出现“X”图标 3) 尝试单击“X”图标但文本文本没有清除。注意:此时,iPhone 键盘仍处于活动状态且未隐藏。4)如果我点击“完成”按钮隐藏键盘,然后点击“X”图标,现在文本将被正确清除。当显示 iPhone 键盘时,我似乎无法用“X”清除文本。
2021-04-03 18:25:57
我冒昧地借用了这段代码中的一些想法来制作一个标签云生成器(带有纯 css 标签以及 upvote 和 downvote 按钮)。我希望它在您的浏览器中看起来不错;jsfiddle.net/7PnKS 上查看
2021-04-07 18:25:57
不错,但背景图像可能会与其他 CSS 冲突。下面 wldaunfr 的回答引用了一个简洁的 jQuery 插件:plugins.jquery.com/clearsearch
2021-04-08 18:25:57
在最新的 Firefox 和 chrome 中对我来说效果很好。但必须更改.on('touchstart click', '.onX', ....on('touchstart click', '.onX, .x', ...使其在 iOS 上运行。
2021-04-11 18:25:57

我可以建议,如果你同意这仅限于 html 5 兼容的浏览器,只需使用:

<input type="search" />

JS小提琴演示

诚然,在 Chromium (Ubuntu 11.04) 中,这确实需要在input元素内部有文本,然后才能出现明文图像/功能。

参考:

我想不是!但我不是 css 向导!:-(
2021-03-14 18:25:57
有没有办法改变X的颜色?
2021-03-15 18:25:57
@RiccardoBassilichi 有没有办法扩展我的 css 文件,这样我就不必编辑原始的 bootstrap.css 并且仍然可以正常工作?
2021-03-18 18:25:57
不幸的是,Firefox 不支持此功能,请参阅:developer.mozilla.org/en-US/docs/Web/CSS/...
2021-03-18 18:25:57
对其他开发人员的帮助:如果您使用 bootstrap CSS 平台,请删除样式“-webkit-appearance: textfield;” 在 bootstrap.css 输入 [type="search"] { -webkit-box-sizing: content-box; -moz-box-sizing: 内容框;框大小:内容框;-webkit 外观:文本字段;}
2021-03-24 18:25:57

根据 MDN<input type="search" />目前所有现代浏览器都支持:

输入类型=搜索

<input type="search" value="Clear this." />


但是,如果您希望跨浏览器保持一致的不同行为,这里有一些仅需要 JavaScript 的轻量级替代方案:

选项 1 - 始终显示“x”:(此处示例)

Array.prototype.forEach.call(document.querySelectorAll('.clearable-input>[data-clear-input]'), function(el) {
  el.addEventListener('click', function(e) {
    e.target.previousElementSibling.value = '';
  });
});
.clearable-input {
  position: relative;
  display: inline-block;
}
.clearable-input > input {
  padding-right: 1.4em;
}
.clearable-input > [data-clear-input] {
  position: absolute;
  top: 0;
  right: 0;
  font-weight: bold;
  font-size: 1.4em;
  padding: 0 0.2em;
  line-height: 1em;
  cursor: pointer;
}
.clearable-input > input::-ms-clear {
  display: none;
}
<p>Always display the 'x':</p>

<div class="clearable-input">
  <input type="text" />
  <span data-clear-input>&times;</span>
</div>

<div class="clearable-input">
  <input type="text" value="Clear this." />
  <span data-clear-input>&times;</span>
</div>

选项 2 - 仅在将鼠标悬停在该字段上时显示“x”:(此处示例)

Array.prototype.forEach.call(document.querySelectorAll('.clearable-input>[data-clear-input]'), function(el) {
  el.addEventListener('click', function(e) {
    e.target.previousElementSibling.value = '';
  });
});
.clearable-input {
  position: relative;
  display: inline-block;
}
.clearable-input > input {
  padding-right: 1.4em;
}
.clearable-input:hover > [data-clear-input] {
  display: block;
}
.clearable-input > [data-clear-input] {
  display: none;
  position: absolute;
  top: 0;
  right: 0;
  font-weight: bold;
  font-size: 1.4em;
  padding: 0 0.2em;
  line-height: 1em;
  cursor: pointer;
}
.clearable-input > input::-ms-clear {
  display: none;
}
<p>Only display the 'x' when hovering over the field:</p>

<div class="clearable-input">
  <input type="text" />
  <span data-clear-input>&times;</span>
</div>

<div class="clearable-input">
  <input type="text" value="Clear this." />
  <span data-clear-input>&times;</span>
</div>

选项 3 - 如果input元素具有值,则仅显示“x” :(此处的示例)

Array.prototype.forEach.call(document.querySelectorAll('.clearable-input'), function(el) {
  var input = el.querySelector('input');

  conditionallyHideClearIcon();
  input.addEventListener('input', conditionallyHideClearIcon);
  el.querySelector('[data-clear-input]').addEventListener('click', function(e) {
    input.value = '';
    conditionallyHideClearIcon();
  });

  function conditionallyHideClearIcon(e) {
    var target = (e && e.target) || input;
    target.nextElementSibling.style.display = target.value ? 'block' : 'none';
  }
});
.clearable-input {
  position: relative;
  display: inline-block;
}
.clearable-input > input {
  padding-right: 1.4em;
}
.clearable-input >[data-clear-input] {
  display: none;
  position: absolute;
  top: 0;
  right: 0;
  font-weight: bold;
  font-size: 1.4em;
  padding: 0 0.2em;
  line-height: 1em;
  cursor: pointer;
}
.clearable-input > input::-ms-clear {
  display: none;
}
<p>Only display the 'x' if the `input` element has a value:</p>

<div class="clearable-input">
  <input type="text" />
  <span data-clear-input>&times;</span>
</div>

<div class="clearable-input">
  <input type="text" value="Clear this." />
  <span data-clear-input>&times;</span>
</div>

您可以使用带有图像样式的重置按钮...

<form action="" method="get">
   <input type="text" name="search" required="required" placeholder="type here" />
   <input type="reset" value="" alt="clear" />
</form>

<style>
   input[type="text"]
   {
      height: 38px;
      font-size: 15pt;
   }

   input[type="text"]:invalid + input[type="reset"]{
     display: none;
   } 

   input[type="reset"]
   {
      background-image: url( http://png-5.findicons.com/files/icons/1150/tango/32/edit_clear.png );
      background-position: center center;
      background-repeat: no-repeat;
      height: 38px;
      width: 38px;
      border: none;
      background-color: transparent;
      cursor: pointer;
      position: relative;
      top: -9px;
      left: -44px;
   }
</style>

在这里查看它的实际效果:http : //jsbin.com/uloli3/63

输入为空时如何隐藏重置图像?KOGI 能举一个活生生的例子吗?
2021-03-17 18:25:57
这将重置整个表单,而不仅仅是一个字段
2021-03-19 18:25:57

我只用 CSS 创建了一个可清除的文本框。它不需要 javascript 代码就可以工作

下面是演示链接

http://codepen.io/shidhincr/pen/ICLBD

文本没有被重新定位为“x”按钮腾出空间。您看不到按钮后面的文字。
2021-03-21 18:25:57
今天它在 FF 27.0.1 中被我打破了。
2021-03-26 18:25:57
这仍然会清除整个表单,而不仅仅是一个字段。
2021-03-29 18:25:57
优秀的!一些有关浏览器支持的信息会有所帮助。
2021-04-05 18:25:57