HTML + CSS + JS'yi mevcut sitelerden seçici bir şekilde kopyalamak için araçlar [kapalı]


403

Çoğu web geliştiricisi gibi, zaman zaman nasıl biçimlendirildiklerini görmek için web sitelerinin kaynağına bakmak istiyorum. Firebug ve Chrome Geliştirici Araçları gibi araçlar kodu incelemeyi kolaylaştırır, ancak yalıtılmış bir bölümü kopyalayıp yerel olarak oynamak istersem, tüm öğeleri ve ilgili css'lerini kopyalamak bir acı olur. Ve muhtemelen tüm kaynağı kurtarmak ve ilgisiz kodu kesmek için çok fazla iş.

Firebug'daki bir düğümü sağ tıklayıp "Bu düğüm için HTML + CSS'yi kaydet" seçeneğine sahip olsaydım harika olurdu. Böyle bir araç var mı? Bu özelliği eklemek için Firebug veya Chrome Geliştirici Araçlarını genişletmek mümkün mü?


4
Sadece eklemek istedim (açıkladığınız gibi bir araç değil, bu yüzden cevap vermeyin), krom kullanıyorsanız bir öğe seçebilir ve css bölümünün sağındaki "Hesaplanan Stil" e bakabilirsiniz. Tüm listeyi bir stile kopyalayıp yapıştırabilirsiniz. Bu, istediğiniz bir araçtan ek bir adımdır, ancak aradığınız css'yi verir.
riv_rec

1
Sorunuza tam bir yanıt değil, ancak "Öğeler" sekmesindeki Chrome geliştirme araçlarındaki F2, seçilen DOM öğesini ve satır içi düzenleme (ve isterseniz kopyalama) için alt ağacı açacaktır.
lojistik

Chrome'un çok ilginç bir uzantısı "Tüm Kaynakları Kaydet" tir. Yükleyin ve ardından Chrome Dev Tool sekmesinin "Kaynak Tasarrufu" na gidin ve indirin!
dimeros

Yanıtlar:


580

SnappySnippet

Sonunda bu aracı oluşturmak için biraz zaman buldum. SnappySnippet'i Github'dan yükleyebilirsiniz . Belirtilen (son incelenen) DOM düğümünden kolay HTML + CSS çıkarılmasına olanak tanır. Ayrıca, kodunuzu doğrudan CodePen veya JSFiddle'a gönderebilirsiniz. Zevk almak!

SnappySnippet Chrome uzantısı

Diğer özellikler

  • HTML'yi temizler (gereksiz nitelikleri kaldırma, girintiyi düzeltme)
  • CSS'yi okunabilir hale getirmek için optimize eder
  • tamamen yapılandırılabilir (tüm filtreler kapatılabilir)
  • ile çalışır ::beforeve ::aftersözde öğeler
  • Bootstrap & Flat-UI projeleri sayesinde güzel kullanıcı arayüzü

kod

SnappySnippet açık kaynak kodludur ve kodu GitHub'da bulabilirsiniz .

uygulama

Bunu yaparken çok şey öğrendiğimden, yaşadığım bazı problemleri ve çözümlerimi paylaşmaya karar verdim, belki birisi ilginç bulacaktır.

İlk deneme - getMatchedCSSRules ()

İlk başta orijinal CSS kurallarını almayı denedim (web sitesindeki CSS dosyalarından geliyor). Oldukça şaşırtıcı, bu çok basit window.getMatchedCSSRules(), ancak iyi çalışmadı. Sorun, HTML ve CSS seçicilerinin yalnızca belgenin tamamı bağlamında eşleşen ve bir HTML pasajı bağlamında artık eşleşmeyen bir bölümünü almamızdı. Seçicileri ayrıştırmak ve değiştirmek iyi bir fikir gibi görünmediğinden, bu girişimden vazgeçtim.

İkinci deneme - getComputedStyle ()

Sonra, @CollectiveCognition'ın önerdiği bir şeyden başladım - getComputedStyle(). Ancak, gerçekten tüm stilleri satır içi yerine CSS form HTML ayırmak istedim.

Sorun 1 - CSS'yi HTML'den Ayırma

Buradaki çözüm çok güzel değil, oldukça basitti. Seçilen alt ağaçtaki tüm düğümlere kimlikler atadım ve bu kimliği uygun CSS kuralları oluşturmak için kullandım.

Sorun 2 - Özellikleri varsayılan değerlerle kaldırma

Düğümlere kimlik atamak güzel çalıştı, ancak her CSS kuralımın tüm CSS'yi okunamaz hale getiren ~ 300 özelliğe sahip olduğunu öğrendim.
Çıkıyor getComputedStyle()getiri verilen elemanı için hesaplanan tüm olası CSS özelliklerini ve değerler. Bazıları boş olduğunda, bazılarında tarayıcı varsayılan değerleri vardı. Varsayılan değerleri kaldırmak için önce tarayıcıdan almak zorunda kaldım (ve her etiketin farklı varsayılan değerleri vardır). Çözüm, web sitesinden gelen öğenin stillerini, boş bir öğeye eklenen aynı öğeyle karşılaştırmaktı <iframe>. Buradaki mantık, boş bir stil sayfası olmamasıydı <iframe>, bu yüzden eklediğim her öğenin yalnızca varsayılan tarayıcı stilleri vardı. Bu şekilde önemsiz olan özelliklerin çoğundan kurtulabildim.

Problem 3 - Sadece steno özelliklerinin korunması

Ben tespit bir sonraki şey stenografi eşdeğeri olan özellikleri gereksiz yere basılmış oldu (örneğin vardı border: solid black 1pxve sonra border-color: black;, border-width: 1pxitd.).
Bunu çözmek için sadece stenografi eşdeğeri olan özelliklerin bir listesini oluşturdum ve sonuçlardan filtreledim.

Sorun 4 - Ön ekli özellikleri kaldırma

Her kuralın özellikleri sayısı önemli ölçüde önceki işlemden sonra düşürmek oldu, ama ben çok vardı eşik tespit ettik -webkit-asla duymak ait getirdiğiniz öneki özellikleri ( -webkit-app-region? -webkit-text-emphasis-position?).
Bunlardan bazı yararlı görünüyordu çünkü (bu özelliklerin herhangi tutmalı acaba -webkit-transform-origin, -webkit-perspective-originvs.). Ancak, bunu nasıl doğrulayacağımı anlayamadım ve çoğu zaman bu özelliklerin sadece çöp olduğunu bildiğim için hepsini kaldırmaya karar verdim.

Sorun 5 - Aynı CSS Kurallarını Birleştirmek

Bir sonraki sorun, aynı CSS kurallarının tekrar tekrar tekrarlanmasıydı (örneğin, <li>aynı stilleri olan her biri için oluşturulan CSS çıktısında aynı kural vardı).
Bu sadece kuralları birbirleriyle karşılaştırma ve tam olarak aynı özellik ve değerlere sahip olan kuralları birleştirme meselesiydi. Sonuç olarak, yerine #LI_1{...}, #LI_2{...}aldım #LI_1, #LI_2 {...}.

Sorun 6 - HTML girintisini temizleme ve düzeltme

Sonuçtan memnun olduğum için HTML'ye geçtim. Çoğunlukla outerHTMLözellik tam olarak sunucudan döndürüldüğü gibi biçimlendirilmiş kalması nedeniyle bir karışıklık gibi görünüyordu . İhtiyaç duyulan
tek HTML kodu outerHTMLbasit bir kod yeniden biçimlendirmesiydi. Her IDE'de mevcut bir şey olduğundan, tam olarak bunu yapan bir JavaScript kütüphanesi olduğundan emindim. Ve haklı olduğum ortaya çıkıyor (jquery-clean) . Dahası, gereksiz niteliklerin kaldırılması ekstra var ( style, data-ng-repeatvb.).

Sorun 7 - CSS'yi kıran filtreler

Bazı durumlarda yukarıda belirtilen filtrelerin snippet'te CSS'yi bozma ihtimali olduğundan, hepsini isteğe bağlı yaptım. Bunları Ayarlar menüsünden devre dışı bırakabilirsiniz .


@KonradDzwinel, bunu bir sayfa içinde programlı olarak yapmanın bir yolunu arıyorum (Belirli bir DOM alt ağacını yazdırmak için, yeni bir pencereye kopyalayın ve print()). Bunu JS'de tek başına çağrılabilir bir işlev olarak yapmak ne kadar zor olurdu (sizin için veya birisinin repo'yu çatallamak istediği için)?
Hashbrown

@Hashbrown Bana mail atın ve detayları konuşabiliriz - bence oldukça basit olacak.
Konrad Dzwinel

@KonradDzwinel çaba için çok teşekkür ederim, ama eğer 'file_get_contents ($ url)' php fonksiyonu ile düğüm elemanını almak istersem, herhangi bir çözüm var, işte mesajım: stackoverflow.com/questions/21419857/ …
Yassine edouiri

Harika iş! ancak öğeye etki eden js kodunu eklemek mümkün müdür?
t31321

1
@KonradDzwinel birisi beni zaten dövdü: github.com/kdzwinel/SnappySnippet/issues/37 .
David Keaveny

52

Başlangıçta bu soruyu bir Chrome (veya FireFox) çözümü aradığımı sordum, ancak Internet Explorer geliştirici araçlarında bu özellikle karşılaştım. Aradığım hemen hemen (javascript hariç)

Stil ile Öğe Kaynağı

Sonuç:

Stil sonucuyla Öğe Kaynağı


5
IE11 de çalışır. Ancak bu seçeneğe doğrudan öğeye sağ tıklayarak erişilebilir.
Rodolfo Jorge Nemer Nogueira

15
Vay be, nihayet IE aygıtlarının üstün olduğu bir örnek!
dmnd

7
Denediğim en iyi çözüm, bu sayfada listelenen diğerleriyle karşılaştır. Oluşturulan CSS + HTML, orijinal css adlarını korurken süper temizdir, yani html orijinal ile aynıdır.
xoofx

Bu harika saçmalık. @Xoofx'in HTML işaretlemesinin aynı kaldığını ancak stil ile gerçekten eşleşmesi için gereken iskelet ebeveyn sarma öğelerini çıkardığını daha fazla yorumlamak istediğini doğrulayabilir.
Daniel Sokolowski

Bunu kullandım. Hızlı snippet'in düzgün çalışması (karmaşık html & css) alınamadı. Bunun gerçekten işe yaradığına inanamıyorum. Ve insanların bildiği gibi, bu özelliği sadece kaşifte görmedim.
Watson

51

Webkit tarayıcıları (FireBug hakkında emin değilim) bir öğenin HTML kodunu kolayca kopyalamanıza izin verir, bu da sürecin bir parçasıdır.

Bir öğenin HTML'sini kopyalamadan önce bunu (javascript konsolunda) çalıştırmak, verilen üst öğe ve tüm alt öğeler için hesaplanan tüm stilleri, daha sonra HTML'nin bir parçası olarak kullanılabilecek satır içi stil özelliğine taşır. .

var el = document.querySelector("#someid");
var els = el.getElementsByTagName("*");

for(var i = -1, l = els.length; ++i < l;){

    els[i].setAttribute("style", window.getComputedStyle(els[i]).cssText);

}

Bu tamamen bir kesmek ve wade için "önemsiz" css öznitelikleri bir sürü olacak, ama en azından başlamak gerekir.


3
Harika cevap, ama ... gerçek cevapla ilgisi olmayan, for ... loop sözdizimiyle ne var? Bana şaşırmış gibi geliyor.
Steve Campbell

1
Bu harika, sadece kök elemanı özlüyor. Bunu da ekleyin: el.setAttribute ("stil", window.getComputedStyle (el) .cssText);
Karman Kertesz

Chrome konsolunda .querySelector benim için null değerini döndürdü. Bu yüzden aşağıdaki şekilde değiştirin ve işe yaradı: var el = document.getElementById ("# someid"); el.setAttribute ("stil", window.getComputedStyle (el) .cssText); var els = el.getElementsByTagName ("*"); for (var i = -1, l = els.length; ++ i <l;) {els [i] .setAttribute ("stil", window.getComputedStyle (els [i]). cssText); }
Viktor Tango


25

Bu, karalama defteri adı verilen Firebug Eklentisi tarafından yapılabilir

Ayarda Javascript seçeneğini kontrol edebilirsiniz

resim açıklamasını buraya girin

Düzenle:

Bu da yardımcı olabilir

Firequark, HTML Ekran Kazıma işlemine yardımcı olmak için Firebug'un bir uzantısıdır. Firequark, Firebug (Firefox için bir web geliştirme eklentisi) kullanarak bir web sayfasından tek veya birden fazla html düğümü için css seçiciyi otomatik olarak çıkarır. Oluşturulan css seçici, bilgileri çıkarmak için Scrapi gibi html ekran sıyırıcılarına bir girdi olarak verilebilir. Firequark, html ekran kazıma kullanımı için css seçicinin gücünü ortaya çıkarmak için üretilmiştir.


Karalama defteri harika görünüyor - maalesef hem en son sürüm (1.4.5) hem de incelemelerde (1.4.3) önerilen bir önceki sürüm OSX / FF3.6.1'de benim için çalışmaz. Bu işi yapan var mı?
peteorpeter

keşke daha kesin bir şekilde kaydetmek için bir düğüm seçebilirsiniz, ama bu oldukça iyi çalıştı
kenwarner

1
Bu biraz yardımcı olur, ancak gerekli css içeren bir sayfa öğesini başka bir sayfaya taşıma ihtiyacımı çözmedi. Not Defteri, sayfanın seçilen kısmı için gerekli olsun ya da olmasın, tüm sayfaları css kopyalar ve başka bir sayfanın css ile çarpışmasını önlemek için css'in yeniden yazılmasını sağlamaz.
mc0e

13

divclip Florentin Şardan en güncellenmiş versiyonudur htmlclipper

modern geliştirmelerle: ES5, HTML5, kapsamlı CSS ...

aşağıdakilerle programlı bir stilize div çıkarabilirsiniz:

var html = require("divclip").bySel(".article-body");
console.log(html);

Zevk almak.


Muhteşem bir tane! tıkır tıkır çalışıyor! Ben sadece krom çalıştırmak böylece bazı değişiklikler yaptım. "dışa aktar" ve "zorunlu" bağımlılıkları kaldırın ve bunları krom snippet'ine kopyalayın. daha sonra konsolda, copy(divclip.bySel('.topbar'))işlenen çıktı panoya kopyalayacak yazın! ;)
ken

bir hata var: shellprod.msocdn.com/16.00.1692.002/tr-TR/JSC/O365ShellG2Plus.js:21 'DOMWindow' üzerinde 'postMessage' çalıştırılamadı: Sağlanan hedef kökeni (' portal.office.com' ) alıcı penceresinin kökeni ile eşleşmiyor ('null').
Slava

10

Eklenti gerekmez. Sadece tek bir tıklama ile Internet Explorer 11 yerel Geliştirici Araçları ile çok basit bir şekilde yapılabilir, çok temiz. Bir öğeye sağ tıklayın ve öğeyi inceleyin ve bir bloğa sağ tıklayın ve "Öğeyi stillerle kopyala" yı seçin. Aşağıdaki resimde görebilirsiniz.

Css kodunu çok temiz sağlar,

.menu { 
    margin: 0;
}
.menu li {
    list-style: none;
}

Vay canına, bu Microsoft Edge'de mükemmel çalıştı. Htmlclipper ve snappysnippet'i denedim, ancak kopyalamaya çalıştığım öğelerin yanıt verebilirliğini koruma sorunları vardı.
Matt

Bu inanılmaz, mükemmel iyi çalışıyor.
snit80

5

Son zamanlarda, denetlenen öğeyi, html'yi ve yalnızca ilgili css ve medya sorgularını bir sayfadan kopyalamak için bir krom uzantısı "eXtract Snippet" oluşturdum. Bunun size gerçek ilgili CSS'yi vereceğini unutmayın

https://chrome.google.com/webstore/detail/extract-snippet/bfcjfegkgdoomgmofhcidoiampnpbdao?hl=en


Bunun orijinaldeki gibi tüm seçicileri nasıl tuttuğunu seviyorum.
hajamie

1
snappy snippet chrome uzantısıyla nasıl karşılaştırılır?
Patoshi シ ト シ

3

Bunun için tek bir çözümü olan bir araç bilmiyorum, ancak Firebug ve Web Developer uzantısını aynı anda kullanabilirsiniz.

Hangi css'nin bir öğe ile ilişkili olduğunu görmek için ihtiyacınız olan html bölümünü (Element Inspect) ve Web Developer'ı kopyalamak için Firebug'u kullanın (Web Developer'ı "Stil Bilgilerini Görüntüle" olarak adlandırın - Firebug'un "Inspect Element" gibi çalışır, ancak html'yi göstermek yerine) işaretleme, bu işaretlemeyle ilişkili CSS'yi gösterir).

Tam olarak istediğiniz şey değil (her şey için tek bir tıklama), ancak oldukça yakın ve en azından sezgisel.

Web Geliştirici Uzantısından kaynaklanan 'Stil Bilgilerini Görüntüle' sonucu


Yaptığım şey bu, ancak her öğe için CSS'nin manuel olarak kopyalanmasını içerir. Ben OP ideal istediğini düşünüyorum bir öğeyi ve tüm iç içe öğeleri etkileyen CSS stilleri kopyalayabilirsiniz - HTML için yaptığınız gibi tek seferde kopyalama.
Muhd

3

Firebug'da da bu özelliğe ihtiyacım var! O zamana kadar başka bir yaklaşım, sınıfları kaldırmak ve css'i satır içi stillere dönüştürmek için bu çevrimiçi hizmeti kullanmaktır .


3

http://clipboardjs.com bunu ve oldukça iyi yapıyor. Kopyalanan sürümden beklentiniz tam olarak orijinalinde olduğu gibi, onunla oynayabilir ve öğrenebilirsiniz, ancak gerçekçi olmayabilir.


2

Sadece web sayfasından istediğiniz bölümü kopyalayın ve wysiwyg editörüne yapıştırın. Düzenleyici araç çubuğundaki "kaynak" düğmesini tıklayarak html kaynağını kontrol edin.

Bir Drupal sitesinde çalışırken en kolay yolu buldum. Wysiwyg CKeditor kullanıyorum.


2
jQuery.fn.extend({
getStyles: function() {
    var rulesUsed = [];
    var sheets = document.styleSheets;
    for (var c = 0; c < sheets.length; c++) {
        var rules = sheets[c].rules || sheets[c].cssRules;
        for (var r = 0; r < rules.length; r++) {
            var selectorText = rules[r].selectorText.toLowerCase().replace(":hover","");
            if (this.is(selectorText) || this.find(selectorText).length > 0) {
                rulesUsed.push(rules[r]);
            }
        }
    }
    var style = rulesUsed.map(function(cssRule) {
        return cssRule.selectorText.toLowerCase() + ' { ' + cssRule.style.cssText.toLowerCase() + ' }';
    }).join("\n");
    return style;
}
});

kullanımı:$("#login_wrapper").getStyles()


Benim ihtiyacım için, bu oldukça umut verici görünüyor, çünkü getComputedStyle sınırlamalarını önler. Ben sadece css gerçek metin almak için nasıl kullanılacağından emin olmak için bir javascript çaylak çok.
mc0e

Kullanmak kullanımını değiştirdik jQueryyerine $bana biraz yol alır, ama şimdi olsun SecurityError: The operation is insecure. herhangi işaretçiler?
mc0e

0

En çok oy alan yanıtı sürüklenebilir bir yer imi olarak uyarladım.

Bu sayfayı ziyaret edin ve "jQuery Kodunu Çalıştır" düğmesini yer işareti çubuğunuza sürükleyin.


1
Hata verir: Hata: Sözdizimi Hata: belirsiz dize değişmez
Barney

@Barney: Yani, cevabı oraya kopyalamalı ve bundan bir pasaj yapmalısın. cevap değil, ama bir cevap yerine yorum yapmayı öneriyorum
Mo Hrad A


0

Burada cevap olarak bahsedilen tüm araçları inceledim. Ama baktığınız güzel yüzü ile tekrarlanan, kirli HTML CSS veriyorlar. Sana JS vermiyorlar.

Ne yaptığım:

  1. İlk olarak sayfada gerekli olmayan reklamlara filtre uygularım
  2. Ardından, tüm web sayfasını bağlantı kaynakları ile birlikte kaydedin.
  3. Gereksiz HTML, CSS ve JS'yi kaldırın
  4. bağlantıların kaynaklarını tek tek dikkatlice tutun.
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.