টাচ ডিভাইসে বোতামগুলির জন্য কীভাবে স্টিকি হোভার এফেক্টগুলি প্রতিরোধ করবেন


144

আমি পূর্ববর্তী এবং পরবর্তী বোতামের সাহায্যে একটি ক্যারোসেল তৈরি করেছি যা সর্বদা দৃশ্যমান। এই বোতামগুলির একটি হোভার স্টেট রয়েছে, সেগুলি নীল হয়ে যায়। আইপ্যাডের মতো স্পর্শ ডিভাইসে, হোভারের অবস্থাটি আঠালো, তাই বোতামটি এটিকে টেপ দেওয়ার পরে নীল থেকে যায়। আমি এটা চাই না।

  • আমি প্রতিটি বোতামের জন্য একটি no-hoverক্লাস যুক্ত ontouchendকরতে পারি এবং আমার সিএসএসকে এটি তৈরি করতে পারি: button:not(.no-hover):hover { background-color: blue; }তবে এটি সম্ভবত কার্য সম্পাদনের জন্য বেশ খারাপ, এবং Chromebook পিক্সেলের মতো ডিভাইসগুলি (যা একটি টাচস্ক্রিন এবং একটি মাউস উভয়ই রয়েছে) সঠিকভাবে পরিচালনা করে না।

  • আমি একটি touchক্লাস যুক্ত করতে documentElementএবং এটি আমার সিএসএস তৈরি করতে পারতাম: html:not(.touch) button:hover { background-color: blue; }তবে এটি স্পর্শ এবং মাউস উভয়ই ডিভাইসে ঠিক কাজ করে না।

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

আমি যে সমস্ত সমাধান পেয়েছি সেগুলি অপূর্ণ বলে মনে হচ্ছে। একটি নিখুঁত সমাধান আছে?

উত্তর:


55

আপনি অস্থায়ীভাবে ডিওএম থেকে লিঙ্কটি সরিয়ে হোভারের অবস্থাটি সরাতে পারেন। Http://testbug.handraft.com/ipad.html দেখুন


সিএসএসে আপনার রয়েছে:

:hover {background:red;}

জেএসে আপনার রয়েছে:

function fix()
{
    var el = this;
    var par = el.parentNode;
    var next = el.nextSibling;
    par.removeChild(el);
    setTimeout(function() {par.insertBefore(el, next);}, 0)
}

এবং তারপরে আপনার HTML এ রয়েছে:

<a href="#" ontouchend="this.onclick=fix">test</a>

3
@ ক্রিস গুড পয়েন্ট, আমি অনটচেনড ইভেন্টে অন্লিক হ্যান্ডলারটি সেট করার উদাহরণটি পরিবর্তন করেছি।
সজোয়ার্ড ভিসচার

4
আপনার উত্তরে ন্যূনতম প্রদর্শক কোড যুক্ত করার বিষয়টি দয়া করে বিবেচনা করুন। ধন্যবাদ! stackoverflow.com/help/how-to-answer
2540625

1
@ সোজারডভিসর আমি এটি আটকিয়ে রেখেছি links স্ট্যাকওভারফ্লো উত্তরটিতে কোডটি পছন্দ করে, কারণ লিঙ্কগুলি যেতে পারে। (এবং এক্ষেত্রে এটি কেবল ক্লিকের মাধ্যমে নয়, তবে উত্সটি দেখার দরকার ছিল এবং কোন বিটগুলিই প্রশ্নে কৌশল তা কৌশলগত।)
ড্যারেন কুক

2
@ কেভিনবোর্ডার হ্যাঁ কিছু ডিভাইসে উপাদানটি অপসারণ এবং পুনরায় সরিয়ে দেওয়ার মধ্যে সময় বিলম্ব খুব লক্ষণীয় হতে পারে। দুর্ভাগ্যক্রমে, আমি আমার অ্যান্ড্রয়েড 4.4 ডিভাইসে পেয়েছি যে সেটটাইমআউট ছাড়াই এটি করা কার্যকর হয় না।
রডনি

1
ধারণাটি আকর্ষণীয়, তবে আমি এটিকে কিছুটা বিড়বিড় করে দেখেছি এবং সমস্ত স্পর্শ ডিভাইসে ব্যাপকভাবে সমর্থনযোগ্য নয়। আমি এই স্ট্যাকওভারফ্লো.com
লরেঞ্জো পোলিডোরি

83

সিএসএস মিডিয়া ক্যোয়ারী স্তর 4 একবার কার্যকর হয়ে গেলে আপনি এটি করতে সক্ষম হবেন:

@media (hover: hover) {
    button:hover {
        background-color: blue;
    }
}

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

যেহেতু মিডিয়া ক্যোয়ারী লেভেল 4 এর এই অংশটি এখন পর্যন্ত কেবল রক্তক্ষরণকারী ক্রোমে প্রয়োগ করা হয়েছে, তাই আমি এটি মোকাবেলায় একটি পলিফিল লিখেছি । এটি ব্যবহার করে, আপনি উপরের ভবিষ্যত সিএসএসকে রূপান্তর করতে পারেন:

html.my-true-hover button:hover {
    background-color: blue;
}

( .no-touchকৌশলটিতে একটি প্রকরণ ) এবং তারপরে একই পলিফিল থেকে কিছু ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্ট ব্যবহার করে যা ঘোরাঘুরির জন্য সমর্থন সনাক্ত করে, আপনি সেই my-true-hoverঅনুযায়ী ক্লাসের উপস্থিতি টগল করতে পারেন :

$(document).on('mq4hsChange', function (e) {
    $(document.documentElement).toggleClass('my-true-hover', e.trueHover);
});

ধন্যবাদ! আমার উদ্দেশ্যগুলির জন্য এটি বেশিরভাগ ব্রাউজারে caniuse.com/#search=media%20 অনুসন্ধানগুলিতে সমর্থিত বলে মনে হয় এবং দুর্দান্তভাবে কাজ করে, ধন্যবাদ!
রাগামুফিন

3
আপনি তাকান প্রয়োজন caniuse.com/#feat=css-media-interaction পরিবর্তে এবং আপনি দেখতে পাবেন এটা Firefox এবং IE11 সমর্থিত নয় :( তাই আপনি polyfill প্রয়োজন
CherryDT

দেখে মনে হচ্ছে পলিফিল আর সমর্থিত নয় (রেপো সংরক্ষণাগারভুক্ত) এবং এর জন্য jQuery দরকার ...
amoebe

এটি এখন মোবাইল ব্রাউজারগুলিতে বিস্তৃতভাবে সমর্থিত এবং একটি কবজির মতো কাজ করে। আমি মনে করি এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
ট্রেভর বার্নহ্যাম

এটি অবশ্যই প্রয়োগ করা সবচেয়ে সহজ এবং সর্বোত্তম উত্তর। অ্যান্ড্রয়েড মোবাইল এবং পিসিতে ফায়ারফক্সে কাজ করে। দ্বৈত স্পর্শ এবং মাউস ডিভাইস সম্পর্কে নিশ্চিত না।
হাফমেনস 13

28

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

আমার সবচেয়ে পরিষ্কার সমাধানটি হ'ল কেবলমাত্র হোভার আচরণ সক্ষম করা যদি ডিভাইসটি টাচ ইনপুটটিকে সমর্থন করে না বলে মনে করা হয়।

var isTouch =  !!("ontouchstart" in window) || window.navigator.msMaxTouchPoints > 0;

if( !isTouch ){
    // add class which defines hover behavior
}

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

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


1
আশ্চর্যজনক, এটি আমার জন্য কাজ করেছে, সম্প্রদায়ের উইকি / ড্যারেন কুক জবাবের বিপরীতে।
জান্নিক

1
ভাল উত্তর. এটি একটি অনুরূপ সমাধান: স্ট্যাকওভারফ্লো.com
লোরেঞ্জো পলিডোরি

11

সঙ্গে Modernizr আপনি কোন স্পর্শ ডিভাইসের জন্য বিশেষভাবে আপনার হোভার লক্ষ্য করতে পারেন:

(দ্রষ্টব্য: এটি স্ট্যাকওভারফ্লোর স্নিপেট সিস্টেমে চলে না, পরিবর্তে jsfiddle দেখুন )

/* this one is sticky */
#regular:hover, #regular:active {
  opacity: 0.5;
}

/* this one isn't */
html.no-touch #no-touch:hover, #no-touch:active {
  opacity: 0.5;
}

মনে রাখবেন যে :activeএটির সাথে লক্ষ্যবস্তু করার দরকার নেই .no-touchকারণ এটি মোবাইল এবং ডেস্কটপ উভয় ক্ষেত্রেই প্রত্যাশা অনুযায়ী কাজ করে।


এটি সেরা উত্তর IMO তবে উদাহরণটি ভুল। এটি টাচ এবং নন-টাচ ডিভাইসের জন্য একই হোভারের অবস্থা দেখাচ্ছে। ট্যাগটিতে .no-touchউপস্থিত থাকলে এটি কেবল হোভার স্টেট প্রয়োগ করা উচিত html। অন্যথায়, এই উত্তরটি আমার অনুমোদনের স্ট্যাম্প পেয়েছে।
মরিসব্রেট

2
সমস্যাটি হ'ল এখন যে মাউস-সক্ষম ডিভাইসগুলির স্পর্শ স্ক্রিনগুলি রয়েছে সমস্ত জায়গা জুড়ে, আপনি সত্যিই আর এই পদ্ধতিতে নির্ভর করতে পারবেন না। তবে আমি এটি করার আরও অনেক উপায় দেখতে পাচ্ছি না ... এটি বেশ দ্বিধাদ্বন্দ্ব
ডুয়াদওয়াদ

আমি মনে করি এটি করার একটি উপায় হ'ল মডার্নিজার পাশাপাশি মোবাইল-ডিটেক্ট.জেসের মতো একটি লাইব্রেরি উভয়ই এটি ফোন বা ট্যাবলেট নয় তা নিশ্চিত করার জন্য ব্যবহার করা।
গ্যাভিন

আপনি ত্রাণকর্তা লোকটি মোবাইল ডিভাইসগুলির জন্য পুরোপুরি কাজ করেছে অনেক ধন্যবাদ
শিবাম

8
$("#elementwithhover").click(function() { 
  // code that makes element or parent slide or otherwise move out from under mouse. 

  $(this).clone(true).insertAfter($(this));
  $(this).remove();
});

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

ক্লোন ট্রু আটকে থাকা হোভারের সাথে উপাদানটির স্থান নিয়ে নতুন এলেমিনেটের ক্লিক ইভেন্ট সংরক্ষণ করে। ক্লোন করার পরে আসল উপাদানটি ডোম থেকে সরানো হচ্ছে।
ভেরার্ড স্লগজেট

অসাধারণ ভাই, 10x
কালায়ান স্টামাতভ

স্থির জন্য অনুসন্ধানের ঘন্টা এবং এটি অবশেষে একটি সরবরাহ করে। অসংখ্য ধন্যবাদ!
phil917

8

থেকে মোবাইলে চটচটে হোভার সঙ্গে চুক্তি 4 উপায়ে : এখানে একটি উপায় পরিবর্তনশীল যোগ করতে অথবা একটি "সরান এর can touchব্যবহারকারীর বর্তমান ইনপুট ধরনের উপর ভিত্তি করে দস্তাবেজে" শ্রেণী। এটি হাইব্রিড ডিভাইসগুলির সাথেও কাজ করে যেখানে ব্যবহারকারী স্পর্শ এবং একটি মাউস / ট্র্যাকপ্যাডের মধ্যে স্যুইচ করতে পারে:

<script>

;(function(){
    var isTouch = false //var to indicate current input type (is touch versus no touch) 
    var isTouchTimer 
    var curRootClass = '' //var indicating current document root class ("can-touch" or "")

    function addtouchclass(e){
        clearTimeout(isTouchTimer)
        isTouch = true
        if (curRootClass != 'can-touch'){ //add "can-touch' class if it's not already present
            curRootClass = 'can-touch'
            document.documentElement.classList.add(curRootClass)
        }
        isTouchTimer = setTimeout(function(){isTouch = false}, 500) //maintain "istouch" state for 500ms so removetouchclass doesn't get fired immediately following a touch event
    }

    function removetouchclass(e){
        if (!isTouch && curRootClass == 'can-touch'){ //remove 'can-touch' class if not triggered by a touch event and class is present
            isTouch = false
            curRootClass = ''
            document.documentElement.classList.remove('can-touch')
        }
    }

    document.addEventListener('touchstart', addtouchclass, false) //this event only gets called when input type is touch
    document.addEventListener('mouseover', removetouchclass, false) //this event gets called when input type is everything from touch to mouse/ trackpad
})();

</script>

এটি আমার সর্বাধিক সেরা উপায়, এছাড়াও যদি আপনি টাইমারটি 1000 মিমি পর্যন্ত বাড়িয়ে দেন তবে আপনি দীর্ঘ প্রেসটিও কভার করতে পারেন, এখানে দেখুন । দুর্দান্ত জিনিস!
lowtechsun

8

হোভার সমর্থন করে না এমন ডিভাইসগুলির জন্য আপনি হোভার এফেক্টটিকে ওভাররাইড করতে পারেন। ভালো লেগেছে:

.my-thing {
    color: #BADA55;
}

.my-thing:hover {
    color: hotpink;
}

@media (hover: none) {
    .my-thing {
        color: #BADA55;
    }
}

আইওএস 12 এ পরীক্ষিত এবং যাচাই করা হয়েছে

এটি নির্দেশ করার জন্য https://stackoverflow.com/a/50285058/178959 এ টুপি টিপুন ।


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

3

আমি আমার নিজস্ব সমাধান পোস্ট করতে যাচ্ছিলাম, তবে ইতিমধ্যে কেউ এটি পোস্ট করেছে কিনা তা পরীক্ষা করে দেখলাম যে @ রডনি এটি প্রায় সম্পন্ন করেছে। যাইহোক, তিনি এটিকে একটি চূড়ান্ত গুরুত্বপূর্ণ বিষয় থেকে মিস করেছেন যা আমার পক্ষে কমপক্ষে এটি দৃষ্টিনন্দন করে তুলেছিল। আমি বলতে চাচ্ছি, আমি খুব একই নেন .fakeHover/ বর্গ উপরন্তু মাধ্যমে সরানোর mouseenterএবং mouseleaveইভেন্ট সনাক্তকরণ, কিন্তু যে একা, কোনটাই , প্রায় হুবহু "প্রকৃত" মত কাজ করে :hover। আমি বলতে চাইছি: আপনি যখন আপনার টেবিলের কোনও উপাদানটিতে ট্যাপ করেন তখন এটি সনাক্ত করে না যে আপনি এটি "ছুঁড়ে" ফেলেছেন - এইভাবে "ফেইকহোভার" স্থিতি রেখে।

আমি যা করেছি তা কেবল শুনতে clickপেলাম, তাই যখন আমি বোতামটি "টিপ" করি, আমি নিজে নিজে একটি গুলি চালিয়ে যাই mouseleave

সি এটি আমার চূড়ান্ত কোড:

.fakeHover {
    background-color: blue;
}


$(document).on('mouseenter', 'button.myButton',function(){
    $(this).addClass('fakeHover');
});

$(document).on('mouseleave', 'button.myButton',function(){
    $(this).removeClass('fakeHover');
});

$(document).on('button.myButton, 'click', function(){
    $(this).mouseleave();
});

আপনার বাটনে hoverকেবল "ঘোরা" যখন মাউস ব্যবহার করার সময় আপনি আপনার স্বাভাবিক কার্যকারিতাটি বজায় রাখেন। ঠিক আছে, প্রায় সবগুলিই: একরকমই হতাশাটি হ'ল, মাউসের সাহায্যে বোতামটি ক্লিক করার পরে, এটি hoverঅবস্থায় থাকবে না । অনেকটা পছন্দ মতো যদি আপনি ক্লিক করে তাড়াতাড়ি পয়েন্টারটি বোতামের বাইরে নিয়ে যান। তবে আমার ক্ষেত্রে আমি এটি নিয়ে বাঁচতে পারি।


2

এই আমি বাকি উত্তরগুলি অধ্যয়ন করে এতদূর এনেছি। এটি কেবলমাত্র স্পর্শ, কেবল মাউস-বা সংকর ব্যবহারকারীদের সমর্থন করতে সক্ষম হওয়া উচিত।

হোভার ইফেক্টের জন্য একটি পৃথক হোভার ক্লাস তৈরি করুন। ডিফল্টরূপে, আমাদের বোতামে এই হোভার ক্লাস যুক্ত করুন।

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

পরবর্তী সমস্যাটি হল, যদি ব্যবহারকারীটি বোতামটি স্পর্শ করার পরে মাউস ব্যবহার করতে ফিরে যেতে চান? এটি সমাধানের জন্য, আমাদের সরিয়ে নেওয়া হোভার ক্লাসটি আবার যুক্ত করার জন্য আমাদের একটি উপযুক্ত মুহূর্তের সন্ধান করতে হবে।

তবে আমরা এটিকে সরিয়ে দেওয়ার সাথে সাথেই এটি আবার যুক্ত করতে পারি না, কারণ হোভারের অবস্থা এখনও সক্রিয়। আমরা পুরো বোতামটি পাশাপাশি ধ্বংস করতে ও পুনরায় তৈরি করতে চাই না।

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

আমি জানি ব্যস্ত-অপেক্ষার কাজটি দুর্দান্ত নয় তবে কোনও উপযুক্ত ঘটনা আছে কিনা তা আমি নিশ্চিত নই। আমি এটিকে আবার মাউসলেভ ইভেন্টে যুক্ত করার বিষয়টি বিবেচনা করেছি, তবে এটি খুব শক্ত ছিল না। উদাহরণস্বরূপ, বোতামটি স্পর্শের পরে যখন কোনও সতর্কতা পপ আপ হয়, তখন মাউস অবস্থানটি স্থানান্তরিত হয় তবে মাউসলেভ ইভেন্টটি ট্রিগার হয় না।

var button = document.getElementById('myButton');

button.ontouchstart = function(e) {
  console.log('ontouchstart');
  $('.button').removeClass('button-hover');
  startIntervalToResetHover();
};

button.onclick = function(e) {
  console.log('onclick');
}

var intervalId;

function startIntervalToResetHover() {
  // Clear the previous one, if any.
  if (intervalId) {
    clearInterval(intervalId);
  }
  
  intervalId = setInterval(function() {
    // Stop if the hover class already exists.
    if ($('.button').hasClass('button-hover')) {
      clearInterval(intervalId);
      intervalId = null;
      return;
    }
    
    // Checking of hover state from 
    // http://stackoverflow.com/a/8981521/2669960.
    var isHovered = !!$('.button').filter(function() {
      return $(this).is(":hover");
    }).length;
    
    if (isHovered) {
      console.log('Hover state is active');
    } else {
      console.log('Hover state is inactive');
      $('.button').addClass('button-hover');
      console.log('Added back the button-hover class');
      
      clearInterval(intervalId);
      intervalId = null;
    }
  }, 1000);
}
.button {
  color: green;
  border: none;
}

.button-hover:hover {
  background: yellow;
  border: none;
}

.button:active {
  border: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id='myButton' class='button button-hover'>Hello</button>

সম্পাদনা: অন্য একটি পদ্ধতির জন্য আমি চেষ্টা করেছিলাম e.preventDefault()হ'ল অনটচ স্টার্ট বা অন্টচেন্ডের মধ্যে কল করা। এটি বোতামটি স্পর্শ করা হলে হোভার এফেক্টটি থামিয়ে দেবে বলে মনে হয়, তবে এটি বোতামটি ক্লিক অ্যানিমেশনটি বন্ধ করে দেয় এবং বোতামটি স্পর্শ করা হলে অনক্লিক ফাংশনটি কল করা থেকে বাধা দেয়, সুতরাং আপনাকে সেইগুলি ম্যানুয়ালি কল করতে হবে অনটচ স্টার্ট বা অন্টচেন্ড হ্যান্ডলারে। খুব পরিষ্কার সমাধান নয়।


1

এটি আমার জন্য সহায়ক ছিল: লিঙ্ক

function hoverTouchUnstick() {
    // Check if the device supports touch events
    if('ontouchstart' in document.documentElement) {
        // Loop through each stylesheet
        for(var sheetI = document.styleSheets.length - 1; sheetI >= 0; sheetI--) {
            var sheet = document.styleSheets[sheetI];
            // Verify if cssRules exists in sheet
            if(sheet.cssRules) {
                // Loop through each rule in sheet
                for(var ruleI = sheet.cssRules.length - 1; ruleI >= 0; ruleI--) {
                    var rule = sheet.cssRules[ruleI];
                    // Verify rule has selector text
                    if(rule.selectorText) {
                        // Replace hover psuedo-class with active psuedo-class
                        rule.selectorText = rule.selectorText.replace(":hover", ":active");
                    }
                }
            }
        }
    }
}

গ্লোবাল অনটচ স্টার্ট ইভেন্ট হ্যান্ডলার থেকে আপনাকে একবার হোভারটচউনস্টিক () কল করতে হবে। এবং এই সমাধান নিখুঁতভাবে কাজ করবে।
Jusid

1

আপনার পৃষ্ঠায় এই জেএস কোড যুক্ত করুন:

document.body.className = 'ontouchstart' in document.documentElement ? '' : 'hover';

এখন আপনার সিএসএসে প্রতিটি হোভারের আগে হওয়ার ক্লাসটি যুক্ত করুন:

.hover .foo:hover {}

ডিভাইসটি স্পর্শ করা থাকলে, বডি ক্লাসটি খালি থাকবে, অন্যথায় এর শ্রেণিটি হোভার হবে এবং নিয়মগুলি প্রয়োগ করা হবে!


আমার পক্ষে কাজ করেনি, তবে এটি করেছে:document.body.className = 'ontouchstart' in window ? '' : 'hover';
ডারসকুলস্টার

1

আমি প্রতিটি বোতামের জন্য নো-হোভার ক্লাস অন টুচেন্ড যুক্ত করতে পারি এবং আমার সিএসএসকে> এর মতো করে তুলতে পারি: বোতাম: নয় (কোনও নম্বরে নেই): হোভার {ব্যাকগ্রাউন্ডের রঙ: নীল; } তবে এটি সম্ভবত পারফরম্যান্সের জন্য বেশ খারাপ, এবং Chromebook পিক্সেলের মতো ডিভাইসগুলি (যাতে একটি টাচস্ক্রিন এবং একটি মাউস উভয়ই রয়েছে)> সঠিকভাবে পরিচালনা করে না।

এটি সঠিক সূচনা পয়েন্ট। পরবর্তী পদক্ষেপ: নিম্নলিখিত ইভেন্টগুলিতে নোহোভার ক্লাস প্রয়োগ / সরিয়ে ফেলুন (jQuery সহ ডেমো)

buttonelement
 .on("touchend touchcancel",function(){$(this).addClass("nohover")})
 .on("touchstart mouseover",function({$(this).removeClass("nohover")});   

বিজ্ঞপ্তি: আপনি যদি বুনোনিলেটে অন্যান্য ক্লাস প্রয়োগ করতে চান তবে সিএসএসে: (নাহোভার) প্রত্যাশার মতো আর কাজ করবে না। হোভার শৈলী ওভাররাইট করতে আপনার পরিবর্তে ডিফল্ট মান এবং! গুরুত্বপূর্ণ ট্যাগের সাথে পরিবর্তে একটি পৃথক সংজ্ঞা যুক্ত করতে হবে: নোওভার {পটভূমির রঙ: সাদা! গুরুত্বপূর্ণ}

এটি এমনকি Chromebook পিক্সেলের মতো ডিভাইসগুলি হ্যান্ডেল করা উচিত (যার মধ্যে একটি টাচস্ক্রিন এবং একটি মাউস উভয় রয়েছে) সঠিকভাবে! এবং আমি মনে করি না, এটি একটি বড় পারফরম্যান্স হত্যাকারী ...


1

একটি সমাধান যা আমার পক্ষে কাজ করেছে:

html {
   -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}

আপনার স্টাইলশিটে এই কোডটি যুক্ত করুন।

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


1

আমি মনে করি অনুরূপ সমস্যার জন্য আমি একটি মার্জিত (সর্বনিম্ন জেএস) সমাধান পেয়েছি:

JQuery ব্যবহার করে আপনি ব্যবহার করে শরীরে (বা অন্য কোনও উপাদান) হোভার ট্রিগার করতে পারেন .mouseover()

সুতরাং আমি এই জাতীয় উপাদানটির ontouchendইভেন্টের সাথে এই হ্যান্ডলারটি কেবল সংযুক্ত করি :

var unhover = function() {
  $("body").mousover();  
};
.hoverable {
  width: 100px;
  height: 100px;
  background: teal;
  cursor: pointer;
}

.hoverable:hover {
  background: pink;
}
<div class="hoverable" ontouchend={unhover}></div>

তবে এটি কেবল সরিয়ে দেয়: অন্য কোনও স্পর্শ ইভেন্টের সূত্রপাত হওয়ার পরে উপাদানটি থেকে সিউডোক্লাসটি হোয়েপ বা অন্য কোনও স্পর্শের মতো ঘটান


1
আপনার কোড স্নিপেটের জন্য, আমি এটি স্পর্শ করার পরে বর্গটি এখনও গোলাপী থেকে যায় remains আমার ধারণা আপনি এই প্রশ্নটিতে জিজ্ঞাসা করা সমস্যাটি কি সত্যিই সমাধান করেননি?
কেভিন লি

এই সমাধান কাজ করে না। প্রথমত, আপনি কোনও ইভেন্ট শুরু করার জন্য ভুল পদ্ধতিটি ব্যবহার করেছেন, আপনার .trigger () ব্যবহার করা উচিত । দ্বিতীয়ত, মোবাইল সাফারি কোনওভাবেই কাজ করে না।
xHocquet

1

আমার কাছে একটি ভাল সমাধান রয়েছে যা আমি ভাগ করে নিতে চাই। প্রথমে আপনাকে ব্যবহারকারী এটির মতো মোবাইলে রয়েছে কিনা তা সনাক্ত করতে হবে:

var touchDevice = /ipad|iphone|android|windows phone|blackberry/i.test(navigator.userAgent.toLowerCase());

তারপরে কেবল যুক্ত করুন:

if (!touchDevice) {
    $(".navbar-ul").addClass("hoverable");
}

এবং সিএসএসে:

.navbar-ul.hoverable li a:hover {
    color: #fff;
}

2
হাইব্রিড ডিভাইসগুলিতে কাজ করে না, যেমন উইন্ডোজ টাচস্ক্রিন পিসি।
সিএসপল্টন

1

আমি একই ধরণের সমস্যার মধ্য দিয়ে গিয়েছিলাম, আমার অ্যাপ্লিকেশনটি সমস্ত স্ক্রিনের মাপের সাথে সামঞ্জস্যপূর্ণ ছিল ডেস্কটপ-স্ক্রিন-আকার / মাউস ভিত্তিক ডিভাইসগুলিতে হরওয়ারের প্রভাবগুলি হ'ল এবং পরে আমি বুঝতে পেরেছি যে স্পর্শ ভিত্তিক ডিভাইসগুলি স্টিকি হিসাবে পরিচিত একটি শর্ত তৈরি করছে were - তবে টাচ ভিত্তিক ডিভাইস ব্যবহারকারীদের জন্য অ্যাপটি সঠিকভাবে কাজ করা বাধা হয়ে দাঁড়িয়েছিল।

আমরা আমাদের অ্যাপে এসসিএসএস ব্যবহার করছিলাম । এবং আমি একটি মিশ্রণ সংজ্ঞায়িত করেছি স্পর্শ ভিত্তিক ডিভাইসের যত্ন নিতে ।

@mixin hover-support {
  @media not all and (pointer: coarse) {
    &:hover {
      @content;
    }
  }
}

এবং তারপরে আমি আমার সমস্ত CSS ক্লাসগুলি নীচে উল্লিখিত স্নিপেটের নীচে রেখেছি।

   @include hover-support() {
    // Your css-classes or css that you want to apply on those devices that support hover.
   }

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

@include hover-support() {
  .animate-icon {
    -webkit-transition: all 0.2s;
    transition: all 0.2s;
    &:hover {
      transform: scale(1.3);
      filter: brightness(85%);
      cursor: pointer;
    }
  }
}

1

এখানে কিছু সাধারণ জাভাস্ক্রিপ্ট কোড রয়েছে যা বিকাশকারীকে সিএসএস সম্পাদনা করতে বা কোনও নতুন সিএসএস বিধি লেখার প্রয়োজন নেই। আমি class="btn"এটি দিয়ে বুটস্ট্র্যাপ বোতামগুলির জন্য লিখেছি , তবে এটি কোনও শ্রেণীর নাম রয়েছে এমন কোনও বোতামের সাথে কাজ করবে।

পদক্ষেপগুলি হ'ল:

  1. এটি কোনও স্পর্শ ডিভাইস কিনা তা নির্ধারণ করুন
  2. যদি এটি হয় তবে প্রতিটি সিএসএস নিয়মে পুনরাবৃত্তি করুন document.styleSheets
  3. .btnএবং উভয়ই যে কোনও নিয়ম মুছুন:hover

সমস্ত .btn :hoverসিএসএস বিধি বিলোপ নিশ্চিত করে যে কোনও বোতামে ভিজ্যুয়াল হোভার প্রভাব থাকবে না effect

পদক্ষেপ 1: টাচ ডিভাইস সনাক্ত করুন

উপস্থিতির জন্য মিডিয়া ক্যোয়ারী পরীক্ষা করুন (hover: none):

    const hasMatchMedia = typeof window.matchMedia !== 'undefined';
    /**
     * determine if device is touch-capable
     * true - device is touch-capable
     * false - device is not touch-capable
     * null - unable to determine touch capability
     * @return {null|boolean}
     */
    const hasTouch = () => {
      if (hasMatchMedia) {
        return window.matchMedia('(hover: none)').matches;
      }
      return null;
    };

পদক্ষেপ 2: `বিটিএন` এবং`: হোভার` সমন্বিত সিএসএস বিধিগুলি মুছুন `

    /**
     * remove all CSS rules contaning both '.btn' and ':hover'
     * @return {number} count of rules deleted
     */
    function removeBtnHovers () {

      let rulesDeleted = 0;

      // recursively delete '.btn:hover' rules
      function recursiveDelete (rules, styleSheet) {

        if (typeof rules === 'undefined' ||
          typeof rules.length === 'undefined' ||
          rules.length <= 0) {
          return;
        }

        // iterate in reverse order,
        // deleting any rule containing both '.btn' and ':hover'
        const ruleLen = rules.length;
        for (let i = ruleLen - 1; i >= 0; i--) {
          const rule = rules[i];
          if (typeof rule.cssRules === 'undefined') {
            // a standard rule, evaluate it
            const cssText = rule.cssText;
            if (typeof cssText === 'string' &&
              cssText.includes('.btn') &&
              cssText.includes(':hover')) {
              styleSheet.deleteRule(i);
              rulesDeleted++;
            }
          } else {
            // rule contains cssRules, iterate over them
            recursiveDelete(rule.cssRules, rule);
          }
        }
      }

      // iterate over all style sheets in document
      for (const styleSheet of document.styleSheets) {
        let rules = styleSheet.cssRules;
        if (!rules) { continue; }
        recursiveDelete(rules, styleSheet);
      }
      return rulesDeleted;
    }

সম্পূর্ণ কোডটি গিটহাব এবং এনপিএম এ

Terrymorse.com এ লাইভ ডেমো ।


এটি কি মাউস / ট্র্যাকপ্যাড সহ টাচস্ক্রিন ডিভাইসের জন্য হোভার এফেক্টটি সরিয়ে দেয় না?
Jensei

পছন্দ করেছেন ডিভাইসটি মেলে @media (hover:none), বা ব্যবহারকারী যখন প্রথম স্ক্রিনটি স্পর্শ করে তখন হোভার বিধিগুলি সরানো হয় । আপনি এটি নিশ্চিত করার জন্য লাইভ ডেমো পৃষ্ঠায় এটি ব্যবহার করে দেখতে পারেন।
টেরিমর্স

0

আপনি :activeস্টেটে ব্যাকগ্রাউন্ড-কালার সেট করতে এবং :focus ডিফল্ট ব্যাকগ্রাউন্ড দিতে পারেন।

আপনি যদি এর মাধ্যমে ব্যাকগ্রাউন্ড-রঙ সেট করেন onfocus/ontouch, একবার :focusরাজ্য চলে গেলে রঙের স্টাইলটি রয়ে যায় । ফোকাস হারিয়ে গেলে ডিফল্ট বিজি পুনরুদ্ধার করতে আপনার
পুনরায় সেট করতে হবে onblur


তবে আমি মাউস ব্যবহারকারীদের জন্য হোভার ইফেক্ট বজায় রাখতে চাই।
ক্রিস

: হোভার এবং: অ্যাক্টিভ একই সিএসএস গ্রহণ করতে পারে, এটি: ফোকাস আপনার সমস্যা আছে। প্রকৃতপক্ষে, আপনি যদি অনফোকাসের মাধ্যমে পটভূমি রঙ সেট করেন তবে একবার ফোকাস হয়ে গেলে রঙের স্টাইলটি রয়ে যায়। ডিফল্ট বিজি পুনরুদ্ধার করতে আপনার onlur এ পুনরায় সেট করা দরকার
G-Cyrillus

0

এটি আমার পক্ষে কাজ করেছে: একটি নতুন ক্লাসে হোভার স্টাইলিং রাখুন

.fakehover {background: red}

তারপরে যখন প্রয়োজন হবে তখন ক্লাস যুক্ত / সরিয়ে দিন

$(".someclass > li").on("mouseenter", function(e) {
  $(this).addClass("fakehover");
});
$(".someclass > li").on("mouseleave", function(e) {
  $(this).removeClass("fakehover");
});

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


0

ড্যারেন কুকের উত্তরের উপর ভিত্তি করে যা আপনার আঙুলকে অন্য কোনও উপাদানের উপরে সরিয়ে দিলে তাও কার্যকর হয়।

দেখুন খুঁজুন উপাদান আঙুল একটি touchend ইভেন্টের সময় চালু থাকে

jQuery(function() {
    FastClick.attach(document.body);
});
// Prevent sticky hover effects for buttons on touch devices
// From https://stackoverflow.com/a/17234319
//
//
// Usage:
// <a href="..." touch-focus-fix>..</a>
//
// Refactored from a directive for better performance and compability
jQuery(document.documentElement).on('touchend', function(event) {
  'use strict';

  function fix(sourceElement) {
    var el = $(sourceElement).closest('[touch-focus-fix]')[0];
    if (!el) {
      return;
    }
    var par = el.parentNode;
    var next = el.nextSibling;
    par.removeChild(el);
    par.insertBefore(el, next);
  }

  fix(event.target);
  var changedTouch = event.originalEvent.changedTouches[0];
  // http://www.w3.org/TR/2011/WD-touch-events-20110505/#the-touchend-event
  if (!changedTouch) {
    return;
  }
  var touchTarget = document.elementFromPoint(changedTouch.clientX, changedTouch.clientY);
  if (touchTarget && touchTarget !== event.target) {
    fix(touchTarget);
  }
});

Codepen Demo


0

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

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

var isEventSupported = function (eventName, elementName) {
    var el = elementName ? document.createElement(elementName) : window;
    eventName = 'on' + eventName;
    var isSupported = (eventName in el);
    if (!isSupported && el.setAttribute) {
        el.setAttribute(eventName, 'return;');
        isSupported = typeof el[eventName] == 'function';
    }
    el = null;
    return isSupported;
};

if (!isEventSupported('touchstart')) {
    $('a').addClass('with-hover');
}

CSS:

a.with-hover:hover {
  color: #fafafa;
}

0

আমি এখন পর্যন্ত আমার প্রকল্পগুলিতে যা করেছি তা হ'ল :hoverটাচ ডিভাইসগুলির পরিবর্তনগুলি ফিরিয়ে দেওয়া :

.myhoveredclass {
    background-color:green;
}
.myhoveredclass:hover {
    background-color:red;
}
@media screen and (-webkit-min-device-pixel-ratio:0) {
    .myhoveredclass:hover, .myhoveredclass:active, .myhoveredclass:focus {
        background-color:green;
    }
}

কেবলমাত্র প্রদর্শনের উদ্দেশ্যে সমস্ত শ্রেণীর নাম এবং নামযুক্ত রঙ ;-)


0

এটি 2 পদক্ষেপে পুরোপুরি কাজ করে।

  1. আপনার শরীরের ট্যাগটি এটির মতো সেট করুন <body ontouchstart="">। আমি এই "হ্যাক" এর অনুরাগী নই, তবে এটি আইওএস-এ সাফারিটিকে তাত্ক্ষণিকভাবে ছোঁয়ার প্রতিক্রিয়া জানাতে দেয়। কীভাবে নিশ্চিত, তবে এটি কার্যকর works

  2. আপনার স্পর্শযোগ্য ক্লাসটি এটির মতো সেট আপ করুন:

    // I did this in SASS, but this should work with normal CSS as well
    
    // Touchable class
    .example {
    
        // Default styles
        background: green;
    
        // Default hover styles 
        // (Think of this as Desktop and larger)
        &:hover {
            background: yellow;
        }
    
        // Default active styles
        &:active {
            background: red;
        }
    
        // Setup breakpoint for smaller device widths
        @media only screen and (max-width: 1048px) {
    
            // Important!
            // Reset touchable hover styles
            // You may want to use the same exact styles as the Default styles
            &:hover {
                background: green;
            }
    
            // Important!
            // Touchable active styles
            &:active {
                background: red;
            }
        }
    }

আপনি আপনার স্পর্শযোগ্য ক্লাসে যে কোনও অ্যানিমেশনটিও সরাতে চাইতে পারেন। অ্যান্ড্রয়েড ক্রোম আইওএসের চেয়ে কিছুটা ধীর বলে মনে হচ্ছে।

এর ফলে ব্যবহারকারী যদি আপনার ক্লাসটি স্পর্শ করার সময় পৃষ্ঠাটি স্ক্রোল করে তবে সক্রিয় স্থিতির প্রয়োগ হবে।


0

ব্রাউজারগুলি স্ক্রিনটি ম্যানিপুলেট করার চেষ্টা করায় :hover :focus :activeমোবাইল ডিভাইসে কিছু স্টিকি বা আটকে যাওয়া সমস্যা দেখা দিতে পারে <meta name="viewport" content="width=device-width">


0

আমার জন্য সমাধানটি হ'ল নোডটি ক্লোন করে প্রতিস্থাপন করার পরে ... আমি এটি করা ঘৃণা করি কিন্তু অফসেটের সাথে উপাদানটি পুনরায় রঙ করার চেষ্টা করেও হাইট কাজ করছে না

    let cloneNode = originNode.cloneNode( true );
    originNode.parentNode.replaceChild( cloneNode, originNode );

শেষ পর্যন্ত এটি আমার পক্ষে কাজ করে নি ... আমার ক্ষেত্রে আমাকে একটি সম্পূর্ণ ES6 ক্লোন করতে হবে যা প্রসারিত এবং বেশ কয়েকটি ইভেন্ট শ্রোতা এবং এটি কেবল এইরকম ক্ষুদ্র জিনিসটি সমাধান করতে জটিল হতে শুরু করে।
নিষিদ্ধ করা

0

এটি একটি এইচটিএমএল ক্লাস অদলবদল দ্বারা সম্পন্ন করা যেতে পারে। এটি পুরো উপাদান মুছে ফেলার চেয়ে গ্ল্যাচগুলি কম প্রবণ হওয়া উচিত, বিশেষত বড়, চিত্রের লিঙ্কগুলি ইত্যাদির সাথে etc.

আমরা ঘোরাতে চাই কিনা তাও আমরা সিদ্ধান্ত নিতে পারি (টাচমোভ) স্ক্রোল করার সময় রাজ্যগুলি ট্রিগার করা বা তাদের বিলম্ব করার জন্য একটি সময়সীমা যুক্ত পারি।

আমাদের কোডের একমাত্র উল্লেখযোগ্য পরিবর্তনটি অতিরিক্ত এইচটিএমএল ক্লাস যেমন <a class='hover'></a>নতুন আচরণ বাস্তবায়নের উপাদানগুলিতে ব্যবহার করবে।

এইচটিএমএল

<a class='my-link hover' href='#'>
    Test
</a>

সিএসএস

.my-link:active, // :active can be turned off to disable hover state on 'touchmove'
.my-link.hover:hover {

    border: 2px dotted grey;
}

জেএস (jQuery সহ)

$('.hover').bind('touchstart', function () {

   var $el;
   $el = $(this);
   $el.removeClass('hover'); 

   $el.hover(null, function () {
      $el.addClass('hover');
   });
});

উদাহরণ

https://codepen.io/mattrcouk/pen/VweajZv

-

যদিও এটিকে সঠিকভাবে পরীক্ষা করতে আমার উভয় মাউস এবং স্পর্শ সহ কোনও ডিভাইস নেই।

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