Центр выровнять два деления в одном ряду - PullRequest
0 голосов
/ 11 июня 2018

У меня есть сценарий JavaScript, который в основном скрывает поле при нажатии на верхние два поля.При нажатии на одну из коробок сверху, одна из коробок внизу скрывается.Как сделать так, чтобы две рамки в нижней части оставались по центру?

Вот целевая страница:

Diagram 1

Я хочу, чтобы элементы div внизу были по центру, один разкоробка скрыта.Я хочу, чтобы блоки SharePoint и Команды центрировались после того, как другой блок скрыт.

Diagram 2

Центрируйте нижние два элемента div после изменения ^

Код:

.margin-bottom-20 { 
	margin-bottom: 20px; 
}

.collabProjects:hover, .collabFiles:hover, .collabSocially:hover {
  box-shadow: 0 0 15px rgba(33,3,3,.2); 
}

.decisionTreeBox {
	background-color: #4B92DB;
	color: white;
	width: 300px;
	height: 140px;
	display: flex;
  	justify-content: center;
  	align-items: center;
  	transition: box-shadow .3s;
}

#decisionTreeOneDrive {
	background-color: #094AB2;
	color: white;
	width: 300px;
	height: 140px;
	display: flex;
  	justify-content: center;
  	align-items: center;
}


#decisionTreeSharePoint {
	background-color: #008CE7;
	color: white;
	width: 300px;
	height: 140px;
	display: flex;
  	justify-content: center;
  	align-items: center;
}

#decisionTreeTeams {
	background-color: #4A1EBD;
	color: white;
	width: 300px;
	height: 140px;
	display: flex;
  	justify-content: center;
  	align-items: center;
}

#innerBoxHeadings {
	color: white!important; 
	text-align: center; 
	padding-top: 5px;
}

#columnMiddleBorderLeft, #pageTitle {
	display:none!important;
}
<div class="outer-container">
  <div class="row">
    <div class="col-md-6" style="text-align: center;">
      <div data-collaborate="shareCollab" class="decisionTreeBox" style="font-size: x-large; float: right;">
        Share and Collaborate</div>
    </div>
    <div class="col-md-6" style="text-align: center;">
      <div data-collaborate="shareExternally" class="decisionTreeBox" style="font-size: x-large;">
        Share Externally</div>
    </div>
  </div>
  <hr />
  <div class="container" style="padding: 0px;">
    <div class="row">
      <a href="/TrainingResourceCenter/O365Training/Pages/OneDrive.aspx">
        <div class="col-md-4 margin-bottom-20" style="text-align: center;">
          <div data-decision="shareExternally" id="decisionTreeOneDrive">
            <h3 id="innerBoxHeadings"><img src="/TrainingResourceCenter/O365Training/PublishingImages/onedrive-logo.png" style="width: 65px; height: 65px; padding-bottom: 5px; padding-right: 10px; vertical-align: middle;" />OneDrive</h3>
          </div>
        </div>
      </a>
       <a href="/TrainingResourceCenter/O365Training/Pages/SharePointOnline.aspx">
        <div class="col-md-4 margin-bottom-20" style="text-align: center;">
          <div data-decision="shareCollab shareExternally" id="decisionTreeSharePoint">
            <h3 id="innerBoxHeadings"><img src="/TrainingResourceCenter/O365Training/PublishingImages/SharePointDecisionTree.png" style="padding-bottom: 5px; padding-right: 10px; vertical-align: middle;" />SharePoint</h3>
          </div>
        </div>
      </a>
      <a href="/TrainingResourceCenter/O365Training/Pages/Teams.aspx">
        <div class="col-md-4 margin-bottom-20" style="text-align: center;">
          <div data-decision="shareCollab" id="decisionTreeTeams">
            <h3 id="innerBoxHeadings"><img src="/TrainingResourceCenter/O365Training/PublishingImages/TeamsDecisionTree.png" style="padding-bottom: 5px; padding-right: 10px; vertical-align: middle;" />Teams</h3>
          </div>
        </div>
      </a>
    </div>
  </div>
</div>
<script>
   function projectCollab() {
   		var divsToCange = document.querySelectorAll('[data-decision]'),
   			attr = this.getAttribute('data-collaborate');
   
   		for (var i = 0; i < divsToCange.length; i++) {
   			var d = divsToCange[i];
   
   		if (d.getAttribute('data-decision').includes(attr)) { /* Had: == attr) { */
   			d.parentNode.style.display = 'block';
   		} else {
   			d.parentNode.style.display = 'none';
   			}
   		}
   		return false;
   		}
   
   		var divButtons = document.querySelectorAll('[data-collaborate]');
   
   		for (var i = 0; i < divButtons.length; i++) {
   			divButtons[i].addEventListener('click', projectCollab);
   }
</script>

Ответы [ 4 ]

0 голосов
/ 11 июня 2018

То, что вы просите, встроено в BS.Но вы замутили фреймворк, добавив html там, где его не должно быть.в частности, оборачивая столбцы BS тегом привязки, который нарушает сеточную систему BS, в частности правило, гласящее, что только столбцы могут быть потомками строк.

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

ИСПРАВЛЕНИЯ:

  • Я переместил вкладку привязки внутри столбца.Это нарушало выравнивание сетки BS. И это также неверная разметка для системы сетки BS.
  • Я изменил ваш JS, чтобы скрыть col, а не якорь.Это позволяет гибкой сетке BS правильно выполнять выравнивание
  • В javascript рассмотрите возможность добавления атрибута в свою разметку, чтобы вам не приходилось перемещаться по нужному количеству родительских уровней.На самом деле, если вы добавите больше слоев в столбец HTML, ваш JS сломается.

function projectCollab() {
  var divsToChange = document.querySelectorAll('[data-decision]'),
    attr = this.getAttribute('data-collaborate');

  for (var i = 0; i < divsToChange.length; i++) {
    var d = divsToChange[i];
    d.parentNode.parentNode.hidden = ! d.getAttribute('data-decision').includes(attr);
  }
  return false;
}

var divButtons = document.querySelectorAll('[data-collaborate]');

for (var i = 0; i < divButtons.length; i++) {
  divButtons[i].addEventListener('click', projectCollab);
}
.collabProjects:hover,
.collabFiles:hover,
.collabSocially:hover {
  box-shadow: 0 0 15px rgba(33, 3, 3, .2);
}

div[data-decision],
div[data-collaborate]{
  color: white;
  width: 200px;
  height: 100px;
}

.decisionTreeBox {
  background-color: #4B92DB;
}


#decisionTreeOneDrive {
  background-color: #094AB2;
}

#decisionTreeSharePoint {
  background-color: #008CE7;
}

#decisionTreeTeams {
  background-color: #4A1EBD;
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous">

<div class="outer-container">
<div class="container-fluid">
  <div class="row justify-content-center">
    <div class="col-4">
      <div data-collaborate="shareCollab" class="decisionTreeBox">
        Share and Collaborate</div>
    </div>
    <div class="col-4">
      <div data-collaborate="shareExternally" class="decisionTreeBox">
        Share Externally</div>
    </div>
  </div>
  <hr />
    <div class="row justify-content-center">
      <div class="col-4">
        <a href="#">
          <div data-decision="shareExternally" id="decisionTreeOneDrive">
            <h3 id="innerBoxHeadings">OneDrive</h3>
          </div>
        </a>
      </div>
      <div class="col-4">
        <a href="#">
          <div data-decision="shareCollab shareExternally" id="decisionTreeSharePoint">
            <h3 id="innerBoxHeadings">SharePoint</h3>
          </div>
        </a>
      </div>
      <div class="col-4">
        <a href="#">
          <div data-decision="shareCollab" id="decisionTreeTeams">
            <h3 id="innerBoxHeadings">Teams</h3>
          </div>
        </a>
      </div>
    </div>
  </div>
</div>
0 голосов
/ 11 июня 2018

В подобных случаях я обычно устанавливаю класс контента, который меняется в зависимости от количества элементов.Например, представьте, что вы проверяете массив с именем items, длина которого 2 или 3.Вот некоторый псевдокод, который показывает вам, о чем я думаю.

let itemsClass;

if (items.length === 2) {
    itemsClass = 'col-md-6';
} else {
    itemsClass = 'col-md-4';
}

myElement.setClass(itemsClass);

Вы можете установить обработчик кликов, который будет проверять после нажатия кнопки или что-то еще.В ответ это может быть частью вашего компонента render() метода.

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

edit : Извините, я не прочитал весь ваш фрагмент кода.Это то, что вы можете добавить к обработчику, который у вас уже есть.Вам просто нужно взять элементы и изменить классы в это время.

0 голосов
/ 11 июня 2018

Существует старая техника центрирования содержимого родительского элемента, а затем создания дочерних элементов display: inline-block;.Вам придется учитывать видимость символа пробела "", но это довольно хорошо задокументировано (например, Удаление пробелов между элементами встроенного блока ).Вам придется играть с полем, чтобы восстановить интервал, И не забудьте изменить JS, чтобы при восстановлении элементов отражать inline-block вместо block.

В интересах здравого смысла селектора я добавилПример класса для содержащего row элемента в демонстрационном коде.

HTML

<div class="row centered-buttons">

CSS

.centered-buttons {
    text-align: center;
}

.centered-buttons a {
    display: inline-block;
    vertical-align: middle;
}

.margin-bottom-20 {
  margin-bottom: 20px;
}

.collabProjects:hover,
.collabFiles:hover,
.collabSocially:hover {
  box-shadow: 0 0 15px rgba(33, 3, 3, .2);
}

.decisionTreeBox {
  background-color: #4B92DB;
  color: white;
  width: 300px;
  height: 140px;
  display: flex;
  justify-content: center;
  align-items: center;
  transition: box-shadow .3s;
}

#decisionTreeOneDrive {
  background-color: #094AB2;
  color: white;
  width: 300px;
  height: 140px;
  display: flex;
  justify-content: center;
  align-items: center;
}

#decisionTreeSharePoint {
  background-color: #008CE7;
  color: white;
  width: 300px;
  height: 140px;
  display: flex;
  justify-content: center;
  align-items: center;
}

#decisionTreeTeams {
  background-color: #4A1EBD;
  color: white;
  width: 300px;
  height: 140px;
  display: flex;
  justify-content: center;
  align-items: center;
}

#innerBoxHeadings {
  color: white!important;
  text-align: center;
  padding-top: 5px;
}

#columnMiddleBorderLeft,
#pageTitle {
  display: none!important;
}

.centered-buttons {
  text-align: center;
}

.centered-buttons a {
  display: inline-block;
  vertical-align: middle;
}
<div class="outer-container">
  <div class="row">
    <div class="col-md-6" style="text-align: center;">
      <div data-collaborate="shareCollab" class="decisionTreeBox" style="font-size: x-large; float: right;">
        Share and Collaborate</div>
    </div>
    <div class="col-md-6" style="text-align: center;">
      <div data-collaborate="shareExternally" class="decisionTreeBox" style="font-size: x-large;">
        Share Externally</div>
    </div>
  </div>
  <hr />
  <div class="container" style="padding: 0px;">
    <div class="row centered-buttons">
      <a href="/TrainingResourceCenter/O365Training/Pages/OneDrive.aspx">
        <div class="col-md-4 margin-bottom-20" style="text-align: center;">
          <div data-decision="shareExternally" id="decisionTreeOneDrive">
            <h3 id="innerBoxHeadings"><img src="/TrainingResourceCenter/O365Training/PublishingImages/onedrive-logo.png" style="width: 65px; height: 65px; padding-bottom: 5px; padding-right: 10px; vertical-align: middle;" />OneDrive</h3>
          </div>
        </div>
      </a>
      <a href="/TrainingResourceCenter/O365Training/Pages/SharePointOnline.aspx">
        <div class="col-md-4 margin-bottom-20" style="text-align: center;">
          <div data-decision="shareCollab shareExternally" id="decisionTreeSharePoint">
            <h3 id="innerBoxHeadings"><img src="/TrainingResourceCenter/O365Training/PublishingImages/SharePointDecisionTree.png" style="padding-bottom: 5px; padding-right: 10px; vertical-align: middle;" />SharePoint</h3>
          </div>
        </div>
      </a>
      <a href="/TrainingResourceCenter/O365Training/Pages/Teams.aspx">
        <div class="col-md-4 margin-bottom-20" style="text-align: center;">
          <div data-decision="shareCollab" id="decisionTreeTeams">
            <h3 id="innerBoxHeadings"><img src="/TrainingResourceCenter/O365Training/PublishingImages/TeamsDecisionTree.png" style="padding-bottom: 5px; padding-right: 10px; vertical-align: middle;" />Teams</h3>
          </div>
        </div>
      </a>
    </div>
  </div>
</div>
<script>
  function projectCollab() {
    var divsToCange = document.querySelectorAll('[data-decision]'),
      attr = this.getAttribute('data-collaborate');

    for (var i = 0; i < divsToCange.length; i++) {
      var d = divsToCange[i];

      if (d.getAttribute('data-decision').includes(attr)) { /* Had: == attr) { */
        d.parentNode.style.display = 'block';
      } else {
        d.parentNode.style.display = 'none';
      }
    }
    return false;
  }

  var divButtons = document.querySelectorAll('[data-collaborate]');

  for (var i = 0; i < divButtons.length; i++) {
    divButtons[i].addEventListener('click', projectCollab);
  }
</script>
0 голосов
/ 11 июня 2018

Добавьте следующий CSS к классу row:

<div class="container" style="padding: 0px;">
<div class="row" style="justify-content: center">

Поскольку bootstrap использует систему flexbox, это должно работать для вас.

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