একেবারে অবস্থিত পিতামাতার ডিভের ভিতরে উল্লম্বভাবে ডিভকে কেন্দ্র করে কীভাবে


146

আমি গোলাপী রঙের মাঝখানে নীল রঙের ধারক পাওয়ার চেষ্টা করছি, তবে মনে vertical-align: middle;হয় সেই ক্ষেত্রে কাজটি করবে না।

<div style="display: block; position: absolute; left: 50px; top: 50px;">
    <div style="text-align: left; position: absolute;height: 56px;vertical-align: middle;background-color: pink;">
        <div style="background-color: lightblue;">test</div>
    </div>
</div>

ফলাফল:

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

প্রত্যাশা:

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

আমি কীভাবে এটি অর্জন করতে পারি দয়া করে পরামর্শ দিন।

Jsfiddle


1
আপনি position: absoluteকোথাও ব্যবহার করছেন এমন কোনও কারণ আছে ?
ভাকো

vertical-align: middle;সাথে কাজে display: inline-blockবা টেবিল বিন্যাস
ctf0

এই লিঙ্কটি দেখুন: vanseodesign.com/css/vertical-centering ;)
জর্ডি

@ ভুকো হ্যাঁ - এটি পূর্বশর্ত হিসাবে এটি খুব জটিল বিন্যাসের সহজতর সংস্করণ, তবে উভয় শীর্ষ ডিভগুলিতে পরম অবস্থান মূল বিষয়।
ভ্লাদিমির্স

@Vladimirs আমি শুধু মনে করতে পারেন margin-top: calc((56px - 16px) / 2), যেখানে 56px - parent height, 16px - element height/font-size- JSFiddle
Vucko

উত্তর:


332

সবার আগে এটি নোট করুন vertical-align কেবল টেবিল ঘর এবং ইনলাইন-স্তরের উপাদানগুলির জন্য প্রযোজ্য।

উল্লম্ব সারিবদ্ধতা অর্জনের বেশ কয়েকটি উপায় রয়েছে যা আপনার প্রয়োজনগুলি পূরণ করতে পারে বা নাও পারে। তবে আমি আপনাকে আমার পছন্দসই দুটি পদ্ধতি দেখাব :

1. ব্যবহার transformএবংtop

.valign {
    position: relative;
    top: 50%;
    transform: translateY(-50%);
    /* vendor prefixes omitted due to brevity */
}
<div style="position: absolute; left: 50px; top: 50px;">
    <div style="text-align: left; position: absolute;height: 56px;background-color: pink;">
        <div class="valign" style="background-color: lightblue;">test</div>
    </div>
</div>

মূল বিষয়টি হ'ল যে একটি শতাংশের মান এটি topথাকা heightব্লকের সাথে সম্পর্কিত; একটি শতাংশ মান চালু আছেtransformএস এর বাক্সের আকারের সাথে (সীমানা বাক্স) তুলনামূলক।

আপনি অনুভব করেন, তাহলে ফন্ট রেন্ডারিং সমস্যা (ঝাপসা ফন্ট), ফিক্স যোগ হয় perspective(1px)করার transformঘোষণা তাই এটি হয়ে:

transform: perspective(1px) translateY(-50%);

এটি লক্ষণীয় যে সিএসএস transform IE9 + এ সমর্থিত

2. ব্যবহার inline-block (সিউডো-) উপাদান

এই পদ্ধতিতে, আমাদের দুটি সহোদর inline-blockউপাদান রয়েছে যা vertical-align: middleঘোষণার মাধ্যমে মাঝখানে উল্লম্বভাবে প্রান্তিক হয় ।

heightএর 100%মধ্যে একটির এর পিতা-মাতার একটি রয়েছে এবং অন্যটি হ'ল আমাদের কাঙ্ক্ষিত উপাদান যার আমরা একে মাঝখানে প্রান্তিককরণ করতে চেয়েছিলাম।

.parent {
    text-align: left;
    position: absolute;
    height: 56px;
    background-color: pink;
    white-space: nowrap;
    font-size: 0; /* remove the gap between inline level elements */
}

.dummy-child { height: 100%; }

.valign {
    font-size: 16px; /* re-set the font-size */
}

.dummy-child, .valign {
    display: inline-block;
    vertical-align: middle;
}
<div style="position: absolute; left: 50px; top: 50px;">
    <div class="parent">
        <div class="dummy-child"></div>
        <div class="valign" style="background-color: lightblue;">test</div>
    </div>
</div>

অবশেষে, ইনলাইন-স্তরের উপাদানগুলির মধ্যে ব্যবধান দূর করতে আমাদের একটি উপলভ্য পদ্ধতি ব্যবহার করা উচিত ।


এই দরকারী টিপস জন্য ধন্যবাদ। এটি আমার প্রকল্পের জন্য কাজ করছিল। ভালো কাজ.
সেদাত কুমকু

প্রথম পদ্ধতির জন্য valignউপাদানটি হওয়া উচিতdisplay: block
ওলেগ

transform: translateY(-50%);এটি আগে কখনও দেখেনি, তবে এটি নির্দ্বিধায় কাজ করে। রিয়েল লাইফ সেভার
বেনি বোত্তেমা

55

এটা ব্যবহার কর :

.Absolute-Center {
    margin: auto;
    position: absolute;
    top: 0; left: 0; bottom: 0; right: 0;
}

এই লিঙ্কটি দেখুন: https://www.smashingmagazine.com/2013/08/absolve-horizontal-versical-centering-css/


এটি কীভাবে মূল সমাধান নয়? এত সহজ এবং এটি কাজ করে!
ম্যাসন

21
মনে রাখবেন যে কাজ করার জন্য heightসম্পত্তি অবশ্যই সংজ্ঞায়িত করা উচিত (px, em ইত্যাদি)।
বৈদাস

যদি আমার পিতামাতার ভিতরে একাধিক ডিভ থাকে? সব কি একে অপরের উপরে স্থাপন করা হবে না?
সাইকিড

"পরম কেন্দ্র" সহ একই স্তরে আরও একটি শিশু থাকলে এটি কাজ করে না
পাসকুট

18

এর বিষয়বস্তুকে কেন্দ্র করে আপনার স্পষ্টত অবস্থানযুক্ত ডিভিউতে ফ্লেক্স ব্ল্যাক্স ব্যবহার করুন।

উদাহরণ দেখুন https://plnkr.co/edit/wJIX2NpbNhO34X68ZyoY?p= পূর্বরূপ

.some-absolute-div {    
  display: -webkit-box;
  display: -webkit-flex;
  display: -moz-box;
  display: -moz-flex;
  display: -ms-flexbox;
  display: flex;

  -webkit-box-pack: center;
  -ms-flex-pack: center;
  -webkit-justify-content: center;
  -moz-justify-content: center;
  justify-content: center;

  -webkit-box-align: center;
  -ms-flex-align: center;
  -webkit-align-items: center;
  -moz-align-items: center;
  align-items: center;
}

11

উল্লম্ব এবং অনুভূমিকভাবে কেন্দ্র:

.parent{
  height: 100%;
  position: absolute;
  width: 100%;
  top: 0;
  left: 0;
}
.c{
  position: absolute;
  top: 50%;
  left: 0;
  right: 0;
  transform: translateY(-50%);
}

3

আপনি display:table/ ব্যবহার করতে পারেনtable-cell;

.a{
   position: absolute; 
  left: 50px; 
  top: 50px;
  display:table;
}
.b{
  text-align: left; 
  display:table-cell;
  height: 56px;
  vertical-align: middle;
  background-color: pink;
}
.c {
  background-color: lightblue;
}
<div class="a">
  <div  class="b">
    <div class="c" >test</div>
  </div>
</div>


ধন্যবাদ, আপনার উদাহরণটি নিখুঁতভাবে কাজ করে, তবে .bমিস করা position: absolute;কোডটি পরিষ্কার রাখার জন্য আমি অন্তর্ভুক্ত করি নি এমন অন্যান্য জিনিস প্রদর্শিত হওয়া গুরুত্বপূর্ণ missing আমি জানি যে টেবিল-সেলটি একেবারে অবস্থিত থাকা কোনও অর্থই রাখে না তবে সম্ভবত আরও একটি পদ্ধতি রয়েছে যা position: absolute;উভয় .aএবং .bশ্রেণী উভয়ই ধরে রাখতে পারে ?
ভ্লাদিমির

যদি কোনও নিখুঁত অবস্থান হয় এবং খ (সন্তানের) এটির আকার দেয় তবে খ নিজেই বাকি সামগ্রীর দিকে নিখুঁত অবস্থানে থাকে। যদি না অনুমান করা যায় যে আমি নিরবচ্ছিন্ন থাকতে পারি তবে আমি পরম অভ্যন্তরের পরম উদ্দেশ্য বুঝতে পারি না?
জি-সিরিলাস

1

টপ অবজেক্টটি ব্যবহারের জন্য এখানে সহজ উপায়।

উদাহরণস্বরূপ: যদি নিখুঁত উপাদানটির আকার 60px হয়।

.absolute-element { 
    position:absolute; 
    height:60px; 
    top: calc(50% - 60px);
}

2
ব্যবহার calcকরা সহায়ক, যদিও top: calc(50% - 30px)এটি কেন্দ্রীভূত হওয়ার জন্য এটি হওয়া উচিত ।
ব্রেনব্যাগ

1

একটি অতিরিক্ত সহজ সমাধান

এইচটিএমএল:

<div id="d1">
    <div id="d2">
        Text
    </div>
</div>

সিএসএস:

#d1{
    position:absolute;
    top:100px;left:100px;
}

#d2{
    border:1px solid black;
    height:50px; width:50px;
    display:table-cell;
    vertical-align:middle;
    text-align:center;  
}

0

অনুরূপ সমস্যার এই উত্তরটি পরীক্ষা করে দেখুন check

এটি এখন পর্যন্ত আমার সবচেয়ে সহজতম উপায়।

https://stackoverflow.com/a/26079837/4593442

বিঃদ্রঃ. আমি প্রদর্শন ব্যবহার করেছি : -উইবকিট-ফ্লেক্স; প্রদর্শন পরিবর্তে : ফ্লেক্স; সাফারি ভিতরে পরীক্ষা করার জন্য।

পাদটীকা। আমি কেবল একজন শিক্ষানবিস, স্পষ্টত অভিজ্ঞ যে কারও কাছ থেকে সহায়তা ভাগ করে নিচ্ছি।


0

আপনি display:table;পিতামহক ডিভ এবং display: table-cell; vertical-align: middle;শিশু বিভাগে ব্যবহার করে এটি করতে পারেন

<div style="display:table;">
      <div style="text-align: left;  height: 56px;  background-color: pink; display: table-cell; vertical-align: middle;">
          <div style="background-color: lightblue; ">test</div>
      </div>
  </div>


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