दिलचस्प पोस्ट
क्या C ++ में एक उत्पादन तैयार ताला मुक्त कतार या हैश कार्यान्वयन है? Google नक्शे में दो geocoords के बीच एक मार्ग प्रदर्शित करने के लिए कैसे? PHP substr () और strip_tags () का प्रयोग करते हुए स्वरूपण को बनाए रखना और HTML को तोड़ने के बिना फ़ंक्शन नाम के आसपास कोष्ठक क्या होता है? ढाल बिल्ड लिंट कार्य पर विफल रहता है OSX शेर पर जावा एप्लिकेशन के लिए पूर्णस्क्रीन सुविधा जावास्क्रिप्ट अभिव्यक्ति में अल्पविराम क्या करता है? जावा अनुप्रयोग में अनुकूलन शॉर्टकट Google-Play-Service लायब्रेरी को इस संदर्भ एंड्रॉइड के पास एक लाल X दिखा रहा है VBA में अंतिम उपयोग किए गए सेल को ढूँढने में त्रुटि Data.frame में NAs (अनुपलब्ध मान) के साथ पंक्तियों को निकालें ParseInt () और संख्या () में अंतर क्या है? GoogleMaps मूल आईओएस डेमो एप क्रैश – अपरिचित चयनकर्ता को उदाहरण के लिए भेजा गया एंड्रॉइड स्टूडियो – इम्यूलेटर – ईगलसुरफेसअट्रीब लागू नहीं किया गया स्थानीय चर पर कचरा संग्रहण

JQuery के साथ पृष्ठभूमि कवर के लिए स्केल तत्व आनुपातिक

मेरे पास एक मुश्किल सवाल है: मेरे पास जिस साइट पर काम कर रहा है उस पर एक पूर्ण आकार पृष्ठभूमि है। अब मैं छवि पर एक निश्चित स्थिति के लिए एक div को संलग्न करना चाहता हूं और यह भी कि "पृष्ठभूमि-आकार: कवर" संपत्ति के साथ मेरी पृष्ठभूमि की छवि समान रूप से div तराजू करता है तो इस उदाहरण में, मेरे पास एक शहर की एक तस्वीर है, जो ब्राउज़र विंडो को कवर करती है और मुझे अपने डिवेल को एक विशेष इमारत को ओवरले करना है, खिड़की के आकार की कोई बात नहीं।

मैं पहले से ही एक स्थान पर चिप को चिपकाने में कामयाब रहा हूँ, लेकिन इसे ठीक से आकार में बदल नहीं सकता मैंने अभी तक क्या किया:

http://codepen.io/EmmieBln/pen/YqWaYZ

var imageWidth = 1920, imageHeight = 1368, imageAspectRatio = imageWidth / imageHeight, $window = $(window); var hotSpots = [{ 'x': -160, 'y': -20, 'height': 400, 'width': 300 }]; function appendHotSpots() { for (var i = 0; i < hotSpots.length; i++) { var $hotSpot = $('<div>').addClass('hot-spot'); $('.container').append($hotSpot); } positionHotSpots(); } function positionHotSpots() { var windowWidth = $window.width(), windowHeight = $window.height(), windowAspectRatio = windowWidth / windowHeight, $hotSpot = $('.hot-spot'); $hotSpot.each(function(index) { var xPos = hotSpots[index]['x'], yPos = hotSpots[index]['y'], xSize = hotSpots[index]['width'], ySize = hotSpots[index]['height'], desiredLeft = 0, desiredTop = 0; if (windowAspectRatio > imageAspectRatio) { yPos = (yPos / imageHeight) * 100; xPos = (xPos / imageWidth) * 100; xSize = (xSize / imageWidth) * 1000; ySize = (ySize / imageHeight) * 1000; } else { yPos = ((yPos / (windowAspectRatio / imageAspectRatio)) / imageHeight) * 100; xPos = ((xPos / (windowAspectRatio / imageAspectRatio)) / imageWidth) * 100; } $(this).css({ 'margin-top': yPos + '%', 'margin-left': xPos + '%', 'width': xSize + 'px', 'height': ySize + 'px' }); }); } appendHotSpots(); $(window).resize(positionHotSpots); 

मेरा विचार था: यदि (imageWidth / windowWidth) <1 तब var स्केल के लिए मान = (windowWidth / imageWidth) और var स्केल (windowHeight / imageHeight) सेट करें और var स्केल का उपयोग ट्रांसफ़ॉर्म के लिए: पैमाने (स्केल, स्केल) लेकिन मैं नहीं कर सकता यह काम करने के लिए प्रबंधन …

शायद आप लोग मेरी मदद कर सकते हैं …

वेब के समाधान से एकत्रित समाधान "JQuery के साथ पृष्ठभूमि कवर के लिए स्केल तत्व आनुपातिक"

पृष्ठभूमि-आकार के समाधान: कवर

मैं आपको समाधान देने की कोशिश कर रहा हूं (या एक विचार के रूप में विचार करना) आप यहां काम कर रहे डेमो की जांच कर सकते हैं परिणाम को देखने के लिए विंडो का आकार बदलें

सबसे पहले, मुझे समझ में नहीं आया कि आप transform का उपयोग क्यों कर रहे हैं, top:50% और left:50% हॉटस्पॉट के लिए left:50% इसलिए मैंने इसे कम से कम उपयोग-केस का उपयोग करने और मेरी सुविधा के लिए आपके मार्कअप और सीएसएस समायोजित करने का प्रयास किया।

यहां rImage मूल छवि का पहलू अनुपात है।

  var imageWidth = 1920; var imageHeight = 1368; var h = { x: imageWidth / 2, y: imageHeight / 2, height: 100, width: 50 }; var rImage= imageWidth / imageHeight; 

खिड़की के आकार बदलते हैंडलर में व्यूपोर्ट r के पहलू राशन की गणना करें। इसके बाद, यह चाल छवि का आयाम ढूंढना है, जब हम विंडो का आकार बदलते हैं। लेकिन, व्यूपोर्ट, आकृति अनुपात बनाए रखने के लिए छवि को क्लिप करेगा। इसलिए छवि आयामों की गणना करने के लिए हमें कुछ सूत्र की आवश्यकता है।

background-size:cover का उपयोग करते background-size:cover छवि के आयामों की गणना करने के लिए background-size:cover , नीचे फ़ार्मुलों का उपयोग किया जाता है।

 if(actual_image_aspectratio <= viewport_aspectratio) image_width = width_of_viewport image_height = width_ofviewport / actual_image_aspectratio 

तथा

 if(actual_image_aspectratio > viewport_aspectratio) image_width = height_of_viewport * actual_image_aspectratio image_height = height_of_viewport 

background-size:cover का उपयोग करते समय आप छवि आयामों की गणना के बारे में अधिक समझने के लिए इस यूआरएल को संदर्भित कर सकते हैं background-size:cover

छवि के आयामों को प्राप्त करने के बाद, हमें वास्तविक छवि से हॉट-स्पॉट निर्देशांक को नई छवि आयामों पर चित्रित करना होगा।

व्यूपोर्ट छवि में छवि को फिट करने के लिए छवि के ऊपर और नीचे / बायां और दाईं ओर काटा जाएगा। तो हम इस क्लिप के आकार का आकार ऑफसेट के रूप में देखना चाहिए, जबकि हॉटस्पॉट्स की साजिश रचने पर।

 offset_top=(image_height-viewport_height)/2 offset_left=(image_width-viewport_width)/2 

प्रत्येक हॉटस्पॉट के x,y समन्वय के लिए इस ऑफ़सेट मान जोड़ें

 var imageWidth = 1920; var imageHeight = 1368; var hotspots = [{ x: 100, y: 200, height: 100, width: 50 }, { x: 300, y: 500, height: 200, width: 100 }, { x: 600, y: 600, height: 150, width: 100 }, { x: 900, y: 550, height: 100, width: 25 }]; var aspectRatio = imageWidth / imageHeight; $(window).resize(function() { positionHotSpots(); }); var positionHotSpots = function() { $('.hotspot').remove(); var wi = 0, hi = 0; var r = $('#image').width() / $('#image').height(); if (aspectRatio <= r) { wi = $('#image').width(); hi = $('#image').width() / aspectRatio; } else { wi = $('#image').height() * aspectRatio; hi = $('#image').height(); } var offsetTop = (hi - $('#image').height()) / 2; var offsetLeft = (wi - $('#image').width()) / 2; $.each(hotspots, function(i, h) { var x = (wi * hx) / imageWidth; var y = (hi * hy) / imageHeight; var ww = (wi * (h.width)) / imageWidth; var hh = (hi * (h.height)) / imageHeight; var hotspot = $('<div>').addClass('hotspot').css({ top: y - offsetTop, left: x - offsetLeft, height: hh, width: ww }); $('body').append(hotspot); }); }; positionHotSpots(); 
 html, body { height: 100%; padding: 0; margin: 0; } #image { height: 100%; width: 100%; background: url('https://upload.wikimedia.org/wikipedia/commons/thumb/0/08/Alexanderplatz_Stadtmodell_1.jpg/1920px-Alexanderplatz_Stadtmodell_1.jpg'); background-size: cover; background-repeat: no-repeat; background-position: center; } .hotspot { position: absolute; z-index: 1; background: red; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id='image'></div> 

ठीक है, इसलिए मैंने आपके मूल विचार का उपयोग करने की कोशिश की, और यहां और कुछ ही बिट्स को संशोधित किया।

प्रतिशत का उपयोग करने के बजाय, मुझे पिक्सेल मूल्यों का उपयोग करना आसान पाया गया इसलिए:

 $(this).css({ 'margin-top': yPos + 'px', 'margin-left': xPos + 'px', 'width': xSize + 'px', 'height': ySize + 'px' }); 

उसके बाद, हमें केवल व्यूपोर्ट के अनुपात की जांच करनी है कि कैसे हमें div की संपत्तियों को संशोधित करना है

 if (windowAspectRatio > imageAspectRatio) { var ratio = windowWidth / imageWidth; } else { var ratio = windowHeight / imageHeight; } xPos = xPos * ratio; yPos = yPos * ratio; xSize = xSize * ratio; ySize = ySize * ratio; 

कार्य का उदाहरण: http://codepen.io/jaimerodas/pen/RaGQVm

स्टैक स्निपेट

 var imageWidth = 1920, imageHeight = 1368, imageAspectRatio = imageWidth / imageHeight, $window = $(window); var hotSpots = [{ x: -210, y: -150, height: 250, width: 120 }, { x: 240, y: 75, height: 85, width: 175 }]; function appendHotSpots() { for (var i = 0; i < hotSpots.length; i++) { var $hotSpot = $('<div>').addClass('hot-spot'); $('.container').append($hotSpot); } positionHotSpots(); } function positionHotSpots() { var windowWidth = $window.width(), windowHeight = $window.height(), windowAspectRatio = windowWidth / windowHeight, $hotSpot = $('.hot-spot'); $hotSpot.each(function(index) { var cambio = 1, xPos = hotSpots[index]['x'], yPos = hotSpots[index]['y'], xSize = hotSpots[index]['width'], ySize = hotSpots[index]['height'], desiredLeft = 0, desiredTop = 0; if (windowAspectRatio > imageAspectRatio) { var ratio = windowWidth / imageWidth; } else { var ratio = windowHeight / imageHeight; } xPos = xPos * ratio; yPos = yPos * ratio; xSize = xSize * ratio; ySize = ySize * ratio; $(this).css({ 'margin-top': yPos + 'px', 'margin-left': xPos + 'px', 'width': xSize + 'px', 'height': ySize + 'px' }); }); } appendHotSpots(); $(window).resize(positionHotSpots); 
 html, body { margin: 0; width: 100%; height: 100%; } .container { width: 100%; height: 100%; position: relative; background-image: url(https://upload.wikimedia.org/wikipedia/commons/thumb/0/08/Alexanderplatz_Stadtmodell_1.jpg/1920px-Alexanderplatz_Stadtmodell_1.jpg); background-size: cover; background-repeat: no-repeat; background-position: center; } .hot-spot { background-color: red; border-radius: 0; position: absolute; top: 50%; left: 50%; z-index: 1; opacity: 0.8; content: ""; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="container"></div> 

सीएसएस पर भरोसा करने और उसे एक ही तत्व में लागू करने से आप हॉटस्पॉट की संख्या (कम डोम मेहनत और बहुत कम पुन: प्रवाह) की परवाह किए बिना बेहतर प्रदर्शन प्राप्त कर सकते हैं। हार्डवेयर एक्सेलेरेशन भी एक अच्छा है 🙂

सबसे पहले, मेटा कोड:

  1. अपनी छवि के अंदर एक .hot-spot--container बनाएं। .hot-spot--container

  2. बनाएँ। .hot-spot और स्थिति / आकार उन्हें अंदर .hot-spot--container

  3. ट्रांसफ़ॉर्म .hot-spot--container अनुकरण background-size: cover व्यवहार

  4. # 3 दोबारा दोहराएं जब भी कोई पुनः आकार हो

अपने बीजी छवि अनुपात की गणना करें:

 var bgHeight = 1368; var bgWidth = 1920; var bgRatio = bgHeight / bgWidth; 

जब भी विंडो को फिर से आकार दिया जाता है, कंटेनर अनुपात को फिर से गणना करता है:

 var containerHeight = $container.height(); var containerWidth = $container.width(); var containerRatio = containerHeight / containerWidth; 

background-size: cover नकल करने के लिए स्केल कारक की गणना करें background-size: cover व्यवहार …

 if (containerRatio > bgRatio) { //fgHeight = containerHeight //fgWidth = containerHeight / bgRatio xScale = (containerHeight / bgRatio) / containerWidth } else { //fgHeight = containerWidth / bgRatio //fgWidth = containerWidth yScale = (containerWidth * bgRatio) / containerHeight } 

… और हॉट स्पॉट कन्टेनर तत्व में परिणत लागू करें, अनिवार्य रूप से इसे फिर से आकार देने और पृष्ठभूमि में "सिंक में" पोजीशनिंग करना:

 var transform = 'scale(' + xScale + ', ' + yScale + ')'; $hotSpotContainer.css({ 'transform': transform }); 

Fiddled: https://jsfiddle.net/ovfiddle/a3pdLodm/ (आप पूर्वावलोकन विंडो के साथ बहुत प्रभावी ढंग से खेल सकते हैं। नोट करें कि कोड को पिक्सेल-आधारित आयाम और हॉट स्पॉट के लिए पोजिशन लेने के लिए समायोजित किया जा सकता है, आपको बस पर विचार करना होगा कंटेनर और छवि आकार जब पैमाने मानों की गणना करते हैं)

अद्यतन: background-size: contain व्यवहार में कंसाइनर रेटियो बीजीआरैटियो से छोटा है, इसके अलावा व्यवहार समान गणना करता है। पृष्ठभूमि सीएसएस अपडेट करना और आसपास के संकेत को फ़्लिप करने के लिए पर्याप्त है

ठीक है, तो बहुत सी लोग नहीं जानते कि सीएसएस मापन वीएच और वीडब्ल्यू (अर्थशैइट और व्यू विडथ) के बारे में है। मैंने एक स्क्रिप्ट बनाई है जो pageload पर एक बार चलती है ( प्रत्येक आकार में ~ 50 लाइनों के कोड के साथ कुछ अन्य उत्तर के विपरीत)।

यह पृष्ठभूमि-छवि के अनुपात की गणना करता है, overlayContainer लिए सीएसएस के दो टुकड़े लागू overlayContainer , और यह किया गया है।

मैंने आईडी square साथ एक डिवा भी जोड़ा है। यह सब आपके लिए काम करने के लिए एक चौराह बना लेता है जिसमें पृष्ठभूमि के अनुपात के बजाय 1: 1 का अनुपात है। यह सुनिश्चित करता है कि – यदि आप एक वर्ग बनाना चाहते हैं – तो आप एक ही चौड़ाई और ऊंचाई का उपयोग मैन्युअल रूप से एक अलग मानों के साथ बनाने की कोशिश कर सकते हैं। यह भी काम में आता है जब आप पृष्ठभूमि-छवि के आकार को थोड़ा बदलते हैं, क्योंकि उस वर्ग के कारण, आपके ओवरलेइंग डिवाइज़ अपने पहलू अनुपात को नहीं खोएंगे।

background-size: cover , यह बेला देखें।

background-size: contain , यह बेला देखें।

आवश्यक एचटीएमएल:

 <div id="overlayContainer"> <div id="square"> <!-- Create overlay divs here --> </div> </div> 

सीएसएस की आवश्यकता:

 #overlayContainer{ position: absolute; /* Fixed if the background-image is also fixed */ min-width: 100vw; /* When cover is applied */ min-height: 100vh; /* When cover is applied */ max-width: 100vw; /* When contain is applied */ max-height: 100vh; /* When contain is applied */ top: 50%; left: 50%; transform: translate(-50%, -50%); } #square{ position: relative; padding-bottom: 100%; } /* When creating divs, make them all absolutely positioned, and work with percentages only */ /* I advise looking at my Fiddle for an example */ 

जावास्क्रिप्ट की जरूरत है:

 var image = new Image() image.src = $('body').css('background-image').replace(/url\((['"])?(.*?)\1\)/gi,'$2').split(',')[0] /* When cover is applied, use this: */ $('#overlayContainer').css({'height':100/(image.width/image.height)+'vw','width':100/(image.height/image.width)+'vh'}) /* When contain is applied, use this: */ $('#overlayContainer').css({'height':100*(image.height/image.width)+'vw','width':100*(image.width/image.height)+'vh'}) 

उम्मीद है की यह मदद करेगा


@ एलजीएसन द्वारा अपडेट करें

मुझे सीएसएस का एकमात्र हल खोजने की उम्मीद नहीं थी, यद्यपि यहाँ यह है, इस जवाब में खुद को छिपाया जा रहा है, और इसलिए मैंने इसे उसी में जोड़ने का फैसला किया।

#overlayContainer नियम में इन 2 पंक्तियों को जोड़कर ( cover और contain दोनों के लिए काम करता contain ), स्क्रिप्ट को छोड़ा जा सकता है।

 width: calc(100vh * (1920 / 1368)); height: calc(100vw * (1368 / 1920)); 

बेशक, स्क्रिप्ट संस्करण में मूल्यों को स्वचालित रूप से प्राप्त करने का लाभ होता है, हालांकि चूंकि पृष्ठभूमि में हॉटस्पॉट (एस) के पास एक विशिष्ट स्थान बिंदु है, तो छवि का आकार सबसे अधिक जाना जाएगा

background-size: cover साथ नमूना background-size: cover

 html, body{ height: 100%; overflow: hidden; } body{ margin: 0; background-image: url('https://upload.wikimedia.org/wikipedia/commons/thumb/0/08/Alexanderplatz_Stadtmodell_1.jpg/1920px-Alexanderplatz_Stadtmodell_1.jpg'); background-size: cover; background-repeat: no-repeat; background-position: center; } #overlayContainer{ position: absolute; width: calc(100vh * (1920 / 1368)); height: calc(100vw * (1368 / 1920)); min-width: 100vw; /* for cover */ min-height: 100vh; /* for cover */ /* max-width: 100vw; for contain */ /* max-height: 100vh; for contain */ top: 50%; left: 50%; transform: translate(-50%, -50%); } #square{ position: relative; padding-bottom: 100%; } #square div{ position: absolute; top: 19.75%; left: 49.75%; width: 4.75%; height: 4.75%; background-color: rgba(255,0,0,.7); border-radius: 50%; } 
 <div id="overlayContainer"> <div id="square"> <div></div> </div> </div> 

नीचे एक jQuery समाधान है, bgCoverTool प्लगइन repositions एक माता पिता की पृष्ठभूमि छवि के पैमाने पर आधारित तत्व।

 //bgCoverTool Properties $('.hot-spot').bgCoverTool({ parent: $('#container'), top: '100px', left: '100px', height: '100px', width: '100px'}) 

डेमो:

 $(function() { $('.hot-spot').bgCoverTool(); }); 
 html, body { height: 100%; padding: 0; margin: 0; } #container { height: 100%; width: 100%; background: url('https://upload.wikimedia.org/wikipedia/commons/thumb/0/08/Alexanderplatz_Stadtmodell_1.jpg/1920px-Alexanderplatz_Stadtmodell_1.jpg'); background-size: cover; background-repeat: no-repeat; position: relative; } .hot-spot { position: absolute; z-index: 1; background: red; left: 980px; top: 400px; height: 40px; width: 40px; opacity: 0.7; } 
 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>BG Cover Tool</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script type="text/javascript" charset="utf-8"> //bgCoverTool jQuery plugin (function($) { $.bgCoverTool = function(element, options) { var $element = $(element), imgsize = {}; var defaults = { parent: $element.parent(), top: $element.css('top'), left: $element.css('left'), height: $element.css('height'), width: $element.css('width') }; var plugin = this; plugin.settings = {}; plugin.init = function() { plugin.settings = $.extend({}, defaults, options); var tempurl = plugin.settings.parent.css('background-image').slice(4, -1) .replace('"', '').replace('"', ''); var tempimg = new Image(); var console = console || { error: function() {} }; if (plugin.settings.parent.css('background-size') != "cover") { return false; } if (typeof tempurl !== "string") { return false; } if (plugin.settings.top == "auto" || plugin.settings.left == "auto") { console.error("#" + $element.attr('id') + " needs CSS values for 'top' and 'left'"); return false; } $(tempimg).on('load', function() { imgsize.width = this.width; imgsize.height = this.height; imageSizeDetected(imgsize.width, imgsize.height); }); $(window).on('resize', function() { if ('width' in imgsize && imgsize.width != 0) { imageSizeDetected(imgsize.width, imgsize.height); } }); tempimg.src = tempurl; }; var imageSizeDetected = function(w, h) { var scale_h = plugin.settings.parent.width() / w, scale_v = plugin.settings.parent.height() / h, scale = scale_h > scale_v ? scale_h : scale_v; $element.css({ top: parseInt(plugin.settings.top, 10) * scale, left: parseInt(plugin.settings.left, 10) * scale, height: parseInt(plugin.settings.height, 10) * scale, width: parseInt(plugin.settings.width, 10) * scale }); }; plugin.init(); }; /** * @param {options} object Three optional properties are parent, top and left. */ $.fn.bgCoverTool = function(options) { return this.each(function() { if (undefined == $(this).data('bgCoverTool')) { var plugin = new $.bgCoverTool(this, options); $(this).data('bgCoverTool', plugin); } }); } })(jQuery); </script> </head> <body> <div id="container"> <div class="hot-spot"></div> </div> </body> </html> 

आपकी समस्या के लिए एक बहुत आसान / बेहतर दृष्टिकोण एसवीजी तत्व का उपयोग करना है, यह आपकी आवश्यकता के लिए बेहतर अनुकूल है। एसवीजी के बारे में अच्छी बात यह है कि सब कुछ डिफ़ॉल्ट रूप से आनुपातिक पैमाने पर होगा क्योंकि यह एक सदिश ऑब्जेक्ट है जो दस्तावेज़ प्रवाह ऑब्जेक्ट नहीं है।

यह उदाहरण तकनीक का प्रदर्शन करेगा

 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>SVG</title> <style type="text/css" media="screen"> body { background: #eee; margin: 0; } svg { display: block; border: 1px solid #ccc; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: #fff; } .face { stroke: #000; stroke-width: 20px; stroke-linecap: round } </style> </head> <body> <svg xmlns="http://www.w3.org/2000/svg" viewBox="-350 -250 700 500"> <circle r="200" class="face" fill="red"/> <path fill="none" class="face" transform="translate(-396,-230)" d="M487.41,282.411c-15.07,36.137-50.735,61.537-92.333,61.537 c-41.421,0-76.961-25.185-92.142-61.076"/> <circle id="leftEye" cx="-60" cy="-50" r="20" fill="#00F"/> <circle id="rightEye" cx="60" cy="-50" r="20" fill="#00F"/> </svg> <script type="text/javascript"> document.getElementById('leftEye').addEventListener('mouseover', function (e) { alert('Left Eye'); }); document.getElementById('rightEye').addEventListener('mouseover', function (e) { alert('Right Eye'); }); </script> </body> </html> 

आप जो चीजें प्राप्त कर सकते हैं उसे हासिल करने के लिए एसवीजी को चित्र जोड़ सकते हैं।

https://jsfiddle.net/tnt1/3f23amue/