{"id":745911,"date":"2023-10-14T22:09:27","date_gmt":"2023-10-15T04:09:27","guid":{"rendered":"https:\/\/blogging-techies.com\/sw\/nyborjarguiden-till-css-object-model-cssom\/"},"modified":"2023-10-14T22:09:27","modified_gmt":"2023-10-15T04:09:27","slug":"nyborjarguiden-till-css-object-model-cssom","status":"publish","type":"post","link":"https:\/\/blogging-techies.com\/sw\/nyborjarguiden-till-css-object-model-cssom\/","title":{"rendered":"Nyb\u00f6rjarguiden till CSS Object Model (CSSOM)"},"content":{"rendered":"<p>M\u00e5nga saker h\u00e4nder emellan <strong>f\u00f6rsta HTTP-f\u00f6rfr\u00e5gan<\/strong> och den <strong>slutgiltig leverans<\/strong> av en webbsida.  Data\u00f6verf\u00f6ringen och renderingsprocessen f\u00f6r webbl\u00e4saren kr\u00e4ver m\u00e5nga olika tekniker, en av dem \u00e4r <strong><a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/drafts.csswg.org\/cssom\/\">CSS-objektmodell<\/a><\/strong>eller den <strong>CSSOM<\/strong>.<\/p>\n<p>CSS-objektmodellen tar CSS-koden och representerar varje v\u00e4ljare <strong>i en tr\u00e4dstruktur<\/strong> f\u00f6r att underl\u00e4tta analysen.  Det kanske inte \u00e4r avg\u00f6rande f\u00f6r utvecklare att helt f\u00f6rst\u00e5 detta koncept, men det \u00e4r ett v\u00e4rdefullt \u00e4mne att studera om du vill l\u00e4ra dig mer om det. <strong>hur webbl\u00e4sare renderar kod till en fungerande webbplats<\/strong>.<\/p>\n<p>I det h\u00e4r inl\u00e4gget kommer jag att t\u00e4cka grunderna i CSS-objektmodellen och visa dig hur det fungerar.<\/p>\n<h5><span class=\"ez-toc-section\" id=\"Vad_ar_CSSOM\"><\/span>Vad \u00e4r CSSOM?<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Termen CSS-objektmodell beskriver en <strong>mappa alla CSS-v\u00e4ljare och relevanta egenskaper f\u00f6r varje v\u00e4ljare<\/strong>.  Dessa stilar kan vara rotelement eller ha kapslade underordnade.<\/p>\n<p>CSSOM \u00e4r v\u00e4ldigt lik <strong>DOM i HTML<\/strong>, som st\u00e5r f\u00f6r Document Object Model.  B\u00e5da \u00e4r en del av <strong><a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/web.dev\/\/performance\/critical-rendering-path\">kritisk renderingsv\u00e4g<\/a><\/strong>    vilket \u00e4r en rad steg som m\u00e5ste h\u00e4nda <strong>rendera en webbplats korrekt<\/strong>.  Alla dessa processer sker <strong>automatiskt<\/strong>bakom kulisserna.<\/p>\n<p>S\u00e5 varf\u00f6r \u00e4r CSSOM viktigt?  Det \u00e4r den karta som navigatorn anv\u00e4nder f\u00f6r att <strong>rendera CSS-stilar korrekt<\/strong> P\u00e5 en hemsida.  Det finns inget enkelt s\u00e4tt att tala om f\u00f6r en dator att alla stycken i en .main-content div ska ha extra radh\u00f6jd.<\/p>\n<p>L\u00f6sningen \u00e4r CSS-objektmodellen som <strong>kartl\u00e4gger alla element och egenskaper<\/strong> av din CSS-kod.<\/p>\n<p>CSSOM g\u00f6r det enklare f\u00f6r webbl\u00e4saren <strong>rendera stilar p\u00e5 sidan<\/strong>.  Det hela \u00e4r v\u00e4ldigt tekniskt, men det \u00e4r v\u00e4rt att f\u00f6rst\u00e5 processen lite, speciellt om du bygger webbplatser.<\/p>\n<h5><span class=\"ez-toc-section\" id=\"Hur_fungerar_det\"><\/span>Hur fungerar det<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>B\u00e5de DOM och CSSOM \u00e4r det <strong>anv\u00e4nds ofta av alla webbl\u00e4sare<\/strong> att tolka och rendera webbsidor.  F\u00f6ljande diagram \u00e4r <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/web.dev\/\/performance\/critical-rendering-path\/constructing-the-object-model?hl=en\">Google Developer&#8217;s Guide to Web Fundamentals<\/a>och f\u00f6rklara hur <strong>DOM renderas i en webbl\u00e4sare<\/strong>.<\/p>\n<figure class=\"is-mega\" data-lazy=\"\"> <\/figure>\n<p>I b\u00e5de DOM och CSSOM finns all information <strong>konverteras fr\u00e5n byte till digitala kartor<\/strong> som representerar varje element i ett webbdokument.  Processen fungerar enligt f\u00f6ljande:<\/p>\n<ol>\n<li>Navigatorn <strong>ladda ner HTML<\/strong> f\u00f6r en webbsida.<\/li>\n<li>Under bearbetning av HTML kan parsern st\u00f6ta p\u00e5 ett l\u00e4nkelement <strong>h\u00e4nvisar till en extern stilmall<\/strong>.<\/li>\n<li>Denna CSS-stilmall \u00e4r d\u00e5 <strong>analyseras p\u00e5 en karta<\/strong> anv\u00e4nda <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/www.w3.org\/TR\/cssom-1\/\">CSS-objektmodellspecifikationer<\/a>.<\/li>\n<li>Den resulterande koden kan d\u00e5 vara <strong>till\u00e4mpas p\u00e5 element i DOM<\/strong>.<\/li>\n<\/ol>\n<p>Allt detta sker v\u00e4ldigt snabbt och intr\u00e4ffar <strong>med varje sidf\u00f6rfr\u00e5gan<\/strong>.  Detta andra diagram nedan visar en <strong>Exempel p\u00e5 CSSOM-tr\u00e4dstruktur<\/strong>.<\/p>\n<figure class=\"is-mega\" data-lazy=\"\"> <\/figure>\n<p>L\u00e4gg m\u00e4rke till hur vissa egenskaper i diagrammet har ljusare gr\u00e5 f\u00e4rger.  Dessa egenskaper \u00e4r <strong><a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/developer.mozilla.org\/en\/docs\/Web\/Guide\/CSS\/Getting_started\/Cascading_and_inheritance\">\u00e4rvt<\/a> av fadern<\/strong>.  Eftersom br\u00f6dtexten har en specifik teckenstorlek f\u00e5r alla element i kroppen ocks\u00e5 den teckenstorleken om de inte \u00e5sidos\u00e4tts.<\/p>\n<p>HTML- och CSS-str\u00e4ngar \u00e4r <strong>omvandlas till tokens<\/strong> vilket d\u00e5 kan vara <strong>f\u00f6rst\u00e5s som noder<\/strong> av webbl\u00e4saren.  Dessa noder \u00e4r som <strong>objekt inom tr\u00e4dstrukturen<\/strong> som definierar hur hela sidan ska byggas.<\/p>\n<p>CSSOM och DOM \u00e4r helt <strong>separata datamodeller<\/strong>d\u00e4rf\u00f6r \u00e4r de det <strong>analyseras separat fr\u00e5n varandra<\/strong>.  Men det har de b\u00e5da <strong>liknande tr\u00e4dstrukturer<\/strong>och b\u00e5da har samma syfte: att ge webbl\u00e4saren en struktur f\u00f6r att representera och identifiera olika element p\u00e5 sidan.<\/p>\n<h5><span class=\"ez-toc-section\" id=\"Varfor_webbutvecklare_bor_bry_sig\"><\/span>Varf\u00f6r webbutvecklare b\u00f6r bry sig<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Sedan all rendering <strong>h\u00e4nder i backend<\/strong>, du beh\u00f6ver egentligen inte oroa dig mycket f\u00f6r CSSOM-tr\u00e4det.  Men det kan vara bra att f\u00f6rst\u00e5 hur det fungerar.<\/p>\n<p>En sak att komma ih\u00e5g \u00e4r att <strong>CSSOM m\u00e5ste vara fulladdat<\/strong> innan webbsidan visas, eftersom den kommer att definiera hur varje element p\u00e5 sidan ska se ut.  Om sidan laddades f\u00f6re CSSOM kommer den att visas som vanlig HTML f\u00f6rst, f\u00f6ljt av stilarna n\u00e5gra sekunder senare.<\/p>\n<p>Webbl\u00e4sare undviker specifikt detta eftersom det skulle vara f\u00f6rvirrande f\u00f6r slutanv\u00e4ndare.  Och det \u00e4r v\u00e4rt att notera att CSSOM <strong>kan inte cachelagras<\/strong>;  m\u00e5ste vara <strong>\u00e5terskapas p\u00e5 varje sida<\/strong>.<\/p>\n<p>Faktiska CSS-filer kan cachelagras f\u00f6r att ladda resurser snabbare men rendera en sida i webbl\u00e4saren. <strong>kr\u00e4ver alltid att CSSOM-parsern k\u00f6rs<\/strong>.  Detta inneb\u00e4r ocks\u00e5 att JavaScript kan ha en negativ inverkan p\u00e5 rendering och prestanda.<\/p>\n<p>Jag skulle starkt rekommendera det <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/dash.plotly.com\/external-resources\">l\u00e4ser den h\u00e4r artikeln<\/a> f\u00f6r mer information om externa CSS\/JS-resurser och deras laddningstider.<\/p>\n<p>Det b\u00e4sta s\u00e4ttet att optimera din webbplats \u00e4r att skapa en <strong>naturligt vattenfall<\/strong> av resurser som <strong>debiteras samtidigt<\/strong>.<\/p>\n<p>Det \u00e4r m\u00f6jligt att manipulera CSSOM med JavaScript eftersom det \u00e4r det <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/docs.w3cub.com\/dom\/css_object_model\">tekniskt sett ett JS API<\/a>.  Men det \u00e4r inte till stor nytta j\u00e4mf\u00f6rt med <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/www.w3schools.com\/js\/js_htmldom.asp\">JavaScript DOM-manipulation<\/a>.<\/p>\n<p>Det viktigaste sk\u00e4let att l\u00e4ra sig om CSSOM \u00e4r att bli b\u00e4ttre informerad om hur webbplatser verkligen fungerar.<\/p>\n<p>Det finns m\u00e5nga saker vi tar f\u00f6r givet som g\u00f6r att internet fungerar smidigt.  N\u00e4r du f\u00f6rst\u00e5r lite mer om hela processen kommer du att kunna visualisera hur det hela utspelar sig, och f\u00f6rhoppningsvis kommer du att f\u00e5 lite uppskattning f\u00f6r existensen av World Wide Web.<\/p>\n<h5><span class=\"ez-toc-section\" id=\"Andra_lasningar\"><\/span>Andra l\u00e4sningar<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Jag hoppas att den h\u00e4r introduktionen kan ge dig en solid uppfattning om vad CSS-objektmodellen \u00e4r och hur den p\u00e5verkar webbsidor.  d\u00e4r <strong>Det finns inte mycket att manipulera i CSSOM.<\/strong>s\u00e5 det skiljer sig lite fr\u00e5n DOM.<\/p>\n<p>Det \u00e4r dock fortfarande en kritisk teknik inom webbutveckling och b\u00f6r klarg\u00f6ra viktiga aspekter av webbl\u00e4sarrendering.<\/p>\n<p>Det finns m\u00e5nga andra resurser som diskuterar CSSOM och hur det fungerar.  Om du vill l\u00e4ra dig mer, h\u00e4r \u00e4r n\u00e5gra inl\u00e4gg jag rekommenderar:<\/p>\n  <div id=\"ez-toc-container\" class=\"ez-toc-v2_0_88 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/blogging-techies.com\/sw\/nyborjarguiden-till-css-object-model-cssom\/#Vad_ar_CSSOM\" >Vad \u00e4r CSSOM?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/blogging-techies.com\/sw\/nyborjarguiden-till-css-object-model-cssom\/#Hur_fungerar_det\" >Hur fungerar det<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/blogging-techies.com\/sw\/nyborjarguiden-till-css-object-model-cssom\/#Varfor_webbutvecklare_bor_bry_sig\" >Varf\u00f6r webbutvecklare b\u00f6r bry sig<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/blogging-techies.com\/sw\/nyborjarguiden-till-css-object-model-cssom\/#Andra_lasningar\" >Andra l\u00e4sningar<\/a><\/li><\/ul><\/nav><\/div>\n ","protected":false},"excerpt":{"rendered":"<p>M\u00e5nga saker h\u00e4nder emellan f\u00f6rsta HTTP-f\u00f6rfr\u00e5gan och den slutgiltig leverans av en webbsida. Data\u00f6verf\u00f6ringen och renderingsprocessen f\u00f6r webbl\u00e4saren kr\u00e4ver m\u00e5nga olika tekniker, en av dem \u00e4r CSS-objektmodelleller den CSSOM. CSS-objektmodellen tar CSS-koden och representerar varje v\u00e4ljare i en tr\u00e4dstruktur f\u00f6r att underl\u00e4tta analysen. Det kanske inte \u00e4r avg\u00f6rande f\u00f6r utvecklare att helt f\u00f6rst\u00e5 detta koncept, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":745912,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/blogging-techies.com\/wp-content\/uploads\/2023\/06\/22023-768x432-1.webp","fifu_image_alt":"","footnotes":""},"categories":[5],"tags":[],"class_list":["post-745911","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bloggar"],"_links":{"self":[{"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/posts\/745911","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/comments?post=745911"}],"version-history":[{"count":0,"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/posts\/745911\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/media\/745912"}],"wp:attachment":[{"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/media?parent=745911"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/categories?post=745911"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogging-techies.com\/sw\/wp-json\/wp\/v2\/tags?post=745911"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}