Есть ли способ разместить пространство между моим столом и полосами прокрутки при использовании overflow-x: auto; "
У меня есть простая таблица:
<div id="table-overflow">
<div>
<table>
...
...
</table>
</div>
</div>
#table-overflow {
position: absolute;
top: 10rem;
right: 3rem;
left: 3rem;
bottom: 2rem;
display: block;
overflow-x: auto;
}
Когда есть много строк и столбцов, тогда полосы прокрутки выглядят так, как ожидалось. Когда ширина больше, чем таблица, я вижу вертикальную полосу прокрутки справа, а данные таблицы идут прямо до этой полосы прокрутки. Есть ли способ, которым я могу располагать пробел слева от вертикальной полосы прокрутки и пробел над горизонтальной полосой прокрутки без использования плагина прокрутки jQuery?
Что бы я хотел увидеть, это примерно так:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx v
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx v
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx v
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx v
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
Где v - вертикальная полоса прокрутки, h - горизонтальная полоса прокрутки, а x - данные
Ответы
Ответ 1
Хорошо, у меня есть решение:
HTML:
<div id="table-overflow">
<div class="screen">
<div class="right"></div>
<div class="bottom"></div>
</div>
<div class="table">
<div>
<table>
<tr><td>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</td></tr>
<tr><td>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1</td></tr>
<tr><td>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1</td></tr>
</table>
<div class="fix-right"></div>
</div>
</div>
</div>
CSS
#table-overflow {
position: absolute;
top: 10rem;
right: 3rem;
left: 3rem;
bottom: 2rem;
display: block;
padding-right: 21px;
padding-bottom: 21px;
}
#table-overflow > div.table {
position: absolute;
overflow: scroll;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 9;
padding: 0 10px 8px 0;
}
#table-overflow > div.table > div {
white-space: nowrap;
}
#table-overflow > div.table table {
display: inline-block;
}
#table-overflow > div.table div.fix-right {
display: inline-block;
width: 10px;
height: 10px;
}
div.screen {
position: absolute;
left: 0;
top: 0;
right: 21px;
bottom: 21px;
}
div.right {
background: red;
position: absolute;
top: 0;
right: 0;
bottom: 0;
width: 10px;
z-index: 10;
}
div.bottom {
background: red;
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 10px;
z-index: 10;
}
Подробнее см. http://jsbin.com/OGuHagaz/3/edit?html,css,output (проверяется только в Chrome).
Идея такова: создаются 2 divs, которые абсолютно расположены на экране, который показан над таблицей, и этот "экран" исключает 21px снизу и справа, которые берутся полосами прокрутки.
Затем на нем размещены два divs: "bottom" и "right", которые имеют высоту и ширину вашего желания. Я установил красный фон, чтобы показать более понятным образом, как это работает.
Также "fix-right" и div. "table" фиксируют проблему прокрутки под экраном путем заполнения (для нижней строки) и ширины "fix-right" (для правой строки).
К сожалению, этот метод имеет две проблемы:
- не работает для "переполнения: авто", но для "переполнения: прокрутка", по крайней мере, так, как он не адаптирован с некоторым JavaScript, чтобы определить, больше ли ширина таблицы, чем контейнер div. Кроме того, если размер будет изменен, возможно, вы должны отслеживать событие "изменить размер", а затем изменить некоторые цифры в css
- в разных браузерах ширина полосы прокрутки может различаться: учтите это
Надеюсь, это поможет вам.
Ответ 2
Работает, но с последствиями
Посмотрите эту скрипту (и измените ее размер, чтобы прокрутить или не прокрутить, чтобы увидеть эффект). Он использует следующий CSS:
#table-overflow {
position: absolute;
top: 10rem;
right: 3rem;
left: 3rem;
bottom: 2rem;
}
#table-overflow > div {
height: 100%;
width: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
overflow-x: auto;
}
#table-overflow > div:after {
content: '';
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: -1; /*allow scroll bars to show */
/* the following hides table to create gap
10px is approx. desired gap
16px is approx. scroll bar size
approximations will work fine cross broswers
*/
border-right: 26px solid white;
border-bottom: 26px solid white;
}
#table-overflow > div > table {
position: relative;
z-index: -1; /* push table below #table-overflow > div:after */
/*The following = border width for hiding,
10px is needed for full scroll to offset "gap"
16px is needed for full visibility of table
when no scroll bars are needed
*/
padding-right: 26px;
padding-bottom: 26px;
}
Проблема в том, что css не знает, "когда" что-то находится в состоянии переполнения или нет (иначе мы могли бы улучшить работу, чтобы работать лучше). Таким образом, это решение должно включать в себя постоянное правое и нижнее расстояние (в состоянии переполнения или нет). Кроме того, он должен нажать table
позади элемента :after
, создавая промежуток. Это приводит к следующим ограничениям:
- Если что-либо в таблице нужно щелкнуть, оно не может быть (может быть самым большим убийцей).
- В таблице прокрутки всегда есть лишнее количество, которое просто "потерянное пространство" справа и внизу (здесь
26px
).
- Красивые граничные рамки на столе будут сложными (если не невозможными, чтобы действительно получиться), если это нужно.
- Для этого нужен сплошной цвет фона.
С некоторыми творческими реализациями javascript некоторые из этих вещей могут быть сведены к минимуму в их отрицательных эффектах (изменение размера смещения на основе состояния переполнения или нет).
Ответ 3
#table-overflow {
padding: 20px;
}
или
#table-overflow table {
padding: 20px;
}
Зависит от вашего макета и как вы хотите, чтобы он выглядел.
Поскольку я не получил ответа, см. его здесь: http://jsfiddle.net/MDgb9/
И большая версия здесь: http://jsfiddle.net/MDgb9/2/
Ответ 4
Извините, я все думал об этом в первую попытку...
Я думаю, что вы можете получить желаемый вид с небольшим отступом и теней в коробке... Его очень похоже на подход ScottS, его немного более упрощен и использует свойство указателя-событий, чтобы решить проблему с событиями мыши в таблице.
Рабочий пример
#table-overflow {
pointer-events: none; /* allow pointer events to pass through */
position: absolute;
top: 10rem;
right: 3rem;
left: 3rem;
bottom: 2rem;
display: block;
overflow-x: auto;
box-shadow: -30px -30px blue inset;
}
table {
pointer-events: auto; /* reset the pointer-event property to handle inheritance */
padding:0px 20px 20px 0px;
position:relative;
z-index: -1; /* places the table beneath #table-overflow */
}
<div id="table-overflow">
<table>
<tr>
<td>XXXXXXXXXXXX...
Ответ 5
попробуйте установить для него border cellpadding и cellspacing.
<table border="2" cellpadding="20" cellspacing="20">