Боковое меню Flexbox

Следующая реализация, которую я придумал для бокового меню, отлично работает

https://jsbin.com/getotijela/edit?html,css,output

HTML:

<link rel = "stylesheet" type = "text/css" href = "main.css">

<div class = "container">
<div class = "menu">
    a
</div>

<div class = "content">
    <span id = "clickable">
        basdasdasdasdas
    </span>
</div>
<div>

<script>

document.getElementById("clickable").addEventListener('click',function(){
    var el = document.getElementsByClassName("menu")[0]
    el.className  = "menuClosed"
})

</script>

CSS:

.test{
    background-color:red;
}

.container{
    display:flex;
    flex-direction: row;
    position:relative;
    height:100%;
}

.menu{
    width:200px;
    /* left:20px; */
    background-color:red;
}

.menuClosed{
    width:0px;
    background-color:red;
    transition: 0.3s all;
}


.content{
    background-color:yellow;
    flex:1;
}

но что он делает, так это сворачивает сайдменю на width или 0 (как я его проинструктировал). Я стремился к следующему: перемещение бокового меню влево на столько единиц, сколько его ширина, чего я раньше добивался, изменяя свойство leftcss.

Другими словами, я не хочу, чтобы меню сворачивалось до ширины 0, просто уберите его из поля зрения.

Как я могу добиться чего-то подобного во флексбоксе, если это вообще возможно?

Пожалуйста, разместите достаточно кода, чтобы воспроизвести проблему.

Michael Benjamin 29.03.2018 22:05

добавил его в jsbin, но дело не в том, что реализация проблематична, просто как новичок я не знаю, как перейти от этого к тому, чего я действительно хотел достичь

Return-1 29.03.2018 22:10

Важно опубликовать весь соответствующий код, чтобы мы могли увидеть, с какой проблемой вы столкнулись. Вы также должны опубликовать код в самом вопросе (иначе ваш вопрос, скорее всего, будет закрыт). stackoverflow.com/help/mcve

Michael Benjamin 29.03.2018 22:12

хорошо отредактировано, все же думаю, что код сам по себе относительно не связан, поскольку реализация im после будет другой

Return-1 29.03.2018 22:31
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
4
967
2

Ответы 2

Пожалуйста, попробуйте это:

HTML:

<link rel = "stylesheet" type = "text/css" href = "main.css">

<div class = "container">
<div class = "menu">
    a
</div>

<div class = "content">
    <span id = "clickable">
        basdasdasdasdas
    </span>
</div>
<div>

CSS

.test{
    background-color:red;
}

.container{
    display:flex;
    flex-direction: row;
    position:relative;
    height:100%;
}

.menu{
    width:200px;
    transition: 0.3s all ease-in-out;
    background-color:red;
}

.menuClosed{
    background-color:red;
    transition: 0.3s all ease-in-out;
    transform: translateX(-200px);
    margin-right: -200px;
}

.content{
    background-color:yellow;
    flex:1;
}

Я изменил класс menuClosed, переместив его влево с помощью преобразования: translateX (-200px). Чтобы экран снова сдвинулся вправо, я добавил отрицательное поле того же размера справа.

Возможно, это не лучшая практика - я готов услышать другие решения!

Кроме того, в качестве плюса я изменил ваш код Javascript, чтобы переключить класс, заставив его открываться и закрываться по щелчку, а не только открываться.

Вы можете увидеть новый код здесь, на Codepen. Надеюсь, это вам поможет!

@PossessWithin Зачем вам для этого нужен translateX?

Вы должны использовать свойства flexbox-shrink и flexbox-basic, которые созданы специально для этих случаев.

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

<aside class = "sidebar is-visible">
    <p class = "sidebar-content">
      Put all your content inside of here since this keeps the width of your sidebar <br>(so a div with the width       you want the sidebar to be).
    </p>
  </aside>
  <main class = "content">
    <button class = "toggle-sidebar">Toggle sidebar</button>
    <p>
      scale this content
    </p>
  </main>

CSS

*{
    box-sizing: border-box;
}

html, body  {
  width: 100%;
  height: 100%;
  margin: 0;
}

body {
  display: flex;
  justify-content: flex-end;
}

.content {
  display: flex;
  min-height: 0;
  flex-direction: column;

  flex-grow: 1;
  flex-shrink: 0;
  flex-basis: 100%;
}


.sidebar {
  flex-grow: 0;
  flex-shrink: 0;
  flex-basis: auto;

  height: 100%;
}

.sidebar.is-visible  ~ .content {
  flex-basis: 0;
}

/* Animation */
.content {
  transition: flex-basis .1s cubic-bezier(.465, .183, .153, .946);
  will-change: flex-basis;
}

.sidebar.is-visible  ~ .content {
  transition: flex-basis .3s cubic-bezier(.465, .183, .153, .946);
}


.sidebar-content {
  display: block;
  width: 300px;
  background-color: #eee;
  height: 100%;
  margin: 0;
  padding: 20px;
  border-right: 1px solid #ccc;
}

.content {
  padding: 20px;
}

Пожалуйста, проголосуйте за это, так как это должно быть сделано.

Также вы должны использовать семантические теги HTML5 вместо div. Они более практичны в использовании Javascript и удобочитаемы для последующих изменений.

Siebe.V 29.03.2018 22:43

Другие вопросы по теме