2011-11-15 12 views
9

Aquí hay un poco de CSS y HTML para hacer un área de texto a continuación una lista de puntos de datos:Haga una lista de valores se alinean con un área de texto y etiquetas

form label { 
    width: 140px; 
    float: left; 
} 
form ol li { 
    background: #98c8dc; 
    list-style: none; 
    padding: 5px 10px; 
} 

<form> 
<ol> 
<li> 
    <label><br/><br/><br/><br/>Recent data</label> 
    <ol> 
    <li>3 99</li> 
    <li>5 98</li> 
    <li>15 97</li> 
    <li>28 96</li> 
    </ol> 
</li> 
<li> 
    <label>New data</label> 
    <textarea placeholder="30 95" rows="4"></textarea> 
</li> 
</ol> 
</form> 

Se hace así:

enter image description here

¿Cómo recomendaría que lo alineara exactamente? A saber, "Datos recientes" debe alinearse con la línea "28 96" y, quizás el más complicado, el "30 95", a pesar de estar en el área de texto, debe alinearse como si fuera solo otra fila que viene después del "28 96 ".

+2

¿Alguien puede aconsejarme sobre la etiqueta de recompensas? Quería dárselo a @Bee para saltar y clavarlo dentro de las 24 horas de mi pregunta. Nadie ha mejorado su respuesta en términos de la calidad de lo que se representa, pero se ha superado en términos de la elegancia del código. ¿Puedo, por ejemplo, convertir la solución más elegante en la aceptada, pero otorgar la recompensa en función de la velocidad de respuesta? Quiero decir, sé que puedo, pero ¿qué hay de más en el espíritu de stackoverflow? (Divulgación: Bee y yo somos cohackers en la vida real.) – dreeves

+1

Según tengo entendido, la recompensa se puede dividir y no está vinculada a la respuesta aceptada – HerrSerker

+1

En su código HTML, no debe usar una etiqueta para datos recientes ya que no hay elemento de forma correspondiente. Un span o inline p con exactamente el mismo estilo que la etiqueta de abajo estaría bien (mi nombre preferido es una clase .label_like ^^). Y debe agregar una asociación for/id entre label y textarea, como es habitual para los elementos de formulario asociados con una etiqueta. – FelipeAls

Respuesta

3

Este es un buen ejemplo para el posicionamiento CSS. Los elementos con position:absolute se ubican en relación con su elemento situado más cercano principal. Eso significa que podemos anclar las etiquetas en la parte superior/izquierda de sus contenedores usando position:relative en el <ol>, y position:absolute en la etiqueta.

Ejemplo aquí: http://jsfiddle.net/YhQYS/1/

HTML:

<form action="." method="post"> 
    <ol> 
     <li class="recent-data"> 
      <strong>Recent data</strong> 
      <ol> 
       <li>3 99</li> 
       <li>5 98</li> 
       <li>15 97</li> 
       <li>28 96</li> 
      </ol> 
     </li> 
     <li class="new-data"> 
      <label>New data</label> 
      <textarea placeholder="30 95" rows="4"></textarea> 
     </li> 
    </ol> 
</form> 

CSS:

form > ol { 
    background: #98c8dc; 
    font-family: serif; 
} 
.recent-data > ol, 
.new-data > ol { 
    list-style: none; 
    padding: 5px 10px 5px 0; 
    line-height:20px; 
} 
.recent-data li { padding-left:5px; } 
.recent-data, 
.new-data { 
    position:relative; 
    padding-left:140px; 
} 
.recent-data strong, 
.new-data label { 
    position:absolute; 
    left:10px; 
    line-height:20px; 
} 
.recent-data strong { bottom:5px; } 
.new-data label { top:5px; } 
.new-data textarea { 
    font-family:serif; 
    font-size:100%; 
    padding:4px; 
} 

Esto es muy simple para razonar acerca y fiable entre navegadores. Tenga en cuenta que no debe usar un <label> que no tenga un control de formulario correspondiente.


Pero eso se parece a los datos tabulares ... es su elección, que no tienen suficiente contexto para saber qué margen de beneficio es más apropiado. Así que aquí es un enfoque más semánticamente correcto uso de tablas, rowspan y vertical-align:

HTML:

<form action="." method="post"> 
    <table id="results"> 
     <tbody> 
      <tr> 
       <th rowspan="4" scope="row" class="recent-label">Recent data</th> 
       <td>2</td> 
       <td>47</td> 
      </tr> 
      <tr> 
       <td>3</td> 
       <td>99</td> 
      </tr> 
      <tr> 
       <td>5</td> 
       <td>98</td> 
      </tr> 
      <tr> 
       <td>5</td> 
       <td>98</td> 
      </tr> 
      <tr> 
       <th rowspan="1" scope="row" class="new-label">New data</th> 
       <td colspan="2" class="new-data"> 
        <textarea>23</textarea> 
       </td> 
      </tr> 
     </tbody> 
    </table> 
</form> 

CSS:

form { 
    background: #98c8dc; 
    font-family: serif; 
} 
#results th, 
#results td { 
    padding:3px 5px; 
} 

#results .recent-label { 
    vertical-align:bottom; 
} 
#results .new-label { 
    vertical-align:top; 
} 
#results .new-data { 
    padding-left:0px; 
} 
#results textarea { 
    padding:4px; // +1px border 
    font-size:100%; 
    font-family:serif; 
} 

muestra a http://jsfiddle.net/quqf8/1/

2

Quite el borde y el relleno del textarea y configúrelo con la misma fuente.

Aproximadamente, http://jsfiddle.net/vP7As/1/

+0

Ah, gracias por el jsfiddle ¡enlazar! Pero no creo que eso funcione. Parece terrible no tener frontera en el área de texto, ¿no crees? – dreeves

+0

cierto, siempre puedes establecer el borde en 1px luego agregar un margen a los otros elementos con 1px. –

5

vertical-align no funciona en los elementos en línea, pero funciona en tablas (more details on vertical-align).

Así que aquí hay una solución: Acabo de envolver los dos elementos principales en el primer li en una fila de la tabla, y establecer la alineación vertical en la parte inferior para forzar la etiqueta 'datos recientes' en la parte inferior. (Puede haber alguna manera de utilizar la propiedad display cambiar el li de un elemento en línea?)

También tendrá que ajustar el relleno en el ol y los label s table y etiquetas para que todo sale. En la vida real, probablemente uses algún tipo de restablecimiento de CSS para normalizar las reglas de estilo predeterminadas para todos estos elementos diferentes, por lo que es posible que tengas que realizar diferentes ajustes para que todo quede perfectamente alineado, pero esto es lo que se me ocurrió.

Altogether now

En total ahora:

<style> 
table,tbody,tfoot,thead,tr,th,td { 
    margin:0; 
    padding:0; 
    border:0; 
    outline:0; 
    font-size:100%; 
    vertical-align:baseline; 
    background:transparent} 
body{line-height:1} 
ol,ul{list-style:none} 
table {border-spacing: 0px;} 
table td{ 
    vertical-align: bottom; 
} 

* { 
    font-size: 14px; 
    font-family: Times New Roman, serif; 
} 
form label { 
    width: 140px; 
    float: left; 
} 
form ol li { 
    background: #98c8dc; 
    list-style: none; 
    padding: 5px; 
    margin-bottom: 2px; 
} 
form ol li:last-child { 
    margin-bottom: 0px; 
} 
form li label{ 
    padding: 4px 0 4px 0; 
} 
</style> 

<form> 
<ol> 
<li> 
<table><tr><td> 
    <label>Recent data</label> 
</td><td> 
    <ol> 
    <li>3 99</li> 
    <li>5 98</li> 
    <li>15 97</li> 
    <li>28 96</li> 
    </ol> 
</td> 
</tr></table> 
</li> 
<li> 
    <label>New data</label> 
    <textarea placeholder="30 95" rows="4"></textarea> 
</li> 
</ol> 
</form> 
0

Algunos jQuery

Puede establecer el relleno etiqueta de forma dinámica con jQuery utilizando la lista de número de elemento.

http://jsfiddle.net/uSehQ/2/

<script type="text/javascript"> 
$(document).ready(function() { 
    var size = $("#data").children().size(); 
    var top = 5+30*(size-1); 
    $("#label").css("padding", top+"px 0 0 0") 
}); 
</script> 
<style> 
form label { 
    width: 140px; 
    float: left; 
} 
form ol li { 
    background: #98c8dc; 
    list-style: none; 
    padding: 5px 10px; 
} 
</style> 
<form> 
<ol> 
<li> 
    <label id="label">Recent data</label> 
    <ol id="data"> 
    <li>3 99</li> 
    <li>5 98</li> 
    <li>15 97</li> 
    <li>20 25</li> 
    <li>30 95</li> 
    </ol> 
</li> 
<li> 
    <label>New data</label> 
    <textarea placeholder="40 76" rows="4"></textarea> 
</li> 
</ol> 
</form> 
2

aquí es una solución. no table, no jquery, basta con añadir una etiqueta en p primera lable

Demo in fiddle

Probado en Safari 15, Firefox 6, e IE8.

Creo que debe establecer un line-weigh para caculate. Por ejemplo, configuré 18px para que toda la altura en <ol><li>3 99...</ol> sea (18+5+5)*4=112px (dos 5px para su li: altura de relleno), luego agregue una etiqueta p fácil para un control position.

parte HTML: parte

<form> 
<ol> 
<li> 
    <label><p>Recent data</p></label> 
    <ol> 
    <li>3 99</li> 
    <li>5 98</li> 
    <li>15 97</li> 
    <li>28 96</li> 
    </ol> 
</li> 
<li> 
    <label>New data</label> 
    <textarea placeholder="30 95" rows="4"></textarea> 
</li> 
</ol> 
</form> 

CSS:

form{font:14px/18px arial;} 

form label { 
    width: 140px; 
    float: left; 
} 
form>ol>li>label { 
    height: 112px; 
    position:relative; 
} 
form>ol>li>label>p { 
    position:absolute; 
    bottom:5px; /* 5px for the last li(28.96) padding-bottom:5px */ 
    left:0; 
} 
form ol li { 
    background: #98c8dc; 
    list-style: none; 
    padding: 5px 10px; 
} 
2

Prueba esto : Utilizando algunos position: reltive; puede hacer que todo esté alineado.

<html> 
<head> 
<style type="text/css"> 
form { 
background: #98c8dc; 
padding: 5px 10px; 
} 
form label { 
width: 140px; 
float: left; 
position: relative; 
bottom: 20px; 
display: block; 
} 
form label span { 
display: block; 
} 
form ol li { 
display: table-row; 
list-style: none; 
} 
#area { 
position: relative; 
right: 5px; 
} 
</style> 
</head> 
<body> 
<form> 
<label>&nbsp;</label> 
<ol> 
<li>3 99</li> 
<li>5 98</li> 
<li>15 97</li> 
<li>28 96</li> 
</ol> 
<label><span>Recent data</span>New data</label> 
<textarea id="area" placeholder="30 95" rows="4"></textarea> 
</li> 
</ol> 
</form> 
</body> 
</html> 

Sin embargo, tiene un aspecto como si estuviera trabajando con datos tabulares, en cuyo caso el simple uso de una mesa, probablemente sería la mejor manera de hacerlo.

3

Si desea que las cosas se comporten como una tabla, muéstrela como una tabla. Use los CSS table, table-row y table-cell para la propiedad display de los elementos. Luego puede usar la alineación vertical y otras cosas de la tabla 'solo'. Tenga en cuenta que utilicé > para los selectores de CSS, por lo que las listas internas tampoco reciben esos estilos.

http://jsfiddle.net/nQWBw/2/

CSS:

.table-like { 
    display: table; 
    border: 1px solid red; 
    background: #98c8dc; 
    margin: 0; 
    padding: 0; 
} 
.table-like > LI { 
    display: table-row; 
    border: 1px solid lime; 
    list-style: none; 
    margin: 0; 
    padding: 0; 
} 
.table-like > LI > LABEL , 
.table-like > LI > OL , 
.table-like > LI > TEXTAREA { 
    display: table-cell; 
    border: 1px dashed magenta; 
    /* padding: 5px 10px; */ 
    vertical-align: top; 
} 
.table-like LI:first-child > *{ 
    vertical-align: bottom; 
} 
.table-like > LI > OL > LI { 
    display: block; 
    margin: 0; 
    padding: 0; 
} 

HTML:

<form> 
    <ol class="table-like"> 
     <li> 
      <label>Recent data</label> 
      <ol> 
       <li>3 99</li> 
       <li>5 98</li> 
       <li>15 97</li> 
       <li>28 96</li> 
      </ol> 
     </li> 
     <li> 
      <label>New data</label> 
      <textarea placeholder="30 95" rows="4"></textarea> 
     </li> 
    </ol> 
</form> 
1

Alineación vertical trabaja con elementos inline-block
http://jsfiddle.net/s3ayp/


<!-- HTML --> 
<form> 
    <ol> 
    <li class="lineup lineup-bottom"> 
     <label >Recent data</label> 
     <ol> 
     <li class="first">3 99</li> 
     <li>5 98</li> 
     <li>15 97</li> 
     <li class="last">28 96</li> 
     </ol> 
    </li> 
    <li class="lineup lineup-top"> 
     <label>New data</label> 
     <ol> 
     <li> 
      <textarea placeholder="30 95" rows="4"></textarea> 
     </li> 
     </ol> 
    </li> 
    </ol> 
</form> 

/* CSS */ 
.lineup > * { 
    display: -moz-inline-box; /* FF 2 */ 
    display: inline-block; 
} 
*:first-child + html .lineup > * { /* IE7 hack */ 
    display: inline; 
} 

.lineup.lineup-top > * { 
    vertical-align: top; 
} 

.lineup.lineup-bottom > * { 
    vertical-align: bottom; 
} 
form label { 
    width: 140px; 
    vertical-align: bottom; 
} 
ol { 
    background: #98c8dc; 
    list-style: none; 
} 
ol li { 
    padding: 5px 10px; 
} 
ol li.first { 
    padding-top: 0 
} 
ol li.last { 
    padding-bottom: 0 
} 
Cuestiones relacionadas