Html боковая панель, которая липкая и ограничена div - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь создать HTML боковую панель, которая ограничена размером divs (не полноэкранный, как обычные боковые панели), и она также липкая, так что, когда высота div превышает высоту экрана, боковая панель прилипает к экрану и не свиток.

Пока что я сделал первую часть. Боковая панель ограничена высотой элемента, в котором она находится.

HTML

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h2>Top text</h2>
<div class="filtering">

  <div id="mySidenav" class="sidenav">
    <div id="sticky">
    <a href="javascript:void(0)" onclick="closeNav()" class="close" id="closefilter"></a>
    <div id="filterheader">Filter</div>
    <div id="filtercontent">
      <div id="subfilterheader">Platforms</div>
      <ul style="list-style: none;" id="filterlist">
        <li>
          <div class="checkbox">
            <label><input id="filtersteam" type="checkbox" onchange="changeFilter('steam')"/>Steam</label>
          </div>
        </li>
        <li>
          <div class="checkbox">
            <label><input id="filterepic" type="checkbox" onchange="changeFilter('epic')"/>Epic</label>
          </div>
        </li>
        <li>
          <div class="checkbox">
            <label><input id="filterorigin" type="checkbox" rel="origin" onchange="changeFilter('origin')"/>Origin</label>
          </div>
        </li>
        <li>
          <div class="checkbox">
            <label><input id="filtergog" type="checkbox" rel="gog" onchange="changeFilter('gog')"/>GOG</label>
          </div>
        </li>
      </ul>
      </div>
    </div>
  </div>

<span style="font-size:30px;cursor:pointer" onclick="openNav()">&#9776; open</span>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis eget </p>
</div>
<h1>Bottom text</h1>
</body>
</html>

CSS

body {
  font-family: "Lato", sans-serif;
}
.sidenav {
  height: 100%;
  width: 0;
  z-index: 2;
  top: 0;
  left: 0;
  background-color: #111;
  overflow-x: hidden;
  transition: 0.5s;
  position: absolute;
}

.sidenav a {
  padding: 8px 8px 8px 32px;
  text-decoration: none;
  font-size: 25px;
  color: #818181;
  display: block;
  transition: 0.3s;
}


.sidenav a:hover {
  color: #f1f1f1;
}

.sidenav #filterheader {
  top: 0;
  right: 25px;
  font-size: 36px;
  margin-left: 30px;
  margin-top: 32px;
  text-align: left;
  color: white;
}

p{
  font-size: 50px;
}

.filtering{
  position: relative;
}


#subfilterheader{
  color: white;
  font-size: 21px;
  margin-top: 30px;
  margin-left: 40px;
}

#filterlist{
  margin-left: 15px;
  color: white;
}

#sticky{
  position: sticky;
  position: -webkit-sticky;
  top: 30px;
}


.close {
  position: absolute;
  right: 0px;
  width: 32px;
  height: 32px;
  opacity: 0.3;
}
.close:hover {
  opacity: 1;
}
.close:before, .close:after {
  position: absolute;
  left: 15px;
  content: ' ';
  height: 33px;
  width: 2px;
  background-color: #ffffff;
}
.close:before {
  transform: rotate(45deg);
}
.close:after {
  transform: rotate(-45deg);
}

@media screen and (max-height: 450px) {
  .sidenav a {font-size: 18px;}
}

JS - открытие и закрытие боковой панели

function openNav() {
  document.getElementById("mySidenav").style.width = "250px";
}

function closeNav() {
  document.getElementById("mySidenav").style.width = "0";
}

JS скрипка - https://jsfiddle.net/4a31mgw0/

Моя цель состоит в том, чтобы объединить это с чем-то вроде этого: https://jsfiddle.net/yn5rv0ke/
Есть ли способ сделать боковую панель ограниченной и div и липкой?

Ответы [ 5 ]

1 голос
/ 22 апреля 2020

Я отредактировал вашу скрипку здесь

В основном вам нужно position: fixed для вашего #mySidenav элемента. Но так как это правило выводит элемент из потока документов и у него больше не может быть высота c, я добавил битовый код js, чтобы изменить его стиль в соответствии с его контейнером (я добавил идентификатор #container в родительский элемент с классом filtering). Изменения CSS и JS применяются к элементу #mySidenav, а не к элементу .sticky, чтобы получить желаемый результат.

PS Анимация выглядит немного забавно, когда меню открывается впервые, в этом случае вы можете перемещать команды js, которые изменяют стиль на более ранней стадии.

1 голос
/ 22 апреля 2020

Важно знать, что для того, чтобы div был липким, он должен иметь определенную высоту. Если я правильно понял, что вы хотите сделать, проблема в вашем предыдущем коде заключается в том, что вы помещаете липкий div внутри боковой панели, а затем назначаете высоту боковой панели.

Кроме того, с ним легче работать отдельные div, то есть, div вашей боковой панели и ваш контент div.

В этом решении я добавил display: flex к основному div (.filtering) и поместил ваш текстовый контент в другой div (.main-content) , Теперь ваша боковая панель прикреплена только внутри основного div. Однако вы также должны знать, так как вы нажимаете кнопку, чтобы открывать и закрывать div рядом с текстовым содержимым, я решил, что вы не хотите, чтобы он был липким.

Вот решение: (и скрипка )

function openNav() {
  document.getElementById("mySidenav").style.width = "250px";
}

function closeNav() {
  document.getElementById("mySidenav").style.width = "0";
}
body {
  font-family: "Lato", sans-serif;
}
.sidenav {
  height: 100vh;
  width: 0;
  z-index: 2;
  width: 250px;
  position: sticky;
  top: 0;
  left: 0;
  background-color: #111;
  overflow-x: hidden;
  transition: 0.5s;
}

.sidenav a {
  padding: 8px 8px 8px 32px;
  text-decoration: none;
  font-size: 25px;
  color: #818181;
  display: block;
  transition: 0.3s;
}


.sidenav a:hover {
  color: #f1f1f1;
}

.sidenav #filterheader {
  top: 0;
  right: 25px;
  font-size: 36px;
  margin-left: 30px;
  margin-top: 32px;
  text-align: left;
  color: white;
}

p{
  font-size: 50px;
}

.filtering{
  display: flex;
  flex-wrap: wrap;
  flex-direction: row;
}

.main-content {
  flex: 1;
}

#subfilterheader{
  color: white;
  font-size: 21px;
  margin-top: 30px;
  margin-left: 40px;
}

#filterlist{
  margin-left: 15px;
  color: white;
}


.close {
  position: absolute;
  right: 0px;
  width: 32px;
  height: 32px;
  opacity: 0.3;
}
.close:hover {
  opacity: 1;
}
.close:before, .close:after {
  position: absolute;
  left: 15px;
  content: ' ';
  height: 33px;
  width: 2px;
  background-color: #ffffff;
}
.close:before {
  transform: rotate(45deg);
}
.close:after {
  transform: rotate(-45deg);
}

@media screen and (max-height: 450px) {
  .sidenav a {font-size: 18px;}
}
<!DOCTYPE html>
<html>

  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>

  <body>
    <h2>Top text</h2>
    <div class="filtering">

      <div id="mySidenav" class="sidenav">
        <a href="javascript:void(0)" onclick="closeNav()" class="close" id="closefilter"></a>
        <div id="filterheader">Filter</div>
        <div id="filtercontent">
          <div id="subfilterheader">Platforms</div>
          <ul style="list-style: none;" id="filterlist">
            <li>
              <div class="checkbox">
                <label><input id="filtersteam" type="checkbox" onchange="changeFilter('steam')" />Steam</label>
              </div>
            </li>
            <li>
              <div class="checkbox">
                <label><input id="filterepic" type="checkbox" onchange="changeFilter('epic')" />Epic</label>
              </div>
            </li>
            <li>
              <div class="checkbox">
                <label><input id="filterorigin" type="checkbox" rel="origin" onchange="changeFilter('origin')" />Origin</label>
              </div>
            </li>
            <li>
              <div class="checkbox">
                <label><input id="filtergog" type="checkbox" rel="gog" onchange="changeFilter('gog')" />GOG</label>
              </div>
            </li>
          </ul>
        </div>
      </div>

      <span style="font-size:30px;cursor:pointer" onclick="openNav()">&#9776; open</span>
      <div class="main-content">
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis eget </p>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis eget </p>
      </div>
    </div>
    <h1>Bottom text</h1>
  </body>

</html>
0 голосов
/ 22 апреля 2020

Заменить вас Javascript Код ... By-

document.getElementById("mySidenav").style.overflow = "hidden";
document.getElementById("sticky").style.overflow = "hidden";
document.getElementById("sticky").style.width = "0";
document.getElementById("sticky").style.background = "#111";
function openNav() {
  document.getElementById("mySidenav").style.width = "250px";
  document.getElementById("sticky").style.width = "250px";
}

function closeNav() {
  document.getElementById("mySidenav").style.width = "0";
  document.getElementById("sticky").style.width = "0";
}
var s = document.querySelector('#sticky');
document.addEventListener('scroll', ()=>{
if(window.scrollY > s.offsetHeight){
    s.style.position="fixed";
}
else s.style.position="static"

});
0 голосов
/ 22 апреля 2020

Вам просто нужно немного изменить структуру, а некоторые css и js

  function openNav() {
  document.getElementById("mySidenav").style.width = "250px";
  document.getElementById("openBtn").style.display = "none";
  document.getElementById("content-wrapper").style.paddingLeft = "270px";
}

function closeNav() {
  document.getElementById("content-wrapper").style.paddingLeft = "15px";
  document.getElementById("mySidenav").style.width = "0px";
  document.getElementById("openBtn").style.display = "block";
}
body {
  font-family: "Lato", sans-serif;
  margin:0;
  padding: 0;
}
span#openBtn {
  display: inline-block;
  width: fit-content;
}
div#content-wrapper {
  padding: 0px 15px;
}
.sidenav {
  height: 100vh;
  width: 0;
  z-index: 2;
  top: 0;
  left: 0;
  background-color: #111;
  overflow-x: hidden;
  overflow-y: scroll;
  transition: 0.5s;
  position: absolute;
}
.sidenav::-webkit-scrollbar {
  width: 8px;
}
.sidenav::-webkit-scrollbar-button {
  background: #ccc
}
.sidenav::-webkit-scrollbar-track-piece {
  background: #888
}
.sidenav::-webkit-scrollbar-thumb {
  background: #eee
}

.sidenav a {
  padding: 8px 8px 8px 32px;
  text-decoration: none;
  font-size: 25px;
  color: #818181;
  display: block;
  transition: 0.3s;
}


.sidenav a:hover {
  color: #f1f1f1;
}

.sidenav #filterheader {
  top: 0;
  right: 25px;
  font-size: 36px;
  margin-left: 30px;
  margin-top: 32px;
  text-align: left;
  color: white;
}

p{
  font-size: 50px;
}

.filtering {
  position: relative;
  overflow-y: scroll;
  min-height: 100vh;
}


#subfilterheader{
  color: white;
  font-size: 21px;
  margin-top: 30px;
  margin-left: 40px;
}

#filterlist{
  margin-left: 15px;
  color: white;
}

#sticky{
  position: sticky;
  position: -webkit-sticky;
  top: 30px;
}


.close {
  position: absolute;
  right: 0px;
  width: 32px;
  height: 32px;
  opacity: 0.3;
}
.close:hover {
  opacity: 1;
}
.close:before, .close:after {
  position: absolute;
  left: 15px;
  content: ' ';
  height: 33px;
  width: 2px;
  background-color: #ffffff;
}
.close:before {
  transform: rotate(45deg);
}
.close:after {
  transform: rotate(-45deg);
}

@media screen and (max-height: 450px) {
  .sidenav a {font-size: 18px;}
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="style.css" />
</head>
<body>

<div class="filtering">

  <div id="mySidenav" class="sidenav">
    <div id="sticky">
    <a href="javascript:void(0)" onclick="closeNav()" class="close" id="closefilter"></a>
    <div id="filterheader">Filter</div>
    <div id="filtercontent">
      <div id="subfilterheader">Platforms</div>
      <ul style="list-style: none;" id="filterlist">
        <li>
          <div class="checkbox">
            <label><input id="filtersteam" type="checkbox" onchange="changeFilter('steam')"/>Steam</label>
          </div>
        </li>
        <li>
          <div class="checkbox">
            <label><input id="filterepic" type="checkbox" onchange="changeFilter('epic')"/>Epic</label>
          </div>
        </li>
        <li>
          <div class="checkbox">
            <label><input id="filterorigin" type="checkbox" rel="origin" onchange="changeFilter('origin')"/>Origin</label>
          </div>
        </li>
        <li>
          <div class="checkbox">
            <label><input id="filtergog" type="checkbox" rel="gog" onchange="changeFilter('gog')"/>GOG</label>
          </div>
        </li>
      </ul>
      </div>
    </div>
  </div>
  <div id="content-wrapper">
    <div class="header">
      <h1>Top Text</h1>
    </div>
  <span id="openBtn" style="font-size:30px;cursor:pointer" onclick="openNav()">&#9776; open</span>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis eget </p>
  
  <div class="footer"><h1>Bottom text</h1></div>
</div>
</div>
</body>
</html>
0 голосов
/ 22 апреля 2020

Просто замените position: absolute на position: fixed.

https://jsfiddle.net/vhgj29yk/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...