¿Es posible hacer que los campos de entrada sean de solo lectura a través de CSS?


Sé que los elementos de entrada se hacen de solo lectura aplicando el atributo booleano readonly, y al ser un atributo no se ve afectado por CSS.

Por otro lado, mi escenario parece ser un muy buen ajuste para CSS, así que esperaba que hubiera algún tipo de truco CSS para dejarme hacerlo. Tengo un versión imprimible hipervínculo en mi formulario. Al hacer clic en él se muestra a ... versión imprimible del documento. Es sobre todo cosas CSS, mi impresión.css se ve así:

html.print {
    width: 8.57in;
}

.print body {
    font: 9pt/1.5 Arial, sans-serif;
    margin: 0 1in;
    overflow: auto;
}

.print #header, .print #footer {
    display: none;
}

.print .content {
    background-color: white;
    overflow: auto;
}

.print .fieldset > div.legend:first-child {
    background: white;
}

.print ::-webkit-input-placeholder {
    /* WebKit browsers */
    color: transparent;
}

.print :-moz-placeholder {
    /* Mozilla Firefox 4 to 18 */
    color: transparent;
}

.print ::-moz-placeholder {
    /* Mozilla Firefox 19+ */
    color: transparent;
}

.print :-ms-input-placeholder {
    /* Internet Explorer 10+ */
    color: transparent;
}

.print .check-mark {
    display: inline;
}

.print input[type=checkbox] {
    display: none;
}

.print .boolean-false {
    display: none;
}

Hay también algunas piezas de javascript, tales como:

  • Añadiendo la clase print al elemento html
  • Mostrando tablas sin barras de desplazamiento
  • Algunas otras cosas menores, como ocultar cualquier superposición de ventanas emergentes.

Mi problema actual son los campos de entrada. Deben ser de solo lectura, sin embargo, no tengo idea de cómo hacerlo con cambios mínimos en el código. CSS podría ser una solución perfecta.

¿Alguna idea?

Author: James Donnelly, 2013-05-29

8 answers

¿Solo con CSS? Esto es una especie de posible en las entradas de texto mediante el uso de user-select:none:

.print {
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;          
}

Ejemplo de JSFiddle.

Vale la pena señalar que esto no funcionará en los navegadores que no soportan CSS3 o soportan la propiedad user-select . La propiedad readonly debería ser dada idealmente al marcado de entrada que desea que se haga de solo lectura, pero esto funciona como una alternativa a hacky CSS.

Con JavaScript:

document.getElementById("myReadonlyInput").setAttribute("readonly", "true");

Editar: El método CSS ya no funciona en Chrome (29). La propiedad -webkit-user-select ahora parece ser ignorada en los elementos de entrada.

 29
Author: James Donnelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-30 14:05:56

No es posible (con los navegadores actuales) hacer un campo de entrada de solo lectura solo a través de CSS.

Aunque, como ya has mencionado, puedes aplicar el atributo readonly='readonly'.

Si su criterio principal es no alterar el marcado en la fuente, hay maneras de obtener esto, discretamente, con javascript.

Con jQuery, esto es fácil:

 $('input').attr('readonly', 'readonly');

O incluso con Javascript simple:

document.getElementById('someId').setAttribute('readonly', 'readonly');
 9
Author: Faust,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-14 07:19:46

No es realmente lo que necesita, pero puede ayudar y responder la pregunta aquí dependiendo de lo que desea lograr.

Puede evitar que todos los eventos de puntero se envíen a la entrada utilizando la propiedad CSS: pointer-events:none Añadirá una capa encima del elemento que le impedirá hacer clic en él ... También puede agregar un cursor:text al elemento padre para devolver el estilo del cursor de texto a la entrada ...

Útil, por ejemplo, cuando no se puede modificar el JS/HTML de un módulo.. y solo puede personalizarlo por css.

JSFIDDLE

 6
Author: Cétia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-01 15:29:13

Esto no es posible con css, pero he utilizado un truco css en uno de mi sitio web, por favor compruebe si esto funciona para usted.

El truco es: envuelva el cuadro de entrada con un div y hágalo relativo, coloque una imagen transparente dentro del div y hágalo absoluto sobre el cuadro de texto de entrada, de modo que nadie pueda editarlo.

Css

.txtBox{
    width:250px;
    height:25px;
    position:relative;
}
.txtBox input{
    width:250px;
    height:25px;
}
.txtBox img{
    position:absolute;
    top:0;
    left:0
}

Html

<div class="txtBox">
<input name="" type="text" value="Text Box" />
<img src="http://dev.w3.org/2007/mobileok-ref/test/data/ROOT/GraphicsForSpacingTest/1/largeTransparent.gif" width="250" height="25" alt="" />
</div>

JsFiddle File

 2
Author: Roy Sonasish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-29 10:43:18

CSS no puede establecer ningún comportamiento. La única manera de desactivar algo en CSS es hacerlo invisible, ya sea configurando display:none o simplemente poniendo div con img transparente por todas partes y cambiando sus órdenes z para desactivar el usuario centrándose en él con el ratón. Aunque, el usuario todavía será capaz de centrarse con la pestaña de otro campo.

 0
Author: David Jashi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-29 10:13:10

No establece el comportamiento de los controles a través de CSS, solo su estilo.Puede usar jquery o simple javascript para cambiar la propiedad de los campos.

 0
Author: sAnS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-29 10:22:38

¿Por qué no ocultar el elemento input y reemplazarlo con un elemento label con el mismo contenido?

Me quedé perplejo sobre cómo la aplicación React TODOMVC logró esta misma cosa y esta es la estrategia que se les ocurrió.

Para verlo en acción, echa un vistazo a la aplicación a continuación, y ver las propiedades CSS de los elementos de TODO cuando haga doble clic en ellos y luego haga clic de distancia.

Http://todomvc.com/examples/react-backbone/#/

Cuando renderizas la página puedes tener cualquiera una entrada editable, o una etiqueta no editable con display: none; dependiendo de su consulta de medios.

 0
Author: Ian Danforth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-29 20:59:45

Espero que esto ayude.

    input[readonly="readonly"]
{
    background-color:blue;
}

Referencia:

Http://jsfiddle.net/uzyH5/1 /

 -10
Author: RachithaS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-29 10:19:57