কোনও উপাদানটিতে প্রযোজ্য সমস্ত সিএসএস বিধি সন্ধান করুন


87

অনেক সরঞ্জাম / এপিআই নির্দিষ্ট শ্রেণি বা আইডির উপাদান নির্বাচন করার উপায় সরবরাহ করে। ব্রাউজার দ্বারা লোড করা কাঁচা স্টাইলশিটগুলিও পরীক্ষা করা সম্ভব।

যাইহোক, ব্রাউজারগুলির জন্য কোনও উপাদান রেন্ডার করার জন্য, তারা সমস্ত সিএসএস বিধি (সম্ভবত বিভিন্ন স্টাইলশিট ফাইল থেকে) সংকলন করবে এবং এটি উপাদানটিতে প্রয়োগ করবে। এটি আপনি ফায়ারব্যাগ বা ওয়েবকিট পরিদর্শকের সাথে দেখেন - কোনও উপাদানের জন্য সম্পূর্ণ সিএসএস উত্তরাধিকার গাছ।

অতিরিক্ত ব্রাউজার প্লাগইনগুলির প্রয়োজন ছাড়াই আমি কীভাবে খাঁটি জাভাস্ক্রিপ্টে এই বৈশিষ্ট্যটি পুনরুত্পাদন করতে পারি?

আমি যা খুঁজছি তার জন্য সম্ভবত একটি উদাহরণ কিছু ব্যাখ্যা প্রদান করতে পারে:

<style type="text/css">
    p { color :red; }
    #description { font-size: 20px; }
</style>

<p id="description">Lorem ipsum</p>

এখানে পি # বর্ণনার উপাদানটিতে দুটি সিএসএস বিধি প্রয়োগ করা হয়েছে: একটি লাল রঙ এবং একটি ফন্টের আকার 20 পিক্সেল।

আমি উত্সটি খুঁজতে চাই যেগুলি থেকে এই গণনা করা সিএসএস বিধিগুলি উত্পন্ন হয়েছে (রঙ আসে পি নিয়ম এবং তেমন)।



ব্রাউজার এবং ব্যবহারকারীর মধ্যে ব্রাউজার বিকাশকারী সরঞ্জামগুলি দেখুন (যেমন Chrome এ উপাদানগুলির ট্যাব)?
রনি রয়স্টন

উত্তর:


77

যেহেতু এই প্রশ্নের বর্তমানে কোনও লাইটওয়েট (গ্রন্থাগারবিহীন) নেই, ক্রস ব্রাউজারের সামঞ্জস্যপূর্ণ উত্তর নেই, তাই আমি একটি উত্তর দেওয়ার চেষ্টা করব:

function css(el) {
    var sheets = document.styleSheets, ret = [];
    el.matches = el.matches || el.webkitMatchesSelector || el.mozMatchesSelector 
        || el.msMatchesSelector || el.oMatchesSelector;
    for (var i in sheets) {
        var rules = sheets[i].rules || sheets[i].cssRules;
        for (var r in rules) {
            if (el.matches(rules[r].selectorText)) {
                ret.push(rules[r].cssText);
            }
        }
    }
    return ret;
}

জেএসফিডাল: http://jsfiddle.net/HP326/6/

কলিং css(document.getElementById('elementId'))প্রতিটি সিএসএস নিয়মের জন্য একটি উপাদান সহ একটি অ্যারের প্রদান করবে যা উত্তীর্ণ উপাদানটির সাথে মিলবে। আপনি যদি প্রতিটি নিয়ম সম্পর্কে আরও সুনির্দিষ্ট তথ্য জানতে চান তবে CSSRule অবজেক্ট ডকুমেন্টেশনটি দেখুন check


4
a.matchesএই লাইন সংজ্ঞায়িত হয়: a.matches = a.matches || a.webkitMatchesSelector || a.mozMatchesSelector || a.msMatchesSelector || a.oMatchesSelector। এর অর্থ হ'ল, যদি ডিওএম নোডের জন্য ইতিমধ্যে একটি (মানক) "ম্যাচ" পদ্ধতি আছে তবে এটি সেটিকে ব্যবহার করবে, অন্যথায় এটি ওয়েবকিট নির্দিষ্ট একটি (ওয়েবকিটম্যাচসলেক্টর), তারপরে মজিলা, মাইক্রোসফ্ট এবং অপেরা ব্যবহার করার চেষ্টা করে। আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন: developer.mozilla.org/en/docs/Web/API/Element/matches
এসবি

4
দুর্ভাগ্যক্রমে, আমি মনে করি এই বিকল্পটি সিএসএসের সমস্ত নিয়ম সনাক্ত করতে পারে না যা শিশুদের পিতামাতার উপাদান থেকে ক্যাসকেড করে। ফিডল: jsfiddle.net/t554xo2L এই ক্ষেত্রে, উল রুল (যা উপাদানটির সাথে প্রযোজ্য) রক্ষণif (a.matches(rules[r].selectorText)) শর্তের সাথে মেলে না ।
ফানফর্মগুলি 6'15

4
আমি কখনই দাবি করি নি যে এটি তালিকাভুক্ত / উত্তরাধিকারসূত্রে / সিএসএস বিধিগুলি তালিকাভুক্ত করেছে - এটি যা করে তা হ'ল সিএসএস বিধিগুলির তালিকা যা উত্তীর্ণ উপাদানগুলির সাথে মেলে। আপনি যদি সেই উপাদানটির জন্য উত্তরাধিকার সূত্রেও পেতে চান তবে আপনার সম্ভবত ডিওএমকে উপরের দিকে যেতে হবে এবং css()প্যারেন্ট উপাদানগুলির প্রত্যেককে কল করতে হবে।
এসবি

4
আমি জানি :-) আমি কেবল এটি উল্লেখ করতে চেয়েছিলাম যেহেতু এই প্রশ্নটি অনুসন্ধান করতে পারে এমন লোকেরা ধরে নিতে পারে যে এটি 'উপাদানগুলির সাথে প্রযোজ্য সমস্ত সিএসএস বিধি' পেয়েছে, যেমন প্রশ্নের শিরোনামটি বলে, যা এটি নয় ।
ফানফর্মগুলি 6'15

4
আপনি যদি উত্তরাধিকার সূত্রে প্রাপ্ত উপাদানগুলি সহ সমস্ত বিধি প্রয়োগ করতে চান তবে আপনার getComputesStyle ব্যবহার করা উচিত। এর আলোকে, আমি এই উত্তরটি সঠিক বলে মনে করি এবং পিতামাতার উত্তরাধিকার সূত্রে প্রাপ্ত শৈলীগুলি অন্তর্ভুক্ত করা ঠিক নয় (উদাহরণস্বরূপ পিতামাতার কাছে পাঠ্য বর্ণিত রঙ)। যদিও এতে অন্তর্ভুক্ত নেই, সেগুলি মিডিয়া প্রশ্নের সাথে শর্তাধীন প্রয়োগ করা হয়।
কাঁপানো

24

সম্পাদনা: এই উত্তরটি এখন অবচয় করা হয়েছে এবং Chrome 64+ এ আর কাজ করে না । Historicalতিহাসিক প্রসঙ্গে ছেড়ে চলেছে ving বাস্তবে এটি ব্যবহারের বিকল্প সমাধানের জন্য বাগ রিপোর্টটি এই প্রশ্নের সাথে আবার লিঙ্ক করে।


মনে হয় আমি আরও এক ঘন্টা গবেষণার পরে নিজের প্রশ্নের উত্তর দিতে পেরেছি।

এটি এর মতোই সহজ:

window.getMatchedCSSRules(document.getElementById("description"))

(ওয়েবকিট / ক্রোমে কাজ করে, সম্ভবত অন্যরাও)


4
তবে এটি কেবল ক্রোম দ্বারা সমর্থিত হলে এটি খুব বেশি ব্যবহারযোগ্য নয়। এটি সমস্ত দর্শকের 5% এরও কম (ডেমোগ্রাফিকের উপর নির্ভর করে) কাজ করবে।
তোমাসি

4
@ ডায়ামন্ডিভ: জুন ২০১২ পর্যন্ত, ক্রোম ব্যবহারের পরিমাণ বেড়েছে ৩২% এর বেশি (এবং আইই ব্যবহারের তুলনায় কিছুটা বেশি!) gs.statcounter.com
রায় টিঙ্কার

6
getMatchedCSSRules আপনাকে চূড়ান্ত শৈলীগুলি প্রদর্শন করে না যা উপাদানটিতে প্রয়োগ হয়। এটি সমস্ত CSSStyleRule অবজেক্টের একটি অ্যারে প্রদান করে যা তারা প্রদর্শিত হয় সেই ক্রমে প্রয়োগ করে। আপনি যদি সিএসএস মিডিয়া ক্যোয়ারীগুলির মাধ্যমে প্রতিক্রিয়াশীল ওয়েব ডিজাইন করেন বা একাধিক স্টাইল শীট (যেমন আই এর মতো) লোড করেন তবে আপনার প্রতিটি শৈলীর জন্য ফিরে আসা প্রতিটি স্টাইলের মধ্য দিয়ে লুপ করতে হবে এবং প্রতিটি নিয়মের জন্য সিএসএসের নির্দিষ্টতা গণনা করতে হবে। তারপরে প্রযোজ্য চূড়ান্ত নিয়মগুলি গণনা করুন। ব্রাউজারটি প্রাকৃতিকভাবে যা করে তা আপনাকে পুনরুত্পাদন করতে হবে। আপনার উদাহরণে এটি প্রমাণ করার জন্য, আপনার শৈলীর ঘোষণার শুরুতে "p {রঙ: নীল! গুরুত্বপূর্ণ}" প্রিপেন্ড করুন।
mrbinky3000


4
এটি অবশেষে ক্রোম
63৩ এ

20

সংক্ষিপ্ত সংস্করণ 12 এপ্রিল 2017

চ্যালেঞ্জার হাজির।

var getMatchedCSSRules = (el, css = el.ownerDocument.styleSheets) => 
    [].concat(...[...css].map(s => [...s.cssRules||[]])) /* 1 */
    .filter(r => el.matches(r.selectorText));            /* 2 */

লাইন /* 1 */সমস্ত নিয়মের সমতল অ্যারে তৈরি করে।
লাইন /* 2 */মেলানো নিয়ম বাতিল করে।

একই পৃষ্ঠায় @ এসবি দ্বারা ফাংশনেরcss(el) ভিত্তিতে ।

উদাহরণ 1

var div = iframedoc.querySelector("#myelement");
var rules = getMatchedCSSRules(div, iframedoc.styleSheets);
console.log(rules[0].parentStyleSheet.ownerNode, rules[0].cssText);

উদাহরণ 2

var getMatchedCSSRules = (el, css = el.ownerDocument.styleSheets) => 
    [].concat(...[...css].map(s => [...s.cssRules||[]]))
    .filter(r => el.matches(r.selectorText));

function Go(big,show) {
    var r = getMatchedCSSRules(big);
PrintInfo:
    var f = (dd,rr,ee="\n") => dd + rr.cssText.slice(0,50) + ee;
    show.value += "--------------- Rules: ----------------\n";
    show.value += f("Rule 1:   ", r[0]);
    show.value += f("Rule 2:   ", r[1]);
    show.value += f("Inline:   ", big.style);
    show.value += f("Computed: ", getComputedStyle(big), "(…)\n");
    show.value += "-------- Style element (HTML): --------\n";
    show.value += r[0].parentStyleSheet.ownerNode.outerHTML;
}

Go(...document.querySelectorAll("#big,#show"));
.red {color: red;}
#big {font-size: 20px;}
<h3 id="big" class="red" style="margin: 0">Lorem ipsum</h3>
<textarea id="show" cols="70" rows="10"></textarea>

ত্রুটি

  • কোন মিডিয়া হ্যান্ডলিং, কোন @import, @media
  • ক্রস-ডোমেন স্টাইলশিটগুলি থেকে লোড হওয়া শৈলীতে অ্যাক্সেস নেই।
  • নির্বাচক দ্বারা নির্দিষ্ট বাছাই "নির্দিষ্টতা" (গুরুত্বের ক্রম)।
  • পিতামাতার কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত কোনও স্টাইল নেই।
  • পুরানো বা প্রাথমিক ব্রাউজারগুলির সাথে কাজ করতে পারে না।
  • এটি সিউডো-ক্লাস এবং সিউডো-বাছাইকারীদের সাথে কীভাবে মোকাবিলা করে তা নিশ্চিত নয় তবে ঠিক আছে বলে মনে হয়।

হয়তো আমি একদিন এই ত্রুটিগুলি সমাধান করব।

দীর্ঘ সংস্করণ 12 আগস্ট 2018

কারওর গিটহাব পৃষ্ঠা (বাগজিল্লার মাধ্যমে এই মূল কোডটি থেকে ফোরকড ) থেকে নেওয়া এখানে আরও ব্যাপক বাস্তবায়ন । গেকো এবং আইইয়ের জন্য লেখা, তবে এটি ব্লিঙ্কের সাথেও কাজ করার গুজব।

4 মে 2017: সুনির্দিষ্ট ক্যালকুলেটরের সমালোচনামূলক বাগ রয়েছে যা আমি এখন ঠিক করেছি। (লেখকদের আমি জানাতে পারি না কারণ আমার কাছে গিটহাব অ্যাকাউন্ট নেই))

12 আগস্ট 2018: সাম্প্রতিক ক্রোম আপডেটগুলি thisস্বাধীন ভেরিয়েবলগুলিকে নির্ধারিত পদ্ধতি থেকে ডিকপলড অবজেক্ট স্কোপ ( ) বলে মনে হয়েছে । সুতরাং অনুরোধ matcher(selector)কাজ বন্ধ করে দিয়েছে। এটির পরিবর্তে এটি matcher.call(el, selector)সমাধান হয়েছে।

// polyfill window.getMatchedCSSRules() in FireFox 6+
if (typeof window.getMatchedCSSRules !== 'function') {
    var ELEMENT_RE = /[\w-]+/g,
            ID_RE = /#[\w-]+/g,
            CLASS_RE = /\.[\w-]+/g,
            ATTR_RE = /\[[^\]]+\]/g,
            // :not() pseudo-class does not add to specificity, but its content does as if it was outside it
            PSEUDO_CLASSES_RE = /\:(?!not)[\w-]+(\(.*\))?/g,
            PSEUDO_ELEMENTS_RE = /\:\:?(after|before|first-letter|first-line|selection)/g;
        // convert an array-like object to array
        function toArray(list) {
            return [].slice.call(list);
        }

        // handles extraction of `cssRules` as an `Array` from a stylesheet or something that behaves the same
        function getSheetRules(stylesheet) {
            var sheet_media = stylesheet.media && stylesheet.media.mediaText;
            // if this sheet is disabled skip it
            if ( stylesheet.disabled ) return [];
            // if this sheet's media is specified and doesn't match the viewport then skip it
            if ( sheet_media && sheet_media.length && ! window.matchMedia(sheet_media).matches ) return [];
            // get the style rules of this sheet
            return toArray(stylesheet.cssRules);
        }

        function _find(string, re) {
            var matches = string.match(re);
            return matches ? matches.length : 0;
        }

        // calculates the specificity of a given `selector`
        function calculateScore(selector) {
            var score = [0,0,0],
                parts = selector.split(' '),
                part, match;
            //TODO: clean the ':not' part since the last ELEMENT_RE will pick it up
            while (part = parts.shift(), typeof part == 'string') {
                // find all pseudo-elements
                match = _find(part, PSEUDO_ELEMENTS_RE);
                score[2] += match;
                // and remove them
                match && (part = part.replace(PSEUDO_ELEMENTS_RE, ''));
                // find all pseudo-classes
                match = _find(part, PSEUDO_CLASSES_RE);
                score[1] += match;
                // and remove them
                match && (part = part.replace(PSEUDO_CLASSES_RE, ''));
                // find all attributes
                match = _find(part, ATTR_RE);
                score[1] += match;
                // and remove them
                match && (part = part.replace(ATTR_RE, ''));
                // find all IDs
                match = _find(part, ID_RE);
                score[0] += match;
                // and remove them
                match && (part = part.replace(ID_RE, ''));
                // find all classes
                match = _find(part, CLASS_RE);
                score[1] += match;
                // and remove them
                match && (part = part.replace(CLASS_RE, ''));
                // find all elements
                score[2] += _find(part, ELEMENT_RE);
            }
            return parseInt(score.join(''), 10);
        }

        // returns the heights possible specificity score an element can get from a give rule's selectorText
        function getSpecificityScore(element, selector_text) {
            var selectors = selector_text.split(','),
                selector, score, result = 0;
            while (selector = selectors.shift()) {
                if (matchesSelector(element, selector)) {
                    score = calculateScore(selector);
                    result = score > result ? score : result;
                }
            }
            return result;
        }

        function sortBySpecificity(element, rules) {
            // comparing function that sorts CSSStyleRules according to specificity of their `selectorText`
            function compareSpecificity (a, b) {
                return getSpecificityScore(element, b.selectorText) - getSpecificityScore(element, a.selectorText);
            }

            return rules.sort(compareSpecificity);
        }

        // Find correct matchesSelector impl
        function matchesSelector(el, selector) {
          var matcher = el.matchesSelector || el.mozMatchesSelector || 
              el.webkitMatchesSelector || el.oMatchesSelector || el.msMatchesSelector;
          return matcher.call(el, selector);
        }

        //TODO: not supporting 2nd argument for selecting pseudo elements
        //TODO: not supporting 3rd argument for checking author style sheets only
        window.getMatchedCSSRules = function (element /*, pseudo, author_only*/) {
            var style_sheets, sheet, sheet_media,
                rules, rule,
                result = [];
            // get stylesheets and convert to a regular Array
            style_sheets = toArray(window.document.styleSheets);

            // assuming the browser hands us stylesheets in order of appearance
            // we iterate them from the beginning to follow proper cascade order
            while (sheet = style_sheets.shift()) {
                // get the style rules of this sheet
                rules = getSheetRules(sheet);
                // loop the rules in order of appearance
                while (rule = rules.shift()) {
                    // if this is an @import rule
                    if (rule.styleSheet) {
                        // insert the imported stylesheet's rules at the beginning of this stylesheet's rules
                        rules = getSheetRules(rule.styleSheet).concat(rules);
                        // and skip this rule
                        continue;
                    }
                    // if there's no stylesheet attribute BUT there IS a media attribute it's a media rule
                    else if (rule.media) {
                        // insert the contained rules of this media rule to the beginning of this stylesheet's rules
                        rules = getSheetRules(rule).concat(rules);
                        // and skip it
                        continue
                    }

                    // check if this element matches this rule's selector
                    if (matchesSelector(element, rule.selectorText)) {
                        // push the rule to the results set
                        result.push(rule);
                    }
                }
            }
            // sort according to specificity
            return sortBySpecificity(element, result);
        };
}

স্থির বাগ

  • = match+= match
  • return re ? re.length : 0;return matches ? matches.length : 0;
  • _matchesSelector(element, selector)matchesSelector(element, selector)
  • matcher(selector)matcher.call(el, selector)

GetSheetRules এ আমাকে যুক্ত করতে হয়েছিল যদি (স্টাইলশীট.এস.সি.আরুলস === নাল) {ফেরত [] it এটি আমার পক্ষে কাজ করার জন্য।
জলের

"দীর্ঘ সংস্করণ" পরীক্ষা করেছেন। আমার জন্য কাজ কর. খুব খারাপ getMatchedCSSRules () ব্রাউজারগুলির দ্বারা কখনও স্ট্যান্ডার্ড করা হয়নি।
কলিন মক

এই, এইচ 1 এবং এইচ 1, ডিভ - যেখানে একই হিসাবে শেষ ঘোষিত একজন ব্যবহার করা উচিত, যেমন একই বৈশিষ্ট্যের সাথে দুটি নির্বাচককে কীভাবে পরিচালনা করবে?
স্টেলান

ছদ্মবেশটি আমরা এখানে ছদ্ম ব্যবহারের জন্য কিছু ধারণা পেতে পারি? github.com/dvtng/jss/blob/master/jss.js
mr1031011

19

এই লাইব্রেরিটি একবার দেখুন, যা যা চেয়েছিল তা করে: http://www.brothercake.com/site/resources/scriptts/cssutilities/

এটি আইই 6 এর ঠিক পিছনে সমস্ত আধুনিক ব্রাউজারে কাজ করে, আপনাকে ফায়ারবাগের মতো নিয়ম এবং সম্পত্তি সংগ্রহ প্রদান করতে পারে (বাস্তবে এটি ফায়ারবগের চেয়ে বেশি নির্ভুল), এবং কোনও নিয়মের আপেক্ষিক বা নিখুঁত সুনির্দিষ্টতাও গণনা করতে পারে। একমাত্র সতর্কতা হ'ল যদিও এটি স্থির মিডিয়া প্রকারগুলি বোঝে, তবে এটি মিডিয়া-কোয়েরিগুলি বুঝতে পারে না।


এই মডিউলটি সত্যিই দুর্দান্ত, কেবল আশা করি এটি লেখকের আরও ভালবাসা পাবে।
mr1031011

4

এসবি এর উত্তরের একটি সংস্করণ এখানে মিডিয়ার প্রশ্নের সাথে মিলে যাওয়া বিধিগুলিও সরবরাহ করে। আমি *.rules || *.cssRulesএকত্রিতকরণ এবং.matches বাস্তবায়ন অনুসন্ধানকারী ; একটি পলিফিল যুক্ত করুন বা আপনার যদি প্রয়োজন হয় তবে সেই লাইনগুলি আবার যুক্ত করুন।

এই সংস্করণটি CSSStyleRuleনিয়মের পাঠ্যের পরিবর্তে বস্তুগুলিও ফেরত দেয় । আমি মনে করি এটি কিছুটা বেশি কার্যকর, যেহেতু নিয়মের সুনির্দিষ্ট বিবরণগুলি আরও সহজে প্রোগ্রামেমেটিকভাবে এই পদ্ধতিতে অনুসন্ধান করা যেতে পারে।

কফি:

getMatchedCSSRules = (element) ->
  sheets = document.styleSheets
  matching = []

  loopRules = (rules) ->
    for rule in rules
      if rule instanceof CSSMediaRule
        if window.matchMedia(rule.conditionText).matches
          loopRules rule.cssRules
      else if rule instanceof CSSStyleRule
        if element.matches rule.selectorText
          matching.push rule
    return

  loopRules sheet.cssRules for sheet in sheets

  return matching

জেএস:

function getMatchedCSSRules(element) {
  var i, len, matching = [], sheets = document.styleSheets;

  function loopRules(rules) {
    var i, len, rule;

    for (i = 0, len = rules.length; i < len; i++) {
      rule = rules[i];
      if (rule instanceof CSSMediaRule) {
        if (window.matchMedia(rule.conditionText).matches) {
          loopRules(rule.cssRules);
        }
      } else if (rule instanceof CSSStyleRule) {
        if (element.matches(rule.selectorText)) {
          matching.push(rule);
        }
      }
    }
  };

  for (i = 0, len = sheets.length; i < len; i++) {
    loopRules(sheets[i].cssRules);
  }

  return matching;
}

কীভাবে পাশ করা বাচ্চাদের জন্য এটি ব্যবহার করা যেতে পারে element?
ক্রাগলন

4
আপনার ব্যবহারের ক্ষেত্রে কী? এটি কোথায় কার্যকর হবে তা আমি সত্যিই দেখতে পাচ্ছি না, যেহেতু শিশুদের ক্ষেত্রে প্রযোজ্য বিধিগুলি পিতামাতার পক্ষে প্রযোজ্য নয়। আপনি কেবলমাত্র সাধারণ কোনও কিছুই না রেখে নিয়মের একটি গাদা দিয়ে শেষ করতে চাইবেন। আপনি যদি সত্যিই চান যে আপনি কেবল বাচ্চাদের উপর পুনরাবৃত্তি করতে পারেন এবং প্রত্যেকের জন্য এই পদ্ধতিটি চালাতে পারেন, এবং সমস্ত ফলাফলের একটি অ্যারে তৈরি করতে পারেন।
কাঁপানো

আমি কেবল cloneNode(true)কার্যকারিতা তৈরি করার চেষ্টা করছি তবে স্টাইলিংয়ের সাথে আরও গভীর ক্লোন করা রয়েছে।
ক্রাগালন

4
এই শর্তটি: যদি (উইন্ডো.ম্যাচমিডিয়া (নিয়ম। কন্ডিশনটেক্সট)। ম্যাচগুলি) rule ... my আমার ক্ষেত্রে একটি ম্যাচ প্রতিরোধ করে যেহেতু "नियमকোন্ডিশনটেক্সট" অপরিজ্ঞাত ছিল। এটি ছাড়া, এটি কাজ করে। আপনি এটিকে নিউজ.ইম্বোনেটর ডটকম-এ পরীক্ষা করে দেখতে পারেন । "স্প্যান.পেজটপ বি" এর একটি মিডিয়া ক্যোয়ারী রুল রয়েছে যা আপনার ফাংশনের সাথে যেমন হয় তেমন মেলে না।
আইয়াল জেলস

4
ক্রোম CSSMediaRule দৃষ্টান্তগুলিতে শর্ত পাঠের সম্পত্তিটিকে সমর্থন করে না।
ম্যাকিল

3

এখানে আমার getMatchedCSSRulesক্রিয়াকলাপের সংস্করণ যা কোয়েরিকে সমর্থন করে @media

const getMatchedCSSRules = (el) => {
  let rules = [...document.styleSheets]
  rules = rules.filter(({ href }) => !href)
  rules = rules.map((sheet) => [...(sheet.cssRules || sheet.rules || [])].map((rule) => {
    if (rule instanceof CSSStyleRule) {
      return [rule]
    } else if (rule instanceof CSSMediaRule && window.matchMedia(rule.conditionText)) {
      return [...rule.cssRules]
    }
    return []
  }))
  rules = rules.reduce((acc, rules) => acc.concat(...rules), [])
  rules = rules.filter((rule) => el.matches(rule.selectorText))
  rules = rules.map(({ style }) => style)
  return rules
}

1

var GetMatchedCSSRules = (elem, css = document.styleSheets) => Array.from(css)
  .map(s => Array.from(s.cssRules).filter(r => elem.matches(r.selectorText)))
  .reduce((a,b) => a.concat(b));

function Go(paragraph, print) {
  var rules = GetMatchedCSSRules(paragraph);
PrintInfo:
  print.value += "Rule 1: " + rules[0].cssText + "\n";
  print.value += "Rule 2: " + rules[1].cssText + "\n\n";
  print.value += rules[0].parentStyleSheet.ownerNode.outerHTML;
}

Go(document.getElementById("description"), document.getElementById("print"));
p {color: red;}
#description {font-size: 20px;}
<p id="description">Lorem ipsum</p>
<textarea id="print" cols="50" rows="12"></textarea>


4
আমার উত্তরের পুরানো সংস্করণের অর্থহীন নকল । কেবল পৃষ্ঠাটি দূষিত করছে। সম্পূর্ণ এবং আপ টু ডেট সংস্করণ: এখানে
7vujy0f0hy

1

আইই 9+ নিশ্চিত করে, আমি একটি ফাংশন লিখেছিলাম যা অনুরোধকৃত উপাদান এবং তার বাচ্চাদের জন্য সিএসএস গণনা করে এবং নীচে স্নিপেটে প্রয়োজনে এটি একটি নতুন ক্লাসনেমে সংরক্ষণের সম্ভাবনা দেয়।

/**
  * @function getElementStyles
  *
  * Computes all CSS for requested HTMLElement and its child nodes and applies to dummy class
  *
  * @param {HTMLElement} element
  * @param {string} className (optional)
  * @param {string} extras (optional)
  * @return {string} CSS Styles
  */
function getElementStyles(element, className, addOnCSS) {
  if (element.nodeType !== 1) {
    return;
  }
  var styles = '';
  var children = element.getElementsByTagName('*');
  className = className || '.' + element.className.replace(/^| /g, '.');
  addOnCSS = addOnCSS || '';
  styles += className + '{' + (window.getComputedStyle(element, null).cssText + addOnCSS) + '}';
  for (var j = 0; j < children.length; j++) {
    if (children[j].className) {
      var childClassName = '.' + children[j].className.replace(/^| /g, '.');
      styles += ' ' + className + '>' + childClassName +
        '{' + window.getComputedStyle(children[j], null).cssText + '}';
    }
  }
  return styles;
}

ব্যবহার

getElementStyles(document.getElementByClassName('.my-class'), '.dummy-class', 'width:100%;opaity:0.5;transform:scale(1.5);');

4
1. আপনি পুরো computeStylesদ্বারা সাবউরটিন প্রতিস্থাপন করতে পারেন el => getComputedStyle(el).cssText। প্রমাণ: বেহালার২. '.' + element.className একটি ত্রুটিযুক্ত নির্মাণ কারণ এটি এক শ্রেণির নামের অস্তিত্ব ধরে নিয়েছে। বৈধ নির্মাণ হয় element.className.replace(/^| /g, '.')৩. আপনার ফাংশনটি কেবল ক্লাসগুলির চেয়ে অন্যান্য সিএসএস নির্বাচকদের সম্ভাবনা উপেক্ষা করে। ৪. আপনার পুনরাবৃত্তি ইচ্ছামত এক মাত্রায় সীমাবদ্ধ (শিশু তবে নাতি নাতনি)। ৫. ব্যবহার: কোনও নেই getElementByClassName, কেবলমাত্র getElementsByClassName(একটি অ্যারে প্রদান করে)।
7vujy0f0hy

1

আমি মনে করি এসবি এর উত্তর এই মুহুর্তে গৃহীত হওয়া উচিত তবে এটি সঠিক নয়। এটি কয়েকবার উল্লেখ করা হয়েছে যে কিছু নিয়ম রয়েছে যা মিস হতে পারে। এর মুখোমুখি হয়ে, আমি সিদ্ধান্ত নিয়েছি। একমাত্র বিষয় হ'ল উপাদানগুলির অনন্য পরিচয় প্রয়োজন যা আপনি খুঁজছেন তার সাথে তুলনা করতে। বেশিরভাগ ক্ষেত্রেই আমি মনে করি যে এটির আইডি একটি অনন্য মান হিসাবে সেট করেই অর্জনযোগ্য। এইভাবে আপনি মিলে যাওয়া উপাদানটিকে নিজের বলে চিহ্নিত করতে পারেন। আপনি যদি ডকুমেন্ট.কোয়ারী নির্বাচনের ফলাফলের সাথে মেলে একটি সাধারণ উপায় সম্পর্কে ভাবতে পারেন তবে আপনি যে উপাদানটির সন্ধান করছেন সেটির সাথে মূলত getMatchedCSSRules এর সম্পূর্ণ পলিফিল হবে।

আমি ডকুমেন্ট.কোয়ারী নির্বাচনকারী সমস্তটির জন্য পারফরম্যান্সটি পরীক্ষা করে দেখলাম যেহেতু এটি সম্ভবত এলিমেন্টের তুলনায় খুব ধীর is আমি দেখতে পাচ্ছি যে এটি প্রায় 0.001 মিলিসেকেন্ডে লাগে।

আমি সিএসএস ইউটিলিটিস লাইব্রেরিটিও পেয়েছি যা বিজ্ঞাপন দেয় যে এটি এটি করতে পারে তবে আমি এটি পুরানো বোধ করি এবং কিছুক্ষণের মধ্যে আপডেট করা হয়নি। এর উত্স কোডটি দেখে, এটি আমার মনে হয় যে এটির কোনও ঘটনা হারিয়েছে।


সিএসএস ইউটিলিটিগুলি সত্যই পুরানো, তবে এটি সিউডো রাজ্যের নিয়মগুলিও ফিরিয়ে দেয় (উদাহরণস্বরূপ এটি হোভারের নিয়মগুলি ফিরিয়ে দিতে পারে)। আমি এখানে এমন কোনও উত্তর খুঁজে পাইনি যা সিউডো রাষ্ট্রটিকে সম্বোধন করে।
mr1031011
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.