Zunächst einmal sollte gesagt werden, dass Sie versuchen sollten, Ihre Stile und Ihr JavaScript voneinander fernzuhalten. Wenn Sie den Stil eines Elements mit JavaScript ändern möchten, fügen Sie dem Element einen Klassennamen hinzu (oder entfernen Sie ihn). Verwenden Sie dann diesen Klassennamen als Ankerpunkt in Ihrem CSS, um die Formatierung zu beeinflussen.
Es gibt jedoch Zeiten, in denen Sie Formatierungen innerhalb von JavaScript anwenden müssen. jQuery hat eine Funktion genau dafür.
$("#thing").css("margin-right", 0);
Es kann sogar ein wenig ansprechend sein, da jQuery einige browserspezifische Eigenheiten für Sie handhabt. Zum Beispiel erfordert die Deckkraft (opacity) eine Vielzahl von CSS-Eigenschaften, um browserübergreifend kompatibel zu sein. Aber mit jQuery müssen Sie nicht alle davon anwenden. Allein das Setzen der Deckkraft mit der CSS-Funktion funktioniert. jQuery weiß, in welcher Browserumgebung es sich befindet, und wendet die richtige Eigenschaft an.
// just works
// also alternate CSS syntax
$("#thing").css({
opacity: 0.5
});
Sie könnten also dieses Denken erweitern und davon ausgehen, dass jQuery Ihnen auch bei anderen Dingen hilft, die mehrere CSS-Eigenschaften erfordern, um denselben browserübergreifenden Effekt zu erzielen, wie das klassische Beispiel border-radius. Wir brauchen-moz-border-radiusfür Mozilla-Browser, -webkit-border-radius für WebKit-Browser undborder-radiusfür Opera (und die Zukunft). Aber jQuery hilft uns hier nicht.
// not gonna help in current Firefox or Safari/Chrome
$("#thing").css({
"border-radius": "20px"
});
Um browserübergreifend kompatibles CSS über jQuery zu erhalten, müssen wir immer noch alle drei auflisten.
$("#thing").css({
"border-radius": "20px",
"-moz-border-radius": "20px",
"-webkit-border-radius": "20px"
});
Was ist damit los? David Walsh denkt, es wäre eine Aufblähung der Bibliothek, diese Abstraktion in jQuery zu haben. Ben Alman denkt, jQuery sollte vollständig unterstützte CSS-Eigenschaften behandeln (die border-radius-Spezifikation ist noch nicht endgültig). Screwlewse denkt, der einzige Grund, warum Deckkraft auf diese Weise unterstützt wird, ist, dass sie für Animationen (Kernfunktionen wie fadeToggle) benötigt wird.
Ich bin mir nicht zu 100% sicher, was ich denke. Einerseits wäre es schön, wenn das magisch für mich erledigt würde. Andererseits kann ich die Argumente bezüglich Aufblähung und nicht abgeschlossener Spezifikationen verstehen.
Was denkst du?
Wenn Sie sich jemals dabei ertappt haben, abgerundete Ecken über jQuery anwenden zu müssen, sind Sie vielleicht gut beraten, dies in ein kleines Plugin für sich selbst zu abstrahieren.
$.fn.roundThis = function(radius) {
return this.each(function(e) {
$(this).css({
"border-radius": radius,
"-moz-border-radius": radius,
"-webkit-border-radius": radius
});
});
};
$(function() {
// usage
$("#thing-that-will-become-rounded").roundThis("20px");
});
Das wird IE aber immer noch nicht handhaben, aber es gibt tolle Plugins, die das tun.
In anderen Nachrichten: Herzlichen Glückwunsch an Brent Traut zum Gewinn des kostenlosen Tickets für die jQuery Conference bei meinem kleinen Gewinnspiel. Zehn Personen, die teilgenommen haben, spendeten insgesamt 115 US-Dollar für Open-Source-Projekte. Pseudo-zufällige Zahlen wählten den Gewinner. Wenn Sie immer noch darüber nachdenken, zu kommen, sollten Sie es tun! Und wenn Sie immer noch darüber nachdenken, für Open Source zu spenden, sollten Sie es tun!
Wie Sie sagten, wäre es schön, wenn dieses Problem von jQuery gelöst würde, aber ich denke, ich werde Ben Almans Gedanken folgen: „jQuery sollte vollständig unterstützte CSS behandeln“
Ich stimme der Ansicht zu, dass jQuery die zusätzlichen nicht standardmäßigen Dinge aus der Bibliothek heraushalten sollte. Besonders wenn ich bedenke, dass wir bald CSS3-Tools wie abgerundete Ecken in allen Browsern ohne die proprietären CSS-Attribute sehen werden.
DAS ist das Problem… Wann ist dieses „bald“?
border-radius wurde meines Wissens erstmals 2002 eingeführt [1], wir schreiben 2010 und es ist immer noch ein Entwurf. Vielleicht sollte das W3C einen schnelleren Veröffentlichungszyklus einführen.
[1] Der Entwurf der Spezifikation (zu border-radius) aus dem Jahr 2002: http://www.w3.org/TR/2002/WD-css3-border-20021107/
Guter Beitrag; mir gefallen die verschiedenen Perspektiven, CSS in jQuery robuster zu machen.
Eine Anmerkung zu Ihrem Plugin: Brauchen Sie wirklich ein .each()? Ich dachte, .css() würde einen Satz selbst durchlaufen. Nur neugierig, ob das ein Problem umgangen hat.
Danke!
Das .each() ist notwendig, weil es ein Plugin ist, das mehrere Selektoren übergeben kann, wie z.B.
$(„#thing, #thing2).roundThis();
Ich bin ziemlich sicher, dass deshalb .each() benötigt wird, aber wenn jemand Schlaueres als ich sich dazu äußern möchte, nur zu.
nahe dran, es ist für den Fall, dass Sie eine Sammlung übergeben
wie $(‘a’).roundThis();
Das „this“ in Ihrem Plugin bezieht sich bereits auf Ihren jQuery-Elementstapel. Das .css() durchläuft ebenfalls Elemente, sonst könnten Sie nicht $(„a“).css(); machen.
Sie haben also eine unnötige Schleife konstruiert. Das Entfernen des .each() sollte die Funktionalität nicht beeinträchtigen.
Oder Sie können das jQuery UI CSS Framework verwenden.
Überhaupt nicht.
Das JQuery UI verwendet immer noch dieselben moz- und webkit-CSS-Eigenschaften und funktioniert nicht in IE.
Ich gehe davon aus, dass dies auf die Sizzle.js-Engine angewiesen ist?
Es sollte darauf hingewiesen werden, dass das Ändern von CSS-Eigenschaften über JavaScript ein sehr kostspieliger Vorgang in Bezug auf die Leistung ist. Es ist viel schneller, einfach Klassen zu Elementen hinzuzufügen/entfernen, und die CSS in Ihrem Stylesheet deklarieren zu lassen.
Nichtsdestotrotz gibt es Fälle (wenn auch sehr wenige), in denen das dynamische Setzen von CSS (anstelle von Klassen) erforderlich ist, zum Beispiel bei der Erstellung eines Tools wie css3please.com. Ich glaube jedoch nicht, dass jQuery proprietäre CSS-Eigenschaften abstrahieren sollte, wie Sie es vorgeschlagen haben. Wenn Sie das wirklich tun möchten, ist es einfach genug, ein Plugin zu schreiben, wie Sie es demonstriert haben.
Vergessen Sie nicht, dass Sie CSS-Klassen nicht animieren können, daher müssen Sie die CSS direkt ändern.
Ich denke, je mehr Abstraktion jQuery anhäuft, desto schwieriger wird die Fehlerbehebung. Betrachten Sie das Problem, das Sie neulich mit der Delegate-Eigenschaft und dem Hover-Ereignis von jQuery hatten (das kein echtes JavaScript-Ereignis ist, sondern eine Abstraktion, die nur in einigen Fällen funktioniert): Wenn Sie ein Anfänger im jQuery-Programmieren mit geringem Verständnis von JavaScript und Browser-Ereignissen gewesen wären, wäre der Unterschied zwischen dem, was abstrahiert wird, und dem, was tatsächlich unter der Haube vor sich geht, vielleicht nicht so offensichtlich gewesen. Ich kann mir vorstellen, dass jemand unverhältnismäßig viel Zeit damit verbringt, ein Problem zu lösen, dessen Antwort offensichtlicher wäre, wenn dashoverEreignis als Ersatz fürmouseenterundmouseleave.
Das war nicht als Antwort an Sie, Matthias, gedacht, sondern als Reaktion auf den Artikel im Allgemeinen und Chris im Besonderen.
Jedes Mal, wenn ich solche Dinge benutze, fühle ich mich schlecht, weil nicht alle Benutzer / Kunden JavaScript aktiviert haben. Ist das nicht so?
Die meisten schon. Mir fällt kein Browser ein, der JavaScript standardmäßig deaktiviert hat, also müsste der Benutzer es bewusst deaktivieren oder es wäre als unternehmens- oder organisationsweite Anweisung deaktiviert.
Abgesehen davon ist nichts falsch an einer gewissen graceful degradation. Gerundete Ecken funktionieren aufgrund von JavaScript nicht, weil es nicht aktiviert ist? Kunde sieht eckige Ecken. Dies ist das Thema unzähliger Artikel im Moment, und ich stimme dem zu. Eckig, abgerundet… am Ende des Tages wird die Seite für die 2 % mit deaktiviertem JavaScript recht gut nutzbar sein.
Toller Artikel! Aber es könnte süßer sein, wenn der Radius auch als Argument übergeben werden könnte.
Wir abstrahieren schließlich ;)
@Ingo Wedler
Leute, die JavaScript deaktiviert haben, kümmern sich wirklich nicht (wissen?) um diese UI-Erfahrung :)
Das ist genau das, was ich tun wollte, als ich anfing, diesen Teil zu schreiben, und dann scheinbar faul wurde =).
Ich habe den Artikel aktualisiert.
nette Herangehensweise, aber das mit JS zu machen ist aufwendig. Ich habe meine Stylesheets mit Compass/Sass wieder aufgeräumt.
http://www.slideshare.net/pengwynn/css-metaframeworks-king-of-all-media/100
Compass kann mit jedem Framework verwendet werden, da es nur CSS ausgibt.
Nur zur Ergänzung – Chrome akzeptiert jetzt die CSS-Eigenschaft border-radius neben der Eigenschaft -webkit-border-radius.
Tolles Tutorial, Chris
Welche Chrome-Version unterstützt es?
Ich frage mich, wenn ich beide definiere, welche gewinnt?
Früher oder später brauchen wir keine proprietären Selektoren mehr. Juhu!!! /o/
In den alten Tagen des letzten Jahrhunderts erinnere ich mich, dass es relativ üblich war, über eine JS-Notation für CSS zu sprechen. Ich habe vielleicht noch ein Buch mit diesem (ich bin ein bisschen ein Messie).
Wenn wir sagen „halten Sie Ihr CSS und JS getrennt“, verwenden wir eine Kurzform für „halten Sie Ihre Präsentation und Funktionalität getrennt“ … unter normalen Bedingungen sind die beiden gleichwertig.
Aber.
Es gibt keinen Grund, warum Sie Ihre Präsentation nicht mit JavaScript-Notation ausdrücken könnten. Tatsächlich wäre es völlig legitim (und vielleicht sogar wünschenswert), Ihre gesamte „progressive Enhancement“-Präsentation in JavaScript zu schreiben und jQuery zu nutzen.
Ich erkenne, dass ich hier ein *wenig* kontrovers bin, aber ich denke, der Ansatz hat seine Verdienste. Insbesondere wenn Sie Plugins schreiben, um Dinge wie abgerundete Ecken (wickeln Sie die CSS mit der IE-Problemumgehung in einen Aufruf ein) und andere gängige Behandlungen zu handhaben. Ich würde dies auch in der mythischen Welt empfehlen, in der CSS 3 überall vollständig implementiert ist.
Ich habe einen Snippet in TextMate hinzugefügt, der mir hilft, die lächerliche Menge an Code zu erstellen, die benötigt wird, um coole Edge-CSS3-Effekte zu erzielen.
Ich tippe einfach
rounded ⇥
und es fügt ein
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
-khtml-border-radius: 3px;
border-radius: 3px;
Schön. Sie können den Snippet flexibler gestalten, indem Sie gespiegelte Platzhalter verwenden.
-moz-border-radius: ${1:3px};
-webkit-border-radius: $1;
-khtml-border-radius: $1;
border-radius: $1;
Es ist sinnvoll, Eigenschaften wie Deckkraft in eine Bibliothek aufzunehmen, da sie für dynamische Effekte („fade“) benötigt werden. Aber möchten Sie border-radius dynamisch ändern?
Leider ist es ein wenig sinnlos, darauf zu warten, dass etwas zum Standard wird, bevor jQuery es implementiert, da es lange dauert, bis Dinge das Stadium der vorgeschlagenen Empfehlung (PR) erreichen.
Zum Beispiel erreichte CSS2.1 am 8. September 2009 nur den Status einer Kandidatenempfehlung (vielleicht wurde es irgendwann aufgewertet und dann wieder herabgestuft, was das erklären könnte). Es ist also nichts falsch daran, dass jQuery etwas wie border-radius aufnimmt, auch wenn es noch kein „offizieller“ Standard ist – denn es könnte noch viele Jahre dauern, bis es „offiziell“ ist.
Das ist eine großartige Möglichkeit, die CSS-Validierung zu umgehen. Danke.
Danke für den Link zu den großartigen Plugins, die das tun. Die Korrektur für abgerundete Ecken in IE ist jetzt für mich gelöst, danke Chris für den Link und Dave Methvin für das Plugin.
Ich bevorzuge die Verwendung des Plugins, bis die Cross-Browser-Probleme gelöst sind, damit meine Besucher keinen Spaß verpassen.
Damit abgerundete Ecken in IE funktionieren, wäre es dann sinnvoll, Bilder in Photoshop zu erstellen und sie oben und unten an den divs zu platzieren?