Próbuję to naprawić, div
aby zawsze przylegał do górnej części ekranu, używając:
position: fixed;
top: 0px;
right: 0px;
Jest jednak w div
środku wyśrodkowanego pojemnika. Kiedy position:fixed
go używam , naprawia div
względne okno przeglądarki, na przykład po prawej stronie przeglądarki. Zamiast tego powinien być ustalony względem kontenera.
Wiem, że position:absolute
można tego użyć do naprawy elementu względem div
, ale kiedy przewijasz stronę, element znika i nie przykleja się do góry, jak w przypadku position:fixed
.
Czy istnieje jakiś hack lub obejście tego problemu?
css
position
css-position
fixed
Zach Nicodemous
źródło
źródło
Odpowiedzi:
Krótka odpowiedź:
nie.(Jest to teraz możliwe dzięki transformacji CSS. Zobacz edycję poniżej)Długa odpowiedź: Problem z użyciem „ustalonego” pozycjonowania polega na tym, że usuwa element z przepływu . dlatego nie można go zmienić względem jego rodzica, ponieważ jest tak, jakby go nie miał. Jeśli jednak kontener ma stałą, znaną szerokość, możesz użyć czegoś takiego:
http://jsfiddle.net/HFjU6/1/
Edytuj (03/2015):
To są nieaktualne informacje. Teraz można wyśrodkować zawartość o dynamicznym rozmiarze (poziomo i pionowo) za pomocą magii transformacji CSS3. Ta sama zasada obowiązuje, ale zamiast używać marginesu do przesunięcia kontenera, możesz użyć
translateX(-50%)
. Nie działa to z powyższą sztuczką na marginesie, ponieważ nie wiesz, ile to przesunąć, chyba że szerokość jest stała i nie możesz użyć wartości względnych (jak50%
), ponieważ będzie względna względem elementu nadrzędnego, a nie elementu, który jest dotyczyło.transform
zachowuje się inaczej. Jego wartości odnoszą się do elementu, do którego są stosowane. Zatem50%
dlatransform
średnich oznacza połowę szerokości elementu, natomiast50%
dla marginesu jest połowa szerokości rodzica. To jest rozwiązanie IE9 +Korzystając z kodu podobnego do powyższego przykładu, odtworzyłem ten sam scenariusz, używając całkowicie dynamicznej szerokości i wysokości:
Jeśli chcesz, aby był wyśrodkowany, możesz to również zrobić:
Dema:
jsFiddle: Wyśrodkowany tylko poziomo
jsFiddle: Wyśrodkowany zarówno poziomo jak i pionowo
Oryginalne uznanie dla użytkownika aaronk6 za wskazanie mi go w tej odpowiedzi
źródło
position:fixed
bez podaniatop
lubleft
czasem działa? Niektóre przeglądarki wydają się domyślnie ustawiać element w miejscu, w którym normalnie by się znajdował, gdyby miał normalne ustawienie. stackoverflow.com/questions/8712047/…left:inherit
do elementu stałej pozycji może zmusić przeglądarkę do przestrzegania przesunięcia elementu nadrzędnego.W rzeczywistości jest to możliwe, a przyjęta odpowiedź dotyczy tylko centralizacji, co jest dość proste. Poza tym naprawdę nie musisz używać JavaScript.
To pozwoli ci poradzić sobie z każdym scenariuszem:
Ustaw wszystko tak, jak gdybyś chciał ustawić: absolut w pozycji: względny kontener, a następnie utwórz nowy div div stałej pozycji za pomocą
position: absolute
, ale nie ustawiaj jego górnych i lewych właściwości. Zostanie to naprawione w dowolnym miejscu względem kontenera.Na przykład:
Niestety, miałem nadzieję, że ten wątek rozwiąże mój problem z Androidem WebKit wyświetlającym piksele rozmycia pola jako marginesy na elementach o stałej pozycji, ale wygląda na to, że to błąd.
W każdym razie mam nadzieję, że to pomoże!
źródło
Tak, zgodnie ze specyfikacją istnieje sposób.
Chociaż zgadzam się, że Graeme Blackwood powinna być przyjętą odpowiedzią, ponieważ praktycznie rozwiązuje problem, należy zauważyć, że element stały może być umieszczony względem swojego pojemnika.
Zauważyłem przypadkowo, że przy składaniu wniosku
względem ciała, utworzyło względem niego stałe dziecko (zamiast rzutni). Moje stałe elementy
left
itop
właściwości były teraz względne w stosunku do kontenera.Zrobiłem więc trochę badań i odkryłem, że problem został już omówiony przez Erica Meyera i nawet jeśli wydawało się to „sztuczką”, okazuje się, że jest to część specyfikacji:
http://www.w3.org/TR/css3-transforms/
Tak więc, jeśli zastosujesz transformację do elementu nadrzędnego, stanie się on blokiem zawierającym.
Ale...
Problem polega na tym, że implementacja wydaje się błędna / kreatywna, ponieważ elementy również przestają zachowywać się jak ustalone (nawet jeśli ten bit nie wydaje się być częścią specyfikacji).
To samo zachowanie można znaleźć w Safari, Chrome i Firefox, ale nie w IE11 (gdzie stały element nadal pozostanie stały).
Inną interesującą (nieudokumentowaną) rzeczą jest to, że gdy element stały jest zawarty w przekształconym elemencie, a jego właściwości
top
ileft
będą teraz powiązane z kontenerem, z poszanowaniembox-sizing
właściwości, kontekst przewijania będzie rozciągał się poza krawędź elementu, jak pole -Rozmiar został ustawiony naborder-box
. Dla niektórych twórców może to być zabawką :)TEST
źródło
left:
(biorąc pod uwagę, że to popsuło)Odpowiedź brzmi tak, o ile nie ustawisz
left: 0
lubright: 0
po ustawieniu pozycji div na stałą.http://jsfiddle.net/T2PL5/85/
Sprawdź div paska bocznego. Jest ustalony, ale związany z elementem nadrzędnym, a nie z punktem widoku okna.
źródło
position: sticky
to nowy sposób pozycjonowania elementów, który jest koncepcyjnie podobny doposition: fixed
. Różnica polega na tym, że element zposition: sticky
zachowuje się jakposition: relative
w swoim obiekcie nadrzędnym, dopóki dany próg przesunięcia nie zostanie spełniony w rzutni.W Chrome 56 (obecnie beta w grudniu 2016 r., Stabilny w styczniu 2017 r.) Pozycja: sticky jest teraz z powrotem.
https://developers.google.com/web/updates/2016/12/position-sticky
Więcej szczegółów znajdziesz w Trzymaj swoje lądowania! pozycja: lepkie ziemie w WebKit .
źródło
position:sticky
jest super. Obsługiwane przez wszystkie przeglądarki oprócz IE caniuse.com/#feat=css-stickyROZWIĄZANIE 2019: Możesz korzystać z
position: sticky
nieruchomości.Oto przykład CODEPEN pokazujący użycie, a także, czym się różni
position: fixed
.Jak to działa wyjaśniono poniżej:
Element o lepkiej pozycji jest pozycjonowany na podstawie pozycji przewijania użytkownika. Zasadniczo działa tak,
position: relative
dopóki element nie zostanie przewinięty poza określone przesunięcie, w którym to przypadku zmieni się w pozycję: naprawiono. Po przewinięciu do tyłu powraca do poprzedniej (względnej) pozycji.Wpływa na przepływ innych elementów na stronie, tj. Zajmuje określoną przestrzeń na stronie (podobnie jak
position: relative
).Jeśli jest zdefiniowany w jakimś kontenerze, jest pozycjonowany względem tego kontenera. Jeśli pojemnik ma przepełnienie (przewijanie), w zależności od przesunięcia przewijania zmienia się w pozycję: naprawiono.
Więc jeśli chcesz osiągnąć ustaloną funkcjonalność, ale wewnątrz kontenera, użyj lepkiej.
źródło
position: sticky
. Bardzo pomogłem, dzięki!Po prostu wyjmij górny i lewy styl ze stałej pozycji div. Oto przykład
#Content div będzie siedział wszędzie tam, gdzie siedzi div div, ale zostanie tam naprawiony.
źródło
Stworzyłem tę wtyczkę jQuery, aby rozwiązać podobny problem, w którym miałem wyśrodkowany kontener (dane tabelaryczne), i chciałem, aby nagłówek był przymocowany do góry strony podczas przewijania listy, ale chciałem, żeby była zakotwiczona dane tabelaryczne, tak aby znajdowały się w dowolnym miejscu, w którym umieszczam kontener (wyśrodkowany, lewy, prawy), a także pozwalają mu przesuwać się w lewo i prawo ze stroną podczas przewijania w poziomie.
Oto link do tej wtyczki jQuery, która może rozwiązać ten problem:
https://github.com/bigspotteddog/ScrollToFixed
Opis tej wtyczki jest następujący:
Ta wtyczka służy do mocowania elementów na górze strony, jeśli element przewinąłby się poza widok w pionie; pozwala jednak elementowi nadal przesuwać się w lewo lub w prawo za pomocą przewijania w poziomie.
Biorąc pod uwagę opcję marginTop, element przestanie się poruszać pionowo w górę, gdy pionowy zwój osiągnie pozycję docelową; ale element nadal będzie się przesuwał w poziomie, gdy strona będzie przewijana w lewo lub w prawo. Po przewinięciu strony w dół minęła pozycję docelową, element zostanie przywrócony do pierwotnej pozycji na stronie.
Ta wtyczka została przetestowana w Firefoksie 3/4, Google Chrome 10/11, Safari 5 i Internet Explorer 8/9.
Zastosowanie w konkretnym przypadku:
źródło
Musiałem to zrobić z reklamą, którą mój klient chciał usiąść poza obszarem zawartości. Po prostu zrobiłem następujące i działało to jak urok!
źródło
Dwa elementy HTML i czysty CSS (nowoczesne przeglądarki)
Zobacz ten przykład jsFiddle. Zmień rozmiar i zobacz, w jaki sposób elementy stałe poruszają się nawet z elementami pływającymi, w których się znajdują. Użyj paska przewijania znajdującego się najbardziej na środku, aby zobaczyć, jak przewijanie działa w witrynie (elementy stałe pozostają nieruchome).
Aż tu stwierdziły, jeden klucz nie wyznacza żadnych ustawień pozycyjnych na
fixed
elemencie (notop
,right
,bottom
lubleft
wartości).Zamiast tego umieszczamy wszystkie stałe elementy (zwróć uwagę, jak ostatnie pudełko ma ich cztery) na początku w polu, z którego mają zostać ustawione, tak jak poniżej:
Następnie używamy
margin-top
imargin-left
„przenosimy” je w stosunku do kontenera, podobnie jak ten CSS:Zauważ, że ponieważ
fixed
elementy ignorują wszystkie inne elementy układu, końcowy pojemnik w naszym skrzypcach może mieć wielefixed
elementów i nadal mieć wszystkie te elementy związane z lewym górnym rogiem. Jest to jednak prawdą tylko wtedy, gdy wszystkie zostaną umieszczone najpierw w kontenerze, ponieważ to skrzypce porównawcze pokazuje, że po rozproszeniu w zawartości kontenera pozycjonowanie staje się niewiarygodne .Bez względu na to , czy opakowanie jest ustawione statycznie , względnie czy bezwzględnie , nie ma to znaczenia.
źródło
Możesz wypróbować moją wtyczkę jQuery, FixTo .
Stosowanie:
źródło
Innym dziwnym rozwiązaniem, które pozwala osiągnąć względną stałą pozycję, jest przekształcenie kontenera w ramkę iframe, w ten sposób ustalony element można przymocować do rzutni kontenera, a nie całej strony.
źródło
W czystym CSS nie da się tego zrobić; przynajmniej nie mam. Jednak możesz to zrobić w jQuery bardzo prosto. Wyjaśnię mój problem i przy niewielkiej zmianie możesz go użyć.
Na początek chciałem, aby mój element miał stałą górę (od góry okna) i lewy komponent, który odziedziczył po elemencie nadrzędnym (ponieważ element nadrzędny jest wyśrodkowany). Aby ustawić lewy komponent, wystarczy umieścić element w elemencie nadrzędnym i ustawić
position:relative
element nadrzędny.Następnie musisz wiedzieć, ile wynosi od góry twój element, gdy pasek przewijania znajduje się na górze (przewijane zero); znów są dwie opcje. Po pierwsze, jest statyczny (pewna liczba) lub musisz go odczytać z elementu nadrzędnego.
W moim przypadku jest to 150 pikseli od góry. Więc kiedy zobaczysz 150, to ile wynosi element od góry, gdy nie przewinęliśmy.
CSS
jQuery
źródło
Jest to łatwe (zgodnie z HTML poniżej)
Sztuką jest NIE używać góry lub lewej strony elementu (div) z „position: fixed;”. Jeśli nie zostaną one określone, element „stała treść” pojawi się WZGLĘDNY dla elementu otaczającego (div z „position: relative;”) ZAMIAST względem okna przeglądarki !!!
Powyżej pozwoliło mi zlokalizować zamykający przycisk „X” u góry dużej części tekstu w div z pionowym przewijaniem. „X” siedzi na swoim miejscu (nie porusza się z przewijanym tekstem, a mimo to przesuwa się w lewo lub w prawo z otaczającym kontenerem div, gdy użytkownik zmienia rozmiar okna przeglądarki! W ten sposób jest „ustalony” w pionie, ale ustawiony względem element zamykający poziomo!
Zanim zacząłem działać, „X” przewijał się w górę i poza zasięgiem wzroku, gdy przewijałem treść tekstu w dół.
Przepraszamy za niedostarczenie funkcji javascript hideDiv (), ale niepotrzebnie wydłużyłaby ten post. Zdecydowałem się na jak najkrótsze.
źródło
Stworzyłem jsfiddle, aby pokazać, jak to działa przy użyciu transformacji.
HTML
CSS
jQuery
https://jsfiddle.net/bx6ktwnn/1/
źródło
Mam ten sam problem, jeden z członków naszego zespołu daje mi rozwiązanie. Aby umożliwić pozycję div div fix i w stosunku do innych div, naszym rozwiązaniem jest użycie kontenera ojca owijającego div div i przewijania div.
css
źródło
źródło
Tak, jest to możliwe, o ile nie ustawisz pozycji (
top
lubleft
itp.) Swojegofixed
elementu (nadal możesz jednak użyćmargin
do ustawienia pozycji względnej). Simon Bos napisał o tym jakiś czas temu .Nie oczekuj jednak, że ustalony element będzie przewijał się wraz z nie ustalonymi krewnymi.
Zobacz demo tutaj .
źródło
Zrobiłem coś takiego jakiś czas temu. Byłem całkiem nowy w JavaScript, więc jestem pewien, że możesz zrobić lepiej, ale oto punkt wyjścia:
Musisz ustawić szerokość, a następnie pobiera szerokość okna i zmienia margines co kilka sekund. Wiem, że jest ciężki, ale działa.
źródło
Jest to możliwe, jeśli używasz JavaScript. W takim przypadku wtyczka jQuery Sticky-Kit :
źródło
Mój projekt to .NET ASP Core 2 MVC Angular 4 szablon z Bootstrap 4. Dodanie „lepkiego” do głównego komponentu HTML (tj. App.component.html) w pierwszym rzędzie działało w następujący sposób:
Czy to konwencja, czy też uprościłem to?
źródło
Kiedy używasz
position:fixed
reguły CSS i próbujesz zastosowaćtop
/left
/right
/bottom
ustaw element względem okna.Obejściem tego problemu jest użycie
margin
właściwości zamiasttop
/left
/right
/bottom
źródło
Sprawdź to:
źródło