Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.01.2017, 09:50
Интересующийся
Отправить личное сообщение для Nisxan Посмотреть профиль Найти все сообщения от Nisxan
 
Регистрация: 01.10.2016
Сообщений: 11

Смена цвета текста в зависимости от секции
Здравствуйте, на сайте есть фиксированное меню для перехода по якорям на сайте. Сайт разделен на секции <section> с разными id.

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

http://u42997.s13.wh1.su/

Цвет должен чередоваться, то есть 1, 3, 5 секции - белый цвет, а 2, 4, 6 - черный. Как то так) Помогите кому не трудно, пожалуйста.
Ответить с цитированием
  #2 (permalink)  
Старый 06.01.2017, 02:45
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="utf-8">
		<title>Document</title>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
		<style>
			
html {
	background: url("http://wallpaperscraft.com/image/mazda_white_front_view_113205_5064x3376.jpg") center / cover;
	background-attachment: fixed;
	height: 100vh;
}

body, .scrolling {
	margin: 0;
	height: 100vh;
	overflow: auto;
}

nav {
	position: fixed;
	right: 0;
	top: 50%;
	transform: translateY(-50%);
	padding: 1em 1.5em;
	margin: 1em;
	border-radius: 70% 15% 40% 11%;
	z-index: 1;
	font-weight: bold;
	font-size: 130%;
}

section {
	height: 100vh;
	position: relative;
	top: 100vh;
	overflow: auto;
	display: flex;
	justify-content: center;
	align-items: center;
	font: 20vh "Helvetica Neue", sans-serif;
}

section:nth-child(2n + 1), nav.white {
	color: #fff;
	background: #000;
	mix-blend-mode: multiply;
}

section:nth-child(2n), nav.black {
	color: #000;
	background: #fff;
	mix-blend-mode: screen;
}
			
		</style>
	</head>
	<body>
		<div class="scrolling">
			<nav>☰</nav>
			<section>Lorem</section>
			<section>Ipsum</section>
			<section>Dolor</section>
			<section>Sit</section>
			<section>Amet</section>
		</div>
		
		<script>
			
{
	const nav = document.querySelector("nav");
	nav.className = "black";

	document.querySelector(".scrolling").addEventListener("scroll", event => {
		let element = event.target;
		let progress = (.5 + element.scrollTop / element.offsetHeight) | 0;

		nav.className = progress % 2 ? "white" : "black";
	});
};
			
		</script>
	</body>
</html>
Ответить с цитированием
  #3 (permalink)  
Старый 06.01.2017, 03:48
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Malleys,
может вместо стрелочной функции обычную оставить в данном случае, тогда строка 77 не нужна будет или оставить но строку 77 перенести в строку 75?

Последний раз редактировалось рони, 06.01.2017 в 03:58.
Ответить с цитированием
  #4 (permalink)  
Старый 06.01.2017, 13:58
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

рони,
Может её вообще удалить? И...
let progress = (.5 + event.target.scrollTop / event.target.offsetHeight) | 0;
Ответить с цитированием
  #5 (permalink)  
Старый 06.01.2017, 14:02
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Сообщение от рони
Может её вообще удалить?
неа, оба варианта предложенных выше, не используют event от слова совсем
Ответить с цитированием
  #6 (permalink)  
Старый 06.01.2017, 14:07
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Если только один .scrolling, тогда да! А если много? Не заводить же массив элементов .scrolling
Ответить с цитированием
  #7 (permalink)  
Старый 06.01.2017, 14:13
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Сообщение от Malleys
А если много?
не понимаю, что это меняет. event потребуется только в случае с делегированием ... а сейчас это только лишнее создание переменной element, при любом scroll, которую можно создать всего 1 раз или не создавать вовсе.
Ответить с цитированием
  #8 (permalink)  
Старый 06.01.2017, 14:40
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Да. Можно не создавать Вы правы! Я вообще сначала хотел сделать с mix-blend-mode, но у меня не очень получилось найти правильный режим наложения...
Ответить с цитированием
  #9 (permalink)  
Старый 06.01.2017, 14:46
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Malleys,
Пример: вариант с this
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Document</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
    <style>

html {
  background: url("http://wallpaperscraft.com/image/mazda_white_front_view_113205_5064x3376.jpg") center / cover;
  background-attachment: fixed;
  height: 100vh;
}

body, .scrolling {
  margin: 0;
  height: 100vh;
  overflow: auto;
}

nav {
  position: fixed;
  right: 0;
  top: 50%;
  transform: translateY(-50%);
  padding: 1em 1.5em;
  margin: 1em;
  border-radius: 70% 15% 40% 11%;
  z-index: 1;
  font-weight: bold;
  font-size: 130%;
}

section {
  height: 100vh;
  position: relative;
  top: 100vh;
  overflow: auto;
  display: flex;
  justify-content: center;
  align-items: center;
  font: 20vh "Helvetica Neue", sans-serif;
}

section:nth-child(2n + 1), nav.white {
  color: #fff;
  background: #000;
  mix-blend-mode: multiply;
}

section:nth-child(2n), nav.black {
  color: #000;
  background: #fff;
  mix-blend-mode: screen;
}

    </style>
  </head>
  <body>
    <div class="scrolling">
      <nav>☰</nav>
      <section>Lorem</section>
      <section>Ipsum</section>
      <section>Dolor</section>
      <section>Sit</section>
      <section>Amet</section>
    </div>

    <script>
{
  const nav = document.querySelector("nav");
  nav.className = "black";
  document.querySelector(".scrolling").addEventListener("scroll", function() {
    let progress = (.5 + this.scrollTop / this.offsetHeight) | 0;
    nav.className = progress % 2 ? "white" : "black";
  });
};

    </script>
  </body>
</html>


Пример: вариант с const element
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Document</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
    <style>

html {
  background: url("http://wallpaperscraft.com/image/mazda_white_front_view_113205_5064x3376.jpg") center / cover;
  background-attachment: fixed;
  height: 100vh;
}

body, .scrolling {
  margin: 0;
  height: 100vh;
  overflow: auto;
}

nav {
  position: fixed;
  right: 0;
  top: 50%;
  transform: translateY(-50%);
  padding: 1em 1.5em;
  margin: 1em;
  border-radius: 70% 15% 40% 11%;
  z-index: 1;
  font-weight: bold;
  font-size: 130%;
}

section {
  height: 100vh;
  position: relative;
  top: 100vh;
  overflow: auto;
  display: flex;
  justify-content: center;
  align-items: center;
  font: 20vh "Helvetica Neue", sans-serif;
}

section:nth-child(2n + 1), nav.white {
  color: #fff;
  background: #000;
  mix-blend-mode: multiply;
}

section:nth-child(2n), nav.black {
  color: #000;
  background: #fff;
  mix-blend-mode: screen;
}

    </style>
  </head>
  <body>
    <div class="scrolling">
      <nav>☰</nav>
      <section>Lorem</section>
      <section>Ipsum</section>
      <section>Dolor</section>
      <section>Sit</section>
      <section>Amet</section>
    </div>

    <script>
{
  const nav = document.querySelector("nav");
  nav.className = "black";
  const element = document.querySelector(".scrolling");
  element.addEventListener("scroll", () =>{
    let progress = (.5 + element.scrollTop / element.offsetHeight) | 0;
    nav.className = progress % 2 ? "white" : "black";
  });
};
    </script>
  </body>
</html>
Ответить с цитированием
  #10 (permalink)  
Старый 06.01.2017, 14:51
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Сообщение от Malleys
Я вообще сначала хотел сделать с mix-blend-mode
если б я ещё понимал о чём это предолагаю что-то с CSS препроцессор ...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение цвета блока в зависимости от начального цвета SVDDVS jQuery 3 10.02.2016 20:38
Изменение цвета текста кнопки и цвета кнопки при нажатии Setta jQuery 22 31.07.2013 17:48
Смена цвета текста по кругу! JS_Den Общие вопросы Javascript 4 18.02.2012 14:39
Бесконечная смена цвета текста iGusse Элементы интерфейса 4 08.10.2011 22:03
Смена цвета текста rider-sx Общие вопросы Javascript 7 16.09.2008 18:05