Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] capa con mostrar más

Estas en el tema de capa con mostrar más en el foro de Javascript en Foros del Web. Buenos días Necesito que unas capas se muestren inicialmente con un alto determinado pero con un mostrar más en la parte inferior, que al pulsarlo, ...
  #1 (permalink)  
Antiguo 03/02/2013, 12:57
Avatar de intergus  
Fecha de Ingreso: mayo-2007
Mensajes: 126
Antigüedad: 17 años
Puntos: 3
capa con mostrar más

Buenos días

Necesito que unas capas se muestren inicialmente con un alto determinado pero con un mostrar más en la parte inferior, que al pulsarlo, amplie la capa hasta lo necesario para mostrar todo el contenido.

No quiero ajax para recargar la info. La info debe estar toda al cargar la página por primera vez, aunque no la muestre al completo.

Algo similar se usa en youtube justo debajo del video, en los comentarios que pone el autor del video, los semi oculta y al pulsar en mostrar más, se expande hacia abajo para permitir leer todo el texto.

¿alguna idea?
Gracias
  #2 (permalink)  
Antiguo 03/02/2013, 17:06
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: capa con mostrar más

dale a la capa inicial un alto específico y overflow hidden, y con javascript lo cambias por auto y auto

SAludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #3 (permalink)  
Antiguo 04/02/2013, 13:37
Avatar de intergus  
Fecha de Ingreso: mayo-2007
Mensajes: 126
Antigüedad: 17 años
Puntos: 3
Respuesta: capa con mostrar más

Bueno, te agradecería algo más de ayuda. No se como cambiarle el overflow dentro de la función o restaurar el height al valor inicial.
  #4 (permalink)  
Antiguo 04/02/2013, 14:03
Avatar de intergus  
Fecha de Ingreso: mayo-2007
Mensajes: 126
Antigüedad: 17 años
Puntos: 3
Respuesta: capa con mostrar más

Conste que lo he intentado pero....

1) El primer clic no ejecuta nada, en los restantes va perfecto
2) Debo cerrar todas las capas que se encuentren abiertas, pero solo las de un contenedor determinado (no todas las de la página.
3) Me gustaría simplificarlo si es posible.

Este es el código que he puesto:

<style>
#contenido{
border:solid 1px silver;
overflow: hidden;
height: 50px;
width:200px;
padding:10px;
font:normal 10px/15px verdana;
text-align:justify;

}
</style>
<script>
function actua(esto){
a = document.getElementById(esto);
if(a.style.overflow == 'hidden'){
mostrar(esto);
}else{
ocultar(esto)
}
}

function mostrar(esto){
a = document.getElementById(esto);
a.style.height = "auto";
a.style.overflow = "auto";
}

function ocultar(esto){
a = document.getElementById(esto);
a.style.height = "50px";
a.style.overflow = "hidden";
}
</script>

Lo ejecuto con esto, claro..
<a href="#" onclick="actua('contenido');return false">Más Info</a>
  #5 (permalink)  
Antiguo 04/02/2013, 14:20
Avatar de intergus  
Fecha de Ingreso: mayo-2007
Mensajes: 126
Antigüedad: 17 años
Puntos: 3
Respuesta: capa con mostrar más

Bueno, lo he mejorado aún más, pero sigue fallando el primer clic.

No entiendo porque si la capa inicialmente defino con overflow a hidden, al evaluar la primera vez, el if interpreta que no está en hidden.
algo se me escapa....
  #6 (permalink)  
Antiguo 04/02/2013, 15:39
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: capa con mostrar más

Bien por el intento, pero lo estás complicando un poco. Primero te aclaro que estas técnicas de alternar las propiedades css de un elemento en forma alternada con el click del mouse son muy variadas, y los ajustes pueden cambiar en detalles.

Para tu caso en particular, este ejemplo creo que sirve

Código HTML:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <title>Ver ocultar detalles</title>
  5. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  6. <style type="text/css">
  7. /*<![CDATA[*/
  8. body{
  9. font-family: arial, sans-serif;
  10. font-size: 11pt;
  11. }
  12.  
  13. .faqs {  
  14. text-overflow: ellipsis;
  15. overflow: hidden;
  16. width: 500px;
  17. white-space: nowrap;
  18. padding: 3px;
  19. background: #DFD2C8;
  20. }
  21.  
  22. .ver{
  23. cursor: pointer;
  24. font-size: 11px;
  25. font-weight: bold;
  26. margin-bottom: 10px;
  27. padding: 3px;
  28. }
  29. /*]]>*/
  30. <script type="text/javascript">
  31. //<![CDATA[
  32. function mostrarOcultar(elDiv,e){
  33. var miCapa=document.getElementById(elDiv).style.overflow;
  34. if(miCapa=="auto"){
  35. document.getElementById(elDiv).style.overflow="hidden";
  36. document.getElementById(elDiv).style.whiteSpace = 'nowrap';
  37. e.innerHTML = 'ver detalles';
  38. }else{
  39. document.getElementById(elDiv).style.overflow="auto";
  40. document.getElementById(elDiv).style.whiteSpace = 'normal';
  41. e.innerHTML = 'ocultar detalles';
  42. }
  43. }
  44. //]]>
  45. </head>
  46. <div id="comentario_01" class="faqs">
  47. Lorem ipsum dolor sit  amet, consectetur adipiscing elit.  Aenean euismod vestibulum elit  non condimentum. Pellentesque
  48. vitae adipiscing sem. Phasellus velit enim, consequat id pharetra id, adipiscing in turpis
  49. </div>
  50. <div onclick="mostrarOcultar('comentario_01',this)" class="ver">ver detalles</div>
  51.  
  52.  
  53. <div id="comentario_02" class="faqs">
  54. Vestibulum lacus diam, pellentesque in faucibus eget, dapibus sed sem. Integer id justo id tortor varius tempus. Aliquam
  55. dui tellus, consequat sed molestie in, facilisis eget nisi.
  56. </div>
  57. <div onclick="mostrarOcultar('comentario_02',this)" class="ver">ver detalles</div>
  58.  
  59. </body>
  60. </html>

Si vas a generar los textos en forma dinámica (desde una bd, por ejemplo) asegurate de crear id distintos para cada una y modificar el primer parámetro en la llamada de la función en el texto "ver detalles" para que coincida con el que corresponda

Demo
http://foros.emprear.com/javascript/...detalles.phtml

SAludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #7 (permalink)  
Antiguo 04/02/2013, 16:44
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: capa con mostrar más

Agrego una variante que no requiere id en las capas que contienen el texto

Código HTML:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <title>Ver ocultar detalles usando previousSibling</title>
  5. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  6. <style type="text/css">
  7. /*<![CDATA[*/
  8. body{
  9. font-family: arial, sans-serif;
  10. font-size: 11pt;
  11. }
  12. /* propiedades por defecto para las capas que contienen el texto */
  13. .faqs {  
  14. text-overflow: ellipsis;
  15. overflow: hidden;
  16. width: 500px;
  17. white-space: nowrap;
  18. padding: 3px;
  19. background: #DFD2C8;
  20. }
  21.  
  22. .ver{
  23. cursor: pointer;
  24. font-size: 11px;
  25. font-weight: bold;
  26. margin-bottom: 10px;
  27. padding: 3px;
  28. }
  29. /*]]>*/
  30. <script type="text/javascript">
  31. //<![CDATA[
  32. function mostrarOcultar(e){
  33.  
  34. // identificamos el elemento previo al "mostrar detalles" que se clickea, que por supuesto será un div
  35. if(document.all && document.querySelector && !document.addEventListener){
  36. var p = e.previousSibling; // ie8
  37. }else{
  38. var p = e.previousSibling.previousSibling; // ie9, otros
  39. }
  40.  
  41. // tomamos una propiedad css del elemento obtenido previamente para evaluarla
  42. // en este caso el 'overflow', que por defecto nuestra class 'faqs' establece como hidden
  43. var miCapa=p.style.overflow;
  44.  
  45. // ahora, según sea el valor de overflow, invertimos el resto de las propiedades css y el texto a mostrar en el elemento (e) al que se hizo click
  46. if(miCapa=="auto"){
  47. p.style.overflow="hidden";
  48. p.style.whiteSpace = 'nowrap';
  49. e.innerHTML = 'ver detalles';
  50. }else{
  51. p.style.overflow="auto";
  52. p.style.whiteSpace = 'normal';
  53. e.innerHTML = 'ocultar detalles';
  54. }
  55. }
  56. //]]>
  57. </head>
  58. <div class="faqs">
  59. Lorem ipsum dolor sit  amet, consectetur adipiscing elit.  Aenean euismod vestibulum elit  non condimentum. Pellentesque
  60. vitae adipiscing sem. Phasellus velit enim, consequat id pharetra id, adipiscing in turpis
  61. </div>
  62. <div onclick="mostrarOcultar(this)" class="ver">ver detalles</div>
  63. <div class="faqs">
  64. Vestibulum lacus diam, pellentesque in faucibus eget, dapibus sed sem. Integer id justo id tortor varius tempus. Aliquam
  65. dui tellus, consequat sed molestie in, facilisis eget nisi.
  66. </div>
  67. <div onclick="mostrarOcultar(this)" class="ver">ver detalles</div>
  68. </body>
  69. </html>

Demo
http://foros.emprear.com/javascript/...ssibling.phtml

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #8 (permalink)  
Antiguo 05/02/2013, 11:21
Avatar de intergus  
Fecha de Ingreso: mayo-2007
Mensajes: 126
Antigüedad: 17 años
Puntos: 3
Respuesta: capa con mostrar más

Me gusta la opción del DOM, nunca había usado esa propiedad de previousSibling ni nextSibling.

Aunque no cumple uno de los requisitos, que era el de cerrar todos las otras capas abiertas, es decir que solo una estuviese desplegada en cada momento, pero en realidad tampoco es algo que sea imperioso, quiza quedaría más limpio el resultado.

La verdad es que esta solución del previousSibling, me gusta más, pero puestos a que puedas usar las 2. ¿Cual puede ser más estable con los distintos navegadores?¿tu recomendación?

Por cierto, esto es lo que se llama una respuesta currada.... Applausse...
  #9 (permalink)  
Antiguo 06/02/2013, 10:42
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: capa con mostrar más

Como te dije hay nuchas variantes, me olvidé del detalle de ocultar las restantes, se puede hacer asi (uso otra técnica comparando los indices de los elementos)

Código HTML:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <title>mostrar oculta capas</title>
  5. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  6. <style type="text/css">
  7. /*<![CDATA[*/
  8. p{
  9. font-weight: bold;
  10. cursor: pointer;
  11. }
  12. #contenedor{
  13. width: 300px;
  14. }
  15. .faqs{
  16. /* display: none; */
  17. text-overflow: ellipsis;
  18. overflow: hidden;
  19. white-space: nowrap;
  20. padding: 3px;
  21. background: #DFD2C8;
  22. margin:5px 1px 5px 1px;
  23. border-top: dotted 1px darkred;
  24. cursor: pointer;
  25. }
  26. .faqs span{
  27. display: block;
  28. cursor: pointer;
  29. font-size: 11px;
  30. margin-top: 10px;
  31. }
  32. #contenedor p{
  33. margin-bottom: 0;
  34. background: #DFD2C8;
  35. }
  36. /*]]>*/
  37. <script type="text/javascript">
  38. //<![CDATA[
  39. function contenido(cual){
  40. var i;
  41. var principal = document.getElementById ("contenedor");
  42. var capas = [];
  43. var divTags = principal.getElementsByTagName ("div");
  44. for (var i = 0; i < divTags.length; i++) {
  45. capas.push(i);
  46. }
  47.    for(i in capas){
  48.        if(capas[i] == cual){
  49.        divTags[i].style.overflow = 'auto';
  50.        divTags[i].style.whiteSpace = 'normal';
  51.          divTags[i].title = '';  
  52.        }else{
  53.       divTags[i].style.overflow = 'hidden';
  54.        divTags[i].style.whiteSpace = 'nowrap';
  55.        divTags[i].title = 'Ver más detalles';        
  56.        }
  57.    }
  58. }
  59. //]]>
  60. </head>
  61. <div id="contenedor">
  62.  
  63. <div class="faqs" onclick="contenido(0)" title="Ver más detalles">Texto uno Lorem ipsum dolor sit  amet, consectetur adipiscing elit.  Aenean euismod vestibulum elit  non condimentum. Pellentesque vitae adipiscing sem</div>
  64.  
  65. <div class="faqs" onclick="contenido(1)" title="Ver más detalles">Texto dos Lorem ipsum dolor sit  amet, consectetur adipiscing elit.  Aenean euismod vestibulum elit  non condimentum. Pellentesque vitae adipiscing sem</div>
  66.  
  67. <div class="faqs" onclick="contenido(2)" title="Ver más detalles">Texto tres Lorem ipsum dolor sit  amet, consectetur adipiscing elit.  Aenean euismod vestibulum elit  non condimentum. Pellentesque vitae adipiscing sem</div>
  68. </div>
  69. </body>
  70. </html>
A esta le podría faltar, si se quiere, alguna forma de ocultar la que queda abierta, pero a eso no le dediqué tiempo todavía

Aqui hay 2 más por si estás aburrido
http://foros.emprear.com/javascript/...ctexto_nt.html
http://foros.emprear.com/javascript/...as-ctexto.html

Por compatibilidad no hay problema, las que te dejé antes, corren en todos los navegadores (ie a partir del 8), incluso en OperaMini y el Nokia Browser tembién (ajustes de los tamaños mediante)

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #10 (permalink)  
Antiguo 07/02/2013, 12:09
Avatar de intergus  
Fecha de Ingreso: mayo-2007
Mensajes: 126
Antigüedad: 17 años
Puntos: 3
Respuesta: capa con mostrar más

Bueno, si señor. Sobrádamente aclarado y util. Una pena que se hunda este tema en los fondos de los foros del web.

Muchas gracias, sobre todo por la dedicación.

Etiquetas: ajax
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:24.