আমি এর মূল পাত্রে কীভাবে একটি এসজিজি স্কেল তৈরি করতে পারি?


235

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

index.html: <img src="foo.svg" style="width: 100%;" />

foo.svg: <svg width="123" height="456"></svg>

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


2
এসভিজি প্রস্থ এবং উচ্চতাতে নজরে চেষ্টা করুন।
এনএমসি

@ncm কীভাবে এটি জেএসের সাথে করা হবে?
মাওগ বলছেন মনিকা

উত্তর:


457

চিত্রের আকারযুক্ত আকারের থেকে আলাদাভাবে এসভিজি চিত্রের মধ্যে স্থানাঙ্কগুলি নির্দিষ্ট করতে viewBox, চিত্রের সমন্বিত সিস্টেমে চিত্রের সীমানা বাক্সটি কী তা নির্ধারণ করতে এসভিজি উপাদানটিতে অ্যাট্রিবিউটটি ব্যবহার করুন widthএবং heightসংজ্ঞাটি নির্দিষ্ট করতে বৈশিষ্ট্য এবং বৈশিষ্ট্যগুলি ব্যবহার করুন প্রস্থ বা উচ্চতা সমন্বিত পৃষ্ঠাটি সম্মানের সাথে।

উদাহরণস্বরূপ, আপনার যদি নিম্নলিখিতগুলি থাকে:

<svg>
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

এটি 20px ত্রিভুজ দ্বারা 10px হিসাবে রেন্ডার হবে:

10x20 ত্রিভুজ

এখন, আপনি যদি কেবল প্রস্থ এবং উচ্চতা নির্ধারণ করেন তবে এটি এসভিজি উপাদানটির আকার পরিবর্তন করবে, তবে ত্রিভুজটি স্কেল করবে না:

<svg width=100 height=50>
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

10x20 ত্রিভুজ

যদি আপনি ভিউ বাক্সটি সেট করেন, যার ফলে চিত্রটি রূপান্তরিত হয় যার ফলে প্রদত্ত বাক্সটি (চিত্রের সমন্বিত সিস্টেমে) প্রদত্ত প্রস্থ এবং উচ্চতার (পৃষ্ঠার সমন্বিত সিস্টেমে) ফিট করার জন্য মাপানো হবে। উদাহরণস্বরূপ, ত্রিভুজটি 100px দ্বারা 50px হতে স্কেল করতে:

<svg width=100 height=50 viewBox="0 0 20 10">
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

100x50 ত্রিভুজ

আপনি যদি এইচটিএমএল ভিউপোর্টের প্রস্থ পর্যন্ত স্কেল করতে চান:

<svg width="100%" viewBox="0 0 20 10">
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

300x150 ত্রিভুজ

নোট করুন যে ডিফল্ট হিসাবে, দিক অনুপাত সংরক্ষণ করা হয়। সুতরাং আপনি যদি উল্লেখ করেন যে উপাদানটির প্রস্থটি 100% প্রস্থের হওয়া উচিত তবে 50px উচ্চতা হওয়া উচিত তবে এটি কেবলমাত্র 50px উচ্চতা পর্যন্ত স্কেল করবে (যদি আপনার খুব সরু উইন্ডো না থাকে):

<svg width="100%" height="50px" viewBox="0 0 20 10">
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

100x50 ত্রিভুজ

আপনি যদি আসলে এটি অনুভূমিকভাবে প্রসারিত করতে চান তবে এর সাথে অনুপাতের অনুপাত সংরক্ষণ অক্ষম করুন preserveAspectRatio=none:

<svg width="100%" height="50px" viewBox="0 0 20 10" preserveAspectRatio="none">
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

300x50 ত্রিভুজ

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


1
আপনি কীভাবে কেবলমাত্র ভিউবক্স সংরক্ষণের জন্যই রাখবেন না তবে স্পেসট্রাটিও মূল বাক্সটিও তৈরি করবেন? আমি প্রস্থ চাই: 100%; উচ্চতা: এটির জন্য অটো।
bjb568

1
@ ডুড: আমি মনে করি যে উদাহরণ দিয়ে width="100%"এবং কোনও উচ্চতা নির্দিষ্ট করে না আপনি যা চান তা করে। আমি প্রদর্শনের জন্য ছবি যুক্ত করেছি। এটির 100% প্রস্থ রয়েছে, এবং আনুপাতিকভাবে উচ্চতা পর্যন্ত স্কেল করে। যদি আপনি যা খুঁজছেন তা যদি না হয় তবে আপনি কী বোঝাতে চেয়েছেন তা পরিষ্কার করার চেষ্টা করতে পারেন?
ব্রায়ান ক্যাম্পবেল

1
উহু. আসলে কোন সমস্যা নেই। এটি কেবল একটি ওয়েবকিট বাগ। সাফারি এবং ক্রোমে "আসল" উচ্চতা ডিফল্টরূপে 100% হয়, স্বয়ংক্রিয়ভাবে নয়। তাহলে আমি কীভাবে এই চারপাশে যাব?
bjb568

4
@ ডুড আহ, হ্যাঁ, আমি দেখছি। এটি ফায়ারফক্সে ঠিক আছে, তবে কোনও ক্রোম বা সাফারি নেই। এসভিজি স্পেসিফিকেশন অনুসারে , ফায়ারফক্স সঠিক বলে মনে হচ্ছে; যখন ডিফল্ট মান widthএবং heightএকটি SVG উপাদান জন্য 100%, এই 100% (ধারণকারী ব্লক 100%) এর CSS এর সংজ্ঞা নয়, কিন্তু ভিউপোর্ট যে হয়েছে নিদিষ্ট স্বকীয় অনুপাত উপর ভিত্তি করে এর পরিবর্তে 100% ( যা দেওয়া হওয়ার পরে তা গণনা viewBoxকরা হয়)। ক্রোম / সাফারিতে কাজ করে এমন সমস্যার সমাধান আমি এখনও পাইনি।
ব্রায়ান ক্যাম্পবেল

1
এটি আমার পক্ষে কাজ করে। আমি প্রথমে এসভিজি উপাদানটিতে একটি ভিউবক্স বৈশিষ্ট্য তৈরি করে মানটিকে "0 0 [মূল এসভিজি প্রস্থ] [মূল এসভিজি উচ্চতা]" এ সেট করি। এরপরে আমি এসভিজি উপাদানটির প্রস্থের বৈশিষ্ট্যটি "অটো" এবং উচ্চতা বৈশিষ্ট্যকে "100%" এ পরিবর্তন করি। ধারকটির অবশ্যই একটি নির্ধারিত উচ্চতা থাকতে হবে। এটি ভেক্টরটিকে কন্টেইনার উচ্চতার 100% পর্যন্ত স্কেল করে, প্রস্থটি ভাসমান করতে দেয়। পরিশেষে, ধারককে ওভারশুটিং রোধ করতে এসভিজির সিএসএস সর্বাধিক প্রস্থকে 100% এ সেট করুন।
রায়ান গ্রিগস

28

৪৮ ঘন্টার গবেষণার পরেও আমি আনুপাতিক স্কেলিংয়ের জন্য এটি শেষ করেছি:

দ্রষ্টব্য: এই নমুনাটি প্রতিক্রিয়া সহ লেখা হয়েছে। যদি আপনি এটি ব্যবহার না করে থাকেন তবে উটের কেস স্টাফটিকে হাইফেনে ফিরে যান (যেমন: পরিবর্তন backgroundColorকরুন background-colorএবং শৈলীতে Objectআবার পরিবর্তন করুন String)।

<div
  style={{
    backgroundColor: 'lightpink',
    resize: 'horizontal',
    overflow: 'hidden',
    width: '1000px',
    height: 'auto',
  }}
>
  <svg
    width="100%"
    viewBox="113 128 972 600"
    preserveAspectRatio="xMidYMid meet"
  >
    <g> ... </g>
  </svg>
</div>

উপরের নমুনা কোডটিতে যা ঘটছে তা এখানে:

VIEWBOX

MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Atribute/viewBox

মিনিট-এক্স, মিনিট-ওয়াই, প্রস্থ এবং উচ্চতা

যেমন: ভিউবক্স = "0 0 1000 1000"

ভিউবক্স একটি গুরুত্বপূর্ণ বৈশিষ্ট্য কারণ এটি মূলত এসভিজিকে বলে দেয় কোন আকারটি কোথায় আঁকতে হবে। আপনি যদি এসভিজি 1000x1000 পিক্স তৈরি করতে সিএসএস ব্যবহার করেন তবে আপনার ভিউবক্সটি 2000x2000 ছিল, আপনি নিজের এসভিজির উপরের বাম কোয়ার্টারটি দেখতে পাবেন ।

প্রথম দুটি সংখ্যা, মিনিট-এক্স এবং মিনিট-ওয়াই নির্ধারণ করে যে এসভিজিটি ভিউবক্সের অভ্যন্তরে অফসেট করা উচিত কিনা।

আমার এসভিজির উপরে / নীচে বা বাম / ডানদিকে স্থানান্তরিত হওয়া দরকার

এটি পরীক্ষা করুন: ভিউবক্স = "50 50 450 450"

প্রথম দুটি সংখ্যা আপনার এসভিজি বাম 50px এবং 50px উপরে স্থানান্তরিত করবে এবং দ্বিতীয় দুটি সংখ্যা ভিউবক্সের আকার: 450x450 পিক্স্স। যদি আপনার এসভিজি 500x500 হয় তবে এতে কিছু অতিরিক্ত প্যাডিং রয়েছে তবে আপনি "ভিউবক্স" এর মধ্যে এটিকে ঘুরিয়ে আনতে এই সংখ্যাগুলিকে ম্যানিপুলেট করতে পারেন।

এই মুহুর্তে আপনার লক্ষ্য হ'ল সেই সংখ্যার মধ্যে একটি পরিবর্তন করা এবং দেখুন কী ঘটে।

আপনি ভিউবাক্সকেও পুরোপুরি বাদ দিতে পারেন, তবে তারপরে আপনার মিলটি আপনার সময়ে থাকা অন্য প্রতিটি সেটিংয়ের উপর নির্ভর করে পরিবর্তিত হবে। আমার অভিজ্ঞতায় আপনি অনুপাত সংরক্ষণের সমস্যাগুলির মুখোমুখি হবেন কারণ ভিউবক্সটি অনুপাতের অনুপাতটিকে সংজ্ঞায়িত করতে সহায়তা করে।

সহায়তার অনুপাতটি সংরক্ষণ করুন

MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Atribute/preservAspectRatio

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

প্রস্থ

MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Atribute/width

উপরে আমার উদাহরণ কোড দেখুন। আমি কীভাবে কেবল প্রস্থ নির্ধারণ করেছি, কোনও উচ্চতা নেই Notice আমি এটি 100% এ সেট করে রেখেছি যাতে এটিতে থাকা পাত্রে এটি পূরণ করে St এই স্ট্যাক ওভারফ্লো প্রশ্নের উত্তর দেওয়ার জন্য সম্ভবত এটি সবচেয়ে বেশি অবদান রাখছে।

আপনি যা পিক্সেল মান চান তা এটিতে পরিবর্তন করতে পারেন, তবে আমি এটি 100% এর মতো ব্যবহার করার পরামর্শ দেব যা আমি এটি সর্বোচ্চ আকারে ফুটিয়ে তুলতে চাই এবং তারপরে প্যারেন্ট পাত্রে CSS আমি এটি সুপারিশ করছি কারণ আপনি "যথাযথ" নিয়ন্ত্রণ পাবেন। আপনি মিডিয়া ক্যোয়ারী ব্যবহার করতে পারেন এবং আপনি উন্মাদ জাভাস্ক্রিপ্ট ছাড়াই আকারটি নিয়ন্ত্রণ করতে পারেন।

সিএসএস সহ স্কেলিং

আমার উদাহরণ কোড আবার দেখুন। আমার এই বৈশিষ্ট্যগুলি কীভাবে তা লক্ষ্য করুন:

resize: 'horizontal', // you can safely omit this
overflow: 'hidden',   // if you use resize, use this to fix weird scrollbar appearance
width: '1000px',
height: 'auto',

এটি অতিরিক্ত, তবে এটি আপনাকে দেখায় যে কীভাবে ব্যবহারকারীকে সঠিক দিক অনুপাত বজায় রেখে এসভিজির আকার পরিবর্তন করতে দেওয়া যায়। যেহেতু এসভিজি তার নিজস্ব দিক অনুপাত বজায় রেখেছে, আপনার কেবল প্যারেন্ট পাত্রে প্রস্থকে পুনরায় আকার পরিবর্তন করতে হবে এবং এটি পছন্দমতো আকার পরিবর্তন করবে।

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

এই সেটিংগুলির একটি চিত্র ব্যবহৃত হচ্ছে:

এখানে চিত্র বর্ণনা লিখুন

আপনি যদি এই প্রশ্নের প্রতিটি সমাধান পড়েন এবং এখনও বিভ্রান্ত হয়ে পড়েছেন বা আপনার কী প্রয়োজন তা বেশ কিছু না দেখতে পান তবে এই লিঙ্কটি এখানে দেখুন। আমি এটি খুব সহায়ক বলে মনে করেছি:

https://css-tricks.com/scale-svg/

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


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

@ ব্যবহারকারী 48956 আপনি জাভাস্ক্রিপ্ট সহ সত্যের পরে সর্বদা এটিকে কাজে লাগাতে পারেন।
অ্যান্ড্রু

হ্যাঁ - আপনি সবসময় কোনও প্রোগ্রামিং সহ বিভিন্ন ফাইল ফর্ম্যাটগুলির আভ্যন্তরীণ দিকে ঝুঁকতে পারেন - তবে আপনি আশা করেন যে এমন কোনও পদ্ধতি রয়েছে যা সমস্ত ধরণের সম্পদের জন্য কাজ করে (যেমন পিএনজি) এবং জাভাস্ক্রিপ্ট প্রোগ্রামিংয়ের প্রয়োজন নেই।
ব্যবহারকারী 48956

20

আপনি যেমন রূপান্তর করতে চান:

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

document.getElementById(yourtarget).setAttribute("transform", "scale(2.0)");

সিএসএস সহ:

#yourtarget {
  transform:scale(2.0);
  -webkit-transform:scale(2.0);
}

আপনার এসভিজি পৃষ্ঠাটিকে কোনও গ্রুপ ট্যাগে মোড়ানো এবং পুরো পৃষ্ঠাটি হেরফের করতে লক্ষ্য করুন:

<svg>
  <g id="yourtarget">
    your svg page
  </g>
</svg>

দ্রষ্টব্য : স্কেল 1.0 হল 100%


7
ঠিক আছে. আমি এর মধ্যে জেএস চাই না। এটি পিতামাতার ফিটনেস করার কোনও উপায় আছে কি?
bjb568

@ বিজে সেটএট্রিবিউট <ট্যাগ অ্যাট্রিবিউট = "মান">
জন কোটজিক

17

চারপাশে জবাবদিহি করা & পাওয়া এই সিএসএসে মনে হয় ক্রোম ব্রাউজারে এসভিজি রয়েছে যতক্ষণ না ইমেজটির চেয়ে ধারক বড় is

div.inserted-svg-logo svg { max-width:100%; }

এছাড়াও এফএফ + আইই 11 এ কাজ করছে বলে মনে হচ্ছে।


এটি আমার জন্য সমস্যাটি সমাধান করেছে। যদিও আমি কেবল আইওএস-এ ওভারফ্লো দেখছিলাম। ধন্যবাদ!
ইভান ম্যাটসন

5
উভয়ই ব্যবহার করে max-width: 100%এবং max-height: 100%এসভিজি সর্বদা প্রবাহিত বা তার অনুপাতের অনুপাতটি ছাড়াই পাত্রে স্কেল করে দেবে।
গাভিন

2
@ গ্যাভিন max-height: 100%আমার পক্ষে কাজ করে vhনা, এর পরিবর্তে%
পাভেল

2

এসভিজি ফাইল পরিবর্তন করা আমার পক্ষে উপযুক্ত সমাধান ছিল না, এর পরিবর্তে, আমি আপেক্ষিক সিএসএস ইউনিট ব্যবহার করেছি ।

vh, vw, %খুব সুবিধাজনক হয়। আমি height: 2.4vh;আমার এসভিজি চিত্রগুলিতে একটি গতিশীল আকার নির্ধারণ করতে একটি সিএসএস ব্যবহার করেছি।



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