Mam tabelę, w której pokazuję / ukryję pełną kolumnę według jQuery za pośrednictwem klasy CSS, która nie istnieje:
<table>
<thead>
<tr>
<th></th>
<th class="target"></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td class="target"></td>
<td></td>
</tr>
<tr>
<td></td>
<td class="target"></td>
<td></td>
</tr>
</tbody>
</table>
Za pomocą tego DOMa mogę to zrobić w jednym wierszu za pomocą jQuery: $('.target').css('display','none');
Działa to doskonale, ale czy można używać klas CSS, które nie są zdefiniowane? Czy powinienem utworzyć dla niego pustą klasę?
<style>.target{}</style>
Czy są jakieś skutki uboczne lub czy istnieje lepszy sposób, aby to zrobić?
html
css
w3c-validation
web-standards
totymedli
źródło
źródło
.css
, stylów ustawionych w .css bardzo trudno jest zastąpić bez powodowania innych problemów, więc staram się ich unikać..toggle()
, jest nieco krótsza w kodzie.target
jest do celów javascript, wiele osób używa prefiksujs-
dla takich klas, tjjs-target
. BTW: Target to rodzaj złej nazwy;) Więcej informacji można znaleźć na stronie: philipwalton.com/articles/decoupling-html-css-and-javascriptOdpowiedzi:
„Klasa CSS” jest mylącą nazwą;
class
to atrybut (lub właściwość pod względem skryptów) przypisywany do elementów HTML. Innymi słowy, można zadeklarować klas w HTML, CSS nie, więc w przypadku klasy „target” robi w rzeczywistości istnieje na tych konkretnych elementów i znaczniki są całkowicie poprawny, jak to jest.Nie musi to koniecznie oznaczać, że musisz mieć zadeklarowaną klasę w kodzie HTML, zanim będziesz mógł użyć jej w CSS. Zobacz komentarz ruakh. To, czy selektor jest prawidłowy, zależy całkowicie od jego składni , a CSS ma swój własny zestaw reguł obsługi błędów parsowania , z których żaden nie dotyczy w ogóle znaczników. Zasadniczo oznacza to, że HTML i CSS są całkowicie niezależne od siebie pod względem ważności. 1
Kiedy to zrozumiesz, staje się jasne, że nie ma efektu ubocznego braku zdefiniowania
.target
reguły w arkuszu stylów. 2 Kiedy przypisujesz klasy do swoich elementów, możesz odwoływać się do tych elementów przez te klasy albo w arkuszu stylów, albo w skrypcie, albo w obu. Żadna z nich nie jest zależna od drugiej. Zamiast tego oba odnoszą się do znaczników (a ściślej do jego reprezentacji DOM). Zasada ta obowiązuje nawet wtedy, gdy używasz JavaScript do stosowania stylów, tak jak robisz to w swojej jednowierszowej wersji jQuery.Kiedy piszesz regułę CSS za pomocą selektora klasy, mówisz tylko: „Chcę zastosować style do elementów należących do tej klasy”. Podobnie, kiedy piszesz skrypt do pobierania elementów o określonej nazwie klasy, mówisz: „Chcę robić rzeczy z elementami należącymi do tej klasy”. Czy tam są elementy, które należą do danej klasy jest zupełnie odrębna kwestia.
1 Z tego powodu selektor identyfikatora CSS dopasowuje wszystkie elementy o podanym identyfikatorze, niezależnie od tego, czy identyfikator pojawia się dokładnie raz, czy wielokrotnie (w wyniku czego dokument HTML jest niezgodny).
2 Jedyną sytuacją, w której zdaję sobie sprawę z tego, gdzie taka pusta reguła CSS jest konieczna, jest sytuacja, gdy niektóre przeglądarki odmawiają prawidłowego zastosowania niektórych innych reguł w wyniku błędu; utworzenie pustej reguły spowoduje zastosowanie innych reguł z jakiegoś powodu. Zobacz tę odpowiedź, aby zobaczyć przykład takiego błędu. Jest to jednak po stronie CSS i dlatego nie powinno mieć nic wspólnego ze znacznikami.
źródło
a.extlink
lub nie, nawet jeśli niektóre strony nie zawierają żadnych zewnętrznych linków).Nie ma żadnych złych efektów, aby używać klas, które nie mają stylów. Rzeczywiście, jest to część użyteczności CSS polegającej na tym, że jest on odłączony od znaczników i może stylizować elementy / klasy / itp. w razie potrzeby.
Nie myśl o nich jako o „klasach CSS”. Pomyśl o nich jak o „klasach”, których CSS używa także w razie potrzeby.
źródło
Zgodnie ze specyfikacją HTML5 :
Ponadto w wersji 4 :
Twój przypadek użycia mieści się w drugim scenariuszu, co czyni go uzasadnionym przykładem użycia atrybutu klasy.
źródło
Możesz użyć klasy, która nie ma stylów, jest to całkowicie poprawny HTML.
Klasa, do której odwołuje się plik CSS, nie jest definicją klasy, służy jako reguła selektora do celów stylizacji.
źródło
Kiedy używasz nazwy klasy w JavaScript, nie patrzy na CSS, aby znaleźć tę klasę. Wygląda bezpośrednio w kodzie HTML.
Wymagane jest jedynie, aby nazwa klasy była w kodzie HTML. Nie musi być w CSS.
W rzeczywistości wiele osób uważa, że dobrym pomysłem jest używanie oddzielnych klas w CSS i JavaScript , ponieważ pozwala to projektantom i programistom pracować niezależnie, nie wchodząc sobie nawzajem w siebie nawzajem.
(uwaga, powyższy akapit jest oczywiście bardziej odpowiedni dla większych projektów, więc nie myśl, że musisz przejść do tego ekstremum, jeśli pracujesz na własną rękę; wspomniałem o tym, aby podkreślić, że oba mogą być całkowicie oddzielne )
źródło
Możesz używać klas CSS bez korzystania z nich, ale sugeruję, że jeśli dodajesz klasy CSS tylko dla kodu JavaScript / jQuery, przedrostek z nim,
js-YourClassName
aby programiści front-end nigdy nie używali tych klas do stylowania elementów. Powinni zrozumieć, że klasy te można usunąć w dowolnym momencie.źródło
W momencie dodania klasy do kodu HTML klasa zostanie zdefiniowana, więc Twoje rozwiązanie będzie w porządku
źródło
Definiowanie klas CSS w arkuszu stylów nie jest konieczne . Powinno działać dobrze. Jednak dodanie go nie zaszkodzi.
źródło
Jedną z rzeczy, o których nikt tu nie wspomniał w pełni, jest to, że JavaScript (w tym przypadku wspierany przez jQuery) nie jest w stanie bezpośrednio modyfikować kaskadowego arkusza stylów dokumentu.
css()
Metoda jQuery zmienia jedynie dopasowany zestaw właściwości elementówstyle
. CSS i JavaScript są całkowicie niezwiązane w tym aspekcie.$('.target').css('display','none');
w ogóle nie zmienia.target { }
deklaracji CSS. Zamiast tego dzieje się tutaj, że dowolny element zclass
„celem” wygląda teraz mniej więcej tak:Czy są jakieś skutki uboczne spowodowane brakiem wstępnego zdefiniowania reguły stylu CSS? Absolutnie nic.
Czy jest na to lepszy sposób? Pod względem wydajności, tak, jest!
Jak można poprawić wydajność?
Zamiast bezpośrednio modyfikować
style
każdy element, zamiast tego możesz wstępnie zdefiniować nową klasę i dodać ją do dopasowanych elementów za pomocąaddClass()
(innej metody jQuery).Na podstawie tej wcześniej istniejącej JSPerf który porównuje
css()
zeaddClass()
widzimy, żeaddClass()
jest o wiele szybciej:Jak sami możemy to zrealizować?
Po pierwsze możemy dodać w naszej nowej deklaracji CSS:
Twój HTML pozostanie taki sam, ta wstępnie zdefiniowana klasa jest po prostu gotowa do późniejszego wykorzystania.
Możemy teraz zmodyfikować JavaScript, aby
addClass()
zamiast tego używał :Podczas uruchamiania tego kodu, zamiast bezpośrednio modyfikować
style
właściwość każdego dopasowanego elementu „docelowego”, nowa klasa zostanie teraz dodana:Dzięki nowej „ukrytej” klasie element ten odziedziczy styl deklarowany w twoim CSS, a twój element nie będzie już wyświetlany.
źródło
.css()
zamiast przełączać klasy IMO.Jak wspomina wiele innych osób, tak, używanie klas bez przypisanego CSS jest całkowicie poprawne i zamiast myśleć o nich jako o „klasach CSS”, powinieneś po prostu rozpoznać semantykę klasy i identyfikatora odpowiednio jako grupy i poszczególne elementy.
Chciałem się przyłączyć, ponieważ czułem, że podany przykład nie podniósł ważnej kwestii. Jeśli kiedykolwiek będziesz potrzebować wizualnych manipulacji na elementach o zmiennej długości (w tym przypadku używasz wierszy tabeli), zawsze warto rozpoznać, że koszt zrobienia tego za pomocą Javascript może być bardzo drogi (np. Jeśli masz tysiące wierszy).
W tej sytuacji powiedzmy, że wiemy, że kolumna 2 zawsze ma potencjał do ukrycia (jest to świadoma funkcja twojej tabeli), wtedy warto zaprojektować styl CSS do obsługi tego przypadku użycia.
Następnie zamiast używać JS do przechodzenia między elementami DOM znajdującymi N, musimy po prostu przełączyć klasę na jednym (naszej tabeli).
Przypisując do tabeli identyfikator, byłoby to jeszcze szybsze i możesz nawet po prostu odwołać się do kolumny za pomocą
:nth-child
selektora, co jeszcze bardziej zmniejszy twoje znaczniki, ale nie mogę komentować wydajności. Innym powodem tego jest to, że nienawidzę stylizacji wbudowanej i dołożę wszelkich starań, aby ją wyeliminować!źródło
Nie przyniesie to efektu, jeśli zastosujesz klasę do elementu HTML, a klasa ta nie zostanie zdefiniowana w CSS. Jest to powszechna praktyka i jak powiedział Aamir afridi, jeśli używasz klas wyłącznie w celu js, dobrą praktyką jest poprzedzenie ich js-.
Dotyczy to nie tylko calsses, ale także atrybutu id elementów HTML.
źródło
Nie ma żadnego problemu z użyciem klas do zapytania o elementy. Kiedyś nadawałem takim nazwom klas
sys-
prefiks (na przykład nazwę twoją klasęsys-target
), aby odróżnić je od klas używanych do stylizacji. Była to konwencja stosowana w przeszłości przez niektórych programistów Microsoft. Zauważyłem również rosnącą praktykę używaniajs-
prefiksu do tego celu.Jeśli nie masz doświadczenia w używaniu klas do celów innych niż stylizacja, polecam użycie wtyczki jQuery Role.js, która pozwala osiągnąć ten sam cel za pomocą
role
atrybutu, więc możesz napisać znaczniki jako<td role="target">
i użyć zapytania$("@target")
. Strona projektu ma dobry opis i przykłady. Używam tej wtyczki do dużych projektów, ponieważ naprawdę lubię utrzymywać klasy wyłącznie w celach związanych ze stylizacją.źródło
Zobacz silnik sprawdzania poprawności jQuery . Nawet tam używamy nieistniejących klas do dodawania reguł sprawdzania poprawności atrybutów HTML . Więc nie ma nic złego w korzystaniu z klas, które nie zostały zadeklarowane w arkuszu stylów.
źródło