Wygląda na to, że w jQuery, gdy element nie jest widoczny, width () zwraca 0. Ma to sens, ale muszę uzyskać szerokość tabeli, aby ustawić szerokość elementu nadrzędnego, zanim pokażę go.
Jak zauważono poniżej, w rodzicu znajduje się tekst, który sprawia, że rodzic wypacza się i wygląda paskudnie. Chcę, aby rodzic był tak szeroki jak stół i zawijany tekst.
<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 zawsze zwraca 0, ponieważ nie jest widoczne (jest to moje przypuszczenie, ponieważ daje mi liczbę, gdy jest widoczna). Czy istnieje sposób, aby uzyskać szerokość stołu bez pokazywania rodzica?
źródło
clone.css("visibility","hidden");
doclone.css({"visibility":"hidden", "display":"table"});
którego rozwiązuje problem wskazał @Dean#some wrapper .hidden_element{/*Some CSS*/}
Robisz tak:body .hidden_element
. Nie#some_wrapper .hidden_element
jest już używany! W rezultacie obliczony rozmiar może różnić się od rozmiaru oryginalnego. TLTR: Po prostu tracisz stylOpierając się na odpowiedzi Robertsa, oto moja funkcja. Działa to dla mnie, jeśli element lub jego rodzic został wyblakły za pośrednictwem jQuery, może uzyskać wymiary wewnętrzne lub zewnętrzne, a także zwraca wartości przesunięcia.
/ edit1: przepisano funkcję. jest teraz mniejszy i można go wywołać bezpośrednio na obiekcie
/ edit2: funkcja wstawi teraz klon zaraz po oryginalnym elemencie zamiast body, umożliwiając klonowi zachowanie dziedziczonych wymiarów.
źródło
Dziękuję za zamieszczenie powyższej funkcji realWidth, naprawdę mi pomogła. W oparciu o powyższą funkcję "realWidth" napisałem reset CSS (powód opisany poniżej).
„realWidth” pobiera szerokość istniejącego znacznika. Przetestowałem to z niektórymi tagami graficznymi. Problem polegał na tym, że gdy obraz ma wymiar CSS na szerokość (lub maksymalną szerokość), nigdy nie uzyskasz rzeczywistego wymiaru tego obrazu. Być może img ma „max-width: 100%”, funkcja „realWidth” klonuje go i dołącza do treści. Jeśli oryginalny rozmiar obrazu jest większy niż ciało, otrzymasz rozmiar ciała, a nie rzeczywisty rozmiar tego obrazu.
źródło
Próbuję znaleźć działającą funkcję dla ukrytego elementu, ale zdaję sobie sprawę, że CSS jest o wiele bardziej złożony niż wszyscy myślą. Istnieje wiele nowych technik układu w CSS3, które mogą nie działać dla wszystkich poprzednich odpowiedzi, takich jak elastyczne pudełko, siatka, kolumna lub nawet element wewnątrz złożonego elementu nadrzędnego.
przykład Flexibox
Myślę, że jedynym zrównoważonym i prostym rozwiązaniem jest renderowanie w czasie rzeczywistym . W tym momencie przeglądarka powinna podać prawidłowy rozmiar elementu .
Niestety, JavaScript nie zapewnia żadnego bezpośredniego zdarzenia powiadamiającego o pokazaniu lub ukryciu elementu. Jednak tworzę funkcję opartą na DOM Attribute Modified API, która będzie wykonywała funkcję callback, gdy widoczność elementu ulegnie zmianie.
Aby uzyskać więcej informacji, odwiedź mój projekt GitHub.
https://github.com/Soul-Master/visible.event.js
demo: http://jsbin.com/ETiGIre/7
źródło
Jeśli potrzebujesz szerokości czegoś, co jest ukryte i nie możesz tego ukryć z jakiegokolwiek powodu, możesz to sklonować, zmienić CSS tak, aby był wyświetlany poza stroną, uczynić go niewidocznym, a następnie zmierzyć. Użytkownik nie będzie mądrzejszy, jeśli zostanie później ukryty i usunięty.
Niektóre z innych odpowiedzi powodują, że widoczność jest ukryta, co działa, ale zajmuje to puste miejsce na stronie na ułamek sekundy.
Przykład:
źródło
Zanim weźmiesz szerokość, pokaż ekran nadrzędny, następnie wybierz szerokość i na koniec ukryj wyświetlacz nadrzędny. Tak jak śledzenie
źródło
Jednym z rozwiązań, choć nie zadziała we wszystkich sytuacjach, jest ukrycie elementu poprzez ustawienie krycia na 0. Całkowicie przezroczysty element będzie miał szerokość.
Wadą jest to, że element nadal będzie zajmował miejsce, ale nie będzie to problemem we wszystkich przypadkach.
Na przykład:
źródło
Największym problemem, który jest pomijany w większości rozwiązań tutaj, jest to, że szerokość elementu jest często zmieniana przez CSS na podstawie zakresu w html.
Gdybym miał określić offsetWidth elementu, dołączając jego klon do body, gdy ma style, które mają zastosowanie tylko w jego bieżącym zakresie, uzyskałbym niewłaściwą szerokość.
na przykład:
// css
.module-container .my-elem {border: 60px solid black; }
teraz, gdy spróbuję określić szerokość mojego-elem w kontekście ciała, będzie ona zmniejszona o 120px. Możesz zamiast tego sklonować kontener modułu, ale Twój JS nie powinien znać tych szczegółów.
Nie testowałem tego, ale w zasadzie rozwiązanie Soul_Master wydaje się być jedynym, które może działać poprawnie. Ale niestety patrząc na implementację, prawdopodobnie będzie ona kosztowna w użyciu i niekorzystna dla wydajności (podobnie jak większość zaprezentowanych tutaj rozwiązań).
Jeśli to możliwe, użyj zamiast tego widoczności: ukryty. Spowoduje to nadal renderowanie elementu, umożliwiając obliczenie szerokości bez całego zamieszania.
źródło
Oprócz odpowiedzi wysłanej przez Tima Banksa , po której rozwiązałem mój problem, musiałem zmienić jedną prostą rzecz.
Ktoś inny może mieć ten sam problem; Pracuję z rozwijanym menu Bootstrap w menu rozwijanym. Ale tekst może być szerszy niż obecna treść w tym momencie (i nie ma wielu dobrych sposobów rozwiązania tego problemu za pomocą css).
Użyłem:
zamiast tego ustawia kontener na tabelę, która zawsze skaluje się na szerokość, jeśli zawartość jest szersza.
źródło
Po najechaniu kursorem możemy obliczyć wysokość elementu listy.
źródło
Jak już powiedziano, metoda clone and attach w innym miejscu nie gwarantuje takich samych rezultatów, jak stylizacja może być inna.
Poniżej przedstawiam moje podejście. Wędruje w górę rodziców, szukając rodzica odpowiedzialnego za ukrycie, a następnie tymczasowo ją odsłania, aby obliczyć wymaganą szerokość, wysokość itp.
źródło