Za pomocą javascript łatwo jest ustawić wbudowane wartości CSS. Jeśli chcę zmienić szerokość i mam html tak:
<div style="width: 10px"></div>
Wystarczy, że:
document.getElementById('id').style.width = value;
Zmieni to wbudowane wartości arkusza stylów. Zwykle nie stanowi to problemu, ponieważ styl wbudowany zastępuje arkusz stylów. Przykład:
<style>
#tId {
width: 50%;
}
</style>
<div id="tId"></div>
Używając tego JavaScript:
document.getElementById('tId').style.width = "30%";
Otrzymuję następujące informacje:
<style>
#tId {
width: 50%;
}
</style>
<div id="tId" style="width: 30%";></div>
To jest problem, bo nie tylko nie chcę zmieniać wartości inline, jeśli szukam szerokości przed jej ustawieniem, kiedy mam:
<div id="tId"></div>
Zwracana wartość to Null, więc jeśli mam JavaScript, który musi znać szerokość czegoś, aby wykonać jakąś logikę (zwiększam szerokość o 1%, a nie do określonej wartości), zwracając Null, gdy oczekuję ciągu "50% „tak naprawdę nie działa.
Więc moje pytanie: mam wartości w stylu CSS, które nie są umieszczone w tekście, jak mogę uzyskać te wartości? Jak mogę zmienić styl zamiast wartości wbudowanych, mając identyfikator?
Odpowiedzi:
Ok, wygląda na to, że chcesz zmienić globalny CSS, który skutecznie zmieni jednocześnie wszystkie elementy stylu petikularnego. Niedawno nauczyłem się, jak to zrobić sam z samouczka Shawna Olsona . Możesz bezpośrednio odwołać się do jego kodu tutaj .
Oto podsumowanie:
Możesz pobrać arkusze stylów przez
document.styleSheets
. To faktycznie zwróci tablicę wszystkich arkuszy stylów na twojej stronie, ale możesz stwierdzić, na którym jesteś za pośrednictwemdocument.styleSheets[styleIndex].href
właściwości. Po znalezieniu arkusza stylów, który chcesz edytować, musisz uzyskać zestaw reguł. Nazywa się to „regułami” w IE i „cssRules” w większości innych przeglądarek. Sposobem na stwierdzenie, na jakim CSSRule jesteś, jestselectorText
własność. Działający kod wygląda mniej więcej tak:Daj mi znać, jak to działa w Twoim przypadku i proszę o komentarz, jeśli zauważysz jakieś błędy.
źródło
rule.value
w FF 20. Jestrule.style
jednak to , co można ustawić i zachowuje się jakelement.style
. Por. https://developer.mozilla.org/en-US/docs/DOM/CSSStyleRule .rule.type == rule.STYLE_RULE
Przed uzyskaniem dostępu dobrym pomysłem może być również sprawdzenierule.selectorText
.document.styleSheets[styleIndex].cssRules.[ruleIndex].style = {'color':'red', 'background-color':'green'};
pracował dla mnie, dzięki!Proszę! Po prostu zapytaj w3 ( http://www.quirksmode.org/dom/w3c_css.html )! A właściwie zajęło mi to pięć godzin ... ale oto jest!
Funkcja jest naprawdę łatwa w użyciu ... przykład:
O..
EDYCJA: jak @ user21820 opisał w swojej odpowiedzi, zmiana wszystkich arkuszy stylów na stronie może być trochę niepotrzebna. Poniższy skrypt współpracuje z IE5.5 oraz najnowszą przeglądarką Google Chrome i dodaje tylko opisaną powyżej funkcję css ().
źródło
Zbierając kod w odpowiedziach, napisałem tę funkcję, która wydaje się działać dobrze na moim FF 25.
Jest to sposób na umieszczenie wartości w css, które będą używane w JS, nawet jeśli nie są zrozumiałe dla przeglądarki. np. maxHeight dla tbody w przewijanej tabeli.
Połączenie :
CCSStylesheetRuleStyle('default', "#mydiv", "height");
CCSStylesheetRuleStyle('default', "#mydiv", "color", "#EEE");
źródło
document.styleSheets[m].href
będzie miał wartość NULL i zakończy się niepowodzeniem.Nie wiem, dlaczego inne rozwiązania przechodzą przez całą listę arkuszy stylów dla tego dokumentu. Spowoduje to utworzenie nowego wpisu w każdym arkuszu stylów, co jest nieefektywne. Zamiast tego możemy po prostu dołączyć nowy arkusz stylów i po prostu dodać tam nasze żądane reguły CSS.
Zauważ, że możemy nadpisać nawet style wbudowane ustawione bezpośrednio w elementach, dodając „! Important” do wartości właściwości, chyba że istnieją już bardziej szczegółowe deklaracje stylu „! Important” dla tej właściwości.
źródło
Nie mam wystarczającego przedstawiciela do komentowania, więc sformatuję odpowiedź, ale jest to tylko demonstracja problemu.
Wygląda na to, że kiedy style elementów są zdefiniowane w arkuszach stylów, nie są one widoczne dla metody getElementById ("someElement"). Style
Ten kod ilustruje problem ... Kod z dołu na jsFiddle .
W teście 2, przy pierwszym wywołaniu, pozostała wartość pozycji jest niezdefiniowana, więc to, co powinno być prostym przełącznikiem, zostaje pomieszane. Na mój użytek zdefiniuję moje ważne wartości stylu w tekście, ale wydaje się, że częściowo pokonuje to cel arkusza stylów.
Oto kod strony ...
Mam nadzieję, że pomoże to wyjaśnić tę kwestię.
Pominąć
źródło
Możesz uzyskać „obliczone” style dowolnego elementu.
IE używa czegoś, co nazywa się „currentStyle”, Firefox (i zakładam, że inne przeglądarki „zgodne ze standardami”) używa „defaultView.getComputedStyle”.
Aby to zrobić, musisz napisać funkcję obsługującą przeglądarkę lub użyć dobrego frameworka Javascript, takiego jak prototype lub jQuery (wyszukaj „getStyle” w prototypowym pliku javascript i „curCss” w pliku javascript jquery).
To powiedziawszy, jeśli potrzebujesz wysokości lub szerokości, prawdopodobnie powinieneś użyć element.offsetHeight i element.offsetWidth.
Pamiętaj, że jeśli dodasz styl wbudowany do danego elementu, może on działać jako wartość „domyślna” i będzie czytelny dla JavaScript podczas ładowania strony, ponieważ jest to właściwość stylu wbudowanego elementu:
źródło
Ta prosta, 32-liniowa treść pozwala zidentyfikować dany arkusz stylów i bardzo łatwo zmienić jego style:
źródło
Nigdy nie widziałem żadnego praktycznego zastosowania tego, ale prawdopodobnie powinieneś rozważyć arkusze stylów DOM . Jednak szczerze uważam, że to przesada.
Jeśli chcesz po prostu uzyskać szerokość i wysokość elementu, niezależnie od tego, skąd wymiary są stosowane, po prostu użyj
element.offsetWidth
ielement.offsetHeight
.źródło
Może spróbuj tego:
źródło