#html #css
#HTML #css
Вопрос:
Я работаю над пользовательским скриптом для страницы, поэтому у меня нет контроля над исходным HTML. Кроме того, из-за способа загрузки страницы и работы скрипта, по разным причинам я могу использовать здесь только модификации CSS, и изменения могут быть только на уровне страницы CSS (не для атрибутов стиля каждого элемента).
Итак, проблема в том, что есть большой a
элемент, в котором есть иерархия div
s. Я хотел бы отключить события указателя только для одного из дочерних div
элементов, оставив все в нормальном режиме везде на a
. Например:
const disableBottomPointerEventsStyle =
'.bottom { pointer-events: none; cursor: defau< }';
$('#test').click(function () {
$('<style/>')
.attr('type', 'text/css')
.text(disableBottomPointerEventsStyle)
.appendTo(document.head);
$(this).toggle();
});
.link { display: flex; width: 10ex; height: 20ex; margin-bottom: 1ex; }
.wrapper { display: flex; flex-direction: column; }
.top { border: 1px solid red; }
.bottom { border: 1px solid blue; }
div { flex-grow: 1; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!-- example of page structure: -->
<a class="link" href="about:blank">
<div class="wrapper">
<div class="top"></div>
<div class="bottom"></div>
</div>
</a>
<!-- ========================== -->
<button id="test">Test</button>
В этом примере есть an a
с некоторым div
s в нем, и цель состоит в том, чтобы отключить события указателя только на синем div
внизу, оставив все остальное как есть.
Чтобы использовать пример, нажмите кнопку Test; это вставит правило стиля в документ. Моя текущая лучшая попытка — это значение disableBottomPointerEventsStyle
:
.bottom { pointer-events: none; cursor: defau< }
Это не имеет никакого эффекта.
Итак, мой вопрос в том, возможно ли это сделать, только изменив правило CSS для всей страницы, и если да, то как?
Обратите внимание, что это в основном вопрос CSS, JavaScript здесь в значительной степени случайный.
Комментарии:
1.
const disableBottomPointerEventsStyle = '.link { pointer-events: none; cursor: defau< } .top {pointer-events: auto; cursor:pointer;}';
Я знаю, что это не совсем соответствует вашему использованию, но это был единственный способ, которым я мог это сделать. Путем выборочного включения событий указателя. Иpointer-events
работают так же, как и видимость2. Если вы посмотрите на таблицу стилей страницы, над которой работаете, вы заметите, что пользовательский агент автоматически добавляет стили к
a
элементу. UA автоматически добавляетcursor: pointer;
и значение по умолчаниюpointer-events
равноauto
. Чтобы достичь того, что вы ищете, вам сначала нужно сначала «отменить» стили UA, т.е. Установить.a.link { cursor: none; pointer-events: none}
Затем для каждого прямого потомка (кроме того, который вы хотите) добавьтеcursor: pointer; pointer-events: auto;
. Я знаю, что это не совсем то, что вы ищете, но, похоже, это единственный способ сделать это.
Ответ №1:
Секрет в том, чтобы отключить естественное a
поведение и включить его в child
.
Я использовал жесткий код a.link
— чтобы минимизировать риск побочных эффектов.
Поддерживается https://caniuse.com/?search=pointer-events — должно быть хорошо.
.link { display: flex; width: 10ex; height: 20ex; margin-bottom: 1ex; }
.wrapper { display: flex; flex-direction: column; }
.top { border: 1px solid red; }
.bottom { border: 1px solid blue; }
div { flex-grow: 1; }
a.link{ pointer-events: none}
div.top{ pointer-events: auto}
<a class="link" href="about:blank">
<div class="wrapper">
<div class="top"></div>
<div class="bottom"></div>
</div>
</a>
Комментарии:
1. Потрясающе; Я не знал, что отключение
a
, но включение дочернего элемента все равно вызовет ссылку. Спасибо. Что-то подобное.link { pointer-events: none; cursor: defau< } .wrapper div:not(.bottom) { pointer-events: auto; cursor: pointer; }
также работает в моем случае и позволяет мне оставаться в неведении о любых других divs, которые могут быть в оболочке, кроме того, который мне небезразличен.