Подтвердить что ты не робот

Изменение цвета CSS в тексте прокрутки/вырезания - переполнение z-index

Это, может быть, большая загадка. Может быть, нет. При прокрутке я хочу изменить цвет меню position:fixed.

enter image description here

Мое первое намерение состояло в том, чтобы использовать два фиксированных меню и overflow:hidden, но он не работает с фиксированными элементами. Моя вторая попытка заключалась в использовании z-index. Но это кажется невозможным.

Может у кого-то есть идея?

4b9b3361

Ответ 1

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

Вы можете использовать:

clip: rect(auto, auto, auto, auto);

в контейнере для эмуляции overflow: hidden для меню position: fixed, чтобы вы могли обрезать текст по мере прокрутки.

Обратите внимание, что в то время как clip устарел, новый clip-path не работает с элементами position: fixed, поэтому вы застряли с clip.

clip требует абсолютного или фиксированного позиционирования, но вы можете легко обойти эту проблему, поместив элемент position: absolute внутри контейнера position: relative, например:

<div style="position: relative;">
    <div style="position: absolute; clip: rect(auto, auto, auto, auto);">
        <!-- My awesome menu here -->
    </div>
</div>

Вот демо:

html,
body {
  height: 100%;
  margin: 0;
  padding: 10% 5% 80% 5%;
  background-color: #eee;
  font-family: sans-serif;
}
.container {
  display: table;
  width: 100%;
  height: 100%;
  background-color: #fff;
}
.row {
  display: table-row;
}
.cell {
  display: table-cell;
  position: relative;
}
.cell.small {
  height: 25%;
}
.header,
.content,
.footer {
  position: absolute;
  width: 100%;
  height: 100%;
  padding: 4%;
  box-sizing: border-box;
  clip: rect(auto, auto, auto, auto);
}
.header,
.footer {
  background-color: #F97D9F;
}
.menu {
  position: fixed;
  font-size: 2em;
  top: 10%;
  right: 20%;
}
.white {
  color: #fff;
}
.black {}
<div class="container">
  <div class="row">
    <div class="cell small">
      <div class="header">
        content
        <div class="menu white">MENU</div>
      </div>
    </div>
  </div>
  <div class="row">
    <div class="cell">
      <div class="content">
        content
        <div class="menu black">MENU</div>
      </div>
    </div>
  </div>
  <div class="row">
    <div class="cell small">
      <div class="footer">
        content
        <div class="menu white">MENU</div>
      </div>
    </div>
  </div>
</div>

Ответ 2

Поведение, которое вы ищете, такое же, как background-attachement:fixed;.

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

Цель состоит в том, чтобы использовать 2 фоновых изображения с background-attachement: fixed; и позиционировать ссылку над ними для взаимодействия. Это даст вам желаемое поведение с плавным изменением цвета в соответствии с цветом фона:

DEMO

header, article,footer,body{
    background:#fff url('http://i.imgur.com/oHIZBHL.png') no-repeat;
    background-attachment: fixed;
    background-position:right 160px top 10px;
}
body{
    padding:0 150px 1000px;
    background-color:lightgrey;
}
header,footer{
    background-image:url('http://i.imgur.com/79IWeQK.png');
    background-color:#F97D9F;
    height:125px;
}
article{
    height:500px;
}
nav a{
    position:fixed;
    top:10px; right:160px;
    width:150px; height:50px;
}
<nav><a href="#" title="menu"></a></nav>
<header></header>
<article></article>
<footer></footer>

Ответ 3

EDIT: доказал, что он НЕ работает в Firefox, так что, возможно, это просто уловка Chrome, все еще интересное поведение, поэтому я оставлю этот ответ, если кто-то просто захочет создать версию только для Chrome или когда появятся Firefox и другие браузеры а.

Там я "исправил" его (каламбур:):)

Посмотрите на эту рабочую скрипку: JSFiddle пример фиксированной, относительной и переполненной совместной работы

Вы можете использовать родителей relative с overflow, чтобы имитировать эффект изменения цвета.

Даунсайд: вам нужно дублировать свое меню (которое семантически хорошо, просто неправильно). Вы могли бы использовать некоторый базовый javascript для дублирования меню, хотя это немного улучшило бы его. Я также тестировал это только в Chrome, но он кажется действительно базовым CSS, поэтому я предполагаю, что это будет работать на любом браузере/устройстве.

Фрагменты кода (соответствующие части)

HTML

<div class="topbar">
    <h1>Whoo pink!</h1>
    <div class="fixed-menu">Fixed!</div>
</div>
<div class="loads-of-content">
    <div class="fixed-menu">Fixed!</div>
</div>

CSS

.topbar {
    position: relative;
    overflow: hidden;
    z-index: 3;
}

.topbar .fixed-menu {
    color: red;
}
.fixed-menu {
    position: fixed;
    top: 20px;
    right: 50px;
}
.loads-of-content {
    position: relative;
    overflow: hidden;
}

Ответ 4

Если вы не хотите управлять дублирующими элементами, чтобы снять этот эффект с помощью CSS clip в соответствии с решением Antony, вы можете использовать пару jQuery-плагинов:

  • jq-clipthru - это супергибкий плагин, который, вероятно, может делать все, что вам нужно (и многое другое), но он также требует библиотеки jQuery UI. [Demo]

  • Unobscure Text - Это очень легкий плагин с очень конкретным вариантом использования, но он несовместим с jQuery 3. [Demo]

Если вам нужна поддержка jQuery 3 и вам не нужна IE 11 и ниже, вы можете использовать решение на основе SVG clip-path, like это.