CSS poziome centrowanie stałego div?

#menu {
    position: fixed;
    width: 800px;
    background: rgb(255, 255, 255); /* The Fallback */
    background: rgba(255, 255, 255, 0.8);
    margin-top: 30px;
}

Wiem, że to pytanie jest milion razy tam, jednak nie mogę znaleźć rozwiązania mojej sprawy. Mam div, który powinien być naprawiony na ekranie, nawet jeśli strona jest przewijana, powinna zawsze pozostać wyśrodkowana na środku ekranu!

Div powinien mieć 500px Szerokość, powinien być 30px od góry (margin-top), powinien być poziomo wyśrodkowany na środku strony dla wszystkich rozmiarów przeglądarki i nie powinien się poruszać podczas przewijania reszty strona.

Czy to możliwe?
Author: Barry Michael Doyle, 2010-07-01

8 answers

left: 50%;
margin-left: -400px; /* Half of the width */
 164
Author: Quentin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-03 09:29:31

Odpowiedzi tutaj są nieaktualne. Teraz możesz łatwo użyć transformacji CSS3 bez twardego kodowania marginesu . Działa to na wszystkich elementach, w tym na elementach bez szerokości lub szerokości dynamicznej.

Poziome centrum:

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

Vertical center:

top: 50%;
transform: translateY(-50%);

Zarówno w poziomie, jak i w pionie:

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

Zgodność nie jest problemem: http://caniuse.com/#feat=transforms2d

 604
Author: Maciej Krawczyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-17 16:50:06

Jeśli użycie inline-blocks jest opcją, polecam takie podejście:

.container { 
    /* fixed position a zero-height full width container */
    position: fixed;
    top: 0; /* or whatever position is desired */
    left: 0;
    right: 0;
    height: 0;
    /* center all inline content */
    text-align: center;
}

.container > div {
    /* make the block inline */
    display: inline-block;
    /* reset container's center alignment */
    text-align: left;
} 

Napisałem krótki post na ten temat TUTAJ: http://salomvary.github.com/position-fixed-horizontally-centered.html

 58
Author: salomvary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-27 14:28:52

Edit wrzesień 2016: chociaż miło jest nadal okazjonalnie głosować na to, ponieważ świat ruszył dalej, teraz wybrałbym odpowiedź, która wykorzystuje transformację (i która ma mnóstwo pozytywnych głosów). Nie robiłbym tego w ten sposób.

Inny sposób, aby nie musieć obliczać marginesu lub potrzebować kontenera podrzędnego:

#menu {
    position: fixed;   /* Take it out of the flow of the document */
    left: 0;           /* Left edge at left for now */
    right: 0;          /* Right edge at right for now, so full width */ 
    top: 30px;         /* Move it down from top of window */
    width: 500px;      /* Give it the desired width */ 
    margin: auto;      /* Center it */
    max-width: 100%;   /* Make it fit window if under 500px */ 
    z-index: 10000;    /* Whatever needed to force to front (1 might do) */
}
 33
Author: Nick Rice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-23 08:36:39

Jest możliwe, aby horisontalnie wyśrodkować div w ten sposób:

Html:

<div class="container">
    <div class="inner">content</div>
</div>

Css:

.container {
    left: 0;
    right: 0;
    bottom: 0; /* or top: 0, or any needed value */
    position: fixed;
    z-index: 1000; /* or even higher to prevent guarantee overlapping */
}

.inner {
    max-width: 600px; /* just for example */
    margin: 0 auto;
}

W ten sposób zawsze będziesz miał swój wewnętrzny blok wyśrodkowany, dodatkowo można go łatwo przekształcić w true responsive( w przykładzie będzie tylko płynny na mniejszych ekranach), dlatego nie ma ograniczeń w jak w przykładzie pytania i w wybranej odpowiedzi.

 7
Author: Denis V,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-27 01:44:51

Oto kolejne rozwiązanie dwu-div. Starałem się, aby było zwięzłe i nie zakodowane. Po pierwsze, expectable html:

<div id="outer">
  <div id="inner">
    content
  </div>
</div>

Zasadą stojącą za poniższym css jest pozycjonowanie jakiejś strony "zewnętrznej", a następnie wykorzystanie faktu, że przyjmuje rozmiar" wewnętrznej", aby względnie przesunąć tę ostatnią.

#outer {
  position: fixed;
  left: 50%;          // % of window
}
#inner {
  position: relative;
  left: -50%;         // % of outer (which auto-matches inner width)
}

To podejście jest podobne do Quentina, ale wewnętrzna może mieć zmienną wielkość.

 6
Author: Anonymous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-17 17:54:30

... lub możesz zawinąć menu div w inny:

    <div id="wrapper">
       <div id="menu">
       </div>
    </div>


#wrapper{
         width:800px;
         background: rgba(255, 255, 255, 0.8);
         margin:30px auto;
         border:1px solid red;
    }

    #menu{
        position:fixed;
        border:1px solid green;
        width:300px;
        height:30px;
    }
 5
Author: Meduza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-01 11:49:37

Oto rozwiązanie flexbox podczas korzystania z pełnoekranowego div. justify-content centruje obiekt potomny div poziomo, a align-items centruje go pionowo.

<div class="full-screen-wrapper">
    <div class="center"> //... content</div>
</div>

.full-screen-wrapper { 
  position: fixed;
  display: flex;
  justify-content: center;
  width: 100vw;
  height: 100vh;
  top: 0;
  align-items: center;
}

.center {
  // your styles
}
 -1
Author: Vien Tang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-21 17:42:06