Sıralı CSS'de bu kadar kötü olan ne?


171

Web sitesi başlangıç ​​kodunu ve örneklerini gördüğümde, CSS her zaman "main.css", "default.css" veya "Site.css" gibi bir adda ayrı bir dosyada bulunur. Ancak, bir sayfayı kodlarken, genellikle bir görüntüye "float: right" ayarlayarak CSS'yi bir DOM öğesiyle aynı hizaya getirmeye çalışırım. Bunun "kötü kodlama" olduğunu hissediyorum, çünkü örneklerde çok nadiren yapılır.

Stil birden çok nesneye uygulanacaksa, "Kendinizi Tekrarlama" yı (DRY) izlemenin ve her öğe tarafından başvurulacak bir CSS sınıfına atamanın akıllıca olacağını anlıyorum. Ancak, başka bir öğede CSS tekrarlamak olmaz, neden HTML yazarken CSS satır içi olmasın?

Soru: Satır içi CSS kullanımı, yalnızca bu öğede kullanılacak olsa bile kötü olarak değerlendiriliyor mu? Öyleyse neden?

Örnek (bu kötü mü?):

<img src="myimage.gif" style="float:right" />

1
Her zaman satır içi css'e karşıyım, tek bir öğe için bile, ancak stil özellikleriyle dolu birçok ticari siteyi görüyorum, bu kabul edilen uygulamanın gerçekte ne olduğunu merak ediyor mu?
yu_ominae

3
Satır içi stillerin tembel olduğunu düşünüyorum. Bunu söylüyorum çünkü bunu sık sık kendim yapıyorum, bu yüzden biliyorum - neden yapıyorum, çünkü stilin kalıp kalacağı konusunda hiçbir fikrim yok, bu yüzden html'nin hemen yanında yapardım. Bugünlerde, html5 ve <style> </style> için her yerde pragmatik destekle, mizanpajla uğraşırken bunun yerine yakındaki bir <style> etiketini kullanıyorum ve daha sonra çekirdek / ana css dosyasına taşıyorum. Hız ve yakınlığın aynı faydaları, dezavantajların neredeyse hiçbiri (spesifikliğin bir olması nedeniyle sayfa dışı öğeler üzerinde yan etkiler).
Kzqai

3
@yu_ominae - "ticari siteler" in her zaman en iyi uygulamalara uymadığını unutmayın; aslında oldukça nadirdir. Karar verme faktörü, geliştiricinin zamanı bilmesi, önemsemesi ve zamanı olması; ya da müdür zamanı ayırmaya ve personeli uygulamaya yönlendirmeye istekliyse. İş önceliği son tarihi karşılamak olduğunda kalite genellikle düşer.
BryanH

1
"Ticari siteler" satır içi stiller kullanıyor gibi görünse de, bu css()satır içi stiller uygulayan belirli jQuery çağrılarını (örneğin ) kullanmanın bir sonucu olabilir .
Dave Becker

Yanıtlar:


203

Sitenin farklı görünmesini istediğinizde 100 satır kod değiştirmek zorundasınız. Bu, örneğinizde geçerli olmayabilir, ancak aşağıdaki gibi şeyler için satır içi css kullanıyorsanız

<div style ="font-size:larger; text-align:center; font-weight:bold">

bir sayfa başlığını göstermek için her sayfada,

<div class="pageheader">  

sayfa başlığı tek bir stil sayfasında tanımlandıysa, sayfa başlığının sitenin tamamında nasıl göründüğünü değiştirmek isterseniz, css'i tek bir yerde değiştirirsiniz.

Ancak, bir sapkın olacağım ve örneğinizde sorun görmeyeceğimi söyleyeceğim. Muhtemelen tek bir sayfada doğru görünmesi gereken tek bir görüntünün davranışını hedefliyorsunuz, bu yüzden gerçek css'yi bir stil sayfasına koymak muhtemelen aşırıya kaçacaktır.


18
Benim örneğimin sorun olmadığını söylüyorsun, ama aynı zamanda bir sapkın olduğunu da kabul ediyorsun. Bu yaklaşımı seviyorum.
10:50

8
Her seferinde bir nikelim olsaydı, bir görüntünün şamandıra veya orijinal olarak "sadece bir eleman için" olacak başka bir css değiştirmek zorunda kaldım ... ... iyi, dışarıda bir akşam yemeği için dışarı çıkardım güzel bir restoranda.
Kzqai

8
Yalnızca satır içi stilini kullanmanın iyi olmadığı, aynı zamanda herhangi bir şeyi şekillendirmenin tek yolu olan HTML senaryosu olan başka bir senaryo.
Christophe Marois

Ancak htmldosyanın kendisi de önbelleğe alınır.

User663031'e yanıt olarak: Birden fazla sayfalı bir web sitesinin birçok farklı HTML sayfası vardır, ancak tüm stillerini kolayca önbelleğe alınabilen tek bir CSS dosyasında birleştirebilir.
Sinthorion

68

Farklı bir css dosyasına sahip olmanın avantajı

  1. HTML sayfanızın bakımı kolaydır
  2. Görünüm ve izlenimde değişiklik yapmak kolay olacaktır ve sayfalarınızda birçok tema için destek alabilirsiniz.
  3. Css dosyanız tarayıcı tarafında önbelleğe alınır. Böylece, sayfa her yenilendiğinde veya kullanıcı sitenizde gezintiğinde bazı kbs veri yüklemeyerek internet trafiğine biraz katkıda bulunursunuz.

2
Kendime her ay hakkında bu soruyu sormak (web programlama için oldukça yeni) ve bu ilk kez css dosyası önbellek hakkında bir şey okudum. Bu benim için yapıyor!
ganders

Önbelleği de düşünüyordum, ancak benim durumumda, 15k satır olan birleştirilmiş CSS ile uğraşmak zorunda kalıyorum, önemsiz tek bir sayfada sadece bir kez kullanılacak olan önemsiz tüm büyük bölümünü korumak imkansız. artık mevcut değil. Böylece, trafiğinizin yalnızca% 1'i tarafından görüntülenen tek bir geçici sayfa için her ziyarette herkese CSS kodu atıyorsunuz. İnternet trafiği argümanının her durumda geçerli olduğundan emin değilim. Neyse ki Web Bileşenleri işleri değiştirecek!
Shadoweb

@Shadowbob - büyük yerine küçük css dosyalarına sahip olmak daha iyi olmaz mıydı? Belki tüm sayfalar için kullanılan bir jenerik var, ama sonra diğer sayfalar için küçük ayrı stil sayfaları var. Bakımı daha kolay olmalı. Ve trafik sorunsa, üretim için muhtemelen inşa sürecinde biriyle birleşebilir.
Darius.V

26

Hızlı css prototiplemede html5 yaklaşımı

veya: <style>etiketler artık sadece kafa için değil!

Hacking CSS

Hata ayıkladığınızı ve page-css'nizi değiştirmek istediğinizi varsayalım, belirli bir bölümün daha iyi görünmesini sağlayın. Stillerinizi hızlı ve kirli ve bakımsız bir şekilde oluşturmak yerine, bu günlerde yaptığım şeyi yapabilir ve aşamalı bir yaklaşımda bulunabilirsiniz.

Satır içi stil özelliği yok

Asla css inline'ınızı asla oluşturmayın, yani: <element style='color:red'>hatta <img style='float:right'>çok uygundur, ancak daha sonra gerçek bir css dosyasındaki gerçek seçici özgüllüğü yansıtmaz ve tutarsanız, bakım yükünden sonra pişman olursunuz.

<style>Bunun yerine prototip

Satır içi css kullanacağınız yerde, sayfa içi <style> öğeleri kullanın . Deneyin! Tüm tarayıcılarda iyi çalışır, bu yüzden test için harikadır, ancak istediğiniz zaman / ihtiyaç duyduğunuzda bu css'yi küresel css dosyalarınıza nazikçe taşımanıza izin verir! (* sadece seçicilerin site düzeyinde özgüllük yerine yalnızca sayfa düzeyinde özgünlüğe sahip olacağını unutmayın, bu yüzden çok genel olmaya dikkat edin) Css dosyalarınızdaki kadar temiz:

<style>
.avatar-image{
    float:right
}
.faq .warning{
    color:crimson;
}
p{
    border-left:thin medium blue;
    // this general of a selector would be very bad, though.
    // so be aware of what'll happen to general selectors if they go
    // global
}
</style>

Başkalarının satır içi css'ini yeniden düzenleme

Bazen problem bile değilsin ve başka birinin inline css'si ile uğraşıyorsun ve onu yeniden düzenlemelisin. Bu, <style>sayfa içi için başka bir harika kullanımdır , böylece inline css'yi doğrudan şeritleyebilir ve yeniden düzenleme sırasında sınıflara, kimliklere veya seçicilere doğrudan sayfaya yerleştirebilirsiniz. Seçicilerinize giderken yeterince dikkatli olursanız, son sonucu yalnızca bir kopyala & yapıştır ile sonunda global css dosyasına taşıyabilirsiniz.

Bu transfer etmek biraz zor her küresel css dosyasına derhal css bit, ancak sayfa içi ile <style>elementlerin, şimdi alternatifleri var.


23

Diğer cevaplara ek olarak .... Uluslararasılaşma .

İçeriğin diline bağlı olarak - genellikle bir öğenin stilini uyarlamanız gerekir.

Belli bir örnek sağdan sola yazılan dillerdir.

Diyelim ki kodunuzu kullandınız:

<img src="myimage.gif" style="float:right" />

Şimdi web sitenizin rtl dillerini desteklemesini istediğinizi varsayalım.

<img src="myimage.gif" style="float:left" />

Şimdi, her iki dili de desteklemek istiyorsanız, satır içi stil kullanarak kayan noktaya değer atamanın bir yolu yoktur.

CSS ile bu, lang özelliğiyle kolayca halledilir

Böylece böyle bir şey yapabilirsiniz:

img {
  float:right;
}
html[lang="he"] img { /* Hebrew. or.. lang="ar" for Arabic etc */
  float:left;
}

gösteri


16

Satır içi CSS her zaman, bağlı stil sayfası CSS'lerinden her zaman öncelik kazanır. Bu, uygun bir basamaklı stil sayfası yazdığınızda ve yazdığınızda ve özellikleriniz doğru bir şekilde uygulanmıyorsa, sizin için büyük bir baş ağrısına neden olabilir.

Ayrıca uygulamanızı anlamsal olarak incitir: CSS, sunumu biçimlendirmeden ayırmakla ilgilidir. İkisini birbirine dolaştırdığınızda, şeyleri anlamak ve sürdürmek çok daha zorlaşır. Veritabanı kodunu, şeylerin sunucu tarafındaki denetleyici kodunuzdan ayırmak gibi bir ilkedir.

Son olarak, bu resim etiketlerinden 20 tanesine sahip olduğunuzu düşünün. Solda yüzmeleri gerektiğine karar verdiğinizde ne olur?


12
"her zaman, her zaman kazan" - Stil sayfasında önemli kullanılmazsa
James Westgate

6
İnsanların insancıl olduğu ve bu tür canavarlıkları kullanmadığı varsayımıyla yaşıyorum. =)
issa marie tseng

3
Birisi kullanana kadar @JamesWestgate, geçersiz kılmayı geçersiz kılmak için satır içi css'de önemli ....
Kzqai

11

CSS'nin asıl amacı, içeriği sunumundan ayırmaktır. Yani örneğinizde içeriği sunumla karıştırıyorsunuz ve bu "zararlı olarak kabul edilebilir".


7
ACM'ye "Zararlı Kabul Edilen Satır İçi CSS Stilleri" göndermeniz için size 5 dolar ödeyeceğim.
BalinKingOfMoria Eski CM'leri

11

Satır içi CSS kullanmanın bakımı çok daha zordur.

Değiştirmek istediğiniz her özellik için satır içi CSS kullanmak, yalnızca açıkça tanımlanmış ve umarım iyi yapılandırılmış CSS dosyalarının içine bakmak yerine karşılık gelen HTML kodunu aramanızı gerektirir.


3
+1 - Tasarımcılarımız bunu hızlı bir düzeltme olarak yaptığında, sadece bir şeylerin hizalanması için gerçekten acı çekiyorum. Harici bir CSS kullanmak, elbette tek bir stil sayfasında çalışmadığı sürece asla büyük bir metin değiştirme yapmak zorunda olmadığı anlamına gelir. Dün bana yayınlanan bir kontrol paneli şablonu var ve simgelerin satır içi stillerle değiştirildiği örnekleri bulmak 2 1/2 saat sürdü. Maddening sana söylüyorum .. maddening :)
Tim Post

1
50'den fazla SCSS'niz olduğunda ve Inspect öğeniz yalnızca sıkıştırılmış CSS'yi gösterdiğinde, basitliği kazanan CSS olduğundan emin değilim!
Shadoweb

1
@Shadowbob ekşi haritaların amacı budur. thesassway.com/intermediate/using-source-maps-with-sass
Mike Chamberlain

@TimPost "öğesi
denetle

9

Bu sadece el yazısı kod için geçerlidir. Kod oluşturursanız, özellikle elemanların ve kontrollerin özel bir tedaviye ihtiyaç duyduğu durumlarda, satır içi stilleri kullanmanın uygun olduğunu düşünüyorum.

DRY el yazısı kod için iyi bir kavramdır, ancak makine tarafından oluşturulan kodda, "Demeter Yasası" nı tercih ederim: "Birbirine ait olan, birlikte kalmalı". Stil etiketleri oluşturan kodu değiştirmek, farklı ve "uzak" bir CSS dosyasında global bir stili ikinci kez düzenlemekten daha kolaydır.

Sorunuzun cevabı: duruma göre değişir ...


7
Bence bu gerçekten doğru cevap. "Endişelerin ayrılması" mantrası sadece bir kriterdir. "Yerellik" bakım kolaylığı için de önemlidir. Anahtar özellik, stilin sadece sözdizimsel değil, anlamsal düzeyde yeniden kullanılabilir olup olmadığıdır. Bu durumda, sayfa mantıklıdır. Örneğin, "float: right" için bir sınıf oluşturmayacağım çünkü sadece iki element kullanıyor. Öğelerin anlamsal olarak aynı olmasına bağlıdır. Bir "renk" stili genellikle anlamsal olarak ilişkilidir (temanın bir kısmı) ve genellikle bir sayfaya gider.
koriander

5

Bir öğe için belirli bir stile sahip olsanız bile, aynı stili farklı öğelere aynı öğeye uygulamak isteyebileceğiniz olasılığını düşünmeniz gerektiğini düşünüyorum.

Bir gün birisi her sayfada aynı öğeyi değiştirmeyi veya daha fazla stilistik değişiklik eklemeyi isteyebilir. Harici bir CSS dosyasında tanımlanan stillere sahip olsaydınız, sadece orada değişiklikler yapmanız gerekir ve tüm sayfalara aynı öğeye yansıtılır ve böylece baş ağrısından tasarruf edilir. :-)


4

Nasıl kodlamak istediğinizi kodlayın, ancak bir başkasına aktarıyorsanız, herkesin yaptıklarını kullanmak en iyisidir. CSS için nedenler var, o zaman satır içi nedenler var. Her ikisini de kullanıyorum, çünkü benim için daha kolay. Aynı tekrarlamaya sahip olduğunuzda CSS kullanmak harikadır. Ancak, farklı özelliklere sahip bir dizi farklı öğeniz olduğunda, bu bir sorun haline gelir. Benim için bir örnek, öğeleri bir sayfaya yerleştirdiğim zamandır. Her öğe farklı bir üst ve sol özellik olarak. Eğer gerçekten html ve css sayfa arasında gidiş karmaşa beni kızdıran bir CSS koymak. Bu nedenle, her şeyin aynı yazı tipine, renge, fareyle üzerine gelme efektine vb. Sahip olmasını istediğinizde CSS mükemmeldir. Ancak her şeyin farklı bir konumu olduğunda her öğe için bir CSS örneği eklemek gerçekten acı verici olabilir. Bu sadece benim görüşüm. CSS, kodu kazmanız gerektiğinde daha büyük uygulamalarda gerçekten büyük önem taşır. Mozilla web geliştirici eklentisini kullanın ve öğe kimliklerini ve Sınıflarını bulmanıza yardımcı olacaktır.


2

Stili bu örnekte olduğu gibi yalnızca bir kez kullansanız bile, CONTENT ve DESIGN'ı yine karıştırdınız. "Endişelerin ayrılması" ifadesine bakın.


1

İşaretleme ve stili aynı kaynak dosyada etkili bir şekilde karıştırdığınız için satır içi stiller kullanmak Endişelerin Ayrılması ilkesini ihlal eder. Ayrıca, çoğu durumda, yalnızca tek bir öğeye uygulanabildiğinden, DRY (Kendinizi Tekrarlama) ilkesini ihlal ederken, bunlardan birkaçı bir sınıfa uygulanabilir (ve hatta CSS kurallarının büyüsü ile genişletilebilir! ).

Ayrıca, sitenizde komut dosyası içeriyorsa sınıfların mantıklı kullanımı faydalıdır. Örneğin, JQuery gibi birkaç popüler JavaScript kütüphanesi büyük ölçüde seçici olarak sınıflara bağlıdır.

Son olarak, sınıfları kullanmak DOM'nize ek netlik kazandırır, çünkü belirli bir düğümün ne tür bir öğe olduğunu size açıklayan tanımlayıcılarınız vardır. Örneğin:

<div class="header-row">It's a row!</div>

Şundan çok daha etkileyici:

<div style="height: 80px; width: 100%;">It's...something?</div>

1

Sayfa içi css şu an için bir şeydir, çünkü Google bunu ayrı bir dosyadan yüklenen css'den daha iyi bir kullanıcı deneyimi olarak derecelendirir. Olası bir çözüm, bir metin dosyasına css koymak, php ile anında yüklemek ve belge kafasına çıktısıdır. Bu <head>bölümde şunları içerir:

<head> ...

<?php
$codestring = file_get_contents("styles/style1.txt");
echo "<style>" . $codestring . "</style>";
?>

... </head>

Gerekli css'yi styles / style1.txt dosyasına koyun, <head>belgenizin bölümünde tükürülür . Bu şekilde, tüm sayfalar tarafından paylaşılabilen ve site genelinde stil değişikliklerinin yalnızca bir dosya üzerinden yapılmasına izin veren style1.txt stil şablonu kullanma avantajına sahip sayfa içi css'e sahip olursunuz. Ayrıca, bu yöntem tarayıcının sunucudan ayrı css dosyaları istemesini gerektirmez (böylece alım / oluşturma süresini en aza indirir), çünkü her şey php tarafından bir kerede teslim edilir.

Bunu uyguladıktan sonra, sadece bir kerelik bireysel stiller gerektiğinde manuel olarak kodlanabilir.


Evet! tüm css dosyalarınızda ise "ilk boyama zamanı" nı en aza indirmeye çalışırken bu çok önemlidir ve stil sayfaları kullanıcı tarafından indirilene kadar DOM'yi erteler. Kritik stillerinizi kafadaki bir satır içi <styles> düğümünde bulundurduğunuzda DOM'yi hemen oluşturmaya ve harici stil sayfalarını ertelemeye başlayabilirsiniz. 3G bağlantılarında ve algılanan hızda büyük bir rol oynar. Cevabınız için +1
DOfficial

1

Inline CSS, makine tarafından üretilen kod için iyidir ve çoğu ziyaretçi bir sitede yalnızca bir sayfaya göz attığında iyi olabilir, ancak yapamayacağı bir şey, farklı boyutlardaki ekranlar için farklı görünümlere izin vermek için medya sorgularını işlemektir. Bunun için CSS'yi harici bir stil sayfasına veya dahili bir stil etiketine dahil etmeniz gerekir.


0

Yukarıda verilen tüm cevapları tamamen kabul etsem de, ayrı bir dosyada CSS yazmanın kod yeniden kullanılabilirliği, sürdürülebilirliği, endişelerin daha iyi ayrılması her zaman daha iyidir, insanların üretim kodlarında satır içi CSS'yi tercih ettiği birçok senaryo vardır -

Harici CSS dosyası, tarayıcıya fazladan bir HTTP çağrısına ve dolayısıyla ek gecikmeye neden olur. Bunun yerine CSS satır içine yerleştirilirse tarayıcı hemen ayrıştırmaya başlayabilir. Özellikle SSL üzerinden HTTP çağrıları daha maliyetlidir ve sayfaya ek gecikme süresi ekler. Harici CSS dosyalarını satır içi kod olarak ekleyerek statik HTML sayfaları (veya sayfa snippet'i) oluşturmaya yardımcı olan birçok araç vardır. Bu araçlar, üretim ikili dosyasının oluşturulduğu Oluştur ve Bırak aşamasında kullanılır. Bu şekilde harici CSS'nin tüm avantajlarını elde ederiz ve sayfa da hızlanır.


3
Gecikme ile ilgili bir şey eksik. Çok daha büyük bir sorun , gerçekten: CSS'nin gömülmesi, her sayfa isteğinin bu CSS'yi içermesi gerektiği anlamına gelir, aksi halde tarayıcı bunu önbelleğe alabilir.
Andrew Barber

Haklısın. Bu nedenle, kod boyutu çok küçük olduğunda CSS'yi satır içine alırız, böylece sayfa boyutunda çok fazla ek yüke neden olmaz. Yahoo! Kullanıcıların% 60-80'inin sitenize her gün boş bir önbellek ile geldiğini söyleyen perf yönergeleri sayfası developer.yahoo.com/performance/rules.html ( yuiblog.com/blog/2007/01/04/performance-research-part -2 ) Tabii ki tamamen web sitesinin popülerliğine bağlıdır - Ne kadar popüler bir site, boş olmayan bir önbellek olma şansı daha fazladır.
Diptendu

Bir kullanıcının sitenize boş bir önbellekle erişmesi muhtemel olsa da, sayfanıza boş bir önbellekle erişmesi pek olası değildir . Sayfa tek kullanımlık olmadığı sürece (yani her kullanıcı yalnızca bir kez görüntülüyorsa), ayrı bir css dosyasıyla daha iyi performans gösterir.
astex

Günümüzde birçok modern web sayfası Tek Sayfa Uygulaması olarak tasarlanmıştır, tam sayfa sadece ilk kez yüklenir. Bir dahaki sefere sayfa AJAX çağrısı ile değiştirilir. Bu nedenle, sayfa çoklu kullanımda bile harici CSS yalnızca bir kez yüklenir.
Diptendu

0

AMP HTML Spesifikasyonu'na göre, performans amacıyla CSS'yi HTML dosyanıza (harici bir stil sayfasına karşı) koymak gerekir. Bu satır içi CSS anlamına gelmez, ancak harici stil sayfaları belirtmezler .

Böyle bir sunum sisteminin yapabileceği optimizasyonların eksik bir listesi:

  • Görüntü referanslarını görüntüleyicinin görünümüne göre boyutlandırılmış resimlerle değiştirin.
  • Ekranın üst kısmında görünen satır içi görüntüler.
  • Satır içi CSS değişkenleri.
  • Genişletilmiş bileşenleri önceden yükleyin.
  • HTML ve CSS'yi küçültün.

0

Diğer yanıtlara ek olarak, satır içi CSS'de sözde sınıfları veya sözde öğeleri hedefleyemezsiniz


0

HTML, XML, bilgisayar dilleri, yapılandırılmamış metinler, DSV, vb. Gibi her türlü metin artefaktı için bir dosya yeteneği sağlayan bir şablona dayalı artefakt oluşturucu oluşturduk (ör. Ortak Web veya manuel sayfa başlıklarını işlemek için harika ve komut dosyası olmadan altbilgiler.)

Bunu yaptıktan ve "head" etiketinizin içinde "style" etiketleri sağlamak için kullandığınızda, "endişelerin ayrılması" argümanı ortadan kalkar, "şablonda yapılan her değişiklikten sonra yeniden oluşturmamız gerekir" ve " msgstr "" "Şablonda oluşturduğu hata ayıklama". Bu tutuşmalar, bir önişlemci (veya M4 kullanmaya başlayan) ilk bilgisayar dilinden beri var.

Bakiye olarak, bir CSS dosyasının veya "stil" etiketlerinin meta-izleyebilme yeteneğinin, öğe düzeyindeki stilden daha temiz ve daha az hataya açık olduğunu düşünüyoruz. Ancak bazı profesyonel kararlar gerektirir, bu nedenle yeni başlayanlar ve dağınık beyinler rahatsız etmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.