ChatGPT解决这个技术问题 Extra ChatGPT

How to align absolutely positioned element to center?

I am trying to stack two canvas together and make it a double layers canvas.

I've saw an example here:

<div style="position: relative;">
 <canvas id="layer1" width="100" height="100" 
   style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
 <canvas id="layer2" width="100" height="100" 
   style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
</div>

But i would like to set both of the canvas align at the center of the screen. If i set the value of left as a constant, while I change the orientation of the screen (as I'm doing aps on iPad) the canvas won't remain at the middle of the screen like how it act in

<div align="center">

Can anyone help, please?


A
Andrew

If you set both left and right to zero, and left and right margins to auto you can center an absolutely positioned element.

position:absolute;
left:0;
right:0;
margin-left:auto;
margin-right:auto;

Don't you also need to give the element a width?
I don't think it's necessary in this case.
Just tried this and it works, it should be marked as correct answer
You can use change the left or right values to move the object out of the center, fixed. Using left: 80px; will move the object 40px (!) to the right of the center.
Remark: Only works if the styled element has a given width. (either px or %)
V
Vinicius Santana

If you want to center align an element without knowing it's width and height do:

position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);

Example:

*{ margin:0; padding:0; } section{ background:red; height: 100vh; width: 100vw; } div{ width: 80vw; height: 80vh; background: white; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); }

Popup


It's a nice trick, but there is a little caveat in your approach. If the element's width is not set but it has inline content that's wider than 50% of the parent's width, then the extra 50% offset from the left will extrapolate the parent's width, breaking the content to the next lines to avoid overflow. But it's possible to keep the content inline while using this approach by setting in the element the white-space attribute to nowrap. Try that in this JSFiddle.
s
subindas pm

try this method, working fine for me

position: absolute;
left: 50%;
transform: translateX(-50%); 

M
Mihai Ciobanu
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
margin: auto;

D
Deleteman

Have you tried using?:

left:50%;
top:50%;
margin-left:-[half the width] /* As pointed out on the comments by Chetan Sastry */

Not sure if it'll work, but it's worth a try...

Minor edit: Added the margin-left part, as pointed out on the comments by Chetan...


Ya I have tried this, but the canvas "start" from middle but not "placed" in the middle of the screen. Is there anyway to set left:50% and move the canvas to left again?
@PaulLing margin-left: <negative half the width>
What Chetan said.. beat me to it :P I'll edit my response for future generations...
The width of the screen is different when the iPad is placed in different orientation
He meant half the width of your canvas element..., that would make it margin-left:-50px;
t
tagurit

All you have to do is make sure your parent <div> has position:relative, and set a height and width for the element you want centered. Use the following CSS:

.layer {
    width: 600px; height: 500px;
    display: block;
    position:absolute;
    top:0;
    left: 0;
    right:0;
    bottom: 0;
    margin:auto;
}

https://output.jsbin.com/aXEZUgEJ/1/


Only solution that works for me. Parent is set to flex, flex-grow & overflow. Child was positioned out of frame for images larger than the parent. It didn't seem to be aware of the parent's width. It's fixed now. BIG thanks!
S
Spencer

Move the parent div to the middle with

left: 50%;
top: 50%;
margin-left: -50px;

Move the second layer over the other with

position: relative;
left: -100px;