ডিভাইস টাচস্ক্রীন কিনা তা সনাক্ত করতে মিডিয়া ক্যোয়ারী


122

টাচস্ক্রিন ডিভাইসে না থাকাকালীন কিছু ঘটানোর জন্য মিডিয়া ক্যোয়ারীগুলি ব্যবহার করে, নিরাপদতম উপায় কী? যদি কোনও উপায় না থাকে, আপনি কি জাভাস্ক্রিপ্ট সমাধান যেমন !window.Touchবা মডার্নজার ব্যবহার করার পরামর্শ দিচ্ছেন ?


2
ফাস্ট 2018 অপেক্ষায়, সিএসএস এখন স্থানীয়ভাবে এই কাজ করতে সক্ষম হয় stackoverflow.com/a/50285058/1717735
Buzut

উত্তর:


37

আমি আধুনিকীকরণ ব্যবহার এবং এর মিডিয়া ক্যোয়ারী বৈশিষ্ট্যগুলি ব্যবহার করার পরামর্শ দেব ।

if (Modernizr.touch){
   // bind to touchstart, touchmove, etc and watch `event.streamId`
} else {
   // bind to normal click, mousemove, etc
}

তবে, সিএসএস ব্যবহার করে সিউডো ক্লাস যেমন ফায়ারফক্সে রয়েছে। আপনি ব্যবহার করতে পারেন : -মুজ-সিস্টেম-মেট্রিক (টাচ-সক্ষম) । তবে এই বৈশিষ্ট্যগুলি প্রতিটি ব্রাউজারের জন্য উপলব্ধ নয়।

জন্য অ্যাপল ডিভাইস, আপনাকে সহজ ব্যবহার করতে পারেন:

if(window.TouchEvent) {
   //.....
}

বিশেষত আইপ্যাডের জন্য:

if(window.Touch) {
    //....
}

তবে, এগুলি অ্যান্ড্রয়েডে কাজ করে না

মডার্নিজার বৈশিষ্ট্য সনাক্তকরণের ক্ষমতা দেয় এবং ব্রাউজারগুলির ভিত্তিতে কোডিংয়ের পরিবর্তে বৈশিষ্ট্যগুলি সনাক্তকরণ কোডের একটি ভাল উপায়।

স্টাইলিং টাচ উপাদানসমূহ

মডার্নাইজার এই সঠিক উদ্দেশ্যে HTML ট্যাগে ক্লাস যুক্ত করে। এই ক্ষেত্রে, touchএবং no-touchতাই আপনি আপনার নির্বাচকদের .touch সহ উপস্থাপন করে আপনার স্পর্শ সম্পর্কিত দিকগুলি স্টাইল করতে পারেন। যেমন .touch .your-containerক্রেডিট: বেন সুইনবার্ন


আমি কি এই ভেবে ঠিকই আছি যে কোনও আধুনিক সংস্করণ সমস্ত আধুনিক ডিভাইস / ব্রাউজারগুলির সাথে কাজ করবে না?
জেজেলিলিজিম

@ জেজে ৫6, হ্যাঁ প্রতিটি ব্রাউজার স্পর্শ সিউডো ক্লাস সমর্থন করে না। তবে এটিই modernizrনিখুঁত হবে :)
স্টারেক্স

18
Modernizr.touchপরীক্ষা শুধুমাত্র ইঙ্গিত যদি ব্রাউজার সমর্থন করে ঘটনা, যা অগত্যা একটি টাচস্ক্রীন ডিভাইস প্রতিফলিত না স্পর্শ করুন। উদাহরণস্বরূপ, পাম প্রি / ওয়েবস (টাচ) ফোনগুলি স্পর্শ ইভেন্টগুলিকে সমর্থন করে না এবং এইভাবে এই পরীক্ষায় ব্যর্থ হয়।
numeiaweb

5
এটি যুক্ত করতে কেবল যদি আপনি যাইহোক আধুনিককে অন্তর্ভুক্ত করছেন; মডার্নাইজার এই সঠিক উদ্দেশ্যে বডি ট্যাগে ক্লাস যুক্ত করে। এই ক্ষেত্রে, touchএবং no-touchতাই আপনি আপনার নির্বাচকদের সাথে উপসর্গ রেখে আপনার স্পর্শ সম্পর্কিত দিকগুলি স্টাইল করতে পারেন .touch। উদা.touch .your-container
বেন সুইনবার্ন

2
আমার কাছে মনে হয় মডার্নিজার বডি ট্যাগ নয়, এইচটিএমএল ট্যাগে টাচ ক্লাস যুক্ত করে।
রবিন কক্স

162

CSS4 মিডিয়া ক্যোয়ারী খসড়াটিতে এর জন্য আসলে একটি সম্পত্তি রয়েছে ।

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

'কিছুই নয়'
- ডিভাইসের ইনপুট প্রক্রিয়াটিতে কোনও পয়েন্টিং ডিভাইস অন্তর্ভুক্ত থাকে না।

'মোটা'
- ডিভাইসের ইনপুট প্রক্রিয়াটিতে সীমিত নির্ভুলতার পয়েন্টিং ডিভাইস অন্তর্ভুক্ত।

'ফাইন'
- ডিভাইসের ইনপুট প্রক্রিয়াটিতে একটি সঠিক পয়েন্টিং ডিভাইস অন্তর্ভুক্ত থাকে।

এটি যেমন ব্যবহার করা হবে:

/* Make radio buttons and check boxes larger if we have an inaccurate pointing device */
@media (pointer:coarse) {
    input[type="checkbox"], input[type="radio"] {
        min-width:30px;
        min-height:40px;
        background:transparent;
    }
}

এটি সম্পর্কিত ক্রোমিয়াম প্রকল্পে একটি টিকিটও পেয়েছি ।

ব্রাউজারের সামঞ্জস্যতা এখানে পরীক্ষা করা যেতে পারে Quirksmode । এগুলি আমার ফলাফল (22 জানু 2013):

  • ক্রোম / উইন: ওয়ার্কস
  • ক্রোম / আইওএস: কাজ করে না
  • সাফারি / আইওএস 6: কাজ করে না

3
পোস্টার অনুসারে প্রদত্ত সমাধানটি কাজ না করলে সর্বাধিক পয়েন্টের সাথে কীভাবে এই উত্তর হতে পারে?
এরদোমিস্টার

5
এর জন্য ব্রাউজার সমর্থন আর খারাপ নয়: এজ, ক্রোম, সাফারি, আইওএস এবং অ্যান্ড্রয়েড। দেখুন: caniuse.com/#feat=css-media-interation
জোসা

3
ভাল উত্তর. অতিরিক্তভাবে: বিকাশকারী.মোজিলা.আর.ইন-
ইউএস

আমার জন্য কাজ করে;) এটি গবেষণার জন্য ধন্যবাদ!
ভেরি

51

সিএসএস সমাধানগুলি 2013 সালের মাঝামাঝি পর্যন্ত ব্যাপকভাবে উপলব্ধ বলে মনে হচ্ছে না। পরিবর্তে...

  1. নিকোলাস জাকাস ব্যাখ্যা করেছেন যে no-touchব্রাউজারটি স্পর্শ সমর্থন না করলে মডার্নিজার একটি সিএসএস শ্রেণি প্রয়োগ করে।

  2. বা জাভাস্ক্রিপ্টে একটি সাধারণ কোডের টুকরো সহ সনাক্ত করুন, যা আপনাকে নিজের নিজস্ব আধুনিকীকরণের মতো সমাধানটি প্রয়োগ করতে দেয়:

    <script>
        document.documentElement.className += 
        (("ontouchstart" in document.documentElement) ? ' touch' : ' no-touch');
    </script>

    তারপরে আপনি নিজের সিএসএস লিখতে পারেন:

    .no-touch .myClass {
        ...
    }
    .touch .myClass {
        ...
    }

দ্বিতীয়টি খুব সুন্দর। আমার জন্য একটি কবজ কাজ! ধন্যবাদ।
গারাভানি

@ bjb568 প্রস্তাবিত সম্পাদনার জন্য ধন্যবাদ, যা আরও আধুনিক বিকল্প, তবে এটি কেবল আইই 10 এবং তদূর্ধ্ব হিসাবে কাজ করে, আমি মনে করি আপাতত এই সংস্করণটি রাখা ভাল।
সাইমন পূর্ব

এই শ্রেণীর মতো শব্দগুলি এইচটিএমএল ট্যাগে থাকবে; যার অর্থ সিএসপি ব্যবহার করার সময় এটি ডিফল্টরূপে অক্ষম হবে।
লিও

35

মিডিয়া প্রকারগুলি আপনাকে স্ট্যান্ডার্ডের অংশ হিসাবে স্পর্শ ক্ষমতা সনাক্ত করতে দেয় না:

http://www.w3.org/TR/css3-mediaqueries/

সুতরাং, এটি সিএসএস বা মিডিয়া প্রশ্নের মাধ্যমে ধারাবাহিকভাবে করার কোনও উপায় নেই , আপনাকে জাভাস্ক্রিপ্টের অবলম্বন করতে হবে।

মডার্নিজার ব্যবহার করার দরকার নেই, আপনি কেবল প্লেইন জাভাস্ক্রিপ্ট ব্যবহার করতে পারেন:

<script type="text/javascript">
    var is_touch_device = 'ontouchstart' in document.documentElement;
    if(is_touch_device) alert("touch is enabled!");
</script>

আমি যতদূর জানি, window.touch&& window.TouchEventআপেল ডিভাইসের জন্য শুধুমাত্র হবে।
স্টারেক্স

22
@vsync মডার্নিজার হ'ল মন্টেইন্ডেড লাইব্রেরিতে বিকাশকারীদের জন্য সমস্ত পরীক্ষা কার্যকর করার এক দুর্দান্ত উপায়, যাতে প্রতিবার গুগলে তাদের কোনও স্পর্শ ইভেন্টের মতো পরীক্ষা করার প্রয়োজন হয় না এবং এই পৃষ্ঠাটি সন্ধান করার মতো প্রয়োজন হয় না। এফওয়াইআই-তে একটি কাস্টম মডার্নিজার বিল্ড রয়েছে যা আপনি নিজের পছন্দ মতো পরীক্ষাগুলি দিয়ে কাস্টমাইজ করতে পারেন। প্রকল্পগুলির মধ্যে সর্বদা একইভাবে বৈশিষ্ট্যগুলি পরীক্ষার এক দুর্দান্ত উপায়, আপনি জেএস সিনট্যাক্স ব্যবহার করেন (যেমন: মডার্নিজার টুচ) বা সিএসএস ক্লাস (। টুচ। মাই-উপাদান {})। আমি মনে করি এটি প্রতিটি সময় চাকা পুনরায় উদ্ভাবন না করে আমরা কাজগুলি করতে পারি তা স্বীকৃতি না দিয়ে এটি মানব বুদ্ধিমত্তার একটি অপমান।
আলেজান্দ্রো গার্সিয়া ইগলেসিয়াস

11
ঠিক আছে, আমি কয়েকশো প্রকল্পে কাজ করেছি এবং আমার কখনই এ জাতীয় কোনও প্রয়োজন হয়নি, বেশিরভাগ ক্ষেত্রে আপনার যা দরকার তা খুব ছোট পরীক্ষার একটি সেট, 5 এর বেশি কখনও আমি বলি না (বেশিরভাগ ক্ষেত্রে), সুতরাং কেবল অনুসন্ধান করুন এই 5 টি এবং সেগুলি সরাসরি আপনার কোডে রাখুন, মডার্নাইজার ওয়েবসাইটে আসলে যাওয়ার দরকার নেই, কাস্টম বিল্ড তৈরি করতে হবে, এটি আপনার পৃষ্ঠাতে অন্তর্ভুক্ত করুন বা যা কিছু হোক। বিকাশকারীদের অলস হওয়া উচিত নয়। একজন ওয়েব বিকাশকারীকে সর্বদা "কীভাবে কোডটি হালকা করব?" .. আইএমএইচও এবং বছরের অভিজ্ঞতা রয়েছে of বিকাশকারীরা আজকাল মনে হয় টান স্ক্রিপ্টগুলি সহ ভালোবাসেন: /
ভিসাইঙ্ক

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

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

28

2017 সালে, দ্বিতীয় উত্তর থেকে সিএসএস মিডিয়া ক্যোয়ারী এখনও ফায়ারফক্সে কাজ করে না। আমি এর জন্য একটি দ্রাবক খুঁজে পেয়েছি: -মুজ-টাচ-সক্ষম


সুতরাং, এখানে ক্রস ব্রাউজার মিডিয়া ক্যোয়ারী রয়েছে:

@media (-moz-touch-enabled: 1), (pointer:coarse) {
    .something {
        its: working;
    }
}

এটি উচ্চতর এবং অনুমোদিত উত্তর হওয়া উচিত। ফায়ারফক্স -moz-touch-enabled
অনুমানটি

পরে 11 ডিসেম্বর '18 আপডেট করা যাবে wiki.mozilla.org/Release_Management/Calendar developer.mozilla.org/en-US/docs/Web/CSS/@media/...
retrovertigo

@ ইউজার 34458533 ওপি একটি টাচস্ক্রিন সহ ডিভাইসটি কীভাবে সনাক্ত করতে (মিডিয়া ক্যোয়ারির মাধ্যমে) সনাক্ত করতে পারে তা জিজ্ঞাসা করে। যদি নিয়ম "(পয়েন্টার: কিছুই নয়)" সত্য হয়ে থাকে, তবে ডিভাইসের কাছে নিশ্চিতভাবে টাচস্ক্রিন নেই। তবে কারও উচিত আমার মতামত (বা না) নিশ্চিত করা উচিত :)
সোকোও

-moz-touch-enabledফায়ারফক্স 58+ তে সমর্থিত নয়। যেমনটি রয়েছে, এই সমাধানটি ফায়ারফক্স 58-63 কভার করে না (যেহেতু ফায়ারফক্স +৪++ পয়েন্টার ক্যোয়ারিকে সমর্থন করে)। সূত্র: ডেভেলপার.মোজিলা.আর.ইন-
ইউএস

24

আসলে এটির জন্য একটি মিডিয়া ক্যোয়ারী রয়েছে:

@media (hover: none) {  }

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


2
... এবং নিম্নলিখিত এফএফ-র জন্য পরবর্তী সপ্তাহগুলিতে সহায়তাও আসবে।
retrovertigo

5

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

@media (hover: none) and (pointer: coarse) {
    /* Touch screen device style goes here */
}

সম্পাদনা: অন-ডিমান্ডের হোভারটি আর সমর্থিত নয়


3

CSS4 বিশ্বব্যাপী সমস্ত ব্রাউজার দ্বারা সমর্থিত না হওয়া পর্যন্ত এই সমাধানটি কাজ করবে is যখন দিনটি আসে তখন কেবল CSS4 ব্যবহার করুন। তবে ততক্ষণে এটি বর্তমান ব্রাউজারগুলির জন্য কাজ করে।

ব্রাউজার-util.js

export const isMobile = {
  android: () => navigator.userAgent.match(/Android/i),
  blackberry: () => navigator.userAgent.match(/BlackBerry/i),
  ios: () => navigator.userAgent.match(/iPhone|iPad|iPod/i),
  opera: () => navigator.userAgent.match(/Opera Mini/i),
  windows: () => navigator.userAgent.match(/IEMobile/i),
  any: () => (isMobile.android() || isMobile.blackberry() || 
  isMobile.ios() || isMobile.opera() || isMobile.windows())
};

ভার:

পুরানো উপায়:

isMobile.any() ? document.getElementsByTagName("body")[0].className += 'is-touch' : null;

আরও নতুন উপায়:

isMobile.any() ? document.body.classList.add('is-touch') : null;

উপরের কোডটি ডিভাইসের টাচ স্ক্রিন থাকলে বডি ট্যাগটিতে "ইস-টাচ" শ্রেণি যুক্ত করবে। আপনার ওয়েব অ্যাপ্লিকেশনটিতে এখন যে কোনও অবস্থানের জন্য আপনি সিএসএস পাবেন: হোভার আপনি কল করতে পারেনbody:not(.is-touch) the_rest_of_my_css:hover

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

button:hover

হয়ে:

body:not(.is-touch) button:hover

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


0

জেএস বা জিকুয়েরি ব্যবহার করে শরীরে ক্লাসের টাচস্ক্রিন যুক্ত করা

  //allowing mobile only css
    var isMobile = ('ontouchstart' in document.documentElement && navigator.userAgent.match(/Mobi/));
    if(isMobile){
        jQuery("body").attr("class",'touchscreen');
    }

0

আমি এটি ব্যবহার করে এই সমস্যাটি সমাধান করতে সক্ষম হয়েছি

@media (hover:none), (hover:on-demand) { 
Your class or ID{
attributes
}    
}

এফওয়াইআই, অনুমিতিon-demand থেকে এবং ব্রাউজারগুলি থেকে সরানো হয়েছে: github.com/w3c/csswg-drafts/commit/…
retrovertigo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.