Próbowałem ustalić, jak wyśrodkować zbyt duży obraz w elemencie div, używając tylko CSS.
Używamy układu płynnego, więc szerokość kontenerów obrazu zmienia się wraz z szerokością strony (wysokość elementu div jest stała). Obraz znajduje się w elemencie div, z wartością wstawionego cienia pola, tak aby wyglądał tak, jakbyś patrzył na obraz na stronie.
Rozmiar samego obrazu został tak dopasowany, aby wypełniał otaczający element div w najszerszej możliwej wartości (projekt ma max-width
wartość).
Jest to dość łatwe, jeśli obraz jest mniejszy niż otaczający go element div:
margin-left: auto;
margin-right: auto;
display: block;
Ale kiedy obraz jest większy niż div, po prostu zaczyna się od lewej krawędzi i jest poza środkiem w prawo (używamy overflow: hidden
).
Moglibyśmy przypisać width=100%
, ale przeglądarki wykonują kiepską robotę zmieniając rozmiar obrazów, a projektowanie stron internetowych koncentruje się na wysokiej jakości obrazach.
Jakieś pomysły na wyśrodkowanie obrazu tak, overflow:hidden
aby równo odcięło obie krawędzie?
Odpowiedzi:
Spróbuj czegoś takiego. Powinno to wyśrodkować każdy duży element na środku w pionie i poziomie w stosunku do jego rodzica, niezależnie od ich obu rozmiarów.
źródło
-100%
dla górnego / prawego / dolnego / lewego? Dzięki temu pojemnik mógłby mieć dosłownie dowolną szerokość.-100%
problemu ^^. BTW: jeśli dodaszmin-width
imin-height
stanowi100%
w zasadzie uzyskaćbackground-size: cover;
zachowanie z tagów graficznych -> jsfiddleTo jest stara Q, ale nowoczesne rozwiązanie bez flexboksa lub absolutnej pozycji działa w ten sposób.
Pokaż fragment kodu
Więc dlaczego to działa?
Na pierwszy rzut oka wydaje się, że przesuwamy się o 50% w prawo, a następnie ponownie o 50% w lewo. To spowodowałoby zerowe przesunięcie, więc co z tego?
Ale te 50% to nie to samo, ponieważ ważny jest kontekst. Jeśli użyjesz jednostek względnych, margines zostanie obliczony jako procent szerokości elementu nadrzędnego , podczas gdy transformacja będzie wynosić 50% w stosunku do tego samego elementu.
Mamy taką sytuację, zanim dodamy CSS
Z dodatkowym stylem,
margin-left: 50%
który mamyI
transform: translateX(-50%)
przesuwa się z powrotem w lewoNiestety działa to tylko w przypadku wyśrodkowania w poziomie, ponieważ obliczenie procentu marginesu jest zawsze odniesione do szerokości. To znaczy nie tylko
margin-left
imargin-right
, ale takżemargin-top
imargin-bottom
są obliczane w odniesieniu do szerokości.Zgodność z przeglądarkami nie powinna stanowić problemu: https://caniuse.com/#feat=transforms2d
źródło
margin-top: 50%
będzie 50% szerokości . nie żądaną wysokość.-webkit-transform: translateX(-50%);
na miarę)Umieść duży element DIV wewnątrz elementu DIV, wyśrodkuj go i wyśrodkuj obraz wewnątrz tego elementu DIV.
To wyśrodkowuje go w poziomie:
HTML:
CSS:
Demo: http://jsfiddle.net/Guffa/L9BnL/
Aby wyśrodkować go również w pionie, możesz użyć tego samego dla wewnętrznego elementu DIV, ale potrzebowałbyś wysokości obrazu, aby umieścić go całkowicie wewnątrz niego.
źródło
width
ustawienie na kontenerze, będzie to szerokość elementu nadrzędnego, a obraz jest wyśrodkowany, nawet jeśli strona jest węższa niż obraz, tj. Tyle samo lewej krawędzi, co prawa krawędź zostanie ukryte : jsfiddle.net/Guffa/L9BnL/2Spóźniony do gry, ale odkryłem, że ta metoda jest niezwykle intuicyjna. https://codepen.io/adamchenwei/pen/BRNxJr
CSS
HTML
źródło
display: flex
w kontenerze nadrzędnym ialign-self: center
na obrazie. Oto zoptymalizowana wersja: codepen.io/anon/pen/dWKyeyNie używaj stałej lub jawnej szerokości lub wysokości w tagu obrazu. Zamiast tego zakoduj to:
np .: http://jsfiddle.net/xwrvxser/1/
źródło
Jestem wielkim fanem robienia obrazu jako tła div / node - wtedy możesz po prostu użyć
background-position: center
atrybutu, aby go wyśrodkować niezależnie od rozmiaru ekranuźródło
Szerokość i wysokość to tylko przykładowo:
Musi zadziałać, jeśli lewa i górna część nadrzędnego elementu DIV nie znajdują się na samej górze i po lewej stronie okna ekranu. Mi to pasuje.
źródło
Uważam, że jest to bardziej eleganckie rozwiązanie, bez flexu:
źródło
Opierając się na świetnej odpowiedzi @ yunzen:
Domyślam się, że wiele osób poszukujących tego tematu próbuje użyć dużego obrazu jako obrazu tła „bohatera”, na przykład na stronie głównej. W takim przypadku często chcieliby, aby tekst pojawił się na obrazie i dobrze go skalował na urządzeniach mobilnych.
Oto idealny CSS dla takiego obrazu tła (użyj go na
<img>
tagu):źródło
Jedną z opcji, której możesz użyć, jest
object-fit: cover
to, że zachowuje się trochę jakbackground-size: cover
. Więcej o dopasowaniu do obiektu .zignoruj wszystkie JS poniżej, to tylko do demonstracji.
Kluczowe jest to, że musisz ustawić obraz wewnątrz opakowania i nadać mu następujące właściwości.
Stworzyłem demo poniżej, w którym zmieniasz wysokość / szerokość opakowania i widzisz w grze. Obraz będzie zawsze wyśrodkowany w pionie i poziomie. Zajmie 100% swojej nadrzędnej szerokości i wysokości i nie zostanie rozciągnięty / zgnieciony. Oznacza to, że proporcje obrazu są zachowane. Zamiast tego zmiany są wprowadzane poprzez powiększanie / pomniejszanie.
Jedynym minusem
object-fit
jest to, że nie działa na IE11.źródło