다크 테마 솔로 CSS, MediaQuery 및 자바스크립트 지원
코드펜: Con js y css
코드펜: solo css
설치
Se puede ejecutar desde cualquier server virtual que tengas, no es necesario al 100%
Primero clonar el repositorio e instalar.
git clone https://github.com/205mdp/html-css-js-dark-light-theme.git
yarn add
Ejecutar
yarn dev
옵션 1 - 솔로 CSS
Documentación Variables
/* solo ejemplo de variables */
body {
/* crear variable */
--main-back-color: red;
/* asignar variable */
background-color: var(--main-back-color);
}
:root {
--background: white;
--color: black;
}
/* media query dark */
@media (prefers-color-scheme: dark) {
:root {
--background: black;
--color: white;
}
}
옵션 2 Con Javascript y 미디어 쿼리
Detectamos que configuración tiene el sistema.
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
// dark mode
localStorage.setItem('theme', 'dark');
} else {
localStorage.setItem('theme', 'light');
}
Evento de cambio 스키마
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
event.matches ? enableDarkMode() : disableDarkMode();
});
옵션 3 Con Javascript manualmente por botón.
Se puede hacer agregando una clase al body .dark , .light lo guardamos en el localStorage también.
// cambio de dark mode a ligh mode.
const enableDarkMode = () => {
document.body.classList.add('darkmode');
// 2. Update darkMode in localStorage
localStorage.setItem('theme', 'dark');
}
// cambio de light mode a dark mode.
const disableDarkMode = () => {
// 1. Remove the class from the body
document.body.classList.remove('darkmode');
// 2. Update darkMode in localStorage
localStorage.setItem('theme', 'light');
}
이벤트 단추
// btn btn-theme
const btnTheme = document.querySelector('#btn-theme');
btnTheme.addEventListener('click', () => {
// 1. Check if dark mode is enabled
localStorage.getItem('theme') === 'dark' ? disableDarkMode() : enableDarkMode();
})
Nota hay una mejor solución para no duplicar tanto las variables de css y las clases. Que es controlando desde JS. Lo vemos en el proximo branch.
Con Javascript pero sin 미디어 쿼리
/* variables globales */
:root {
--header-color: #f5f5f5;
--header-back-color: rgb(84, 121, 241);
--main-back-color: #f5f5f5;
--main-color: #333;
--header-container-max-width: 70rem;
}
.darkmode {
--header-color: #b2b2b2;
--header-back-color: rgb(31, 31, 31);
--main-back-color: #595959;
--main-color: rgb(235, 235, 235);
--header-container-max-width: 70rem;
}
// Detectar el color del sistema
const detectColorScheme = () => {
const localTheme = localStorage.getItem('theme');
// Verificar que theme tiene el sistema/navegador
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
// dark mode
(localTheme === 'dark' || localTheme === null) ? enableDarkMode() : disableDarkMode();
} else {
(localTheme === 'dark') ? enableDarkMode() : disableDarkMode();
}
}
// Verifica si hay cambios en el thema y lo cambia
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
event.matches ? enableDarkMode() : disableDarkMode();
});
// Detectar el color del sistema
detectColorScheme();
// btn btn-theme
const btnTheme = document.querySelector('#btn-theme');
btnTheme.addEventListener('click', () => {
// 1. Check if dark mode is enabled
localStorage.getItem('theme') === 'dark' ? disableDarkMode() : enableDarkMode();
})
// cambio de dark mode a light mode.
const enableDarkMode = () => {
document.body.classList.add('darkmode');
// 2. Update darkMode in localStorage
localStorage.setItem('theme', 'dark');
}
// cambio de light mode a dark mode.
const disableDarkMode = () => {
// 1. Remove the class from the body
document.body.classList.remove('darkmode');
// 2. Update darkMode in localStorage
localStorage.setItem('theme', 'light');
}
Nota final: Uds podrían agregar mas temas de colores o dejar que el cliente selecciones los colores y los guarde en el localstorage o en la base de datos.
Cada punto esta un branch distinto.
Reference
이 문제에 관하여(다크 테마 솔로 CSS, MediaQuery 및 자바스크립트 지원), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/geepk/dark-theme-solo-css-mediaquery-y-tambien-con-javascript-30og텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)