আমি কি একটি সিএসএস অক্ষম করতে পারি: জাভাস্ক্রিপ্টের মাধ্যমে হোভার এফেক্ট?


99

আমি :hoverজাভাস্ক্রিপ্টের মাধ্যমে ব্রাউজারটিকে CSS এর প্রভাব ব্যবহার থেকে বিরত করার চেষ্টা করছি ।

আমি আমার সিএসএসে স্টাইল aএবং a:hoverস্টাইলগুলি সেট করে রেখেছি, কারণ জেএস উপলব্ধ না হলে আমি একটি হোভার ইফেক্ট চাই। কিন্তু যদি জাতীয় হল পাওয়া যায়, আমি আমার সিএসএস হোভার ইফেক্ট ওপর দিয়েই লিখতে চান একটি বাধামুক্ত এক (jQuery এর রঙ উদাহরণস্বরূপ প্লাগইন ব্যবহার।)

আমি এটি চেষ্টা করেছি:

$("ul#mainFilter a").hover(
     function(e){ e.preventDefault(); ...do my stuff... }, 
     function(e){ e.preventDefault(); ...do my stuff... });

আমি এটি দিয়ে চেষ্টাও করেছি return false;, তবে এটি কার্যকর হয় না।

এখানে আমার সমস্যার উদাহরণ: http://jsfiddle.net/4rEzz/ । ধূসর না হয়ে লিঙ্কটি কেবল বিবর্ণ হওয়া উচিত।

ফুজির দ্বারা উল্লিখিত হিসাবে, একটি কাজের সমাধান হ'র স্টাইলগুলি ব্যবহার করে পুনরায় সেট করতে হবে .css()তবে আমাকে সিএসএসে উল্লিখিত প্রতিটি একক সম্পত্তি ওভাররাইট করতে হবে (এখানে দেখুন: http://jsfiddle.net/raPeX/1/ )। আমি একটি জেনেরিক সমাধান খুঁজছি

কেউ কি জানেন, এটা কিভাবে করে?

PS: আমি হোভারের জন্য নির্ধারিত প্রতিটি স্টাইলকে ওভাররাইট করতে চাই না।

উত্তর:


136

খাঁটি জাভাস্ক্রিপ্ট জেনেরিক সমাধান নেই, আমি ভীত। জাভাস্ক্রিপ্ট :hoverনিজেই সিএসএস স্টেট বন্ধ করতে সক্ষম নয়।

আপনি নীচের বিকল্প workaround চেষ্টা করতে পারেন। আপনি যদি আপনার এইচটিএমএল এবং সিএসএসে সামান্য বিড়ম্বনা করতে কিছু মনে করেন না, তবে জাভাস্ক্রিপ্টের মাধ্যমে প্রতিটি সিএসএস সম্পত্তি ম্যানুয়ালি রিসেট করা আপনাকে বাঁচায়।

এইচটিএমএল

<body class="nojQuery">

সিএসএস

/* Limit the hover styles in your CSS so that they only apply when the nojQuery 
class is present */

body.nojQuery ul#mainFilter a:hover {
    /* CSS-only hover styles go here */
}

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

// When jQuery kicks in, remove the nojQuery class from the <body> element, thus
// making the CSS hover styles disappear.

$(function(){}
    $('body').removeClass('nojQuery');
)

5
আমি এই সমাধানটি নসক্রিপ্ট সমাধানগুলির চেয়ে ভাল পছন্দ করি কারণ সিএসএস সম্পূর্ণরূপে বাহ্যিক ফাইলগুলিতে অন্তর্ভুক্ত থাকে এবং এটি পৃষ্ঠা লোডের সময়ও কাজ করে, যদি সিএসএস প্রথমে লোড হয় তবে জেএস পরে না লোড হয়। জিনিসগুলিকে "ক্রমবর্ধমানভাবে উন্নত করতে" jQuery ব্যবহার করার ফলে প্রায়শই এমন পৃষ্ঠাগুলির ফলাফল হয় যেগুলি লোডিং শেষ হওয়ার আগে আপনি স্টাফটিতে ক্লিক করলে ভাল কাজ করে না। এমনকি একটি দ্রুত লিঙ্কে একটি দ্রুত ব্রাউজারের সাথেও আমি এটি অনেক কিছু দেখতে পাই।
মিঃ শাইন এবং নিউ 安 宇

@জনাব. চকচকে ও নতুন: আমি একমত, আমার সমাধানের চেয়েও আমি এটি পছন্দ করি! আমি কেন নিশ্চিত যে আমি এর আগে কেন এই কমনীয়তা লক্ষ্য করিনি ...
জোশ

4
"আমি এই সমাধানটি নসক্রিপ্ট সমাধানগুলির চেয়ে ভাল পছন্দ করি কারণ সিএসএস সম্পূর্ণরূপে বাহ্যিক ফাইলগুলিতে অন্তর্ভুক্ত থাকলে এটি কাজ করে" - তাই <noscript>সমাধানটিও করে। আপনি কেবলমাত্র <link>ট্যাগের <noscript>পরিবর্তে আপনার ভিতরে ট্যাগ রেখেছিলেন <style>। আমার সমাধান আপনাকে একাধিক ফাইলের পরিবর্তে সমস্ত কিছু একটি স্টাইলশিট ফাইলে রাখার অনুমতি দেয়।
পল ডি ওয়েট

আমি ঠিক যা খুঁজছিলাম তা নয় তবে আমি মনে করি এই সমাধানটিই সেরা আপোস! আপনার সকলের জন্য ধন্যবাদ
মেও

আপনি একই শৈলীর আলাদা নাম দিয়ে অনুলিপি করতে এবং jquery ব্যবহার করে সেই শ্রেণীর সাথে সমস্ত উপাদান নির্বাচন করুন এবং শ্রেণিটি সরিয়ে নকল শ্রেণীর সাথে প্রতিস্থাপন করতে পারেন।
chepe263

14

কেবলমাত্র হোভার নির্ধারিত রয়েছে এমন একটি দ্বিতীয় শ্রেণি ব্যবহার করুন:

এইচটিএমএল

 <a class="myclass myclass_hover" href="#">My anchor</a>

সিএসএস

 .myclass { 
   /* all anchor styles */
 }
 .myclass_hover:hover {
   /* example color */
   color:#00A;
 }

ক্লাস অপসারণের জন্য এখন আপনি জিকিউরি ব্যবহার করতে পারেন, উদাহরণস্বরূপ যদি উপাদানটি ক্লিক করা থাকে:

জ্যাকুয়েরি

 $('.myclass').click( function(e) {
    e.preventDefault();
    $(this).removeClass('myclass_hover');
 });

আশা করি এই উত্তরটি সহায়ক হবে।


4
প্লাস ১। এটি গোঁড়া নয়, তবে সমস্যাটি বেশ উত্সাহী পদ্ধতিতে ফাটিয়েছে।
জিম টোলান

11

আপনি স্টাইলশিট এবং স্টাইলশীট জাভাস্ক্রিপ্ট দিয়ে তাদের নিয়ম করে নিতে পারেন

var sheetCount = document.styleSheets.length;
var lastSheet = document.styleSheets[sheetCount-1];
var ruleCount;
if (lastSheet.cssRules) { // Firefox uses 'cssRules'
    ruleCount = lastSheet.cssRules.length;
}
else if (lastSheet.rules) { / /IE uses 'rules'
    ruleCount = lastSheet.rules.length;
}
var newRule = "a:hover { text-decoration: none !important; color: #000 !important; }";
// insert as the last rule in the last sheet so it
// overrides (not overwrites) previous definitions
lastSheet.insertRule(newRule, ruleCount);

বৈশিষ্ট্যগুলি তৈরি করা! গুরুত্বপূর্ণ এবং এটিকে একেবারে শেষ সিএসএস সংজ্ঞা তৈরি করা পূর্ববর্তী কোনও সংজ্ঞা ওভাররাইড করা উচিত, যদি না কেউ নির্দিষ্টভাবে লক্ষ্যযুক্ত হয়। সেক্ষেত্রে আপনাকে আরও নিয়ম সন্নিবেশ করতে হতে পারে।


4
অথবা আপনি সমস্ত নসক্রিপ্টের নিয়ম একটি স্টাইলশিটে রেখে দিতে পারেন এবং তারপরে জাভাস্ক্রিপ্ট থেকে স্টাইলশিটটি অক্ষম করতে পারেন।
শন হোগান

4
অথবা <link>কোনও <noscript>উপাদানটির ভিতরে আপনার নোগ্রিপ্ট স্টাইলশিট ট্যাগ রেখেছেন ? ঠিক আছে, কাজ?
পল ডি ওয়েট

4
বা "আপত্তিকর" বিধিটি মুছুন: ডেভেলপার.মোজিলা.আর.ইন
ডিওএম

4
এমনকি আই 5 এটি করতে পারে। এটির পদ্ধতিটিকে আলাদাভাবে বলা হয়, তবে এটির কাজ করা উচিত: msdn.microsoft.com/en-us/library/ms531195%28v=vs.85%29.aspx । আমি অন্যান্য ব্রাউজারগুলি পরীক্ষা করে দেখিনি, তবে আমি অনুমান করব যে সমস্ত আধুনিক ব্রাউজারগুলি মান প্রয়োগ করে implement
RoToRa

ফায়ারফক্সে আমি পাইError: The operation is insecure.
অ্যালেক্স ডব্লু

11

এটি সেপটিকের উত্তরের মতো, তবে এই পদ্ধতির কী হবে? আপনি CSS এ জাভাস্ক্রিপ্ট ব্যবহার করে অক্ষম করতে চান এমন সিএসএস কোডটি মোড়ানো <noscript>। এইভাবে যদি জাভাস্ক্রিপ্ট বন্ধ থাকে, তবে সিএসএস :hoverব্যবহার করা হবে, অন্যথায় জাভাস্ক্রিপ্ট প্রভাব ব্যবহার করা হবে।

উদাহরণ:

<noscript>
<style type="text/css">
ul#mainFilter a:hover {
  /* some CSS attributes here */
}
</style>
</noscript>
<script type="text/javascript">
$("ul#mainFilter a").hover(
     function(o){ /* ...do your stuff... */ }, 
     function(o){ /* ...do your stuff... */ });
</script>

4

আমি not()সিএসএস অপারেটর এবং jQuery এর addClass()ফাংশন ব্যবহার করেছি। এখানে একটি উদাহরণ রয়েছে, আপনি যখন কোনও তালিকার আইটেমটিতে ক্লিক করেন, এটি আর ঘোরাবে না:

উদাহরণ স্বরূপ:

এইচটিএমএল

<ul class="vegies">
    <li>Onion</li>
    <li>Potato</li>
    <li>Lettuce</li>
<ul>

সিএসএস

.vegies li:not(.no-hover):hover { color: blue; }

jQuery

$('.vegies li').click( function(){
    $(this).addClass('no-hover');
});

3

আমি লিঙ্কটির উপস্থিতি পরিবর্তন করতে: হোভার ইভেন্টটিকে আটকাতে CSS ব্যবহার করব।

a{
  font:normal 12px/15px arial,verdana,sans-serif;
  color:#000;
  text-decoration:none;
}

এই সাধারণ সিএসএসের অর্থ লিঙ্কগুলি সর্বদা কালো এবং আন্ডারলাইন করা হবে না not চেহারার পরিবর্তনটিই আপনি নিয়ন্ত্রণ করতে চান কিনা তা আমি প্রশ্ন থেকে বলতে পারি না।


এটির একটি ভাল এটি রয়েছে: জেএস কোনও ক্লায়েন্টের কাছে উপলব্ধ না হলে effect তবে যদি এটি হয় তবে এটির ওভাররাইট করা আমার দরকার। আমি একটি সেট করেছি: আমার সিএসএসে হোভার ক্লাস, কেবল এটি অক্ষম করতে চাই।
মেও

@ মিয়ো: আপনি সিএসএস psuedo ক্লাস অক্ষম করতে পারবেন না, তবে আপনি সমস্ত লিঙ্ক শৈলী একই চেহারা / পরামিতি সেট করে সেটি ওভাররাইড করতে পারেন। এই উত্তর এবং আমার উত্তর উভয়ই কেবল ভিন্ন উপায়ে এটি করে।
মোটি 14

3

আমি যখন সমস্ত ডিভাইস স্পর্শ সমর্থন করে সনাক্ত :hoverকরে :activeতখন সমস্ত বৈশিষ্ট্য প্রতিস্থাপন করার পরামর্শ দেব । আপনি যখন এটি করেন ঠিক তখনই এই ফাংশনটি কল করুন touch()

function touch() {
  if ('ontouchstart' in document.documentElement) {
    for (var sheetI = document.styleSheets.length - 1; sheetI >= 0; sheetI--) {
      var sheet = document.styleSheets[sheetI];
      if (sheet.cssRules) {
        for (var ruleI = sheet.cssRules.length - 1; ruleI >= 0; ruleI--) {
          var rule = sheet.cssRules[ruleI];

          if (rule.selectorText) {
            rule.selectorText = rule.selectorText.replace(':hover', ':active');
          }
        }
      }
    }
  }
}

আমার জন্য দুর্দান্ত কাজ করে ধন্যবাদ!
বিপরীতে 12

1

কেবলমাত্র লিঙ্কের রঙটি সেট করার চেষ্টা করুন:

$("ul#mainFilter a").css('color','#000');

সম্পাদনা: বা আরও ভাল, ক্রিস্টোফারের পরামর্শ অনুসারে সিএসএস ব্যবহার করুন


jsfiddle.net/raPeX আমি একটি উদাহরণ তৈরি করেছি। এটি কাজ করে কিন্তু এটি করতে তার মতো বোকা। আমি প্রতিটি সিএসএস মান পুনরুদ্ধার করতে হবে এবং তাদের শৈলী হিসাবে যুক্ত করতে হবে? আরও ভাল উপায় থাকতে হবে। আমি এটা করতে চাই না। তবে ইঙ্গিতটির জন্য +1
মেও

হাই মিও, না, না, আমার উপরের কোডটি একটি নির্দিষ্ট লিঙ্ককে লক্ষ্যবস্তু করেছিল কারণ আমি ভেবেছিলাম আপনি যা চান তা তাই। আপনি এটির aপরিবর্তে কেবল এটি ব্যবহার করে আপনি আরও সাধারণীকরণ করতে ul#mainFilter aপারেন, বা আপনি পৃষ্ঠাটির প্রতিটি লিঙ্ককে আলাদা রঙ বলছেন?
মটিটি

আমি কী বোঝাতে চাইছি তা বোঝাতে আমি আপনার ডেমোকে মন্তব্য দিয়ে আপডেট করেছি: jsfiddle.net/raPeX/2
মোটি

ive পেয়েছে যে ইতিমধ্যে আপনাকে ধন্যবাদ। তবে সমস্যাটি হ'ল, আমার হোভারটিতে কেবল রঙ পরিবর্তন হয় না, কখনও কখনও এর পটভূমি, সীমান্ত, কখনও কখনও এমনকি লাইন-উচ্চতা পর্যন্ত হয়। আমার পক্ষে কেবল হোভারটি আটকাতে কেন সহজ হবে, প্রতিটি একক হোভার ইফেক্টটি ওভাররাইট করতে পারে না কেন ts
মেও

এই ধারণার জন্য আংশিক প্যাচ: আপনি সিএসএস একটি নিয়ম তৈরি করতে পারেন a.jsOverride:hoverযা সিএসএসের সমস্ত বৈশিষ্ট্যকে ওভাররাইড করে তার জন্য নির্বাচন করে, সুতরাং jsOverrideপৃষ্ঠাটি লোড হওয়ার পরে
জেএসকে কেবল

1

আসলে এটির সমাধানের অন্য একটি উপায় হতে পারে, সিএসএস দিয়ে ওভাররাইট করা insertRule

এটি বিদ্যমান / নতুন স্টাইলশিটে সিএসএস বিধিগুলি ইনজেক্ট করার ক্ষমতা দেয়। আমার দৃ concrete় উদাহরণে এটি দেখতে এই রকম হবে:

//creates a new `style` element in the document
var sheet = (function(){
  var style = document.createElement("style");
  // WebKit hack :(
  style.appendChild(document.createTextNode(""));
  // Add the <style> element to the page
  document.head.appendChild(style);
  return style.sheet;
})();

//add the actual rules to it
sheet.insertRule(
 "ul#mainFilter a:hover { color: #0000EE }" , 0
);

আমার 4 বছরের পুরানো মূল উদাহরণ সহ ডেমো: http://jsfiddle.net/raPeX/21/

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