Parece que en jQuery cuando un elemento no es visible width () devuelve 0. Tiene sentido, pero necesito obtener el ancho de una tabla para establecer el ancho del padre antes de mostrar el padre.
Como se indica a continuación, hay texto en el padre que hace que el padre se desvíe y se vea desagradable. Quiero que el padre sea tan ancho como la mesa y que el texto se ajuste.
<div id="parent">
Text here ... Can get very long and skew the parent
<table> ... </table>
Text here too ... which is why I want to shrink the parent based on the table
</div>
CSS:
#parent
{
display: none;
}
Javascript:
var tableWidth = $('#parent').children('table').outerWidth();
if (tableWidth > $('#parent').width())
{
$('#parent').width(tableWidth);
}
tableWidth siempre devuelve 0 ya que no es visible (supongo que ya que me da un número cuando está visible). ¿Hay alguna forma de obtener el ancho de la tabla sin que el padre sea visible?
fuente
clone.css("visibility","hidden");
aclone.css({"visibility":"hidden", "display":"table"});
la que se resuelve el problema señalado por @Dean#some wrapper .hidden_element{/*Some CSS*/}
Usted está haciendo esto:body .hidden_element
. ¡Ya#some_wrapper .hidden_element
no se usa! Como resultado, su tamaño calculado puede diferir de su tamaño original. TLTR: Estás perdiendo estilosSegún la respuesta de Robert, aquí está mi función. Esto funciona para mí si el elemento o su padre se han desvanecido a través de jQuery, pueden obtener dimensiones internas o externas y también devuelven los valores de compensación.
/ edit1: reescribió la función. ahora es más pequeño y se puede llamar directamente en el objeto
/ edit2: la función ahora insertará el clon justo después del elemento original en lugar del cuerpo, haciendo posible que el clon mantenga las dimensiones heredadas.
fuente
Gracias por publicar la función realWidth anterior, realmente me ayudó. Sobre la base de la función "realWidth" anterior, escribí, un restablecimiento de CSS, (la razón se describe a continuación).
"realWidth" obtiene el ancho de una etiqueta existente. Probé esto con algunas etiquetas de imagen. El problema era que, cuando la imagen tenía una dimensión CSS por ancho (o ancho máximo), nunca obtendría la dimensión real de esa imagen. Quizás, el img tiene "max-width: 100%", la función "realWidth" lo clona y lo agrega al cuerpo. Si el tamaño original de la imagen es mayor que el cuerpo, obtienes el tamaño del cuerpo y no el tamaño real de esa imagen.
fuente
Intento encontrar una función que funcione para el elemento oculto, pero me doy cuenta de que CSS es mucho más complejo de lo que todos piensan. Hay muchas nuevas técnicas de diseño en CSS3 que podrían no funcionar para todas las respuestas anteriores, como caja flexible, cuadrícula, columna o incluso elemento dentro del elemento principal complejo.
ejemplo de caja flexible
Creo que la única solución sostenible y sencilla es el renderizado en tiempo real . En ese momento, el navegador debería proporcionarle ese tamaño de elemento correcto .
Lamentablemente, JavaScript no proporciona ningún evento directo para notificar cuando se muestra u oculta un elemento. Sin embargo, creo una función basada en la API modificada de atributo DOM que ejecutará la función de devolución de llamada cuando se cambie la visibilidad del elemento.
Para obtener más información, visite mi proyecto GitHub.
https://github.com/Soul-Master/visible.event.js
demostración: http://jsbin.com/ETiGIre/7
fuente
Si necesita el ancho de algo que está oculto y no puede mostrarlo por alguna razón, puede clonarlo, cambiar el CSS para que se muestre fuera de la página, hacerlo invisible y luego medirlo. El usuario no se dará cuenta si se oculta y elimina posteriormente.
Algunas de las otras respuestas aquí solo ocultan la visibilidad, lo que funciona, pero ocupará un espacio en blanco en su página durante una fracción de segundo.
Ejemplo:
fuente
Antes de tomar el ancho, haga que se muestre la pantalla principal, luego tome el ancho y finalmente oculte la pantalla principal. Como seguir
fuente
Una solución, aunque no funcionará en todas las situaciones, es ocultar el elemento estableciendo la opacidad en 0. Un elemento completamente transparente tendrá ancho.
El inconveniente es que el elemento seguirá ocupando espacio, pero eso no será un problema en todos los casos.
Por ejemplo:
fuente
El mayor problema que la mayoría de las soluciones pasan por alto aquí es que el ancho de un elemento a menudo es cambiado por CSS en función de su alcance en html.
Si tuviera que determinar offsetWidth de un elemento agregando un clon del mismo al cuerpo cuando tiene estilos que solo se aplican en su alcance actual, obtendría el ancho incorrecto.
por ejemplo:
// css
.module-container .my-elem {borde: 60px negro sólido; }
ahora, cuando trato de determinar el ancho de my-elem en el contexto del cuerpo, saldrá en 120px. En su lugar, podría clonar el contenedor del módulo, pero su JS no debería tener que conocer estos detalles.
No lo he probado, pero esencialmente la solución de Soul_Master parece ser la única que podría funcionar correctamente. Pero, desafortunadamente, al observar la implementación, es probable que sea costoso de usar y malo para el rendimiento (como también lo son la mayoría de las soluciones presentadas aquí).
Si es posible, utilice la visibilidad: oculta en su lugar. Esto seguirá representando el elemento, lo que le permitirá calcular el ancho sin tanto alboroto.
fuente
Además de la respuesta publicada por Tim Banks , que siguió a la solución de mi problema, tuve que editar una cosa simple.
Alguien más podría tener el mismo problema; Estoy trabajando con un menú desplegable Bootstrap en un menú desplegable. Pero el texto puede ser más amplio que el contenido actual en este punto (y no hay muchas buenas formas de resolverlo a través de CSS).
Solía:
en su lugar, establece el contenedor en una tabla que siempre se escala en ancho si el contenido es más ancho.
fuente
Al pasar el mouse, podemos calcular la altura del elemento de la lista.
fuente
Como se ha dicho antes, el método de clonar y adjuntar en otro lugar no garantiza los mismos resultados, ya que el estilo puede ser diferente.
A continuación se muestra mi enfoque. Viaja por los padres buscando al padre responsable del escondite, luego lo muestra temporalmente para calcular el ancho, alto, etc.
fuente