কীভাবে জাভাস্ক্রিপ্টে গতিশীলভাবে সিএসএস ক্লাস তৈরি করা যায় এবং প্রয়োগ করা যায়?


298

আমার জাভাস্ক্রিপ্টে গতিশীলভাবে একটি সিএসএস স্টাইলশিট শ্রেণি তৈরি করা দরকার এবং এটি কয়েকটি HTML উপাদান যেমন - ডিভ, টেবিল, স্প্যান, টিআর, এবং এএসপি: টেক্সটবক্স, ড্রপডাউনলিস্ট এবং ড্যাটালিস্টের মতো কিছু নিয়ন্ত্রণে অর্পণ করা দরকার।

এটা কি সম্ভব?

এটি একটি নমুনা দিয়ে ভাল হবে।


2
কটাক্ষপাত করা github.com/Box9/jss
jedierikb

উত্তর:


394

যদিও আপনি জাভাস্ক্রিপ্ট দিয়ে সিএসএস ক্লাস তৈরি করতে চান তা আমি নিশ্চিত নই, এখানে একটি বিকল্প রয়েছে:

var style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = '.cssClass { color: #F00; }';
document.getElementsByTagName('head')[0].appendChild(style);

document.getElementById('someElementId').className = 'cssClass';

10
আমার ব্যবহারের ক্ষেত্রটি একটি বুকমার্কলেট যা QA উদ্দেশ্যে নির্দিষ্ট উপাদানগুলিকে হাইলাইট করে।
টমজি

25
খুব নিশ্চিত যে এর ফলস্বরূপ IE 8 এবং তারও কম অজানা রানটাইম ত্রুটির ফলাফল।
অ্যান্ডি হিউম

1
আমার ব্যবহারের ক্ষেত্রে একটি এলোমেলো গুগল ওয়েব ফন্ট লোড করা হচ্ছে এবং তারপরে র্যান্ডমফন্ট ক্লাসটি ফন্ট-পরিবারকে দেওয়া হচ্ছে :-)
w00t

26
আর একটি ব্যবহারের ক্ষেত্রে আপনি যেখানে সিএসএস ফাইলে নির্ভরতা ছাড়াই একক জেএস লাইব চান। আমার ক্ষেত্রে আমি লাইটওয়েট গ্রল-স্টাইল সতর্কতা পপআপগুলিকে বাক্সের বাইরে চাই।
xeolabs

1
আমি w00t এর মতো অনুরূপ কিছু করছি। আমি একটি ইন্টারেক্টিভ এইচটিএমএল 5 অ্যাপে কাজ করছি, যার ক্যানভাসে লেখা থাকবে এবং আমি আমার ব্যবহারকারীকে বিভিন্ন ফন্ট ব্যবহার করতে বেছে নিতে দিতে চাই। সমস্ত ফন্টের সাথে একটি দীর্ঘ সিএসএস থাকার পরিবর্তে, আমি একটি ব্যাকএন্ড তৈরি করার পরিকল্পনা করছি যেখানে আমি কেবল ফন্টের ডেটা আপলোড করব এবং যখনই প্রোগ্রামটি লোড করা হবে, তখন একটি
ওয়েবসার্ভিসে

117

একটি আরও ভাল সমাধান পাওয়া গেছে, যা সমস্ত ব্রাউজার জুড়ে কাজ করে।
বিধি যুক্ত করতে বা প্রতিস্থাপন করতে ডকুমেন্ট.স্টাইলশীট ব্যবহার করে। গৃহীত উত্তর সংক্ষিপ্ত এবং কার্যকর তবে এটি আইই 8 জুড়ে কাজ করে এবং এটিও কম less

function createCSSSelector (selector, style) {
  if (!document.styleSheets) return;
  if (document.getElementsByTagName('head').length == 0) return;

  var styleSheet,mediaType;

  if (document.styleSheets.length > 0) {
    for (var i = 0, l = document.styleSheets.length; i < l; i++) {
      if (document.styleSheets[i].disabled) 
        continue;
      var media = document.styleSheets[i].media;
      mediaType = typeof media;

      if (mediaType === 'string') {
        if (media === '' || (media.indexOf('screen') !== -1)) {
          styleSheet = document.styleSheets[i];
        }
      }
      else if (mediaType=='object') {
        if (media.mediaText === '' || (media.mediaText.indexOf('screen') !== -1)) {
          styleSheet = document.styleSheets[i];
        }
      }

      if (typeof styleSheet !== 'undefined') 
        break;
    }
  }

  if (typeof styleSheet === 'undefined') {
    var styleSheetElement = document.createElement('style');
    styleSheetElement.type = 'text/css';
    document.getElementsByTagName('head')[0].appendChild(styleSheetElement);

    for (i = 0; i < document.styleSheets.length; i++) {
      if (document.styleSheets[i].disabled) {
        continue;
      }
      styleSheet = document.styleSheets[i];
    }

    mediaType = typeof styleSheet.media;
  }

  if (mediaType === 'string') {
    for (var i = 0, l = styleSheet.rules.length; i < l; i++) {
      if(styleSheet.rules[i].selectorText && styleSheet.rules[i].selectorText.toLowerCase()==selector.toLowerCase()) {
        styleSheet.rules[i].style.cssText = style;
        return;
      }
    }
    styleSheet.addRule(selector,style);
  }
  else if (mediaType === 'object') {
    var styleSheetLength = (styleSheet.cssRules) ? styleSheet.cssRules.length : 0;
    for (var i = 0; i < styleSheetLength; i++) {
      if (styleSheet.cssRules[i].selectorText && styleSheet.cssRules[i].selectorText.toLowerCase() == selector.toLowerCase()) {
        styleSheet.cssRules[i].style.cssText = style;
        return;
      }
    }
    styleSheet.insertRule(selector + '{' + style + '}', styleSheetLength);
  }
}

ফাংশন নিম্নলিখিত হিসাবে ব্যবহৃত হয়।

createCSSSelector('.mycssclass', 'display:none');

2
আইই 8 এর সাথে কাজ করার বিষয়টি নিশ্চিত করেছেন। আমাকে মিডিয়া টাইপের জন্য "স্টাইলশীট। সংজ্ঞায়িত করা হয়নি।
w00t

@ w00t আপনি কি কোডটি এটিকে কাজ করার জন্য আটকান বা সম্পাদনা করতে পারেন?
হেনজি

আমি সবেমাত্র ক্রোমটি খুললাম (সংস্করণ 34.0.1847.132) ফাংশনগুলি আটকে দিয়েছে এবং এটি সম্পাদন করে, তবে এটি কার্যকর হয়নি: "TypeError: সম্পত্তি 'নাল'র দৈর্ঘ্য' পড়তে পারে না"। এটি কি এমন হতে পারে যে এটি বিকাশকারী কনসোল থেকে তৈরি করে কাজ করে না?
dnuske

এটি ক্রোমের কয়েকটি সংস্করণ (বা ক্রোমিয়াম) সূচক 0 তে সন্নিবেশ করার অনুমতি দেয় না। এখানে ফিক্সটি দেওয়া হয়েছে: শৈলশীট।
dnuske

1
@dnuske আমি একই সমস্যার মুখোমুখি হয়েছি। এটি স্টাইলশীট.সিএসআরুলসগুলি বাতিল করে বলে মূল্যায়ন করে। আমি যে ফিক্সটি ব্যবহার করেছি তা হ'ল নতুন ভেরিয়েবল তৈরি করা var styleSheetLength = styleSheet.cssRules ? styleSheet.cssRules.length : 0এবং ফাংশন বাস্তবায়নের পরিবর্তে এর ব্যবহারের বিকল্প স্থাপন করা।
রাজ নাথানী

27

সংক্ষিপ্ত উত্তর, এটি "সমস্ত ব্রাউজারগুলিতে" উপযুক্ত (বিশেষত, আই 8/7):

function createClass(name,rules){
    var style = document.createElement('style');
    style.type = 'text/css';
    document.getElementsByTagName('head')[0].appendChild(style);
    if(!(style.sheet||{}).insertRule) 
        (style.styleSheet || style.sheet).addRule(name, rules);
    else
        style.sheet.insertRule(name+"{"+rules+"}",0);
}
createClass('.whatever',"background-color: green;");

এবং এই চূড়ান্ত বিট একটি উপাদান ক্লাস প্রয়োগ করে:

function applyClass(name,element,doRemove){
    if(typeof element.valueOf() == "string"){
        element = document.getElementById(element);
    }
    if(!element) return;
    if(doRemove){
        element.className = element.className.replace(new RegExp("\\b" + name + "\\b","g"));
    }else{      
        element.className = element.className + " " + name;
    }
}

এখানে একটি ছোট পরীক্ষার পৃষ্ঠাও রয়েছে: https://gist.github.com/shadybones/9816763

মূল কথাটি হ'ল শৈলীর উপাদানগুলির একটি "স্টাইলশীট" / "শীট" বৈশিষ্ট্য রয়েছে যা আপনি বিধিগুলিকে যুক্ত করতে / অপসারণ করতে ব্যবহার করতে পারেন।


সুতরাং এটি প্রতিটি শ্রেণী তৈরি করে একটি নতুন "স্টাইল" উপাদান তৈরি করে? সুতরাং যদি আমি ডেটা ভিত্তিক লুপের জন্য 1000+ ক্লাস তৈরি করি, তবে এর জন্য ডকুমেন্ট.হেড.অ্যাপেন্ডচিল্ড 1000 বার প্রয়োগ করা দরকার?
নীলজাইকে

আমার জন্য Chrome এর style.sheet এবং style.styleSheet অস্তিত্ব নেই
bluejayke

17

একটি হালকা jQuery প্লাগইন রয়েছে যা সিএসএস ঘোষণা উত্সাহিত করতে দেয়: jQuery-injectCSS SS

প্রকৃতপক্ষে, এটি জেএসএস (জেএসএন দ্বারা বর্ণিত সিএসএস) ব্যবহার করে, তবে ডায়নামিক সিএসএস স্টাইলশিট উত্পন্ন করার জন্য এটি পরিচালনা করা বেশ সহজ।

$.injectCSS({
    "#test": {
        height: 123
    }
});


7

YUI এর মধ্যে এখন পর্যন্ত আমি সবচেয়ে ভাল স্টাইলশিট ইউটিলিটি দেখেছি। আমি আপনাকে এটি পরীক্ষা করতে উত্সাহিত করি, তবে এখানে একটি স্বাদ:

// style element or locally sourced link element
var sheet = YAHOO.util.StyleSheet(YAHOO.util.Selector.query('style',null,true));

sheet = YAHOO.util.StyleSheet(YAHOO.util.Dom.get('local'));


// OR the id of a style element or locally sourced link element
sheet = YAHOO.util.StyleSheet('local');


// OR string of css text
var css = ".moduleX .alert { background: #fcc; font-weight: bold; } " +
          ".moduleX .warn  { background: #eec; } " +
          ".hide_messages .moduleX .alert, " +
          ".hide_messages .moduleX .warn { display: none; }";

sheet = new YAHOO.util.StyleSheet(css);

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


5

আইই ৯ হিসাবে You সুতরাং মূলত আপনি এখন অজ্যাক্সের মাধ্যমে একটি সিএসএস ফাইল লোড করতে পারেন (এবং কলব্যাক পাবেন) এবং তারপরে এই জাতীয় স্টাইল ট্যাগের ভিতরে কেবল পাঠ্য সেট করতে পারেন।

এটি অন্যান্য ব্রাউজারগুলিতে কাজ করে, কতটা পিছনে তা নিশ্চিত নয়। তবে যতক্ষণ আপনার আইই 8 সমর্থন করার দরকার নেই ততক্ষণ এটি কাজ করবে।

// RESULT: doesn't work in IE8 and below. Works in IE9 and other browsers.
$(document).ready(function() {
    // we want to load the css as a text file and append it with a style.
    $.ajax({
        url:'myCss.css',
        success: function(result) {
            var s = document.createElement('style');
            s.setAttribute('type', 'text/css');
            s.innerHTML = result;
            document.getElementsByTagName("head")[0].appendChild(s);
        },
        fail: function() {
            alert('fail');
        }
    })
});

এবং তারপরে আপনি এটি myCss.css এর মতো একটি বাহ্যিক ফাইল টানতে পারেন

.myClass { background:#F00; }

5

বিশ্বনাথের সমাধানটি এখানে মন্তব্যে সামান্য লিখে দেওয়া হয়েছে:

function setStyle(cssRules, aSelector, aStyle){
    for(var i = 0; i < cssRules.length; i++) {
        if(cssRules[i].selectorText && cssRules[i].selectorText.toLowerCase() == aSelector.toLowerCase()) {
            cssRules[i].style.cssText = aStyle;
            return true;
        }
    }
    return false;
}

function createCSSSelector(selector, style) {
    var doc = document;
    var allSS = doc.styleSheets;
    if(!allSS) return;

    var headElts = doc.getElementsByTagName("head");
    if(!headElts.length) return;

    var styleSheet, media, iSS = allSS.length; // scope is global in a function
    /* 1. search for media == "screen" */
    while(iSS){ --iSS;
        if(allSS[iSS].disabled) continue; /* dont take into account the disabled stylesheets */
        media = allSS[iSS].media;
        if(typeof media == "object")
            media = media.mediaText;
        if(media == "" || media=='all' || media.indexOf("screen") != -1){
            styleSheet = allSS[iSS];
            iSS = -1;   // indication that media=="screen" was found (if not, then iSS==0)
            break;
        }
    }

    /* 2. if not found, create one */
    if(iSS != -1) {
        var styleSheetElement = doc.createElement("style");
        styleSheetElement.type = "text/css";
        headElts[0].appendChild(styleSheetElement);
        styleSheet = doc.styleSheets[allSS.length]; /* take the new stylesheet to add the selector and the style */
    }

    /* 3. add the selector and style */
    switch (typeof styleSheet.media) {
    case "string":
        if(!setStyle(styleSheet.rules, selector, style));
            styleSheet.addRule(selector, style);
        break;
    case "object":
        if(!setStyle(styleSheet.cssRules, selector, style));
            styleSheet.insertRule(selector + "{" + style + "}", styleSheet.cssRules.length);
        break;
    }

4

একটি আকর্ষণীয় প্রকল্প যা আপনাকে আপনার কাজে সাহায্য করতে পারে তা হ'ল জেএসএস

সিএসএসের চেয়ে জেএসএস একটি ভাল বিমূর্ততা। এটি জাভাস্ক্রিপ্টকে ঘোষিত এবং রক্ষণাবেক্ষণযোগ্য পদ্ধতিতে শৈলীর বর্ণনা দিতে ভাষা হিসাবে ব্যবহার করে। এটি একটি উচ্চ পারফরম্যান্স জেএস থেকে সিএসএস সংকলক যা ব্রাউজারগুলিতে এবং সার্ভার-সাইডে রানটাইম সময়ে কাজ করে।

জেএসএস লাইব্রেরি আপনাকে .attach()ফাংশনটি ব্যবহার করে ডোম / হেড বিভাগে ইনজেক্ট করতে দেয় ।

মূল্যায়নের জন্য অনলাইন সংস্করণ Repl

জেএসএস সম্পর্কিত আরও তথ্য

একটি উদাহরণ:

// Use plugins.
jss.use(camelCase())

// Create your style.
const style = {
  myButton: {
    color: 'green'
  }
}

// Compile styles, apply plugins.
const sheet = jss.createStyleSheet(style)

// If you want to render on the client, insert it into DOM.
sheet.attach()

3

গুগল ক্লোজার ব্যবহার:

আপনি কেবল সিসসোম মডিউল ব্যবহার করতে পারেন:

goog.require('goog.cssom');
var css_node = goog.cssom.addCssText('.cssClass { color: #F00; }');

জাভাস্ক্রিপ্ট কোড নথির মাথায় সিএসএস নোড রাখার সময় ক্রস ব্রাউজার হওয়ার চেষ্টা করে।


3

https://jsfiddle.net/xk6Ut/256/

জাভাস্ক্রিপ্টে CSS ক্লাস গতিশীলভাবে তৈরি এবং আপডেট করার জন্য একটি বিকল্প:

  • সিএসএস বিভাগ তৈরি করতে স্টাইল এলিমেন্ট ব্যবহার করা
  • শৈলীর উপাদানটির জন্য একটি আইডি ব্যবহার করে যাতে আমরা সিএসএস
    ক্লাস আপডেট করতে পারি

.....

function writeStyles(styleName, cssText) {
    var styleElement = document.getElementById(styleName);
    if (styleElement) 
             document.getElementsByTagName('head')[0].removeChild(
        styleElement);
    styleElement = document.createElement('style');
    styleElement.type = 'text/css';
    styleElement.id = styleName;
    styleElement.innerHTML = cssText;
    document.getElementsByTagName('head')[0].appendChild(styleElement);
}

...

    var cssText = '.testDIV{ height:' + height + 'px !important; }';
    writeStyles('styles_js', cssText)

1

উত্তরের মাধ্যমে সন্ধান করা হয়েছে এবং সর্বাধিক সুস্পষ্ট এবং সোজা ফরোয়ার্ড অনুপস্থিত: document.write()আপনার প্রয়োজনীয় সিএসএসের একটি অংশ লেখার জন্য ব্যবহার করুন।

এখানে একটি উদাহরণ রয়েছে (কোডেপেনে এটি দেখুন: http://codepen.io/ssh33/pen/zGjWga ):

<style>
   @import url(http://fonts.googleapis.com/css?family=Open+Sans:800);
   .d, body{ font: 3vw 'Open Sans'; padding-top: 1em; }
   .d {
       text-align: center; background: #aaf;
       margin: auto; color: #fff; overflow: hidden; 
       width: 12em; height: 5em;
   }
</style>

<script>
   function w(s){document.write(s)}
   w("<style>.long-shadow { text-shadow: ");
   for(var i=0; i<449; i++) {
      if(i!= 0) w(","); w(i+"px "+i+"px #444");
   }
   w(";}</style>");
</script> 

<div class="d">
    <div class="long-shadow">Long Shadow<br> Short Code</div>
</div>

পৃষ্ঠা লোডের পরে আপনার সিএসএস বিধি তৈরি করতে বা এক্সএইচটিএমএল ব্যবহার না করা অবধি এটি ঠিক আছে।
টিম ডাউন

1
function createCSSClass(selector, style, hoverstyle) 
{
    if (!document.styleSheets) 
    {
        return;
    }

    if (document.getElementsByTagName("head").length == 0) 
    {

        return;
    }
    var stylesheet;
    var mediaType;
    if (document.styleSheets.length > 0) 
    {
        for (i = 0; i < document.styleSheets.length; i++) 
        {
            if (document.styleSheets[i].disabled) 
            {
                continue;
            }
            var media = document.styleSheets[i].media;
            mediaType = typeof media;

            if (mediaType == "string") 
            {
                if (media == "" || (media.indexOf("screen") != -1)) 
                {
                    styleSheet = document.styleSheets[i];
                }
            } 
            else if (mediaType == "object") 
            {
                if (media.mediaText == "" || (media.mediaText.indexOf("screen") != -1)) 
                {
                    styleSheet = document.styleSheets[i];
                }
            }

            if (typeof styleSheet != "undefined") 
            {
                break;
            }
        }
    }

    if (typeof styleSheet == "undefined") {
        var styleSheetElement = document.createElement("style");
        styleSheetElement.type = "text/css";
        document.getElementsByTagName("head")[0].appendChild(styleSheetElement);
        for (i = 0; i < document.styleSheets.length; i++) {
            if (document.styleSheets[i].disabled) {
                continue;
            }
            styleSheet = document.styleSheets[i];
        }

        var media = styleSheet.media;
        mediaType = typeof media;
    }

    if (mediaType == "string") {
        for (i = 0; i < styleSheet.rules.length; i++) 
        {
            if (styleSheet.rules[i].selectorText.toLowerCase() == selector.toLowerCase()) 
            {
                styleSheet.rules[i].style.cssText = style;
                return;
            }
        }

        styleSheet.addRule(selector, style);
    }
    else if (mediaType == "object") 
    {
        for (i = 0; i < styleSheet.cssRules.length; i++) 
        {
            if (styleSheet.cssRules[i].selectorText.toLowerCase() == selector.toLowerCase()) 
            {
                styleSheet.cssRules[i].style.cssText = style;
                return;
            }
        }

        if (hoverstyle != null) 
        {
            styleSheet.insertRule(selector + "{" + style + "}", 0);
            styleSheet.insertRule(selector + ":hover{" + hoverstyle + "}", 1);
        }
        else 
        {
            styleSheet.insertRule(selector + "{" + style + "}", 0);
        }
    }
}





createCSSClass(".modalPopup  .header",
                                 " background-color: " + lightest + ";" +
                                  "height: 10%;" +
                                  "color: White;" +
                                  "line-height: 30px;" +
                                  "text-align: center;" +
                                  " width: 100%;" +
                                  "font-weight: bold; ", null);

ডকুমেন্টটিতে কোনও বর্তমান স্টাইলশিট না থাকলে কী হবে
নীলজাইকে

1

এখানে আমার মডুলার সমাধান:

var final_style = document.createElement('style');
final_style.type = 'text/css';

function addNewStyle(selector, style){
  final_style.innerHTML += selector + '{ ' + style + ' } \n';
};

function submitNewStyle(){
  document.getElementsByTagName('head')[0].appendChild(final_style);

  final_style = document.createElement('style');
  final_style.type = 'text/css';
};

function submitNewStyleWithMedia(mediaSelector){
  final_style.innerHTML = '@media(' + mediaSelector + '){\n' + final_style.innerHTML + '\n};';
    submitNewStyle();
};

আপনি মূলত আপনার কোডের যে কোনও জায়গায় করুন:,
addNewStyle('body', 'color: ' + color1);যেখানে color1পরিবর্তনশীল সংজ্ঞায়িত হয়।

আপনি "পোস্ট" আপনি কেবল না বর্তমান সিএসএস ফাইল চান, তখন submitNewStyle(),
এবং তারপর আপনি এখনও পরে আরো সিএসএস যোগ করতে পারেন।

আপনি যদি এটি "মিডিয়া ক্যোয়ারী" যুক্ত করতে চান তবে আপনার কাছে বিকল্প রয়েছে।
"নিউইউ স্টাইলস" যুক্ত করার পরে আপনি কেবল ব্যবহার করেন submitNewStyleWithMedia('min-width: 1280px');


এটি আমার ব্যবহারের ক্ষেত্রে বেশ কার্যকর ছিল, কারণ আমি বর্তমান সময়ের অনুযায়ী জনসাধারণের (আমার নয়) ওয়েবসাইটের সিএসএস পরিবর্তন করছি। আমি "সক্রিয়" স্ক্রিপ্টগুলি ব্যবহার করার আগে একটি সিএসএস ফাইল জমা দিই এবং তারপরে বাকীগুলি (এর মাধ্যমে উপাদানগুলিতে অ্যাক্সেস করার আগে সাইটটিকে দয়ালু মনে হয় querySelector)।


আমি আজ এটি চেষ্টা করে যাচ্ছি। আমার ব্যবহারের ক্ষেত্রে এটি কীভাবে কাজ করে তা আপনাকে জানাতে দেবে। আঙ্গুলগুলি পেরিয়ে গেল !!!!
lopezdp

0

অনুসন্ধানকারীদের সুবিধার জন্য; আপনি jQuery ব্যবহার করা হয়, আপনি নিম্নলিখিত করতে পারেন:

var currentOverride = $('#customoverridestyles');

if (currentOverride) {
 currentOverride.remove();
}

$('body').append("<style id=\"customoverridestyles\">body{background-color:pink;}</style>");

স্পষ্টতই আপনি যা চান অন্তর্ সিএসএস পরিবর্তন করতে পারেন।

কিছু লোক খাঁটি জাভাস্ক্রিপ্ট পছন্দ করেন এর প্রশংসা করুন, তবে এটি কাজ করে এবং গতিশীলভাবে স্টাইলগুলি লেখার / ওভাররাইটিংয়ের জন্য বেশ শক্তিশালী।


0

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

function myCSS(data) {
    var head = document.head || document.getElementsByTagName("head")[0];
    if(head) {
        if(data && data.constructor == Object) {
            for(var k in data) {
                var selector = k;
                var rules = data[k];

                var allSheets = document.styleSheets;
                var cur = null;

                var indexOfPossibleRule = null,
                    indexOfSheet = null;
                for(var i = 0; i < allSheets.length; i++) {
                    indexOfPossibleRule = findIndexOfObjPropInArray("selectorText",selector,allSheets[i].cssRules);
                    if(indexOfPossibleRule != null) {
                        indexOfSheet = i;
                        break;
                    }
                }

                var ruleToEdit = null;
                if(indexOfSheet != null) {

                    ruleToEdit = allSheets[indexOfSheet].cssRules[indexOfPossibleRule];

                } else {
                    cur = document.createElement("style");
                    cur.type =  "text/css";
                    head.appendChild(cur);
                    cur.sheet.addRule(selector,"");
                    ruleToEdit = cur.sheet.cssRules[0];
                    console.log("NOPE, but here's a new one:", cur);
                }
                applyCustomCSSruleListToExistingCSSruleList(rules, ruleToEdit, (err) => {
                    if(err) {
                        console.log(err);
                    } else {
                        console.log("successfully added ", rules, " to ", ruleToEdit);
                    }
                });
            }
        } else {
            console.log("provide one paramter as an object containing the cssStyles, like: {\"#myID\":{position:\"absolute\"}, \".myClass\":{background:\"red\"}}, etc...");
        }
    } else {
        console.log("run this after the page loads");
    }

};  

তারপরে উপরের ফাংশনের অভ্যন্তরে বা অন্য কোথাও এই 2 সহায়ক ফাংশন যুক্ত করুন:

function applyCustomCSSruleListToExistingCSSruleList(customRuleList, existingRuleList, cb) {
    var err = null;
    console.log("trying to apply ", customRuleList, " to ", existingRuleList);
    if(customRuleList && customRuleList.constructor == Object && existingRuleList && existingRuleList.constructor == CSSStyleRule) {
        for(var k in customRuleList) {
            existingRuleList["style"][k] = customRuleList[k];
        }

    } else {
        err = ("provide first argument as an object containing the selectors for the keys, and the second argument is the CSSRuleList to modify");
    }
    if(cb) {
        cb(err);
    }
}

function findIndexOfObjPropInArray(objPropKey, objPropValue, arr) {
    var index = null;
    for(var i = 0; i < arr.length; i++) {
        if(arr[i][objPropKey] == objPropValue) {
            index = i;
            break;
        }
    }
    return index;
}

(লক্ষ্য করুন যে উভয়টিতেই আমি ফিল্টারের পরিবর্তে লুপের জন্য ব্যবহার করি, যেহেতু সিএসএস স্টাইল / নিয়ম তালিকার ক্লাসগুলির কেবল দৈর্ঘ্যের সম্পত্তি থাকে এবং কোনও ফিল্টার পদ্ধতি নেই))

তারপরে এটি কল করতে:

myCSS({
    "#coby": {
        position:"absolute",
        color:"blue"
    },
    ".myError": {
        padding:"4px",
        background:"salmon"
    }
})

এটি যদি আপনার ব্রাউজারের জন্য কাজ করে বা ত্রুটি দেয় তবে আমাকে জানান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.