Tại sao cần dịchY (-50%) để căn giữa một phần tử ở trên cùng: 50%?


83

Tôi có thể thấy rằng mã này hoạt động để căn chỉnh một div theo chiều dọc trong phần tử mẹ của nó:

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

Câu hỏi là tại sao? Suy nghĩ đầu tiên của tôi là phần tử mẹ bao gồm nhiều hơn khung nhìn. Tôi đã làm cho chiều cao 100vhvà chiều rộng khung nhìn mẹ bằng nhau 100%. Điều đó đã không hoạt động. Tôi vẫn cần bản dịch hoặc phần bù chênh lệch lợi nhuận âm. Tại sao tôi cần bù trừ âm khi phần tử mẹ được đặt thành margin: 0;? Có phải do tôi không tính đến số tiền ký quỹ không?


top là tương đối với cha mẹ, biến đổi là tương đối với chính nó. làm toán, bạn sẽ như thế nào kết quả này trong trung các yếu tố
njzk2

Câu trả lời:


157

đầu trang: 0 (mặc định)

Theo mặc định, phần tử của bạn ở đầu trang và đầu phần tử ở 0:

--------Top of Page--------
{element}


------Middle of  Page------



------Bottom of  Page------

hàng đầu: 50%

Khi bạn di chuyển nó xuống 50% chiều cao (50% của toàn bộ trang), phần trên cùng của phần tử ở mốc 50%, có nghĩa là phần tử bắt đầu ở 50% và không được căn giữa.

--------Top of Page--------



------Middle of  Page------
{element}


------Bottom of  Page------

top: 50%; biến đổi: translateY (-50%);

Khi phần trên cùng của phần tử nằm ở nửa đường, chúng ta có thể di chuyển phần tử lên phía trên một nửa chiều cao của phần tử đó để căn giữa phần tử đó với toàn bộ trang. Đó chính xác là những gì transform:translateY(-50%);:

--------Top of Page--------



{element}-Middle of Page---



------Bottom of  Page------

Nhưng tại sao chúng ta không thể chỉ nói top: 25%hoặc một cái gì đó tương tự? Tôi đã tạo một đoạn mã nhanh để cho bạn thấy sự khác biệt với cách triển khai đó:

body {
  margin: 0;
}
.row {
  display: flex;
  justify-content: space-between;
}
.container {
  display: inline-block;
  margin: 5px;
  width: 200px;
  height: 200px;
  background: tomato;
}
.inner {
  position: relative;
  margin: 0 auto;
  height: 50%;
  width: 50%;
  background: #FFC4BA;
}
.inner.small {
  width: 25%;
  height: 25%;
}
.inner.big {
  width: 75%;
  height: 75%;
}
.percent {
  top: 25%
}
.transform {
  top: 50%;
  transform: translateY(-50%);
}
<b>First row </b>looks alright, but that's because the gap works well with the 25%
<div class="row">
  <div class="container">
    <div class="inner percent"></div>
  </div>
  <div class="container">
    <div class="inner transform"></div>
  </div>
</div>
<b>Second row </b>made the center square a bit smaller, and the 25% now is too high as we'd expect the bottom of the element to reach 75%
<div class="row">
  <div class="container">
    <div class="small inner percent"></div>
  </div>
  <div class="container">
    <div class="small inner transform"></div>
  </div>
</div>
<b>Third row </b>now I've made the center box big and it ends lower than 75% making 25% start too late
<div class="row">
  <div class="container">
    <div class="big inner percent"></div>
  </div>
  <div class="container">
    <div class="big inner transform"></div>
  </div>
</div>


Tôi hiểu một phần những gì bạn đang nói. Tôi có các câu hỏi tiếp theo mà tôi đã thêm vào phần nhận xét của câu trả lời @Quentin.
ltrainpr

Tôi thích sự thể hiện trực quan của những gì đang xảy ra. Cảm ơn bạn.
ltrainpr

2
TL; DR topáp dụng 50% từ chiều cao trang / vùng chứa, transform: translateYáp dụng -50% từ chiều cao phần tử riêng.
aldo.roman.nurena

73

Trong khi những người khác đưa ra câu trả lời rằng -50 di chuyển phần tử bên trong lên một nửa chiều cao của chính nó, tôi nghĩ rằng hoạt ảnh nhỏ này hiển thị chuyển động lên top: 50%;đầu tiên, tiếp theo là transform: translateY(-50%);thứ hai, có thể hữu ích.

@keyframes centerMe {
  0% { top: 0%; transform: translateY(0%); }
  50% { top: 50%; transform: translateY(0%); }
  100% { top: 50%; transform: translateY(-50%); }
}

.outer {
  position: relative;
  border: solid 1px;
  height: 200px;
  width: 200px;
}

.inner {
  position: relative;
  background-color: red;
  height: 50px; width: 50px;
  margin: auto;
  animation: centerMe 5s;
  animation-fill-mode: forwards;
}

/* rules for example */
.hline,.vline{background:#000;position:absolute}.vline{height:100%;width:1px;left:calc(50% - .5px);top:0}.hline{width:100%;height:1px;top:calc(50% - .5px)}
<div class="outer">
  <div class="hline"></div>
  <div class="vline"></div>
  <div class="inner"></div>  
</div>


2
Bắn! Đây là một hình ảnh động trực quan tuyệt vời. Đây là lý do tại sao tôi thích front end hơn lập trình back end. Cảm ơn bạn.
ltrainpr

1
@Itrainpr Luôn có tiền thưởng! :-)
wizzwizz

29
position: relative;
top: 50%;

… Di chuyển phần tử xuống một khoảng cách bằng một nửa chiều cao của phần tử gốc.

Vì vị trí mặc định đặt phần trên cùng của phần tử bên trong ở trên cùng của phần tử bên ngoài, điều này sẽ đặt phần trên cùng của phần tử bên trong ở giữa phần tử bên ngoài.

transform: translateY(-50%);

Thao tác này sẽ di chuyển phần tử bên trong trở lại khoảng cách bằng một nửa chiều cao của phần tử bên trong .

Việc kết hợp chúng sẽ đặt giữa phần tử bên trong ở giữa phần tử mẹ.


Nếu tôi hiểu những gì bạn đang nói, phần trên cùng của phần tử con đang được di chuyển xuống dưới giữa phần tử gốc. Sau đó, chúng tôi đang di chuyển phần tử con lùi lại một nửa khoảng cách của phần tử con tương đương với 25% của phần tử mẹ. Đúng không? Nếu vậy, tại sao không di chuyển nó xuống bằng cách làm gì top: 25%? Nếu không, thì làm thế nào top: 25%khác với công việc này xung quanh?
ltrainpr

3
"Sau đó, chúng tôi đang di chuyển phần tử con lùi lại một nửa khoảng cách của phần tử con tương đương với 25% của phần tử mẹ. Điều đó có đúng không?" - Sẽ đúng nếu (và chỉ khi) phần tử con có height: 50%(hoặc tương đương), nhưng không có gì trong mã trong câu hỏi gợi ý rằng chiều cao của đứa trẻ được biết.
Quentin

@ltrainpr điều đó có hợp lý không bạn có hiểu tại sao bạn không thể chỉ nói 25% bây giờ không?
Andrew Bone

1
@AndrewBone Yep, tôi hiểu rồi. Cảm ơn bạn đã dành thời gian để giải thích nó.
ltrainpr

Không phải vị trí mặc định ở trên cùng của phần tử bên ngoài chỉ khi nó là phần tử con đầu tiên (chiếm dấu cách) hoặc khi sử dụng position: absolute(giả sử phần tử bên ngoài được định vị chính nó)?
Bergi

11

Tại sao 50% hàng đầu lại cần dịch bù -50%?

Thay vì trả lời trực tiếp câu hỏi này, tôi sẽ trả lời câu hỏi chung hơn về:

Làm thế nào để neo vị trí hoạt động trong CSS?

Hy vọng rằng, khi trả lời câu hỏi một cách tổng quát, bạn sẽ hiểu các phần áp dụng cho trường hợp cụ thể của mình.


Bạn có nghĩa là gì khi "neo vị trí"?

Cố định vị trí là khi một nút DOM được định vị theo cách mà nó được "cố định" với cha của nó trong một thứ nguyên nhất định. Nếu trên cùng bên trái của nút được neo ở phía trên bên trái của nút cha, các nút sẽ được căn chỉnh ở góc trên cùng bên trái của chúng, bất kể kích thước của một trong hai phần tử.

Vị trí neo trông như thế nào?

Tôi sẽ sử dụng một mẫu cho tất cả các ví dụ khác, vì vậy điều quan trọng là phải hiểu ví dụ cơ sở.

.container {
  background-image: -webkit-linear-gradient(left, darkred 0, darkred 50%, goldenrod 50%, goldenrod 100%), -webkit-linear-gradient(left, darkgreen 0, darkgreen 50%, darkblue 50%, darkblue 100%);
  background-image: linear-gradient(to right, darkred 0, darkred 50%, goldenrod 50%, goldenrod 100%), linear-gradient(to right, darkgreen 0, darkgreen 50%, darkblue 50%, darkblue 100%);
  background-position: top, bottom;
  background-repeat: no-repeat;
  background-size: 100% 50.1%, 100% 50.1%;
  height: 70vh;
  margin: 15vh 15vw;
  position: relative;
  width: 70vw;
}
.box {
  background-image: -webkit-linear-gradient(left, red 0, red 50%, yellow 50%, yellow 100%), -webkit-linear-gradient(left, green 0, green 50%, blue 50%, blue 100%);
  background-image: linear-gradient(to right, red 0, red 50%, yellow 50%, yellow 100%), linear-gradient(to right, green 0, green 50%, blue 50%, blue 100%);
  background-position: top, bottom;
  background-repeat: no-repeat;
  background-size: 100% 50.1%, 100% 50.1%;
  height: 50vmin;
  position: absolute;
  width: 50vmin;
}
<div class="container">
  <div class="box"></div>
</div>

Ví dụ này hiển thị một phụ huynh .containercó các góc phần tư màu đỏ sẫm, vàng đậm, xanh lá cây đậm và xanh lam đậm để dễ dàng xem sự liên kết. Bên trong, nó chứa một .boxcó các góc phần tư màu đỏ, vàng, xanh lá cây và xanh lam để hiển thị độ tương phản cho sự liên kết.

Tất cả các ví dụ tiếp theo sẽ được rút gọn bản soạn sẵn này để làm cho mã liên quan nổi bật hơn.

Lưu ý rằng theo mặc định, phía trên bên trái của con được neo ở phía trên bên trái của cha mẹ.

Neo cha mẹ

Neo đậu phụ huynh có thể được điều chỉnh bằng công top, bottom, left, và righttài sản trên các phần tử con.

Hàng đầu

Sử dụng thuộc toptính sẽ neo cạnh trên của phần tử con với cạnh trên của phần tử cha.

Giả sử bottomkhông được đặt, top: 0sẽ không hiển thị khác với mặc định củatop: auto

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  top: 0;
}
<div class="container">
  <div class="box"></div>
</div>

Sử dụng một tỷ lệ phần trăm sẽ căn chỉnh cạnh trên của con theo tỷ lệ phần trăm đã cho từ đỉnh của phụ huynh.

top: 50% là giữa của cha mẹ:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  top: 50%;
}
<div class="container">
  <div class="box"></div>
</div>

top: 100% là phần dưới cùng của cha mẹ:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  top: 100%;
}
<div class="container">
  <div class="box"></div>
</div>

Neo dưới đáy

Neo dưới cùng sẽ neo cạnh dưới của con vào cạnh dưới của cha mẹ:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  bottom: 0;
}
<div class="container">
  <div class="box"></div>
</div>

bottom: 50%là giữa của cha mẹ, với con được căn chỉnh đối diện với top: 50%:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  bottom: 50%;
}
<div class="container">
  <div class="box"></div>
</div>

bottom: 100% là đỉnh của cha mẹ:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  bottom: 100%;
}
<div class="container">
  <div class="box"></div>
</div>

Neo trái

Các leftbất động sản sẽ neo cạnh trái của đứa trẻ đến mép trái của công ty mẹ.

Giả sử rightkhông được đặt, left: 0sẽ không hiển thị khác với mặc định của left: auto.

left: 50% là giữa của cha mẹ:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  left: 50%;
}
<div class="container">
  <div class="box"></div>
</div>

left: 100% để đứa trẻ bị treo bên phải của cha mẹ.

Neo phải

Các rightbất động sản sẽ neo cạnh phải của đứa trẻ để cạnh phải của phụ huynh:

right: 50%là giữa của cha mẹ, với con được căn chỉnh đối diện với left: 50%:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  right: 50%;
}
<div class="container">
  <div class="box"></div>
</div>

right: 100% để lại teh con treo bên trái của cha mẹ.

Neo trẻ em

Tính năng neo con có thể được điều chỉnh độc lập với tính năng neo của cha mẹ bằng cách tận dụng thuộc transformtính. Cụ thể translate, các hàm translateX, và translateYsẽ được sử dụng để đẩy hộp con để sử dụng một căn chỉnh khác.

Lý do làm việc này là bởi vì tỷ lệ phần trăm trong translategiá trị có liên quan đến các con , trong khi tỷ lệ phần trăm trong top, bottom, left, và rightthuộc tính có liên quan đến các mẹ .

Căn chỉnh dọc

Bằng cách sử dụng transform: translateY(), căn chỉnh của trẻ có thể được nâng lên hoặc xuống.

transform: translateY(0) sẽ để đứa trẻ ở nơi nó đang ở, và nói chung là không hữu ích cho lắm.

Khi đứa trẻ được cố định vào đầu của cha mẹ, transform: translateY(-50%)sẽ căn chỉnh đứa trẻ ở trung tâm của nó:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  top: 0;
  transform: translateY(-50%);
}
<div class="container">
  <div class="box"></div>
</div>

Tương tự như vậy, khi đứa trẻ được cố định dưới cùng của cha mẹ, transform: translate(50%)sẽ căn chỉnh đứa trẻ ở trung tâm của nó:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  bottom: 0;
  transform: translateY(50%);
}
<div class="container">
  <div class="box"></div>
</div>

Điều này cũng có nghĩa top: 100%là tương đương với bottom: 0; transform: translateY(100%):

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  bottom: 0;
  transform: translateY(100%);
}
<div class="container">
  <div class="box"></div>
</div>

Căn chỉnh theo chiều ngang

Bằng cách sử dụng transform: translateX(), sự liên kết của trẻ có thể được chuyển sang trái hoặc phải.

transform: translateX(0) sẽ để đứa trẻ ở vị trí mặc định.

Khi đứa trẻ được neo ở bên trái của cha mẹ, transform: translateX(-50%)sẽ căn chỉnh đứa trẻ ở trung tâm của nó:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  transform: translateX(-50%);
}
<div class="container">
  <div class="box"></div>
</div>

Tương tự như vậy, khi đứa trẻ được neo ở bên phải của cha mẹ, transform: translateX(50%)sẽ căn chỉnh đứa trẻ ở trung tâm của nó:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  right: 0;
  transform: translateX(50%);
}
<div class="container">
  <div class="box"></div>
</div>

left: 100%tương đương với right: 0; transform: translateX(100%).

Trung tâm neo

Căn giữa chỉ là vấn đề sắp xếp đứa trẻ vào giữa cha mẹ, và sau đó đưa nguồn gốc của đứa trẻ vào đúng vị trí.

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}
<div class="container">
  <div class="box"></div>
</div>

Do tính đối xứng, bạn cũng có thể sử dụng:

bottom: 50%;
right: 50%;
transform: translate(50%, 50%);

2
Câu trả lời tổng quát hơn về định vị. Có thể đây sẽ là một cách tuyệt vời để củng cố Tài liệu Định vị CSS. Kiểm tra chỉnh sửa stackoverflow.com/documentation/css/935/…
JonSG

@zzzzBov Nếu bạn lấy nội dung của mình và đảo ngược nó, trình bày nội dung phù hợp nhất trước và sau đó mở rộng / giải thích nó dần dần đến mức tổng quát hơn, điều đó sẽ có động lực hơn nhiều, vì mọi người đọc có thể dừng lại sớm và vẫn hiểu rõ hơn về ngữ cảnh của câu hỏi.
jpaugh

@jpaugh, vâng, vẫn cần cải thiện một chút ở đây, không ít trong số đó là giảm các ví dụ để ít hơn, ít lặp lại hơn, với khả năng tương tác tốt hơn. Cảm ơn bạn đã phản hồi và tôi sẽ xem những gì tôi có thể làm để kết hợp nó vào bản nháp tiếp theo của tôi.
zzzzBov

Thật sự cảm ơn! Tôi thấy rằng, cũng như với mã, viết thích người đọc hoặc người viết --- nhưng không phải cả hai. Chúc mừng!
jpaugh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.