জাভাস্ক্রিপ্ট থেকে সিএসএস সিউডো-শ্রেণির নিয়ম সেট করা


125

আমি জাভাস্ক্রিপ্ট থেকে সিউডো-ক্লাস সিলেক্টারের (যেমন: লিঙ্ক,: হোভার ইত্যাদি) জন্য সিএসএস বিধি পরিবর্তন করার একটি উপায় খুঁজছি।

তাই সিএসএস কোডের একটি অ্যানালগ: a:hover { color: red }জেএসে।

উত্তর আর কোথাও পাইনি; যদি কেউ জানেন যে এটি এমন কিছু যা ব্রাউজারগুলি সমর্থন করে না, তবে এটি একটি সহায়ক ফলাফলও হবে।

উত্তর:


192

আপনি কোনও নির্দিষ্ট উপাদানকে সিউডো-ক্লাস একাই স্টাইল করতে পারবেন না, একইভাবে আপনার কোনও ইনলাইন স্টাইল = "..." বৈশিষ্ট্যে সিউডো-ক্লাস থাকতে পারে না (যেমন কোনও নির্বাচক নেই)।

আপনি স্টাইলশিটটি পরিবর্তন করে এটি করতে পারেন, উদাহরণস্বরূপ বিধি যুক্ত করে:

#elid:hover { background: red; }

আপনি যে প্রতিটি উপাদানকে প্রভাবিত করতে চান তা ধরে নেওয়ার জন্য এটির নির্বাচনের অনুমতি দেওয়ার জন্য একটি অনন্য আইডি রয়েছে।

তাত্ত্বিকভাবে আপনি যে দস্তাবেজটি চান তা হ'ল http://www.w3.org/TR/DOM-Level-2-Style/Overview.html যার অর্থ আপনি (প্রাক-বিদ্যমান এম্বেডড বা লিঙ্কযুক্ত স্টাইলশিট দেওয়া) যেমন সিনট্যাক্স ব্যবহার করে করতে পারেন:

document.styleSheets[0].insertRule('#elid:hover { background-color: red; }', 0);
document.styleSheets[0].cssRules[0].style.backgroundColor= 'red';

আইই এর অবশ্যই নিজস্ব বাক্য গঠন প্রয়োজন:

document.styleSheets[0].addRule('#elid:hover', 'background-color: red', 0);
document.styleSheets[0].rules[0].style.backgroundColor= 'red';

পুরানো এবং গৌণ ব্রাউজারগুলি সম্ভবত সিনট্যাক্সকে সমর্থন করবে না। ডায়নামিক স্টাইলশীট-ফিডলিং খুব কমই করা হয় কারণ এটি সঠিক, বিরল প্রয়োজন এবং historতিহাসিকভাবে ঝামেলা পেতে বেশ বিরক্তিকর।


32
কেন এটি উত্তর হিসাবে বেছে নেওয়া হয়নি?
এসজেডএইচ


2
ফায়ারফক্স: "ত্রুটি: অপারেশনটি নিরাপত্তাহীন" "
8128

@ ফ্লুটফ্লুটটি অপারেশনটিকে অনিরাপদ হিসাবে বিবেচনা করা হয় যদি আপনি কোনও ভিন্ন ডোমেন থেকে সিএসএস ফাইল চালনা করার চেষ্টা করছেন (আমার ধারণা এটি এক ধরণের একই-উত্স নীতি বিষয়)। লজ্জা! একই-উত্স নীতি অনুসারে চেক করার সহজ ফাংশন: function sameOrigin(url) { var loc = window.location, a = document.createElement('a'); a.href = url; return a.hostname === loc.hostname && a.port === loc.port && a.protocol === loc.protocol; }
উইকিনিলিয়ামস

3
নির্দিষ্ট উপাদানগুলিতে কেবল স্টাইলগুলি প্রয়োগ করতে স্টাইলশিটটি ম্যানিপুলেট করার পরামর্শ দেওয়া হয় না কারণ এটি স্টাইলশীট প্রতিবার পরিবর্তিত হওয়ার সাথে সাথে ব্রাউজারটিকে পুরো দস্তাবেজটি রিফ্লো করে দেয়। stubbornella.org/content/2009/03/27/…
জোহানেস এওয়াল্ড

29

আমি এটির জন্য একটি ছোট লাইব্রেরি ছুঁড়েছি যেহেতু আমি মনে করি জেএসে স্টাইলশিটগুলি পরিচালনা করার জন্য বৈধ ব্যবহারের মামলা রয়েছে। কারণগুলি:

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

17

ক্রস ব্রাউজার স্টাফ মোকাবেলা করার জন্য একটি ফাংশন:

addCssRule = function(/* string */ selector, /* string */ rule) {
  if (document.styleSheets) {
    if (!document.styleSheets.length) {
      var head = document.getElementsByTagName('head')[0];
      head.appendChild(bc.createEl('style'));
    }

    var i = document.styleSheets.length-1;
    var ss = document.styleSheets[i];

    var l=0;
    if (ss.cssRules) {
      l = ss.cssRules.length;
    } else if (ss.rules) {
      // IE
      l = ss.rules.length;
    }

    if (ss.insertRule) {
      ss.insertRule(selector + ' {' + rule + '}', l);
    } else if (ss.addRule) {
      // IE
      ss.addRule(selector, rule, l);
    }
  }
};

7

একটি টেম্পলেট স্ট্রিংয়ে কেবল সিএসএস রাখুন।

const cssTemplateString = `.foo:[psuedoSelector]{prop: value}`;

তারপরে একটি শৈলী উপাদান তৈরি করুন এবং স্টাইল ট্যাগে স্ট্রিংটি স্থাপন করুন এবং এটি নথিতে সংযুক্ত করুন।

const styleTag = document.createElement("style");
styleTag.innerHTML = cssTemplateString;
document.head.insertAdjacentElement('beforeend', styleTag);

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


insertAdjacentElementপ্রধান ব্রাউজারগুলিতে (ক্রোম, ফায়ারফক্স, এজ) 2 টি আর্গুমেন্ট প্রয়োজন, যার মধ্যে প্রথমটি রেফারেন্স উপাদানটির সাথে সম্পর্কিত অবস্থান স্থাপন করে ( এখানে দেখুন )। এটি কি সাম্প্রতিক পরিবর্তন? (উত্তরে 'পূর্ববর্তী' যুক্ত হয়েছে)
কলস্পার

6

আমার কৌশলটি একটি অ্যাট্রিবিউট সিলেক্টর ব্যবহার করছে। জাভাস্ক্রিপ্ট দ্বারা বৈশিষ্ট্যগুলি সেট আপ করা সহজ।

CSS

.class{ /*normal css... */}
.class[special]:after{ content: 'what you want'}

জাভাস্ক্রিপ্ট

  function setSpecial(id){ document.getElementById(id).setAttribute('special', '1'); }

এইচটিএমএল

<element id='x' onclick="setSpecial(this.id)"> ...  

4
এই সমাধানটি jQuery ব্যবহার করে - একটি নির্ভরতা প্রবর্তন করে এর মতো সহজ জিনিসের জন্য jQuery আকার, যখন প্রশ্নকারী খাঁটি জাভাস্ক্রিপ্টের জন্য জিজ্ঞাসা করেছিল, খারাপ হয় is
টম অশ্বার্থ

যদিও আজকাল সমস্ত ওয়েবসাইটগুলি jquery ব্যবহার করে, খাঁটি জাভাস্ক্রিপ্ট ব্যবহার করার জন্য আমি এটি পরিবর্তন করব।
সেরজিও অ্যাব্রেউ

1
এবং ঠিক কীভাবে এই পদ্ধতিটি। ক্লাসের সিএসএস বৈশিষ্ট্যগুলি পরিবর্তন করতে পারে [বিশেষ]: সিউডো উপাদানটির পরে, ব্যাকগ্রাউন্ডের রঙ বা অন্য কিছু?
অ্যান্ড্রেসস

5

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


2
এটি সিউডো ক্লাসের আগে এবং: পরে কাজ করে না।
jbyrd

এবং এটি এজেএক্সের মাধ্যমে প্রাপ্ত মান সহ পটভূমি চিত্র পরিবর্তন করতে প্রযোজ্য নয়।
অ্যান্ড্রেসস

1
@ জাইবিআর্ড, :beforeএবং :afterসিউডো উপাদান, ক্লাস নয়।
রায় লিং

@ রাইলিং - হ্যাঁ, সংশোধন করার জন্য ধন্যবাদ! আমার মন্তব্য সম্পাদনা করা যাচ্ছে না।
jbyrd

4

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

সিএসএস ফাইলগুলি সেট আপ করুন,

<link rel="stylesheet" href="always_on.css">
<link rel="stylesheet" title="usual" href="preferred.css"> <!-- on by default -->
<link rel="alternate stylesheet" title="strange" href="alternate.css"> <!-- off by default -->

এবং তারপরে জাভাস্ক্রিপ্ট ব্যবহার করে তাদের মধ্যে স্যুইচ করুন:

function setActiveStyleSheet(title) {
   var i, a, main;
   for(i=0; (a = document.getElementsByTagName("link")<i>); i++) {
     if(a.getAttribute("rel").indexOf("style") != -1
        && a.getAttribute("title")) {
       a.disabled = true;
       if(a.getAttribute("title") == title) a.disabled = false;
     }
   }
}

আপনার যদি এজেএক্স অনুরোধ দ্বারা পুনরুদ্ধার করা মানকে দ্বৈতভাবে ক্লাসটি পরিবর্তন করতে হবে? আপনি এখনই কোনও সিএসএস ফাইল তৈরি করতে পারবেন না ...
অ্যান্ড্রেসস

2

যেমন ইতিমধ্যে বলা হয়েছে এটি ব্রাউজার সমর্থন করে এমন কিছু নয়।

যদি আপনি গতিশীলভাবে শৈলীগুলি না নিয়ে আসেন (যেমন কোনও ডাটাবেস বা কোনও কিছু থেকে এগুলি টেনে তোলা) আপনার পৃষ্ঠার শরীরে একটি শ্রেণি যুক্ত করে এটি ঘিরে কাজ করতে সক্ষম হওয়া উচিত।

CSS এর মতো দেখতে কিছুটা লাগবে:

a:hover { background: red; }
.theme1 a:hover { background: blue; }

এবং জাভাস্ক্রিপ্ট এটিকে পরিবর্তন করার মতো কিছু হবে:

// Look up some good add/remove className code if you want to do this
// This is really simplified

document.body.className += " theme1";  

কৌতূহলের বাইরে, element.classList.addভাল সমর্থন করা হয় না? আমি মানুষ করতে দেখছি element.className +=
জোয়েল করনেট

2
ক্লাসলিস্ট একটি নতুন বৈশিষ্ট্য এবং এটি মোটামুটি সাম্প্রতিক অবধি ভাল সমর্থন পেয়েছে বলে মনে হচ্ছে না ( caniuse.com/classlist দেখুন )
নাথানিয়েল রেইনহার্ট

1

স্টাইলশিটগুলিকে স্যুইচ করা এবং আউট করা এটি করার উপায়। গতিশীল স্টাইলশিট তৈরি করার জন্য এখানে একটি লাইব্রেরি রয়েছে, যাতে আপনি ফ্লাইতে শৈলী সেট করতে পারেন:

http://www.4pmp.com/2009/11/dynamic-css-pseudo-class-styles-with-jquery/


-1

জ্যাকুরিতে আপনি সহজেই হোভার সিউডো ক্লাস সেট করতে পারেন।

$("p").hover(function(){
$(this).css("background-color", "yellow");
}, function(){
$(this).css("background-color", "pink");
});

-1

এখানে দুটি ফাংশন সহ একটি সমাধান রয়েছে: addCSSclass ডকুমেন্টটিতে একটি নতুন CSS ক্লাস যুক্ত করে, এবং টগলক্লাস এটি চালু করে

উদাহরণটি একটি ডিভের সাথে একটি কাস্টম স্ক্রোলবার যুক্ত করে দেখায়

// If newState is provided add/remove theClass accordingly, otherwise toggle theClass
function toggleClass(elem, theClass, newState) {
  var matchRegExp = new RegExp('(?:^|\\s)' + theClass + '(?!\\S)', 'g');
  var add = (arguments.length > 2 ? newState : (elem.className.match(matchRegExp) === null));

  elem.className = elem.className.replace(matchRegExp, ''); // clear all
  if (add) elem.className += ' ' + theClass;
}

function addCSSclass(rules) {
  var style = document.createElement("style");
  style.appendChild(document.createTextNode("")); // WebKit hack :(
  document.head.appendChild(style);
  var sheet = style.sheet;

  rules.forEach((rule, index) => {
    try {
      if ("insertRule" in sheet) {
        sheet.insertRule(rule.selector + "{" + rule.rule + "}", index);
      } else if ("addRule" in sheet) {
        sheet.addRule(rule.selector, rule.rule, index);
      }
    } catch (e) {
      // firefox can break here          
    }
    
  })
}

let div = document.getElementById('mydiv');
addCSSclass([{
    selector: '.narrowScrollbar::-webkit-scrollbar',
    rule: 'width: 5px'
  },
  {
    selector: '.narrowScrollbar::-webkit-scrollbar-thumb',
    rule: 'background-color:#808080;border-radius:100px'
  }
]);
toggleClass(div, 'narrowScrollbar', true);
<div id="mydiv" style="height:300px;width:300px;border:solid;overflow-y:scroll">
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed a eros metus. Nunc dui felis, accumsan nec aliquam quis, fringilla quis tellus. Nulla cursus mauris nibh, at faucibus justo tincidunt eget. Sed sodales eget erat consectetur consectetur. Vivamus
  a diam volutpat, ullamcorper justo eu, dignissim ante. Aenean turpis tortor, fringilla quis efficitur eleifend, iaculis id quam. Quisque non turpis in lacus finibus auctor. Morbi ullamcorper felis ut nulla venenatis fringilla. Praesent imperdiet velit
  nec sodales sodales. Etiam eget dui sollicitudin, tempus tortor non, porta nibh. Quisque eu efficitur velit. Nulla facilisi. Sed varius a erat ac volutpat. Sed accumsan maximus feugiat. Mauris id malesuada dui. Lorem ipsum dolor sit amet, consectetur
  adipiscing elit. Sed a eros metus. Nunc dui felis, accumsan nec aliquam quis, fringilla quis tellus. Nulla cursus mauris nibh, at faucibus justo tincidunt eget. Sed sodales eget erat consectetur consectetur. Vivamus a diam volutpat, ullamcorper justo
  eu, dignissim ante. Aenean turpis tortor, fringilla quis efficitur eleifend, iaculis id quam. Quisque non turpis in lacus finibus auctor. Morbi ullamcorper felis ut nulla venenatis fringilla. Praesent imperdiet velit nec sodales sodales. Etiam eget
  dui sollicitudin, tempus tortor non, porta nibh. Quisque eu efficitur velit. Nulla facilisi. Sed varius a erat ac volutpat. Sed accumsan maximus feugiat. Mauris id malesuada dui.
</div>


-2

আপনি যদি REACT ব্যবহার করেন তবে রেডিয়াম নামে কিছু আছে । এটি এখানে এত দরকারী:

  • ইন্টারেক্টিভ স্টাইলগুলি নির্দিষ্ট করা থাকলে প্রপসগুলিতে হ্যান্ডলার যুক্ত করুন, উদাহরণস্বরূপ onMouseEnter এর জন্য: হোভার করুন, প্রয়োজনে বিদ্যমান হ্যান্ডলারের মোড়ানো

  • যদি কোনও হ্যান্ডলারের ট্রিগার হয়, যেমন ঘুরে বেড়ানোর মাধ্যমে, রেডিয়াম সেট স্টেটকে উপাদানগুলির স্টেট অবজেক্টে একটি রেডিয়াম-নির্দিষ্ট ক্ষেত্র আপডেট করতে কল করে

  • পুনঃ-রেন্ডারে, প্রয়োগ হওয়া কোনও ইন্টারেক্টিভ শৈলীর সমাধান করুন, উদাহরণস্বরূপ: রেডিয়াম-নির্দিষ্ট অবস্থায় উপাদানটির কী বা রেফটি অনুসন্ধান করে হোভার করুন

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