জাভাস্ক্রিপ্ট ব্যবহার করে যখন ব্যবহারকারী কোনও পৃষ্ঠায় জুম পরিবর্তন করে, তখন কি এটি সনাক্ত করা সম্ভব? আমি কেবল একটি "জুম" ইভেন্ট ধরতে এবং তাতে প্রতিক্রিয়া জানাতে চাই (উইন্ডো.অনরাইজ ইভেন্টের অনুরূপ)।
ধন্যবাদ।
জাভাস্ক্রিপ্ট ব্যবহার করে যখন ব্যবহারকারী কোনও পৃষ্ঠায় জুম পরিবর্তন করে, তখন কি এটি সনাক্ত করা সম্ভব? আমি কেবল একটি "জুম" ইভেন্ট ধরতে এবং তাতে প্রতিক্রিয়া জানাতে চাই (উইন্ডো.অনরাইজ ইভেন্টের অনুরূপ)।
ধন্যবাদ।
উত্তর:
জুম থাকলে সক্রিয়ভাবে সনাক্ত করার কোনও উপায় নেই। আপনি কীভাবে এটি প্রয়োগের চেষ্টা করতে পারেন সে সম্পর্কে আমি এখানে একটি ভাল এন্ট্রি পেয়েছি।
আমি জুম স্তর সনাক্তকরণের দুটি উপায় খুঁজে পেয়েছি। জুম স্তরের পরিবর্তনগুলি সনাক্ত করার একটি উপায় শতাংশের মানগুলি জুম করা হয়নি তার উপর নির্ভর করে। শতাংশের মান ভিউপোর্টের প্রস্থের সাথে সম্পর্কিত এবং পৃষ্ঠা জুম দ্বারা প্রভাবিত হয় না। যদি আপনি দুটি উপাদান ,োকেন, একটি শতাংশে পজিশনযুক্ত এবং একটি পিক্সেলের মধ্যে একই পজিশন সহ, পৃষ্ঠাটি জুম করা হয়ে গেলে তারা আলাদা হয়ে যাবে। উভয় উপাদানের অবস্থানের মধ্যে অনুপাতটি সন্ধান করুন এবং আপনি জুম স্তর পেয়েছেন। পরীক্ষার কেস দেখুন। http://web.archive.org/web/20080723161031/http://novemberborn.net/javascript/page-zoom-ff3
উপরের পোস্টের সরঞ্জামগুলি ব্যবহার করে আপনি এটি করতেও পারেন। সমস্যাটি হ'ল আপনি পৃষ্ঠাটি জুম করেছেন কিনা তা নিয়ে কমবেশি শিক্ষিত অনুমান করা। এটি অন্যগুলির তুলনায় কিছু ব্রাউজারে আরও ভাল কাজ করবে।
জুম করার সময় যদি তারা আপনার পৃষ্ঠাটি লোড করে তবে পৃষ্ঠাটি জুম করা হয়েছে কিনা তা বলার উপায় নেই।
document.body.offsetWidth
আমি জাভাস্ক্রিপ্টের এই টুকরোটি জুম "ইভেন্টগুলি" তে প্রতিক্রিয়া জানাতে ব্যবহার করছি।
এটি উইন্ডো প্রস্থ পোল করে। (এই পৃষ্ঠায় কিছুটা পরামর্শ দেওয়া হয়েছে (যার সাথে ইয়ান এলিয়ট লিঙ্ক করেছেন): http://novemberborn.net/javascript/page-zoom-ff3 [সংরক্ষণাগার] )
আইএম নয়, ক্রোম, ফায়ারফক্স 3.6 এবং অপেরা দিয়ে পরীক্ষা করা হয়েছে।
শুভেচ্ছা, ম্যাগনাস
var zoomListeners = [];
(function(){
// Poll the pixel width of the window; invoke zoom listeners
// if the width has been changed.
var lastWidth = 0;
function pollZoomFireEvent() {
var widthNow = jQuery(window).width();
if (lastWidth == widthNow) return;
lastWidth = widthNow;
// Length changed, user must have zoomed, invoke listeners.
for (i = zoomListeners.length - 1; i >= 0; --i) {
zoomListeners[i]();
}
}
setInterval(pollZoomFireEvent, 100);
})();
ভাল খবর সবাইকিছু মানুষ! নতুন ব্রাউজারগুলি যখন জুম পরিবর্তন করা হয় তখন একটি উইন্ডো আকার পরিবর্তন ইভেন্টটি ট্রিগার করবে।
নীচে হিসাবে পিএক্স_রেটিও সংজ্ঞায়িত করা যাক:
পিএক্স অনুপাত = সিএসএস পিএক্স থেকে শারীরিক পিক্সেলের অনুপাত।
যদি কোনও পৃষ্ঠাটি জুম করে, ভিউপোর্ট পিক্সেস (পিক্সেল থেকে পৃথক) কমায় এবং স্ক্রিনে ফিট হওয়া উচিত তাই অনুপাতটি (শারীরিক পিক্সেল / সিএসএস_পিএক্স) আরও বড় হতে হবে।
তবে উইন্ডো রাইজিংয়ে, পর্দার আকার হ্রাস করার পাশাপাশি পিক্সেসও হ্রাস করে। সুতরাং অনুপাত বজায় রাখা হবে।
কিন্তু
পুনরায় আকার: ট্রিগার উইন্ডোজ.স্রাইজ ইভেন্ট -> পেক্স_রেটিও পরিবর্তন হয় না
//for zoom detection
px_ratio = window.devicePixelRatio || window.screen.availWidth / document.documentElement.clientWidth;
$(window).resize(function(){isZooming();});
function isZooming(){
var newPx_ratio = window.devicePixelRatio || window.screen.availWidth / document.documentElement.clientWidth;
if(newPx_ratio != px_ratio){
px_ratio = newPx_ratio;
console.log("zooming");
return true;
}else{
console.log("just resizing");
return false;
}
}
মূল পয়েন্টটি সিএসএস পিএক্স এবং শারীরিক পিক্সেলের মধ্যে পার্থক্য।
https://gist.github.com/abilogos/66aba96bb0fb27ab3ed4a13245817d1e
এটি আমার পক্ষে কাজ করে:
var deviceXDPI = screen.deviceXDPI;
setInterval(function(){
if(screen.deviceXDPI != deviceXDPI){
deviceXDPI = screen.deviceXDPI;
... there was a resize ...
}
}, 500);
এটি কেবল আইই 8 তে প্রয়োজন। অন্যান্য সমস্ত ব্রাউজার স্বাভাবিকভাবেই একটি আকার পরিবর্তন ইভেন্ট উত্পন্ন করে।
এটি থেকে নিফটি প্লাগইন তৈরি করা হয়েছে yonran
যা সনাক্ত করতে পারে। এখানে স্ট্যাক ওভারফ্লোতে তার পূর্বে উত্তর দেওয়া প্রশ্ন। এটি বেশিরভাগ ব্রাউজারের জন্য কাজ করে। অ্যাপ্লিকেশন এই হিসাবে সহজ
window.onresize = function onresize() {
var r = DetectZoom.ratios();
zoomLevel.innerHTML =
"Zoom level: " + r.zoom +
(r.zoom !== r.devicePxPerCssPx
? "; device to CSS pixel ratio: " + r.devicePxPerCssPx
: "");
}
Always enable zoom
এ অ্যাক্সেসিবিলিটি বিকল্পে বোতামটি টিক দিন । ডেমো পরিবর্তনের বিষয়ে প্রতিক্রিয়া জানাবে না।
আমি উইন্ডো প্রস্থে ট্র্যাকিং পরিবর্তনগুলি সহ পূর্ববর্তী সমাধানের উন্নতির পরামর্শ দিতে চাই। ইভেন্ট শ্রোতার নিজস্ব অ্যারে রাখার পরিবর্তে আপনি বিদ্যমান জাভাস্ক্রিপ্ট ইভেন্ট সিস্টেমটি ব্যবহার করতে পারেন এবং প্রস্থ পরিবর্তনের পরে আপনার নিজের ইভেন্টটি ট্রিগার করতে পারবেন এবং ইভেন্ট হ্যান্ডলারদের এটিতে আবদ্ধ করুন।
$(window).bind('myZoomEvent', function() { ... });
function pollZoomFireEvent()
{
if ( ... width changed ... ) {
$(window).trigger('myZoomEvent');
}
}
থ্রটল / ডিবাউন আপনার হ্যান্ডলারের কলগুলির হার কমাতে সহায়তা করতে পারে।
কমপক্ষে একটি অবিচ্ছিন্ন জায়গা (সম্ভবত, লুকানো) রয়েছে এমন একটি ডিভ ইনজেকশনের মাধ্যমে এবং নিয়মিতভাবে এর উচ্চতা পরীক্ষা করে আপনি পাঠ্য পুনরায় আকারের ইভেন্টগুলি এবং জুম ফ্যাক্টরটিও পেতে পারেন। উচ্চতা পরিবর্তিত হলে, পাঠ্যের আকার পরিবর্তিত হয়েছে, (এবং আপনি কতটা জানেন - এটিও ফায়ার করে, ঘটনাক্রমে, উইন্ডোটি যদি পূর্ণ পৃষ্ঠা মোডে জুম হয়ে যায় এবং আপনি এখনও একই উচ্চতা সহ সঠিক জুম ফ্যাক্টরটি পাবেন / উচ্চতা অনুপাত)।
<script>
var zoomv = function() {
if(topRightqs.style.width=='200px){
alert ("zoom");
}
};
zoomv();
</script>
আইওএস 10 এ, ইভেন্টটিতে ইভেন্ট শ্রোতাদের যুক্ত করা touchmove
এবং পৃষ্ঠাটি বর্তমান ইভেন্টের সাথে জুম করা থাকলে এটি সনাক্ত করা সম্ভব ।
var prevZoomFactorX;
var prevZoomFactorY;
element.addEventListener("touchmove", (ev) => {
let zoomFactorX = document.documentElement.clientWidth / window.innerWidth;
let zoomFactorY = document.documentElement.clientHeight / window.innerHeight;
let pageHasZoom = !(zoomFactorX === 1 && zoomFactorY === 1);
if(pageHasZoom) {
// page is zoomed
if(zoomFactorX !== prevZoomFactorX || zoomFactorY !== prevZoomFactorY) {
// page is zoomed with this event
}
}
prevZoomFactorX = zoomFactorX;
prevZoomFactorY = zoomFactorY;
});
এটি 9 বছরের পুরনো প্রশ্ন হলেও সমস্যাটি এখনও থেকেই যায়!
কোনও প্রকল্পে জুম বাদ দিয়ে আমি পুনরায় আকারটি সনাক্ত করতে পেরেছি, তাই আমি আমার কোডটি সম্পাদনা করে একে একে একে একে একে পুনরায় আকার এবং জুম উভয়ই সনাক্ত করতে কাজ করতে পারি। এটি বেশিরভাগ সময় কাজ করে, সুতরাং আপনার প্রকল্পের জন্য যদি বেশিরভাগটি যথেষ্ট ভাল হয় তবে এটি সহায়ক হওয়া উচিত! আমি এ পর্যন্ত যা পরীক্ষা করেছি তাতে এটি 100% জুম করে সনাক্ত করে। একমাত্র সমস্যা হ'ল ব্যবহারকারী যদি উন্মাদ হয়ে যায় (যেমন, উইন্ডোটির আকার পরিবর্তন করে) বা উইন্ডোটি পিছিয়ে যায় তবে এটি উইন্ডোর আকারের পরিবর্তে জুম হিসাবে চালিত হতে পারে।
এটি একটি জুম হিসাবে উইন্ডো পুনরায় আকার থেকে পরিবর্তন বা স্বতন্ত্র পরিবর্তন সনাক্ত করার সময় উইন্ডো আকার পরিবর্তন window.outerWidth
বা পরিবর্তনের window.outerHeight
হিসাবে সনাক্ত করে কাজ করে ।window.innerWidth
window.innerHeight
//init object to store window properties
var windowSize = {
w: window.outerWidth,
h: window.outerHeight,
iw: window.innerWidth,
ih: window.innerHeight
};
window.addEventListener("resize", function() {
//if window resizes
if (window.outerWidth !== windowSize.w || window.outerHeight !== windowSize.h) {
windowSize.w = window.outerWidth; // update object with current window properties
windowSize.h = window.outerHeight;
windowSize.iw = window.innerWidth;
windowSize.ih = window.innerHeight;
console.log("you're resizing"); //output
}
//if the window doesn't resize but the content inside does by + or - 5%
else if (window.innerWidth + window.innerWidth * .05 < windowSize.iw ||
window.innerWidth - window.innerWidth * .05 > windowSize.iw) {
console.log("you're zooming")
windowSize.iw = window.innerWidth;
}
}, false);
দ্রষ্টব্য: আমার সমাধান কাজম্যাগনাসের মতো তবে এটি আমার পক্ষে আরও ভাল কাজ করেছে।
0.05
কমপক্ষে কোনও ভাল ব্যাখ্যা না দিয়ে। ;-) উদাহরণস্বরূপ, আমি জানি যে ক্রোমে, বিশেষত, 10% হ'ল ক্ষুদ্রতম পরিমাণ যা ব্রাউজারটি যে কোনও ক্ষেত্রে জুম করবে, তবে এটি স্পষ্ট নয় যে এটি অন্যান্য ব্রাউজারগুলির ক্ষেত্রে সত্য। এফআই, সর্বদা আপনার কোডটি পরীক্ষা করা হয়েছে তা নিশ্চিত করুন এবং এটির প্রতিরক্ষা বা উন্নতি করতে প্রস্তুত থাকুন।
এখানে একটি পরিষ্কার সমাধান:
// polyfill window.devicePixelRatio for IE
if(!window.devicePixelRatio){
Object.defineProperty(window,'devicePixelRatio',{
enumerable: true,
configurable: true,
get:function(){
return screen.deviceXDPI/screen.logicalXDPI;
}
});
}
var oldValue=window.devicePixelRatio;
window.addEventListener('resize',function(e){
var newValue=window.devicePixelRatio;
if(newValue!==oldValue){
// TODO polyfill CustomEvent for IE
var event=new CustomEvent('devicepixelratiochange');
event.oldValue=oldValue;
event.newValue=newValue;
oldValue=newValue;
window.dispatchEvent(event);
}
});
window.addEventListener('devicepixelratiochange',function(e){
console.log('devicePixelRatio changed from '+e.oldValue+' to '+e.newValue);
});
পুনরায় আকারের ইভেন্টটি আধুনিক ব্রাউজারগুলিতে ইভেন্টটি সংযুক্ত করে window
এবং তারপরে এর মানগুলি body
বা অন্য উপাদানগুলির উদাহরণ সহ পাঠ করে কাজ করে ( .getBoundingClientRect () ) ।
কিছু পূর্ববর্তী ব্রাউজারগুলিতে যে কোনও এইচটিএমএল উপাদানগুলিতে পুনরায় আকারের ইভেন্ট হ্যান্ডলারের নিবন্ধকরণ করা সম্ভব হয়েছিল। অনারাইজ বৈশিষ্ট্যগুলি সেট করা বা যেকোন উপাদানটিতে হ্যান্ডলার সেট করতে অ্যাডএভেন্টলিস্টনার () ব্যবহার করা এখনও সম্ভব। যাইহোক, আকার পরিবর্তন ইভেন্টগুলি কেবল উইন্ডো অবজেক্টে (যেমন ডকুমেন্ট.ডেফাল্টভিউ দ্বারা ফিরে আসে) গুলি চালিত হয়। উইন্ডো অবজেক্টে নিবন্ধিত হ্যান্ডলাররা কেবল পুনরায় আকারের ইভেন্টগুলি পাবেন ।
window.addEventListener("resize", getSizes, false)
function getSizes(){
let body = document.body
console.log(body.clientWidth +"px x "+ body.clientHeight + "px")
}
অন্য একটি বিকল্প : রেজাইজঅবার্সার এপিআই
আপনার বিন্যাসের উপর নির্ভর করে আপনি কোনও নির্দিষ্ট উপাদানটির আকার পরিবর্তন করতে দেখতে পারেন।
এটি "প্রতিক্রিয়াশীল" লেআউটগুলিতে ভাল কাজ করে, কারণ জুম করার সময় ধারক বাক্সটি পুনরায় আকার দেয়।
function watchBoxchange(e){
// console.log(e[0].contentBoxSize.inlineSize+" "+e[0].contentBoxSize.blockSize)
info.textContent = e[0].contentBoxSize.inlineSize+" * "+e[0].contentBoxSize.blockSize + "px"
}
new ResizeObserver(watchBoxchange).observe(fluid)
#fluid {
width: 200px;
height:100px;
overflow: auto;
resize: both;
border: 3px black solid;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
font-size: 8vh
}
<div id="fluid">
<info id="info"></info>
</div>
ব্যবহারকারীর অঙ্গভঙ্গি ইভেন্টগুলি থেকে জাভাস্ক্রিপ্টের কাজগুলি ওভারলোড না করার বিষয়ে সতর্ক হন। আপনার যখনই পুনরায় আঁকার দরকার হবে তখন অনুরোধঅ্যানিমেশনফ্রেম ব্যবহার করুন ।
MDN মতে, "matchMedia" এই কাজ করতে সঠিক উপায় https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio#Monitoring_screen_resolution_or_zoom_level_changes
এটি কিছুটা চূড়ান্ত কারণ কারণ প্রতিটি উদাহরণ একবারে কেবল একটি এমকিউ দেখতে পারে, তাই যদি আপনি আগ্রহী হন কোনও জুম স্তরের পরিবর্তনে একগুচ্ছ ম্যাচার তৈরি করতে হবে .. তবে যেহেতু ব্রাউজারটি ঘটনাগুলি নির্গত করার দায়িত্বে রয়েছে সম্ভবত এটি সম্ভবত ভোটদানের চেয়ে আরও পারফরম্যান্ট এবং আপনি কলব্যাকটি কলব্যাক করতে পারেন বা কলব্যাক শুরু করতে পারেন বা এনিমেশন ফ্রেমে বা কোনও কিছুতে এটি পিন করতে পারেন - এখানে এমন একটি বাস্তবায়ন রয়েছে যা বেশ সুন্দর বলে মনে হচ্ছে, _ত্রোটলে অদলবদল করতে পারেন বা আপনি যদি ইতিমধ্যে এর উপর নির্ভর করে থাকেন তবে যাই হোক না কেন।
কোড স্নিপেটটি চালান এবং আপনার ব্রাউজারে জুম বাড়ান এবং আউট করুন, মার্কআপে আপডেট হওয়া মানটি নোট করুন - আমি এটি ফায়ারফক্সেই পরীক্ষা করেছি! আপনি যদি কোন সমস্যা দেখতে পান তবে লেমমে জানুন।
const el = document.querySelector('#dppx')
if ('matchMedia' in window) {
function observeZoom(cb, opts) {
opts = {
// first pass for defaults - range and granularity to capture all the zoom levels in desktop firefox
ceiling: 3,
floor: 0.3,
granularity: 0.05,
...opts
}
const precision = `${opts.granularity}`.split('.')[1].length
let val = opts.floor
const vals = []
while (val <= opts.ceiling) {
vals.push(val)
val = parseFloat((val + opts.granularity).toFixed(precision))
}
// construct a number of mediamatchers and assign CB to all of them
const mqls = vals.map(v => matchMedia(`(min-resolution: ${v}dppx)`))
// poor person's throttle
const throttle = 3
let last = performance.now()
mqls.forEach(mql => mql.addListener(function() {
console.debug(this, arguments)
const now = performance.now()
if (now - last > throttle) {
cb()
last = now
}
}))
}
observeZoom(function() {
el.innerText = window.devicePixelRatio
})
} else {
el.innerText = 'unable to observe zoom level changes, matchMedia is not supported'
}
<div id='dppx'>--</div>
আমি 3 বছরের পুরানো লিঙ্কটির জবাব দিচ্ছি তবে আমার ধারণা এখানে আরও গ্রহণযোগ্য উত্তর রয়েছে,
.Css ফাইল হিসাবে তৈরি করুন,
@media screen and (max-width: 1000px)
{
// things you want to trigger when the screen is zoomed
}
উদাহরণ: -
@media screen and (max-width: 1000px)
{
.classname
{
font-size:10px;
}
}
উপরের কোডটি '10px' হরফের আকার দেয় যখন পর্দাটি প্রায় 125% জুম করা হয়। '1000px' এর মান পরিবর্তন করে আপনি বিভিন্ন জুম স্তরের জন্য পরীক্ষা করতে পারেন।
max-width
জুম অনুপাতের মধ্যে কী সম্পর্ক ?