প্রতিক্রিয়াশীল উচ্চতার সাথে একটি ডিভের ভিতরে উল্লম্বভাবে একটি চিত্র সারিবদ্ধ করুন


135

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

এইচটিএমএল

<div class="responsive-container">
    <div class="dummy"></div>
    <div class="img-container">
        <IMG HERE>
    </div>
</div>

সিএসএস

.responsive-container {
    position: relative;
    width: 100%;
    border: 1px solid black;
}

.dummy {
    padding-top: 100%; /* forces 1:1 aspect ratio */
}

.img-container {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
}

আমি কীভাবে ধারকটির ভিতরে আইএমজি লম্বালম্বিভাবে সারিবদ্ধ করতে পারি? আমার সমস্ত চিত্রের পরিবর্তনশীল উচ্চতা রয়েছে এবং ধারকটির একটি নির্দিষ্ট উচ্চতা / লাইন উচ্চতা থাকতে পারে না কারণ এটি প্রতিক্রিয়াশীল ... দয়া করে সহায়তা করুন!


1
এখানে একটি সহজ flexbox সমাধান stackoverflow.com/a/31977476/3597276
মাইকেল বেঞ্জামিন

উত্তর:


381

একই সময়ে অনুভূমিকভাবে এবং উল্লম্বভাবে পিতামাতার ভিতরে ইনলাইন উপাদানগুলি সারিবদ্ধ করার একটি কৌশল এখানে রয়েছে :

উল্লম্ব প্রান্তিককরণ

1) এই পদ্ধতির মধ্যে আমরা পিতামাতারinline-block প্রথম (বা শেষ) সন্তানের হিসাবে একটি (সিউডো) উপাদান তৈরি করি এবং তার পিতামাতার সমস্ত উচ্চতা নিতে তার সম্পত্তি সেট করি ।height100%

২) এছাড়াও, যোগ করার vertical-align: middleফলে লাইন স্পেসের মাঝখানে ইনলাইন (-ব্লক) উপাদান থাকে keeps সুতরাং, আমরা সেই প্রথম সিএসএস ঘোষণাকে প্রথম সন্তানের সাথে যুক্ত করব এবং আমাদের উপাদান ( চিত্র ) উভয়ই।

3) অবশেষে, ইনলাইন (-ব্লক) উপাদানগুলির মধ্যে সাদা স্থানের অক্ষরটি সরাতে আমরা পিতামাতার ফন্টের আকারটি শূন্য দ্বারা সেট করতে পারি font-size: 0;

দ্রষ্টব্য: আমি নীচে নিকোলাস গ্যালাগারের চিত্র প্রতিস্থাপন কৌশলটি ব্যবহার করেছি ।

লাভ কি কি?

  • ধারক ( পিতামাতার ) গতিশীল মাত্রা থাকতে পারে।
  • চিত্রের উপাদানগুলির মাত্রা স্পষ্টভাবে নির্দিষ্ট করার দরকার নেই।

  • কোনও <div>উপাদানকে উল্লম্বভাবে সারিবদ্ধ করার জন্য আমরা সহজেই এই পদ্ধতির ব্যবহার করতে পারি ; যার একটি গতিশীল সামগ্রী থাকতে পারে (উচ্চতা এবং / অথবা প্রস্থ)। কিন্তু নোট আছে আপনি পুনরায়-সেট করতে font-sizeসম্পত্তির divভিতরে টেক্সট প্রদর্শন করে। অনলাইন ডেমো

<div class="container">
    <div id="element"> ... </div>
</div>
.container {
    height: 300px;
    text-align: center;  /* align the inline(-block) elements horizontally */
    font: 0/0 a;         /* remove the gap between inline(-block) elements */
}

.container:before {    /* create a full-height inline block pseudo=element */
    content: ' ';
    display: inline-block;
    vertical-align: middle;  /* vertical alignment of the inline element */
    height: 100%;
}

#element {
    display: inline-block;
    vertical-align: middle;  /* vertical alignment of the inline element */
    font: 16px/1 Arial sans-serif;        /* <-- reset the font property */
}

আউটপুট

উল্লম্বভাবে তার ধারকটিতে একটি উপাদান সারিবদ্ধ করুন

প্রতিক্রিয়াশীল ধারক

এই বিভাগটি প্রশ্নের জবাব দিতে যাচ্ছে না কারণ ওপি ইতিমধ্যে জবাবদিহি ধারক তৈরি করতে জানে knows যাইহোক, আমি এটি কীভাবে কাজ করে তা ব্যাখ্যা করব।

তৈরী করার উদ্দেশ্যে উচ্চতা তার সঙ্গে একটি কন্টেইনারে উপাদান পরিবর্তনের প্রস্থ (অনুপাত সম্মান), আমরা শীর্ষ / নীচে জন্য শতকরা মান ব্যবহার করতে পারে paddingসম্পত্তি।

শীর্ষ / নীচের প্যাডিং বা মার্জিনের একটি শতাংশের মানটি ব্লক যুক্ত প্রস্থের সাথে তুলনামূলক।

এই ক্ষেত্রে:

.responsive-container {
  width: 60%;

  padding-top: 60%;    /* 1:1 Height is the same as the width */
  padding-top: 100%;   /* width:height = 60:100 or 3:5        */
  padding-top: 45%;    /* = 60% * 3/4 , width:height =  4:3   */
  padding-top: 33.75%; /* = 60% * 9/16, width:height = 16:9   */
}

এখানে অনলাইন ডেমো রয়েছে । নীচে থেকে লাইনগুলি মন্তব্য করুন এবং প্রভাবটি দেখতে প্যানেলটির আকার পরিবর্তন করুন।

এছাড়াও, আমরা একই ফল অর্জনের জন্য paddingসম্পত্তিটি একটি ডামি শিশু বা :before/ :afterসিউডো-এলিমেন্টে প্রয়োগ করতে পারি । তবে মনে রাখবেন যে এক্ষেত্রে শতাংশের মানটি paddingতার প্রস্থের সাথে .responsive-containerসামঞ্জস্যপূর্ণ।

<div class="responsive-container">
  <div class="dummy"></div>
</div>
.responsive-container { width: 60%; }

.responsive-container .dummy {
  padding-top: 100%;    /*  1:1 square */
  padding-top: 75%;     /*  w:h =  4:3 */
  padding-top: 56.25%;  /*  w:h = 16:9 */
}

ডেমো # 1
ডেমো # 2 ( :afterসিউডো-উপাদান ব্যবহার করে )

সামগ্রী যুক্ত করা হচ্ছে

ব্যবহার padding-topসম্পত্তি বিপুল স্থান ঘটায় উপরে বা কন্টেন্টের নীচে, ভিতরে ধারক

অর্ডার এটি ঠিক করার জন্য, আমরা একটি লেফাফা উপাদান দিয়ে সামগ্রীর মোড়ানো ব্যবহার করে দস্তাবেজ স্বাভাবিক প্রবাহ থেকে যে উপাদান অপসারণ আছে পরম অবস্থান , এবং পরিশেষে মোড়কের প্রসারিত (Bu ব্যবহার top, right, bottomএবং leftবৈশিষ্ট্য) তার পিতা বা মাতা সমগ্র স্থান পূরণ করার জন্য, ধারক

এখানে আমরা যাচ্ছি:

.responsive-container {
  width: 60%;
  position: relative;
}

.responsive-container .wrapper {
  position: absolute;
  top: 0; right: 0; bottom: 0; left: 0;
}

এখানে অনলাইন ডেমো রয়েছে


সব একসাথে করা

<div class="responsive-container">
  <div class="dummy"></div>

  <div class="img-container">
    <img src="http://placehold.it/150x150" alt="">
  </div>
</div>
.img-container {
  text-align:center; /* Align center inline elements */
  font: 0/0 a;       /* Hide the characters like spaces */
}

.img-container:before {
  content: ' ';
  display: inline-block;
  vertical-align: middle;
  height: 100%;
}

.img-container img {
  vertical-align: middle;
  display: inline-block;
}

এখানে ওয়ার্কিং ডেমো রয়েছে

স্পষ্টতই, আপনি ব্রাউজারের সামঞ্জস্যের::before জন্য সিউডো-উপাদান ব্যবহার এড়াতে এবং এর প্রথম শিশু হিসাবে একটি উপাদান তৈরি করতে পারেন :.img-container

<div class="img-container">
    <div class="centerer"></div>
    <img src="http://placehold.it/150x150" alt="">
</div>
.img-container .centerer {
  display: inline-block;
  vertical-align: middle;
  height: 100%;
}

আপডেট করা ডেমো

max-*বৈশিষ্ট্য ব্যবহার করে

ছবিটির বাক্সের ভিতরে কম প্রস্থে রাখার জন্য, আপনি চিত্রটিতে সেট max-heightএবং max-widthসম্পত্তি রাখতে পারেন:

.img-container img {
    vertical-align: middle;
    display: inline-block;
    max-height: 100%;  /* <-- Set maximum height to 100% of its parent */
    max-width: 100%;   /* <-- Set maximum width to 100% of its parent */
}

এখানে আপডেটেড ডেমো রয়েছে


1
হাই হাশেম আপনার উত্তরের জন্য অনেক ধন্যবাদ - এটি ছোট প্রস্থে পুনরায় আকার দেওয়ার পরেও ডেস্কটপ ব্রাউজারগুলির জন্য যাদুবিদ্যার মতো কাজ করেছিল। তবে দুর্ভাগ্যক্রমে ছবিগুলি মোবাইল থেকে কনটেইনার ডিভের নীচে অবস্থানের বাইরে উপস্থিত হচ্ছে (অ্যান্ড্রয়েড ভি 2.3.3.5)। এই জন্য একটি স্থির উপর কোন ধারণা?
ব্যবহারকারী 1794295

3
@ ইউজার 1794295 আমি ব্রাউজারস্ট্যাক ডট কমের মাধ্যমে অ্যান্ড্রয়েড ভি 2.3 (গ্যালাক্সি এস II, গ্যালাক্সি নোট, মটোরোলা ডায়রয়েড 4) এর সাহায্যে তিনটি অ্যান্ড্রয়েড ডিভাইসে এই ঝাঁকুনিটি পরীক্ষা করেছি, আমার প্রত্যাশা অনুযায়ী সবকিছুই কাজ করে You আপনি ফলাফলটি এখানে খুঁজে পেতে পারেন: ব্রাউজারস্ট্যাক / স্ক্রিনশটস /… । আপনার সমস্যার একটি স্ক্রিনশট বা একটি নির্দিষ্ট পরীক্ষা প্রদান করুন। আমি যথাসাধ্য সাহায্য করব
হাশেম কুলামি

1
হাই এখানে কিছু স্ক্রিনশট রয়েছে: ব্রাউজারস্ট্যাক / স্ক্রিনশটস /… - আপনি ছোট ডিভাইসগুলির সাথে দেখতে পারেন (যেমন এক্সপিরিয়া, এলজি নেক্সাস 4) চিত্রগুলি পাত্রে নীচে প্রদর্শিত হচ্ছে ... কী হচ্ছে ?!
ব্যবহারকারী 1794295

3
@ হাশেমকোলামি এটি সবচেয়ে আশ্চর্যজনক সিএসএস জিনিস, যেহেতু আমি ওয়েবসাইট তৈরি করা শুরু করেছি :)।
আলেকজান্ডার সোনোনিক

1
ধন্যবাদ font-size: 0;!
জোহানেস লাইবারম্যান

47

ফ্লেক্সবক্সের সাহায্যে এটি সহজ:

বেহালা

কেবলমাত্র চিত্র ধারকটিতে নিম্নলিখিতগুলি যুক্ত করুন:

.img-container {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    display: flex; /* add */
    justify-content: center; /* add to align horizontal */
    align-items: center; /* add to align vertical */
}

2
এই সমাধানটি কাজ করে এবং আমার ক্ষেত্রে আরও মার্জিত হয়। CSS3 ফ্লেক্স দুর্দান্ত!
ড্যানিয়েল বনেল

2
এটি সাফারিতে কাজ করে না :( আমি অনুমান করি সমস্যাটি নমনীয়
yennefer

1
সাফারি ব্যবহার -webkit-উপসর্গের জন্য @ ইয়েন্নেফার , বা উপসর্গফ্রি.জেএস এর মতো একটি লাইব্রেরি চেষ্টা করুন :)
কিউবি

ধারকটির উচ্চতা প্রতিক্রিয়াশীল (শতাংশে) কাজ করে না।
জেনাল্যাম্পটন

1
নিখুঁত সমাধান!
নিরুস

16

আপনার কাছে ইতিমধ্যে এর জন্য মার্কআপ রয়েছে বলে এই সিএসএসটি ব্যবহার করুন:

.img-container {
    position: absolute;
    top: 50%;
    left: 50%;
}

.img-container > img {
  margin-top:-50%;
  margin-left:-50%;  
}

এখানে একটি কার্যকারী জেএসবিন: http://jsbin.com/ihilUnI/1/edit ed

এই সমাধানটি কেবল বর্গাকার চিত্রগুলির জন্য কাজ করে (কারণ শতাংশের মার্জিন-শীর্ষের মান ধারকটির প্রস্থের উপর নির্ভর করে, উচ্চতা নয়)। এলোমেলো আকারের চিত্রগুলির জন্য, আপনি নিম্নলিখিতগুলি করতে পারেন:

.img-container {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%); /* add browser-prefixes */
}

কার্যত জেএসবিন দ্রবণ: http://jsbin.com/ihilUnI/2/edit


দুঃখিত, আমার পক্ষে কাজ করছেন না - এটি কেবল ধারকের আকারের অর্ধেক প্রস্থে চিত্রের আকার হ্রাস করছে।
ব্যবহারকারী 1794295

2
আমি উল্লিখিত সিএসএস থেকে কীভাবে এটি ঘটতে পারে তা আমি দেখতে পাচ্ছি না। দয়া করে একটি কাজের নমুনা সরবরাহ করুন যাতে আমি আমার উত্তরটি উন্নত করতে পারি see PS: আমি আরও একটি সমাধান সরবরাহ করেছি :)
টিবস

11

আপনি কোনও চিত্রকে অনুভূমিকভাবে এবং উল্লম্বভাবে উভয়কেই ব্যবহার করতে margin: autoএবং পরম অবস্থান নির্ধারণ করতে পারেন। এছাড়াও:

  1. সিউডো উপাদান ব্যবহার করে অতিরিক্ত মার্কআপ খাঁজ করা সম্ভব।
  2. নেতিবাচক বাম, শীর্ষ, ডান এবং নীচের মানগুলি ব্যবহার করে LARGE চিত্রগুলির মাঝের অংশটি প্রদর্শন করা সম্ভব।

.responsive-container {
  margin: 1em auto;
  min-width: 200px;       /* cap container min width */
  max-width: 500px;       /* cap container max width */
  position: relative;     
  overflow: hidden;       /* crop if image is larger than container */
  background-color: #CCC; 
}
.responsive-container:before {
  content: "";            /* using pseudo element for 1:1 ratio */
  display: block;
  padding-top: 100%;
}
.responsive-container img {
  position: absolute;
  top: -999px;            /* use sufficiently large number */
  bottom: -999px;
  left: -999px;
  right: -999px;
  margin: auto;           /* center horizontally and vertically */
}
<p>Note: images are center-cropped on &lt;400px screen width.
  <br>Open full page demo and resize browser.</p>
<div class="responsive-container">
  <img src="http://lorempixel.com/400/400/sports/9/">
</div>
<div class="responsive-container">
  <img src="http://lorempixel.com/400/200/sports/8/">
</div>
<div class="responsive-container">
  <img src="http://lorempixel.com/200/400/sports/7/">
</div>
<div class="responsive-container">
  <img src="http://lorempixel.com/200/200/sports/6/">
</div>


ধন্যবাদ! আপনার .আপনিবাদমূলক-ধারক img CSS কেবলমাত্র আমার জন্য কাজ করেছিল।
ডায়োগো গার্সিয়া

4

আর একবার চেষ্টা কর

  .responsive-container{
          display:table;
  }
  .img-container{
          display:table-cell;
          vertical-align: middle;
   }

দুঃখিত এটি কাজ করে না, আমি মনে করি কারণ আমার .img-containerএকেবারে অবস্থান রয়েছে - বর্গক্ষেত্রের অনুপাত / গতিশীল উচ্চতা বজায় রাখতে এটি প্রয়োজনীয়।
ব্যবহারকারী 1794295

2

এখানে এমন একটি কৌশল যা আপনাকে যে কোনও বিষয়বস্তুকে উল্লম্ব এবং অনুভূমিকভাবে উভয়কেই কেন্দ্র করতে দেয়!

মূলত, আপনার কেবল দুটি ধারক প্রয়োজন এবং আপনার উপাদানগুলি নীচের মানদণ্ডগুলি পূরণ করে তা নিশ্চিত করুন।

বহির্মুখী ধারক:

  • উচিত display: table;

অভ্যন্তরীণ পাত্রে:

  • উচিত display: table-cell;
  • উচিত vertical-align: middle;
  • উচিত text-align: center;

সামগ্রী বাক্স:

  • উচিত display: inline-block;

আপনি যদি এই কৌশলটি ব্যবহার করেন তবে কেবল আপনার চিত্রটি (আপনার সাথে যেতে চাইলে অন্য যে কোনও সামগ্রীর সাথে) যুক্ত করুন।

ডেমো:

body {
    margin : 0;
}

.outer-container {
    position : absolute;
    display: table;
    width: 100%;
    height: 100%;
    background: #ccc;
}

.inner-container {
    display: table-cell;
    vertical-align: middle;
    text-align: center;
}

.centered-content {
    display: inline-block;
    background: #fff;
    padding : 12px;
    border : 1px solid #000;
}

img {
   max-width : 120px;
}
<div class="outer-container">
   <div class="inner-container">
     <div class="centered-content">
        <img src="https://i.stack.imgur.com/mRsBv.png" />
     </div>
   </div>
</div>

আরও দেখুন এই বেহালার !


2

সমাধানের সন্ধানে আমি এই থ্রেডটি পেরিয়ে এসেছি যে:

  • প্রদত্ত চিত্রের প্রস্থের 100% ব্যবহার করে
  • চিত্র অনুপাত অনুপাত রাখে
  • চিত্রটি উল্লম্বভাবে মাঝখানে সারিবদ্ধ রাখে
  • ব্রাউজারগুলিতে কাজ করে যা পুরোপুরি ফ্লেক্স সমর্থন করে না

উপরে পোস্ট করা কয়েকটি সমাধানের পরীক্ষা করে আমি এই সমস্ত মানদণ্ড পূরণ করতে একটিও পাইনি, সুতরাং আমি এই সাধারণটি একসাথে রেখেছি যা অন্যান্য লোকদেরও এটির জন্য প্রয়োজনীয় হতে পারে:

.container {
  width: 30%;
  float: left;
  border: 1px solid turquoise;
  margin-right: 3px;
  margin-top: 3px;
}

.container:last-of-kind {
  margin-right: 0px;
}

.image-container {
  position: relative;
  overflow: hidden;
  padding-bottom: 70%;
  /* this is the desired aspect ratio */
  width: 100%;
}

.image-container img {
  position: absolute;
  /* the following 3 properties center the image on the vertical axis */
  top: 0;
  bottom: 0;
  margin: auto;
  /* uses image at 100% width (also meaning it's horizontally center) */
  width: 100%;
}
<div class="container">
  <div class="image-container">
    <img src="http://placehold.it/800x800" class="img-responsive">
  </div>
</div>

<div class="container">
  <div class="image-container">
    <img src="http://placehold.it/800x800" class="img-responsive">
  </div>
</div>

<div class="container">
  <div class="image-container">
    <img src="http://placehold.it/800x800" class="img-responsive">
  </div>
</div>

জেএসফিডেলে কাজের উদাহরণ


0

চেষ্টা

এইচটিএমএল

<div class="responsive-container">
     <div class="img-container">
         <IMG HERE>
     </div>
</div>

সিএসএস

.img-container {
    position: absolute;
    top: 0;
    left: 0;
height:0;
padding-bottom:100%;
}
.img-container img {
width:100%;
}

0

এইচটিএমএল কোড

<div class="image-container"> <img src=""/> </div>

সিএসএস কোড

img
{
  position: relative;
  top: 50%;
  transform: translateY(-50%);
 }

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

0

আরেকটি ডিভ তৈরি করুন এবং ডিভের ভিতরে দুটি 'ডমি' এবং 'ইমগ-ধারক' যুক্ত করুন

নিম্নলিখিত মত এইচটিএমএল এবং সিএসএস করুন

html , body {height:100%;}
.responsive-container { height:100%; display:table; text-align:center; width:100%;}
.inner-container {display:table-cell; vertical-align:middle;}
<div class="responsive-container">
    <div class="inner-container">
		<div class="dummy">Sample</div>
		<div class="img-container">
			Image tag
		</div>
	</div>	
</div>

'প্রতিক্রিয়াশীল-ধারক' এর জন্য 100% এর পরিবর্তে আপনি যে উচ্চতা চান তা দিতে পারেন,

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