목차
基于伪元素的解决方案
box-shadow的解决方案
backdrop解决方案
웹 프론트엔드 HTML 튜토리얼 CSS秘密花园: 通过亮度调节去强调(De-emphasize)_html/css_WEB-ITnose

CSS秘密花园: 通过亮度调节去强调(De-emphasize)_html/css_WEB-ITnose

Jun 24, 2016 am 11:21 AM

《 CSS Secrets 》是 @Lea Verou 最新著作,这本书讲解了有关于CSS中一些小秘密。是一本CSSer值得一读的一本书,经过一段时间的阅读,我、@南北和@彦子一起将在W3cplus发布一系列相关的读后感,与大家一起分享。

很多时候,我们需要通过在元素背后添加一个半透明的深色叠加来让内容变暗,强调并提醒用户关注某个UI元素。例如,lightboxes和“quick tours”接口经常需要这种效果。

来完成这个效果的最常见的技术是添加一个额外的HTML元素来调节亮度,并应用一些如下的CSS:

.overlay { /* For dimming */    position: fixed;    top: 0;    right: 0;    bottom: 0;    left: 0;    background: rgba(0,0,0,.8);}.lightbox { /* The element to draw attention to */    position: absolute;    z-index: 1;    /* [rest of styling] */}
로그인 후 복사

深色叠加的目的是把用户的注意力放到我们希望用户注意的元素上边,然后元素后边的内容都变暗。 .lightbox 有一个更高的 z-index ,可以让它放置在深色叠加之上。所有这些都是非常OK没有问题的,但是它需要一个额外的HTML元素,也就是说效果不能只通过CSS应用。这不是什么大问题,但是这是一个我们希望可以避免的不便之处,如果可以的话。幸运的是,大多数的情况下我们都可以搞定。

基于伪元素的解决方案

我们可以使用伪元素来消除对额外HTML元素的需求,如下:

body.dimmed::before {    position: fixed;    top: 0;    right: 0;    bottom: 0;    left: 0;    z-index: 1;    background: rgba(0,0,0,.8);}
로그인 후 복사

这是一个稍微好点的解决方案,这也意味着我们现在可以直接通过CSS应用这种效果。但是,问题来了,这不是非常方便,因为 元素可能已经应用了一些其它的东西在它的 ::before 伪元素之上了。所以,也就是说如果想要应用这个效果,我们通常需要一些JavaScript来应用到 dimmed 类上。

我们可以通过给元素本身的 ::before 伪元素应用深色叠加、并给它一个 z-index:-1 来解决这个问题,这样它就位于我们的元素之下了。尽管它解决了可移植性的问题,它并不能给我们控制Z轴的位置提供很精确的控制。它可能最终会被放在我们的元素下边(这是可取的)或放在我们的元素以及它的几个父元素下边。

它的另一个问题是,伪元素没有自己的JavaScript事件。当使用一个单独的元素来进行叠加的时候,我们可以给它添加事件句柄——例如:当用户点击叠加层的时候,关闭高亮窗口。如果我们在同一个想要强调的元素上使用伪元素,想要检测用户是否点击了覆盖层或者元素是很棘手的。

box-shadow的解决方案

伪元素的解决方案非常灵活,而且符合大多数人对叠加的期望。但是,对于简单的用例或原型设计,我们可以采用 box-shadow 的spread半径,把它增大到你在每一边希望指定的大小。也就是说我们可以创建一个非常大的零偏移零模糊的shadow,用一种迅速又随性的方式来模拟覆盖层。

box-shadow: 0 0 0 999px rgba(0,0,0,.8);
로그인 후 복사

第一个通过的解决方案有一个明显的问题是,在非常大分辨率( > 2000px )的地方它就会有问题。我们可以通过使用一个再大一点的数字来缓解这种情况,或者通过使用viewport单位来完全地解决这个问题,这样我们可以确保“overlay”总会比我们的viewport大。因为我们不能使用不同的水平和垂直spread半径值,viewport单位应该是 vmax 。如果你对于 vmax 这个单位不熟悉, 1vmax 等于 1vw 或 1vh ,取较大值。 100vw 等于viewport的width,同样, 100vh 等于viewport的height值。因此,能够满足我们需求的最小值是 50vmax ,因为它在每一边都会添加,所以我们的覆盖层的最终尺寸是 100vmax +我们的元素的尺寸:

box-shadow: 0 0 0 50vmax rgba(0,0,0,.8);
로그인 후 복사

这种技术非常快速而且容易应用,但是它有两个相当严重的问题,限制了它的实用性。你发现了吗?

首先,因为我们的元素的尺寸是和viewport相关的,和页面没有关系,当我们滚动页面的时候,会看到覆盖层的边界,除非元素是 position: fixed; 定位的,或者是页面本身不够长,不能滚动。此外,因为页面可以是很长很长的,它不会机智地尝试去通过增加spread半径来克服这一点。相反,我建议你只对 fixed 定位的元素,或页面很小没有滚动的情况下使用这种技术。

第二,使用一个单独的元素(或伪元素)作为覆盖层并不仅仅会将用户的注意力引导到我们想要的元素上。它还会阻止鼠标和页面的其余部分交互,因为它捕获了指针事件。 box-shadow 没有这个属性。因此,它只会在视觉上帮助用户将注意力引导到特定的元素上,而不会自己捕获任何鼠标交互事件。至于这是否可以接受,要看你具体的使用情况。

backdrop解决方案

如果你想要变成焦点的元素是一个模式对话框

元素通过它的 showModal() 方法显示),它已经有一个覆盖层了,通过用户代理样式表。这种原生的覆盖还可以通过 ::backdrop 伪元素来添加样式,例如,让它变暗一点:

dialog::backdrop {    background: rgba(0, 0, 0, .8);}
로그인 후 복사

这种方法唯一需要注意的地方是,在编写的时候,浏览器的支持是非常有限的,所以一定要在使用前检查其当前状态。记住,即使它不被支持,如果对话框没有覆盖层的话,也不会影响到什么东西,因为它只是一个用户体验的改善。

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

공식 계정 웹 페이지의 캐싱 업데이트에 어려움 : 버전 업데이트 후 사용자 경험에 영향을 미치는 이전 캐시를 피하는 방법은 무엇입니까? 공식 계정 웹 페이지의 캐싱 업데이트에 어려움 : 버전 업데이트 후 사용자 경험에 영향을 미치는 이전 캐시를 피하는 방법은 무엇입니까? Mar 04, 2025 pm 12:32 PM

공식 계정 웹 페이지 업데이트 캐시, 이것은 간단하고 간단하며 냄비를 마시기에 충분히 복잡합니다. 공식 계정 기사를 업데이트하기 위해 열심히 노력했지만 사용자는 여전히 기존 버전을 열었습니까? 이 기사에서는이 뒤에있는 비틀기와 회전을 살펴 보고이 문제를 우아하게 해결하는 방법을 살펴 보겠습니다. 읽은 후에는 다양한 캐싱 문제를 쉽게 처리 할 수있어 사용자가 항상 가장 신선한 콘텐츠를 경험할 수 있습니다. 기본 사항에 대해 먼저 이야기 해 봅시다. 액세스 속도를 향상시키기 위해 브라우저 또는 서버는 일부 정적 리소스 (예 : 그림, CSS, JS) 또는 페이지 컨텐츠를 저장합니다. 다음에 액세스 할 때 다시 다운로드하지 않고도 캐시에서 직접 검색 할 수 있으며 자연스럽게 빠릅니다. 그러나 이것은 또한 양날의 검입니다. 새 버전은 온라인입니다.

HTML5 양식 유효성 검사 속성을 사용하여 사용자 입력을 유효성있게하려면 어떻게합니까? HTML5 양식 유효성 검사 속성을 사용하여 사용자 입력을 유효성있게하려면 어떻게합니까? Mar 17, 2025 pm 12:27 PM

이 기사에서는 브라우저에서 직접 사용자 입력을 검증하기 위해 필요한, Pattern, Min, Max 및 Length 한계와 같은 HTML5 양식 검증 속성을 사용하는 것에 대해 설명합니다.

HTML5의 크로스 브라우저 호환성에 대한 모범 사례는 무엇입니까? HTML5의 크로스 브라우저 호환성에 대한 모범 사례는 무엇입니까? Mar 17, 2025 pm 12:20 PM

기사는 HTML5 크로스 브라우저 호환성을 보장하기위한 모범 사례에 대해 논의하고 기능 감지, 점진적 향상 및 테스트 방법에 중점을 둡니다.

웹 페이지의 PNG 이미지에 뇌졸중 효과를 효율적으로 추가하는 방법은 무엇입니까? 웹 페이지의 PNG 이미지에 뇌졸중 효과를 효율적으로 추가하는 방법은 무엇입니까? Mar 04, 2025 pm 02:39 PM

이 기사는 CSS를 사용한 웹 페이지에 효율적인 PNG 테두리 추가를 보여줍니다. CSS는 JavaScript 또는 라이브러리에 비해 우수한 성능을 제공하며, 미묘하거나 눈에 띄는 효과를 위해 테두리 너비, 스타일 및 색상 조정 방법을 자세히 설명합니다.

& lt; datalist & gt의 목적은 무엇입니까? 요소? & lt; datalist & gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:33 PM

이 기사는 HTML & LT; Datalist & GT에 대해 논의합니다. 자동 완성 제안을 제공하고, 사용자 경험을 향상시키고, 오류를 줄임으로써 양식을 향상시키는 요소. 문자 수 : 159

& lt; Progress & Gt의 목적은 무엇입니까? 요소? & lt; Progress & Gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:34 PM

이 기사는 HTML & lt; Progress & Gt에 대해 설명합니다. 요소, 그 목적, 스타일 및 & lt; meter & gt의 차이; 요소. 주요 초점은 & lt; progress & gt; 작업 완료 및 & lt; meter & gt; Stati의 경우

html5 & lt; time & gt; 의미 적으로 날짜와 시간을 나타내는 요소? html5 & lt; time & gt; 의미 적으로 날짜와 시간을 나타내는 요소? Mar 12, 2025 pm 04:05 PM

이 기사는 html5 & lt; time & gt; 시맨틱 날짜/시간 표현 요소. 인간이 읽을 수있는 텍스트와 함께 기계 가독성 (ISO 8601 형식)에 대한 DateTime 속성의 중요성을 강조하여 Accessibilit를 향상시킵니다.

& lt; meter & gt의 목적은 무엇입니까? 요소? & lt; meter & gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:35 PM

이 기사는 HTML & lt; meter & gt에 대해 설명합니다. 범위 내에 스칼라 또는 분수 값을 표시하는 데 사용되는 요소 및 웹 개발의 일반적인 응용 프로그램. & lt; meter & gt; & lt; Progress & Gt; 그리고 Ex

See all articles