Material-ui: [Modal] Masalah scrollbar dan padding

Dibuat pada 23 Jan 2018  ·  47Komentar  ·  Sumber: mui-org/material-ui

Saat Menu terbuka, scrollbar halaman menghilang. Ini dapat mempengaruhi tata letak halaman. Dalam kasus saya, itu melompati semuanya ke kanan, yang merupakan bug visual.

Larutan

Baik A) perbaiki ini di perpustakaan, atau B) Catat perilaku ini di dokumen, dan berikan cara untuk mengatasinya:

https://material-ui-next.com/demos/menus/

Wadah untuk hal-hal yang melompat adalah absolute, left: 0, right: 0 , dengan bagian yang bisa text-align: center atau display: flex; flex-direction: column; align-items: center;

Lingkungan Anda

| Teknologi | Versi |
| -------------- | --------- |
| Materi-UI | 1.0.0-beta.29 |

Masalah terkait

Ini semua ditutup, dan saya tidak menemukan solusi di dalamnya:

8475 # 7431 # 6656 # 8710

bug 🐛 Modal

Komentar yang paling membantu

Cara saya memperbaikinya adalah dengan menambahkan disableScrollLock={ true } di komponen saya :)

Semua 47 komentar

Dalam kasus saya, itu melompati semuanya ke kanan, yang merupakan bug visual.

@lorensr Apakah Anda memiliki contoh reproduksi? Ini adalah batasan terkenal untuk menonaktifkan scrollbar. Kami menangani elemen posisi absolut yang memiliki nama kelas .mui-fixed .
Kita perlu mendokumentasikannya!

FYI, hal lain yang saya temukan adalah bahwa .mui-fixed fix hanya berfungsi jika elemen tetap Anda juga memiliki

box-sizing: content-box;

Terima kasih, menambahkan kelas berhasil. Saya tidak membutuhkan content-box . Elemennya adalah border-box .

Perlu juga dicatat bahwa ketika bilah gulir dihapus, header blok di dalam elemen right: 0 saya tidak meregang ke tepi kanan browser.

image

Diperbaiki dengan mengubah right: -20px , jadi sekarang css adalah:

main {
  position: absolute;
  box-sizing: border-box;
  left: 0;
  right: -20px;
  overflow-x: hidden;
}

Kelemahannya adalah ketika scrollbar ada, anak-anak yang berada di tengah sekarang 10 piksel ke kanan tengah, dan saya harus menyembunyikan overflow.

Dalam beberapa kasus, tidak mungkin menerapkan kelas css mui-fixed ke beberapa elemen tetap. Misalnya widget obrolan segar di bagian bawah halaman saya. Mungkin terjadi dengan widget interkom juga.

Apakah ada orang lain yang memiliki masalah yang sama dan menemukan solusinya?
localhost_4000

Saya memiliki masalah serupa, tetapi wadahnya tidak mutlak. Yang memperbaikinya untuk saya adalah menambahkan !important ke padding saya seperti ini:

padding: 0 !important;

Saya tidak 100% yakin apakah ini cara yang benar untuk melakukannya tetapi saya menambahkan properti css berikut ke tag <body>

`` css
tubuh {
posisi: mutlak;
kiri: -17px;
kanan: -17px;
padding-top: 0;
padding-right: 17px;
padding-left: 17px;
padding-bottom: 0px;
overflow-x: tersembunyi;
overflow-y: auto! important // Hapus! important jika Anda ingin bilah gulir menghilang
}
`` ''

Semoga ini membantu orang lain:

Setelah mencoba beberapa timpaan css yang tampaknya berhasil tetapi terasa salah, seperti overflow-y: scroll di seluruh aplikasi kami. Kami telah memaksa aplikasi scrollbar sumbu y untuk mencegah pergeseran karena halaman kami memiliki panjang yang bervariasi - beberapa memerlukan pengguliran sumbu y, beberapa tidak.

Alih-alih menempatkan sejumlah tambahan body atau gaya sebaris, kami dapat memperbaiki pergeseran dengan mengisolasi overflow-y: scroll ke konten di bawah AppBar / Header kami yang telah diperbaiki. Sekarang kita memiliki scrollbar yang selalu hijau untuk konten halaman, bukan seluruh jendela, bersama dengan tidak ada pergeseran dari modals / menu karena scrollbar dilampirkan ke konten halaman dan bukan body .

Untuk referensi DOM kami terlihat seperti:

<div>
  <Header />
  <div className="pageContent">
    <div className="page">
      <Route exact path="/pathToPage"> component={PageContent} />
    </div>
  </div>
</div>

dan CSS (tinggi header kita adalah 45px):

.pageContent {
  position: absolute;
  top: 45px;
  left: 0;
  right: 0;
  bottom: 0;
}
.pageContent .page {
  height: 100%;
  overflow-y: scroll;
}

Halo,

Saat ini saya memiliki masalah yang sama dan saya harus mengakui bahwa saya tidak dapat menemukan kebahagiaan saya dalam salah satu solusi yang disebutkan.

Dari apa yang saya pahami, Modal tidak memungkinkan untuk menggunakan scrollbar, yang bermasalah karena saya menggunakan Modal untuk melakukan pencarian lanjutan dan Modal tidak selalu diperlukan untuk memiliki konten pendek.

Berpikir tentang masalah dan solusi yang Anda sebutkan, saya bertanya-tanya mengapa Material-UI tidak mungkin menerapkan properti yang dapat digulir untuk semua yang terkait dengan Modal , Dialog , Menu dan elemen popup lainnya. Secara default, properti boolean ini bernilai false, tetapi bisa juga true untuk memungkinkan scrollbar ditampilkan di komponen.

Jika ini tidak memungkinkan, mungkin menerapkan komponen ScrollBar langsung, bahkan jika saya lebih suka ide sebelumnya.

Saya rasa ini lebih mudah diucapkan daripada dilakukan. Oleh karena itu, saya ingin berterima kasih atas pekerjaan luar biasa yang Anda lakukan.

FWIW Saya baru saja menetapkan body { overflow-y: scroll } global dan semuanya tampaknya bekerja dengan baik.

@avdd Ini tidak membantu karena akan memungkinkan Anda untuk menggulir di badan dan bukan di modal.

@rememberYou Modal adalah primitif level rendah, Anda mungkin ingin menggunakan dialog sebagai gantinya: https://material-ui.com/demos/dialogs/#scrolling -long-content.

@rememberYou ModalManager menetapkan overflow:hidden langsung pada elemen kontainer (body) saat modal terlihat dan menyetel ulang saat modal selesai, jadi, ya, ini berfungsi untuk saya.

https://github.com/mui-org/material-ui/blob/7d4aeaf4c9cdf00a9c7eb41bd9bb7cac61840739/packages/material-ui/src/Modal/ModalManager.js#L24

@oliviertassinari terima kasih atas solusinya.
@avdd maaf, saya tidak mencoba dengan ModalManager .

@lorensr Apakah ini masih menjadi masalah?

@oliviertassinari Satu hal lagi, saya mencoba dengan Dialog , ini bekerja dengan baik, tetapi karena saya ingin desain yang lebih khusus, saya suka menggunakan Modals .

Masalahnya adalah saya memiliki Modal (Login) yang memiliki link untuk membuka Modal (SignUp) kedua yang memiliki link untuk kembali ke Login.

Dalam kasus ini, apakah saya harus menggunakan ModalManager untuk menambahkan dan menghapus Modal ? Maaf untuk keluar dari subjek masalah, saya tidak menemukan dokumentasi apa pun tentang subjek tersebut.

@nathanmarks ya, sepertinya halaman dokumen komponen modal masih tidak menyebutkan .mui-fixed

Menggunakan 3.5.1 - Dialog bergeser ke kiri sebelum ditutup.

Dapat direproduksi di sini https://material-ui.com/demos/dialogs/ - buka dan tutup demo Dialog Sederhana.

Setelah pengujian, ini dimulai di v3.3.

@ stephen099 Terima kasih telah melaporkan! Saya mengonfirmasi, tetapi ini masalah yang berbeda.

Saya perhatikan bahwa pada header (dengan mui terbaru), mui-fixed ditambahkan ke nama kelas, tetapi tidak ada gaya yang ditetapkan padanya (dengan memeriksa header, tidak ada mui-fixed aturan dimuat.

Saya bertanya-tanya, mengapa 'add padding' ini terjadi di tempat pertama, mengapa itu diperlukan? Bagi saya itu rusak oleh komponen Menu .

Bagaimana cara mencegah hal ini terjadi tanpa harus mengganti gaya css dengan !important ...? Terima kasih

@vajnorcan Nama mui-fixed memberi sinyal komponen modal (digunakan oleh menu) bahwa posisi elemen akan berubah saat mengunci scroll pada elemen body. Kami mengimbangi penghapusan lebar scrollbar dengan gaya padding-right sementara. Bisakah Anda memberikan contoh reproduksi minimal pada CodeSandbox? Terima kasih.

Maaf di mana Anda meletakkan .mui-fix? Saya memiliki masalah ini dengan memilih membuka menu.

@ capsule5 Anda perlu menambahkannya ke elemen yang "melompat" karena bilah gulir dinonaktifkan pada menu terbuka (biasanya ini harus menjadi elemen yang dipasang di kanan) dan paddingnya akan ditangani untuk Anda .

Perhatikan juga bahwa, seperti yang disebutkan di atas, Anda mungkin perlu menambahkan ini ke gaya global Anda:

.mui-fixed {
  /*
   * make sure that added right padding
   * actually pushes contents to the left
   */
  box-sizing: content-box;
}

Tidak ada reproduksi di utas ini. Saya tutup.

@cvara Kami melacaknya di # 9275.

Saya tidak mengerti, apakah ini terpecahkan? Saya meningkatkan dari v0.9 ke v4 dan sekarang ketika saya membuka modals konten saya melompat ke kiri (mendapatkan padding-right: 17px )? Apa solusi yang direkomendasikan untuk itu?

Edit nanti:

Karena dalam kasus saya, saya memiliki overflow-y: scroll !important; saya juga harus menambahkan padding-right: 0px !important; untuk memperbaiki masalah melompat ini.

Cara saya memperbaikinya adalah dengan menambahkan disableScrollLock={ true } di komponen saya :)

@Toshiuk komponen yang mana?

@wongjiahau komponen Modal v4 +

Anda juga dapat menambahkan disableScrollLock ke Menu

Ini mereproduksi untuk saya juga. Menambahkan disableScrollLock tidak masuk akal karena saya menggunakan komponen pihak ketiga yang menambahkan item Menu. Ini harus diperbaiki. Mungkin mendeteksi bahwa scrollbar benar-benar ditampilkan atau tidak.

@archfz Apakah Anda memiliki reproduksi?

Saya menyaksikan ini dalam penggunaan komponen Select juga. Setiap kali dropdown Select dibuka, overflow: hidden, padding-right: 15px ditambahkan ke tag body utama aplikasi saya. Apakah ada solusi selain mengganti gaya? Saya merasa ini bukan perilaku yang diharapkan

@WholemealDrop Ikuti # 17353.

@oliviertassinari ahah sepertinya kemampuan pencarian saya tidak terlalu bagus. Terima kasih!

@oliviertassinari Saya telah berhasil mengurangi masalah ke intinya. Masalahnya tampaknya entah bagaimana ada perhitungan yang salah saat tampilan: flex + minHeight: 100vh + body tidak ada padding dan margin yang digabungkan. Sepertinya kode tersebut mengharapkan adanya scrollbar di sana tetapi sebenarnya tidak ada. Kode ini harus mereproduksi masalah.

import React, {FunctionComponent, SyntheticEvent, useState} from 'react';
import {IconButton, Menu, MenuItem, Tooltip} from "@material-ui/core";
import TranslateIcon from "@material-ui/icons/Translate";
import MuiAppBar from "@material-ui/core/AppBar";
import Toolbar from "@material-ui/core/Toolbar";

const AdminAppContainer: FunctionComponent = () => {
  const handleMenu = (event: SyntheticEvent) => setAnchorEl(event.currentTarget);
  const [anchorEl, setAnchorEl] = useState<Element | null>(null);
  const open = Boolean(anchorEl);
  const handleClose = () => setAnchorEl(null);

  const body = document.getElementsByTagName('body')[0];
  body.style.margin = "0";
  body.style.padding = "0";

  return (
    <div style={{ display: 'flex', minHeight: '100vh'}}>
    <MuiAppBar color="secondary" >
      <Toolbar>
        <div style={{flex: 1}}></div>
        <div>
          <Tooltip title='asd'>
            <IconButton onClick={handleMenu}><TranslateIcon /></IconButton>
          </Tooltip>
          <Menu anchorEl={anchorEl} open={open} onClose={handleClose}>
            <MenuItem key={'test'} onClick={handleClose}>Test</MenuItem>
          </Menu>
        </div>
      </Toolbar>
    </MuiAppBar>
    </div>
  )
};

@archfz Bisakah Anda membuat kotak kode? (Anda bisa mulai dengan salah satu contoh dokumen.)

@archfz Maaf, melewatkan ini.

Apa yang saya cari di sini? Saya tidak mengalami perubahan tata letak apa pun.

@archfz Maaf, melewatkan ini.

Apa yang saya cari di sini? Saya tidak mengalami perubahan tata letak apa pun.

Saat Anda mengklik karakter di kanan atas, karakter akan bergerak ke kiri saat item menu terbuka dan kemudian kembali ke kanan saat item menu ditutup.

Bisakah Anda membuka terbitan baru? Sepertinya sesuatu yang baru.

@archfz Ok, ini konflik dengan tooltip. Mari kita abaikan.

@oliviertassinari Yah kita tidak boleh mengabaikannya karena ini masalah nyata. React-admin menggunakan UI material dan ini sebenarnya merupakan masalah di luar kotak. Saya telah membuat masalah di sini https://github.com/mui-org/material-ui/issues/19203

Solusi yang diulang oleh

  • Menu, StyledMenu:
    disableScrollLock={ true }

  • Pilih:
    MenuProps={{ disableScrollLock: true }}

Kami benar-benar perlu membuat solusi lebih mudah ditemukan! :-)

Saya memiliki masalah dengan warna latar belakang toolbar ketika saya membuka menu, dan scrollbar menjadi tidak terlihat

ini contohnya:
https://codesandbox.io/s/material-demo-nj80l

tahu seseorang bagaimana cara memperbaikinya?

tambahkan saja css berikut
body {padding-right: 0px! important; }

halo, di aplikasi saya, saya menggunakan solusi ini.
Saya menambahkan disableScrollLock={true} disablePortal={true} id="custom" pada komponen saya <Menu> dan di css saya
#custom { .MuiPopover-paper, .MuiPopover-paper { max-height: inherit !important; } }
ini bekerja dengan sempurna dalam kasus saya. Saya harap trik ini bisa membantu.

Saya mengalami masalah yang sama saat bekerja dengan Dialog. Berikut ini adalah satu-satunya solusi yang saya coba yang menghapus perpindahan konten dan masih mengunci gulir halaman yang mendasarinya / menghapus bilah gulirnya.

Larutan:
Buka div penampung terluar atau div terluar (penampung apa pun yang merangkum seluruh aplikasi Anda) di aplikasi Anda dan setel lebarnya menjadi ini:

width: calc(100vw - 1px);

1px dapat diganti dengan 34px atau nilai rendah lainnya. Ini akan membuatnya sehingga membuka Dialog akan menyembunyikan bilah gulir dari halaman yang mendasarinya, jika ada, dan tidak akan membuat perubahan apa pun pada posisi konten. Pengguliran masih terkunci untuk halaman yang mendasarinya dan pengguliran masih dimungkinkan untuk dialog Anda.

disableScrollLock = {true}

Anda hanya brilian, Terima kasih

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

ryanflorence picture ryanflorence  ·  3Komentar

ghost picture ghost  ·  3Komentar

anthony-dandrea picture anthony-dandrea  ·  3Komentar

newoga picture newoga  ·  3Komentar

pola88 picture pola88  ·  3Komentar