Icono claro dentro del texto de entrada

185

¿Hay una forma rápida de crear un elemento de texto de entrada con un icono a la derecha para borrar el elemento de entrada en sí (como el cuadro de búsqueda de Google)?

Miré a mi alrededor pero solo encontré cómo poner un ícono como fondo del elemento de entrada. ¿Hay un complemento jQuery o algo más?

Quiero el icono dentro del elemento de texto de entrada, algo como:

--------------------------------------------------
|                                               X|
--------------------------------------------------
Giovanni Di Milia
fuente
3
¿Un complemento jQuery para colocar una imagen sobre un cuadro de entrada? ¿Me estoy perdiendo algo o qué?
Christian
1
@Christian Sciberras Como puede ver en la respuesta que elegí, puede ser un complemento jquery ...
Giovanni Di Milia
1
Puede tener un complemento jQuery para mostrar cuadros de alerta simples. No significa que realmente tenga que hacerlo , y en la mayoría de los casos, es una hinchazón excesivamente diseñada . Ah, por cierto, lo que seleccionó no es un complemento jQuery , sino una combinación de javascript, html y css. Un complemento sería un solo archivo / script con la firma jQuery que contiene los detalles relevantes.
Christian
1
@ Christian Sciberras: Puedo distinguir entre un complemento jQuery y una combinación de javascript y CSS. Lo que estaba diciendo es que si quieres hacer algo bueno, no puedes poner solo una imagen en un cuadro de entrada.
Giovanni Di Milia
Las personas que buscan este problema también necesitarán esta información: ¿cómo se detecta la eliminación de una entrada HTML5 de "búsqueda"?
brasofilo

Respuestas:

342

Agregue un type="search"a su entrada
El soporte es bastante decente pero no funcionará en IE <10

<input type="search">

Entrada limpiable para navegadores antiguos

Si necesita soporte para IE9 aquí hay algunas soluciones

Usando un estándar <input type="text">y algunos elementos HTML:

/**
 * Clearable text inputs
 */
$(".clearable").each(function() {
  
  var $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/2.1.1/jquery.min.js"></script>

Usando solo un <input class="clearable" type="text">(Sin elementos adicionales)

Icono claro dentro del elemento de entrada

establece class="clearable"y juega con su imagen de fondo:

/**
 * 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/2.1.1/jquery.min.js"></script>

jsBin demo

El truco consiste en colocar algo de relleno derecho (usé 18px) inputy empujar la imagen de fondo hacia la derecha, fuera de la vista (solía right -10px center).
Ese relleno de 18px evitará que el texto se oculte debajo del icono (mientras esté visible).
jQ agregará la clase x(si inputtiene valor) mostrando el ícono clear.
Ahora todo lo que necesitamos es apuntar con jQ las entradas con clase xy detectar mousemovesi el mouse está dentro de esa área "x" de 18px; si está adentro, agregue la clase onX.
Al hacer clic en la onXclase, se eliminan todas las clases, se restablece el valor de entrada y se oculta el icono.


7x7px gif: Borrar icono 7x7

Cadena Base64:

data:image/gif;base64,R0lGODlhBwAHAIAAAP///5KSkiH5BAAAAAAALAAAAAAHAAcAAAIMTICmsGrIXnLxuDMLADs=
Roko C. Buljan
fuente
55
Me tomé la libertad de tomar prestadas algunas de las ideas en este código para hacer un generador de nube de etiquetas (con etiquetas css puras y botones de votación positiva y negativa). Espero que se vea bien en su navegador; échale un vistazo a jsfiddle.net/7PnKS
mrBorna
1
Wow, muy buena solución. Eso es lo que estoy buscando. Gracias. Pero, ¿cómo puedo cambiar la imagen "x" para usar el glifo de Bootstrap 3? Debido a que el glifo es fuente, por lo tanto, se visualiza mejor cuando se aleja.
user1995781
1
Agradable, pero la imagen de fondo puede chocar con otros CSS. La respuesta a continuación por wldaunfr se refiere a un complemento limpio de jQuery: plugins.jquery.com/clearsearch
Nick Westgate
1
Funciona muy bien para mí en Firefox y Chrome. pero tuve que cambiar .on('touchstart click', '.onX', ...para .on('touchstart click', '.onX, .x', ...que funcione en iOS.
kritzikratzi
1
@ RokoC.Buljan Acabo de probar nuevamente y aquí están mis hallazgos 1) Ingrese algunos caracteres en el cuadro de texto de entrada 2) Aparece el ícono 'X' 3) Intentado Haga clic en el ícono 'X' pero el texto no se borra. Nota: En este momento, el teclado del iPhone todavía está activo y no está oculto. 4) Si hice clic en el botón "Listo" para ocultar el teclado y luego volví a hacer clic en el ícono 'X', el texto se borrará correctamente ahora. Parece que no puedo borrar el texto con 'X' cuando se muestra el teclado del iPhone.
Retenciones
61

Podría sugerir, si está de acuerdo con que esto se limite a los navegadores compatibles con html 5, simplemente use:

<input type="search" />

Demostración de JS Fiddle

Es cierto que en Chromium (Ubuntu 11.04), esto requiere que haya texto dentro del inputelemento antes de que aparezca la imagen / funcionalidad de texto claro.

Referencia:

David dice reinstalar a Mónica
fuente
11
una ayuda para otros desarrolladores: si utiliza la plataforma de arranque CSS, elimine el estilo "-webkit-apariencia: campo de texto;" en bootstrap.css input [type = "search"] {-webkit-box-sizing: content-box; -moz-box-sizing: content-box; tamaño de la caja: caja de contenido; -webkit-apariencia: campo de texto; }
Riccardo Bassilichi
1
¿Hay alguna manera de cambiar el color de la X?
rotaercz
1
@RiccardoBassilichi, ¿hay alguna manera de extender mi archivo css para que no tenga que editar el bootstrap.css original y aún así hacerlo funcionar?
supersan
¡Creo que no! ¡Pero no soy un asistente de CSS! :-(
Riccardo Bassilichi
2
Desafortunadamente, esto no es compatible con Firefox, consulte: developer.mozilla.org/en-US/docs/Web/CSS/…
Guillaume Husta
27

Podría usar un botón de reinicio diseñado con una imagen ...

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

Véalo en acción aquí: http://jsbin.com/uloli3/63

KOGI
fuente
10
Esto restablece todo el formulario, no solo un campo
konung
¿Cómo ocultar la imagen de restablecimiento cuando la entrada está vacía? ¿Podrías, KOGI dar un ejemplo en vivo?
Harry
24

He creado un cuadro de texto limpiable en solo CSS. No requiere código javascript para que funcione

a continuación se muestra el enlace de demostración

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

Shidhin Cr
fuente
1
¡Excelente! Alguna información sobre el soporte del navegador sería útil.
Ian Newson
1
Hoy está roto en FF 27.0.1 para mí.
Nick Westgate
3
El texto no se está reposicionando para dejar espacio para el botón 'x'. No puedes ver el texto detrás del botón.
CrimsonChris
Esto todavía borra todo el formulario, no solo un campo.
Erik Veland
23

Según MDN , <input type="search" />actualmente es compatible con todos los navegadores modernos:

tipo de entrada = buscar

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


Sin embargo, si desea un comportamiento diferente que sea consistente en todos los navegadores, aquí hay algunas alternativas livianas que solo requieren JavaScript:

Opción 1 - Mostrar siempre la 'x': (ejemplo aquí)

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>

Opción 2: solo muestra la 'x' al pasar el cursor sobre el campo: (ejemplo aquí)

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>

Opción 3: solo muestre la 'x' si el inputelemento tiene un valor: (ejemplo aquí)

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>

Josh Crozier
fuente
9

Dado que ninguna de las soluciones que vuelan realmente cumplió con nuestros requisitos, se nos ocurrió un simple complemento jQuery llamado jQuery-ClearSearch :

usarlo es tan fácil como:

<input class="clearable" type="text" placeholder="search">

<script type="text/javascript">
    $('.clearable').clearSearch();
</script>

Ejemplo: http://jsfiddle.net/wldaunfr/FERw3/

wldaunfr
fuente
Trabajando en Firefox 45
Jeff Davis
1
No parece estar funcionando en la última versión de Google Chrome (v.70 ~ noviembre de 2018)
Ben Clarke
3

EDITAR: Encontré este enlace. Espero eso ayude. http://viralpatel.net/blogs/2011/02/clearable-textbox-jquery.html

Has mencionado que lo quieres a la derecha del texto de entrada. Entonces, la mejor manera sería crear una imagen al lado del cuadro de entrada. Si está buscando algo dentro del cuadro, puede usar la imagen de fondo, pero es posible que no pueda escribir un guión para borrar el cuadro.

Por lo tanto, inserte una imagen y escriba un código JavaScript para borrar el cuadro de texto.

Jaspero
fuente
Me refería a la derecha del cuadro de entrada, pero dentro de la entrada en sí, como lo hace google
Giovanni Di Milia
Use una imagen de fondo que imite un botón y use el siguiente código<input type="text" name="Search" value="Search..." onclick="this.value='';">
Jaspero
Esto no es lo que quiero hacer: quiero un icono que solo si se hace clic borra la entrada ...
Giovanni Di Milia
3

Si quiere que sea como Google, entonces debe saber que la "X" no está realmente dentro de <input>ellos, están uno al lado del otro con el contenedor exterior diseñado para aparecer como el cuadro de texto.

HTML:

<form>
    <span class="x-input">
        <input type="text" class="x-input-text" />
        <input type="reset" />
    </span>
</form>

CSS:

.x-input {
    border: 1px solid #ccc;
}

.x-input input.x-input-text {
    border: 0;
    outline: 0;
}

Ejemplo: http://jsfiddle.net/VTvNX/

Jonathan Lonowski
fuente
1

¿¿Algo como esto?? Jsfiddle Demo

    <!DOCTYPE html>
<html>
<head>
    <title></title>
    <style type="text/css">
    .searchinput{
    display:inline-block;vertical-align: bottom;
    width:30%;padding: 5px;padding-right:27px;border:1px solid #ccc;
        outline: none;
}
        .clearspace{width: 20px;display: inline-block;margin-left:-25px;
}
.clear {
    width: 20px;
    transition: max-width 0.3s;overflow: hidden;float: right;
    display: block;max-width: 0px;
}

.show {
    cursor: pointer;width: 20px;max-width:20px;
}
form{white-space: nowrap;}

    </style>
</head>
<body>
<form>
<input type="text" class="searchinput">
</form>
<script src="jquery-1.11.3.min.js" type="text/javascript"></script> <script>
$(document).ready(function() {
$("input.searchinput").after('<span class="clearspace"><i class="clear" title="clear">&cross;</i></span>');
$("input.searchinput").on('keyup input',function(){
if ($(this).val()) {$(".clear").addClass("show");} else {$(".clear").removeClass("show");}
});
$('.clear').click(function(){
    $('input.searchinput').val('').focus();
    $(".clear").removeClass("show");
});
});
</script>
</body>
</html>
Toki
fuente
1
<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>
Juboraj Sarker
fuente
1

Puedes hacerlo con estos comandos (sin Bootstrap).

Array.from(document.querySelectorAll('.search-field')).forEach(field => {
  field.querySelector('span').addEventListener('click', e => {
    field.querySelector('input').value = '';
  });
});
:root {
  --theme-color: teal;
}

.wrapper {
  width: 80%;
  margin: 0 auto;
}

div {
  position: relative;
}

input {
  background:none;
  outline:none;
  display: inline-block;
  width: 100%;
  margin: 8px 0;
  padding: 13px 15px;
  padding-right: 42.5px;
  border: 1px solid var(--theme-color);
  border-radius: 5px;
  box-sizing: border-box;
}

span {
  position: absolute;
  top: 0;
  right: 0;
  margin: 8px 0;
  padding: 13px 15px;
  color: var(--theme-color);
  font-weight: bold;
  cursor: pointer;
}
span:after {
  content: '\2716';
}
<div class="wrapper">
  <div class="search-field">
    <input placeholder="Search..." />
    <span></span>
  </div>
</div>

Andrés M. Jiménez
fuente
0

Aquí hay un complemento jQuery (y una demostración al final).

http://jsfiddle.net/e4qhW/3/

Lo hice principalmente para ilustrar un ejemplo (y un desafío personal). Aunque los votos positivos son bienvenidos, las otras respuestas se entregan a tiempo y merecen su debido reconocimiento.

Aún así, en mi opinión, está sobredimensionado (a menos que forme parte de una biblioteca de IU).

cristiano
fuente
Si borra el contenido y comienza a escribir de nuevo ... ya no hay xbotón
Roko C. Buljan
jajaja parece un bicho de 2 años que;) es bueno verte todavía por aquí
Roko C. Buljan
0

Utilizando un complemento jquery, lo he adaptado a mis necesidades agregando opciones personalizadas y creando un nuevo complemento. Puede encontrarlo aquí: https://github.com/david-dlc-cerezo/jquery-clearField

Un ejemplo de un uso simple:

<script src='http://code.jquery.com/jquery-1.9.1.js'></script>
<script src='http://code.jquery.com/ui/1.10.3/jquery-ui.js'></script>
<script src='src/jquery.clearField.js'></script>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css">
<link rel="stylesheet" href="css/jquery.clearField.css">

<table>
    <tr>
        <td><input name="test1" id="test1" clas="test" type='text'></td>
        <td>Empty</td>
    </tr>
    <tr>
        <td><input name="test2" id="test2" clas="test" type='text' value='abc'></td>
        <td>Not empty</td>
    </tr>
</table>

<script>
    $('.test').clearField();
</script>

Obteniendo algo como esto:

ingrese la descripción de la imagen aquí

David
fuente
0

No es necesario incluir CSS o archivos de imagen. No es necesario incluir toda esa biblioteca jQuery UI de artillería pesada. Escribí un plugin jQuery liviano que hace la magia por ti. Todo lo que necesitas es jQueryy el complemento . =)

Vista previa de jQuery InputSearch

Violín aquí: jQuery InputSearch demo .

Glenn Mohammad
fuente