>  기사  >  웹 프론트엔드  >  DIVLESS Pure CSS를 사용하여 다크 모드 전환

DIVLESS Pure CSS를 사용하여 다크 모드 전환

Patricia Arquette
Patricia Arquette원래의
2024-11-01 08:43:30371검색

Toggle Dark Mode using DIVLESS Pure CSS

기본적으로 Javascript를 허용하지 않는 직장 Sharepoint 환경에서 .html 문서를 작성해야 한다는 관점에서 저는 "아, 그리고 다크 모드를 전환하는 버튼을 추가하세요. 감사합니다!"

이것은 상사가 "단 하나의 DIV라도 게으름이다"와 동일시하는 우리 정책 문서의 "유효하고 접근 가능한 의미 HTML" 문구에 더해 상황을 아무리 말해도 조금 까다롭게 만들었습니다.

@media(선호하는 색상 구성: 어두운)

반대 방법으로 토글 대신 미디어 쿼리를 사용하여 각 사용자의 밝은/어두운 시스템 선호도에 맞게 페이지 스타일을 지정하는 것이 좋습니다. 응답은 "좋아요. 그래도 토글을 켜두세요."였습니다. 좋습니다. 덜 만들려고 노력하여 더 많은 작품을 만들었습니다.

Light/Dark 모드를 제어하려면 CSS 변수와 체크박스 입력/레이블 방법이 필요하다는 점을 이미 언급했지만 :checked ~ *는 여전히 입력 뒤에 오는 요소에만 영향을 미치므로 배경 스타일을 전환하기 어렵습니다.

첫 번째 해결책은 모든 것 바로 아래에 위치한 일반 DIV를 사용하는 것이었습니다. 상사가 이를 발견하고 제거하라고 할 때까지 작동했습니다. 한 가지 다행스러운 점은 호환성 지원 범위가 브라우저의 90% 이상인 한 최신 HTML/CSS를 사용해도 괜찮다는 것입니다.

:has()를 사용하면 도움이 됩니다!

구현되기 전에 상위 요소를 다시 타겟팅하기 위해 제안된 이 CSS 구문을 처음 봤을 때 어떤 용도로 유용할지 확신할 수 없었습니다. 이제 솔루션을 찾다가 다시 한 번 접하게 되었는데, 'BODY에 한번 해보면 어떨까?'라는 생각이 들었습니다.

즉시 효과가 있었고 더 빨리 시도하지 않은 것에 대해 자책했습니다! 제가 최종 결정한 관련 CSS는 다음과 같습니다.

      * { /* LIGHT mode */
        --tcolor: #000;
        --bgcolor: #FFF;
        --lcontent: "DARK";
        --bgimage: linear-gradient(rgba(255,255,255,0.5),rgba(255,255,255,0.5)), url(INSERT_SEASONAL_BACKGROUND);
        --sbgcolor: rgba(255,255,255,0.75);
        --alink:blue;
        --avisited:purple;
      }
      body:has(#d:checked), body:has(#d:checked) * { /* DARK mode */
        --tcolor: #FFF;
        --bgcolor: #000;
        --lcontent: "LIGHT";
        --bgimage: linear-gradient(rgba(0,0,0,0.5),rgba(0,0,0,0.5)), url(INSERT_SEASONAL_BACKGROUND);
        --sbgcolor: rgba(0,0,0,0.75);
        --alink:lightblue;
        --avisited:#8467D7;
      }
@media (prefers-color-scheme: dark) {
      * { /* DARK mode */
        --tcolor: #FFF;
        --bgcolor: #000;
        --lcontent: "LIGHT";
        --bgimage: linear-gradient(rgba(0,0,0,0.5),rgba(0,0,0,0.5)), url(INSERT_SEASONAL_BACKGROUND);
        --sbgcolor: rgba(0,0,0,0.75);
        --alink:lightblue;
        --avisited:#8467D7;
      }
      body:has(#d:checked), body:has(#d:checked) * { /* LIGHT mode */
        --tcolor: #000;
        --bgcolor: #FFF;
        --lcontent: "DARK";
        --bgimage: linear-gradient(rgba(255,255,255,0.5),rgba(255,255,255,0.5)), url(INSERT_SEASONAL_BACKGROUND);
        --sbgcolor: rgba(255,255,255,0.75);
        --alink:blue;
        --avisited:purple;
      }
}
      body { /* base element under control of mode */
        color:var(--tcolor); /* match text color to mode */
        background-image:var(--bgimage); /* match opacity overlay to mode */
        background-repeat: no-repeat no-repeat, space no-repeat;
        background-size:auto 100vh;
        margin:-1ex;
      }
      label[for="d"]::after {content: var(--lcontent);} /* DARK or LIGHT text */
      section{ /* main interaction area */
        margin:0 auto;
        background-color:var(--sbgcolor);
        padding:1ex;
        padding-top:0;
        height:fit-content;
        max-height:96.2vh;
        overflow-y:scroll;
        scrollbar-color:rgba(128,128,128,0.5) var(--sbgcolor);
      }
      li:nth-of-type(even){ /* subtle horizontal lines */
        background-color:rgba(128,128,128,0.1);
      }
      summary:hover,summary:focus-visible,a:hover,a:focus-visible { /* match mouseover or     */
        background-color:var(--bgcolor);                            /* keyboard focus to mode */
      }
      a:link {color: var(--alink)}       /* match link     */
      a:visited {color: var(--avisited)} /* colors to mode */

섹션 스크롤 막대 색상을 중립으로 유지하기 위해 rgba(128,128,128,0.5)를 사용하여 치트를 한 번 수행했습니다.

최종 결과(Sharepoint에 의해 제한되지 않음)는 다음과 같습니다.

여기 보너스로 속성을 사용하여 수동으로 추가한 해당 페이지의 스키마 데이터 구조가 있습니다. 또 다른 작업에는 sans-javascript가 주어졌습니다.

이제 자바스크립트 없이 오디오 사운드를 실행하는 방법을 알아내면 됩니다!?

제한된 환경에서 일한 경험과 효과가 있었던 점과 그렇지 않았던 점을 자유롭게 댓글로 남겨주세요!

위 내용은 DIVLESS Pure CSS를 사용하여 다크 모드 전환의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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