এটি একটি খুব সাধারণ সমস্যা যা কীভাবে :nth-child()
এবং :nth-of-type()
কাজ করে তার একটি ভুল বোঝাবুঝির কারণে উত্থিত হয় । দুর্ভাগ্যক্রমে, এখনও কোনও নির্বাচক-ভিত্তিক সমাধান নেই কারণ নির্বাচকরা নবম সন্তানের সাথে ম্যাচ করার কোনও উপায় সরবরাহ করেন না যা বিজোড়-সংখ্যাযুক্ত, এমনকি সংখ্যাসূচক বা an+b
যেখানে a != 1
এবং যেখানে কোনও যেমন একটি প্যাটার্নের উপর ভিত্তি করে একটি স্বেচ্ছাসেবী নির্বাচকের সাথে মেলে b != 0
। এটি কেবল নির্বাচক, অবহেলা এবং সাধারণ নির্বাচকদের আরও জটিল সংমিশ্রণের জন্য শ্রেণি নির্বাচকদের বাইরেও প্রসারিত।
:nth-child()
সিউডো-বর্গ মধ্যে উপাদানের বড়, মোট ছাত্র সব একই পিতা বা মাতা অধীন ভাইবোন। এটি কেবল নির্বাচকদের সাথে মেলে এমন ভাইবোনদেরই গণনা করে না। একইভাবে, :nth-of-type()
সিউডো-শ্রেণি ভাইবোনদের একই উপাদান টাইপ ভাগ করে নেওয়ার গণনা করে, যা এইচটিএমএলতে ট্যাগের নাম বোঝায়, এবং বাকি নির্বাচককে নয়।
এর অর্থ হ'ল যদি একই পিতামাতার সমস্ত বাচ্চারা একই উপাদান ধরণের হয়, উদাহরণস্বরূপ, টেবিল বডির ক্ষেত্রে যার একমাত্র শিশু tr
উপাদান বা তালিকার উপাদান যার একমাত্র শিশু li
উপাদান, তবে :nth-child()
এবং :nth-of-type()
অভিন্ন আচরণ করবে, অর্থাৎ প্রতিটি মানের জন্য an+b
, :nth-child(an+b)
এবং :nth-of-type(an+b)
উপাদানগুলির একই সেটটির সাথে মিলবে।
প্রকৃতপক্ষে, সিউডো-ক্লাস যেমন :nth-child()
এবং সিউডো ক্লাস সহ একটি প্রদত্ত যৌগ নির্বাচনের সমস্ত সাধারণ নির্বাচক বাকী নির্বাচকের সাথে মিলে যাওয়া উপাদানগুলির সাবসেটটি দেখার চেয়ে একে অপরের থেকে স্বতন্ত্রভাবে:not()
কাজ করে ।
এটি আরও বোঝায় যে প্রতিটি পৃথক যৌগিক নির্বাচক 1 এর মধ্যে সাধারণ নির্বাচকদের মধ্যে অর্ডার সম্পর্কে কোনও ধারণা নেই , উদাহরণস্বরূপ নিম্নলিখিত দুটি নির্বাচক সমতুল্য:
table.myClass tr.row:nth-child(odd)
table.myClass tr:nth-child(odd).row
ইংরেজী অনুবাদ, উভয়ের অর্থ:
tr
নিম্নলিখিত স্বাধীন অবস্থার সাথে মেলে এমন কোনও উপাদান নির্বাচন করুন :
- এটি তার পিতামাতার একটি বিজোড় সংখ্যাযুক্ত শিশু;
- এটির "সারি" শ্রেণি রয়েছে; এবং
- এটি এমন একটি
table
উপাদানটির বংশধর যা "মাই ক্লাস" শ্রেণি রয়েছে।
(আপনি এখানে কেবল বিন্দুবিহীন তালিকার আমার ব্যবহার লক্ষ্য করবেন, কেবলমাত্র পয়েন্টটি হোম চালানোর জন্য)
বর্তমানে কোনও খাঁটি সিএসএস সমাধান নেই বলে আপনাকে উপাদানগুলি ফিল্টার করার জন্য স্ক্রিপ্ট ব্যবহার করতে হবে এবং সেই অনুসারে শৈলী বা অতিরিক্ত শ্রেণীর নাম প্রয়োগ করতে হবে। উদাহরণস্বরূপ, নীচে jQuery ব্যবহার করে একটি সাধারণ কর্মসূচী রয়েছে (ধরে নেওয়া tr
যে টেবিলের মধ্যে উপাদানগুলির মধ্যে কেবল একটি সারি গোষ্ঠী রয়েছে):
$('table.myClass').each(function() {
// Note that, confusingly, jQuery's filter pseudos are 0-indexed
// while CSS :nth-child() is 1-indexed
$('tr.row:even').addClass('odd');
});
সংশ্লিষ্ট সিএসএস সহ:
table.myClass tr.row.odd {
...
}
আপনি যদি সেলেনিয়ামের মতো স্বয়ংক্রিয় পরীক্ষার সরঞ্জামগুলি বা lxML এর মতো সরঞ্জামগুলি এইচটিএমএল প্রসেসিং ব্যবহার করেন তবে এই সরঞ্জামগুলির মধ্যে অনেকগুলি এক্সপ্যাথকে বিকল্প হিসাবে অনুমতি দেয়:
//table[contains(concat(' ', @class, ' '), ' myClass ')]//tr[contains(concat(' ', @class, ' '), ' row ')][position() mod 2)=1]
বিভিন্ন প্রযুক্তি ব্যবহার করে অন্যান্য সমাধানগুলি পাঠকের অনুশীলন হিসাবে ছেড়ে যায়; এটি উদাহরণের জন্য একটি সংক্ষিপ্ত, স্বীকৃত উদাহরণ।
কি এটা এর মূল্য, সেখানে প্রস্তাব হল থেকে একটি এক্সটেনশন :nth-child()
স্বরলিপি একটি প্রদত্ত নির্বাচক মিলে যে n তম সন্তান নির্বাচন নির্দিষ্ট উদ্দেশ্যের জন্য নির্বাচক স্তর 4 জোড়া যেতে পারে। 2
যে নির্বাচক দ্বারা ম্যাচগুলিতে ফিল্টার করবেন :nth-child()
সেগুলি নির্বাচিতরা বিদ্যমান নির্বাচক বাক্য বিন্যাস দ্বারা নির্ধারিত ক্রম অনুসারে কীভাবে একে অপরের থেকে স্বতন্ত্রভাবে পরিচালনা করে তার কারণ হিসাবে আবার যুক্তি হিসাবে সরবরাহ করা হয়। সুতরাং আপনার ক্ষেত্রে এটি দেখতে এই রকম হবে:
table.myClass tr:nth-child(odd of .row)
(একজন চমকপ্রদ পাঠক তাত্ক্ষণিকভাবে নোট করবেন যে এটি :nth-child(odd of tr.row)
পরিবর্তে হওয়া উচিত , যেহেতু সরল নির্বাচক tr
এবং :nth-child()
একে অপরের থেকে স্বতন্ত্রভাবে পরিচালনাও করতে পারেন This এটি কার্যকরী ছদ্ম-শ্রেণীর একটি সমস্যা যা নির্বাচকদের গ্রহণ করে, আমি কীট কৃমি চাইছি বরং এই উত্তরের মাঝখানে খুলবেন না Instead পরিবর্তে আমি এই ধারণাটি নিয়ে যাচ্ছি যে বেশিরভাগ সাইটে tr
টেবিলের বডিতে একে অপরের ভাইবোন হিসাবে উপাদানগুলি ছাড়া অন্য কোনও উপাদান থাকবে না , যা উভয় বিকল্পকে কার্যত সমতুল্য করে তুলবে))
অবশ্যই, একেবারে নতুন স্পেসিফিকেশনে একেবারে নতুন প্রস্তাব হওয়ায় এটি সম্ভবত কয়েক বছরের রাস্তা অবধি বাস্তবায়ন দেখতে পাবে না। ইতিমধ্যে, আপনাকে উপরের মতো কোনও স্ক্রিপ্ট ব্যবহার করে আটকে থাকতে হবে।
1 আপনি যদি কোনও প্রকার বা সর্বজনীন নির্বাচক নির্দিষ্ট করে থাকেন তবে এটি অবশ্যই প্রথমে আসবে। তবে নির্বাচকরা মৌলিকভাবে কীভাবে কাজ করে তা পরিবর্তিত হয় না; এটি সিনট্যাকটিক গণ্ডগোল ছাড়া আর কিছুই নয় nothing
2 এটি মূলত প্রস্তাবিত হয়েছিল :nth-match()
, কারণ এটি এখনও কেবল তার ভাইবোনদের সাথে সম্পর্কিত কোনও উপাদানকে গণ্য করে, এবং প্রদত্ত নির্বাচিতের সাথে মেলে এমন অন্য উপাদানগুলির সাথে নয়, এটি ২০১৪ সাল থেকে বিদ্যমান :nth-child()
পরিবর্তে এক্সটেনশন হিসাবে পুনরুদ্ধার করা হয়েছে ।