Rehber JavaScript ile Karanlık Tema Yapımı

  • Konuyu başlatan MCV
  • Başlangıç Tarihi
  • Mesaj 5
  • Görüntüleme 1.216
Herkese selam :) Vanilla JavaScript kullanarak nasıl bir karanlık tema uygulaması yapılır, onu gösterdim. Nasıl yapıldığını görmek ve siz de yapmak isterseniz aşağıdaki Codepen linkine göz atabilirsiniz.

HTML:
<button id="switch" class="switch"></button>

CSS:
* {
    /* Tarayıcı css sıfırlama */
    margin: 0;
    padding: 0;
    box-sizing: border-box;
    outline: none;
    border: none;
    list-style: none;
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}

/*
:root sözde sınıfı, en üst düzey ebeveyn öğesini temsil eder. Yani bir html sayfada bu html etiketi anlamına geliyor.
Fakat css’in kullanım alanlarının artmasıyla örneğin svg ve xml’de kullanılırken, :root sözde sınıfı başka bir öğeyi temsil ediyor olabilir.
 */

:root {
    --bg: #fff;
    --button-bg: #000;
    --button-color: #fff;
    --button-hover: rgba(0, 0, 0, 0.87);
}

.dark-mode:root {
    --bg: #000;
    --button-bg: #fff;
    --button-color: #000;
    --button-hover: rgba(255, 255, 255, 0.85);
}

html,
body {
    height: 100%;
}

body {
    display: flex;
    justify-content: center;
    align-items: center;
    background: var(--bg);
    transition: background 500ms;
}

.switch {
    width: auto;
    height: 50px;
    cursor: pointer;
    color: var(--button-color);
    font-size: 18px;
    background: var(--button-bg);
    border-radius: 5px;
    text-transform: uppercase;
    padding: 0 20px;
    transition: 500ms background-color;
}

.switch i {
    margin-right: 15px;
}

i.fas.fa-moon {
    color: #fff;
}

i.fas.fa-sun {
    color: #FDB813;
}

.switch:hover {
    background-color: var(--button-hover);
}

JavaScript:
// Tema değiştirici buttonumuzu bir değişkene atıyoruz
const switcher = document.querySelector('#switch')

// Sayfa yüklendiği zaman fonksiyon çalıştır
document.addEventListener('DOMContentLoaded', () => {
    // dark keyine sahip bir localstorage itemi var mı kontrol et
    if(localStorage.getItem('dark')) {
        // Varsa html etiketine dark-mode ekle ve buttonumuzun içeriğini değiştir
        document.documentElement.classList.add('dark-mode')
        switcher.innerHTML = `<i class="fas fa-sun"></i> Aydınlık tema`
    } else {
        // Yoksa html etiketine dark-mode ekle ve buttonumuzun içeriğini değiştir
        switcher.innerHTML = `<i class="fas fa-moon"></i> Karanlık tema`
    }
})

// Buttonumuza tıklandığı zaman fonksiyon çalıştır
switcher.addEventListener('click', () => {
    // Html etiketinde dark-mode classini toggle et. Yani varsa sil yoksa ekle classı
    document.documentElement.classList.toggle('dark-mode');
    // Eğer bu class htmlde tanımlıysa
    if(document.documentElement.classList.contains('dark-mode')) {
        // buttonumuzun içeriğini değiştir ve dark keyine sahip değeri true olan bir localstorage itemi oluştur
        switcher.innerHTML = `<i class="fas fa-sun"></i> Aydınlık tema`
        localStorage.setItem('dark', true)
    } else {
        // Eğer bu class htmlde tanımlı değilse buttonumuzun içeriğini değiştir ve dark keyine sahip localstorage itemini sil
        switcher.innerHTML = `<i class="fas fa-moon"></i> Karanlık tema`
        localStorage.removeItem('dark')
    }
})


Makaleyi düzenleyen moderatöre teşekkür ederim. Nedense kendim eklerken Javascript kodunu hata aldım consoleda.
 
Başarılı.

Kullanıcının temayı varsayılan ayar olarak seçmesini istemiyorsanız localStorage kullanmayın.

Bir de şunu eklemek istiyorum, CSS'te 1-2 satır kodla karanlık tema yapılabiliyor. Kullandığınız filtrenin resimlere etki etmemesi için :not(img) şeklinde bir sözdizimi kullanabilirsiniz.
 
Başarılı.

Kullanıcının temayı varsayılan ayar olarak seçmesini istemiyorsanız localStorage kullanmayın.
Teşekkürler dostum :)
Sanırım şundan bahsediyorsun @oynozan ;
CSS:
html[theme='dark-mode'] {
    filter: invert(1) hue-rotate(180deg);
}
html[theme='dark-mode'] img{
    filter: invert(1) hue-rotate(180deg);
}
html {
    transition: color 300ms, background-color 300ms;
}
 
Son düzenleme:
Sanırım şundan bahsediyorsun @oynozan ;
CSS:
html[theme='dark-mode'] {
    filter: invert(1) hue-rotate(180deg);
}
html[theme='dark-mode'] img{
    filter: invert(1) hue-rotate(180deg);
}
html {
    transition: color 300ms, background-color 300ms;
}
Aynen bu.
 
Ben karanlık tema için bunları kullanıyorum.
[CODE lang="css" title="CSS" highlight="33-63"]:root {
/*

Renk paletleri için Arctic Ice Studio'ya teşekkürlerimi sunarım.
https://www.nordtheme.com/

*/

/* Kutup gecesi mavisi */
--nord0: #2e3440;
--nord1: #3b4252;
--nord2: #434c5e;
--nord3: #4c566a;

/* Kar beyazı */
--nord4: #d8dee9;
--nord5: #e5e9f0;
--nord6: #eceff4;

/* Don mavisi (hayır, buzdan bahsediyorum 🙂)*/
--nord7: #8fbcbb;
--nord8: #88c0d0;
--nord9: #81a1c1;
--nord10: #5e81ac;

/* Pastel renk paletleri */
--nord11: #bf616a;
--nord12: #d08770;
--nord13: #ebcb8b;
--nord14: #a3be8c;
--nord15: #b48ead;
}
@media (prefers-color-scheme: light) {
body {
background: var(--nord6) !important;
color: var(--nord0) !important;
}

.nav {
box-shadow: 0 0 50px 0 rgba(0, 0, 0, 0.2) !important;
}

a {
color: var(--nord10) !important;
}

.sitebaslik {
background: linear-gradient(to right, var(--nord8), var(--nord9)) !important;
box-shadow: 0 10px 20px 0 rgba(80, 92, 172, 0.4) !important;
}

.nav a {
color: var(--nord10) !important;
}

.sitebaslik a {
color: var(--nord0) !important;
}

.copyright a {
color: var(--nord9) !important;
}
}
body {
background: var(--nord0);
color: var(--nord6);
font-family: Cantarell, Ubuntu, Roboto;
margin: 0;
}

.nav {
list-style-type: none;
margin: 0;
padding: 0;
width: 25%;
height: 100%;
position: fixed;
overflow: auto;
box-shadow: 0 0 50px 0 rgba(0, 0, 0, 0.3);
transition: 200ms ease-in-out;
}

.nav a {
display: block;
padding: 8px 16px;
text-decoration: none;
transition: 200ms ease-in-out;
}

a {
color: var(--nord9);
text-decoration: none;
}

.sitebaslik {
background: linear-gradient(to right, var(--nord9), var(--nord10));
margin: 30px;
padding: 20px;
border-radius: 15px;
cursor: default;
box-shadow: 0 10px 20px 0 rgba(0, 0, 0, 0.3);
transition: 200ms ease-in-out;
}

.nav a {
display: block;
padding: 8px 50px;
margin-bottom: 10px;
text-decoration: none;
transition: 200ms ease-in-out;
}

.sitebaslik a {
color: var(--nord0);
cursor: default;
margin: -10px;
font-size: 29px;
font-weight: 900;
align-items: center;
transition: 200ms ease-in-out;
}

@media (max-width: 1340px) {
.sitebaslik a {
font-size: 25px;
}
.sitebaslik {
background: linear-gradient(to right, var(--nord9), var(--nord10));
margin: 30px;
padding: 0px;
border-radius: 15px;
cursor: default;
box-shadow: 0 10px 20px 0 rgba(0, 0, 0, 0.7);
animation: baslikhareket 4s ease-in-out infinite;
}
}

@media (max-width: 1180px) {
.sitebaslik a {
font-size: 20px;
}
.sitebaslik {
background: linear-gradient(to right, var(--nord9), var(--nord10));
margin: 30px;
padding: 0px;
border-radius: 15px;
cursor: default;
box-shadow: 0 10px 20px 0 rgba(0, 0, 0, 0.7);
animation: baslikhareket 4s ease-in-out infinite;
}
}

@media (max-width: 1000px) {
.sitebaslik a {
font-size: 17px;
}
.sitebaslik {
background: linear-gradient(to right, var(--nord9), var(--nord10));
margin: 30px;
padding: 0px;
border-radius: 15px;
cursor: default;
box-shadow: 0 10px 20px 0 rgba(0, 0, 0, 0.7);
animation: baslikhareket 4s ease-in-out infinite;
}
}

@media (max-width: 920px) {
.sitebaslik li {
margin-top: 20px;
}
.sitebaslik li * {
margin-top: 20px;
}
.sitebaslik a {
display: none;
}
.sitebaslik {
display: none;
}
}

@media (max-width: 700px) {
.nav {
display: none;
}
.metin {
margin-left: 0px;
display: unset;
}
body {
margin: 0 0 1220px 20px;
}
img {
height: 200px;
}
}

.metin {
margin-left: 25%;
padding: 1px 16px;
height: 1000px;
}

.copyright {
display: block;
padding: 8px 50px;
color: var(--nord10);
margin-bottom: 10px;
text-decoration: none;
font-size: 12px;
}

.copyright a {
margin: 0;
padding: 0;
display: unset;
}

img {
width: 97%;
max-width: max-content;
height: auto;
box-shadow: 0 10px 30px 0 rgba(0, 0, 0, 0.3);
border-radius: 8px;
}[/CODE]
 
Ben karanlık tema için bunları kullanıyorum.
[CODE lang="css" title="CSS" highlight="33-63"]:root {
/*

Renk paletleri için Arctic Ice Studio'ya teşekkürlerimi sunarım.
https://www.nordtheme.com/

*/

/* Kutup gecesi mavisi */
--nord0: #2e3440;
--nord1: #3b4252;
--nord2: #434c5e;
--nord3: #4c566a;

/* Kar beyazı */
--nord4: #d8dee9;
--nord5: #e5e9f0;
--nord6: #eceff4;

/* Don mavisi (hayır, buzdan bahsediyorum 🙂)*/
--nord7: #8fbcbb;
--nord8: #88c0d0;
--nord9: #81a1c1;
--nord10: #5e81ac;

/* Pastel renk paletleri */
--nord11: #bf616a;
--nord12: #d08770;
--nord13: #ebcb8b;
--nord14: #a3be8c;
--nord15: #b48ead;
}
@media (prefers-color-scheme: light) {
body {
background: var(--nord6) !important;
color: var(--nord0) !important;
}

.nav {
box-shadow: 0 0 50px 0 rgba(0, 0, 0, 0.2) !important;
}

a {
color: var(--nord10) !important;
}

.sitebaslik {
background: linear-gradient(to right, var(--nord8), var(--nord9)) !important;
box-shadow: 0 10px 20px 0 rgba(80, 92, 172, 0.4) !important;
}

.nav a {
color: var(--nord10) !important;
}

.sitebaslik a {
color: var(--nord0) !important;
}

.copyright a {
color: var(--nord9) !important;
}
}
body {
background: var(--nord0);
color: var(--nord6);
font-family: Cantarell, Ubuntu, Roboto;
margin: 0;
}

.nav {
list-style-type: none;
margin: 0;
padding: 0;
width: 25%;
height: 100%;
position: fixed;
overflow: auto;
box-shadow: 0 0 50px 0 rgba(0, 0, 0, 0.3);
transition: 200ms ease-in-out;
}

.nav a {
display: block;
padding: 8px 16px;
text-decoration: none;
transition: 200ms ease-in-out;
}

a {
color: var(--nord9);
text-decoration: none;
}

.sitebaslik {
background: linear-gradient(to right, var(--nord9), var(--nord10));
margin: 30px;
padding: 20px;
border-radius: 15px;
cursor: default;
box-shadow: 0 10px 20px 0 rgba(0, 0, 0, 0.3);
transition: 200ms ease-in-out;
}

.nav a {
display: block;
padding: 8px 50px;
margin-bottom: 10px;
text-decoration: none;
transition: 200ms ease-in-out;
}

.sitebaslik a {
color: var(--nord0);
cursor: default;
margin: -10px;
font-size: 29px;
font-weight: 900;
align-items: center;
transition: 200ms ease-in-out;
}

@media (max-width: 1340px) {
.sitebaslik a {
font-size: 25px;
}
.sitebaslik {
background: linear-gradient(to right, var(--nord9), var(--nord10));
margin: 30px;
padding: 0px;
border-radius: 15px;
cursor: default;
box-shadow: 0 10px 20px 0 rgba(0, 0, 0, 0.7);
animation: baslikhareket 4s ease-in-out infinite;
}
}

@media (max-width: 1180px) {
.sitebaslik a {
font-size: 20px;
}
.sitebaslik {
background: linear-gradient(to right, var(--nord9), var(--nord10));
margin: 30px;
padding: 0px;
border-radius: 15px;
cursor: default;
box-shadow: 0 10px 20px 0 rgba(0, 0, 0, 0.7);
animation: baslikhareket 4s ease-in-out infinite;
}
}

@media (max-width: 1000px) {
.sitebaslik a {
font-size: 17px;
}
.sitebaslik {
background: linear-gradient(to right, var(--nord9), var(--nord10));
margin: 30px;
padding: 0px;
border-radius: 15px;
cursor: default;
box-shadow: 0 10px 20px 0 rgba(0, 0, 0, 0.7);
animation: baslikhareket 4s ease-in-out infinite;
}
}

@media (max-width: 920px) {
.sitebaslik li {
margin-top: 20px;
}
.sitebaslik li * {
margin-top: 20px;
}
.sitebaslik a {
display: none;
}
.sitebaslik {
display: none;
}
}

@media (max-width: 700px) {
.nav {
display: none;
}
.metin {
margin-left: 0px;
display: unset;
}
body {
margin: 0 0 1220px 20px;
}
img {
height: 200px;
}
}

.metin {
margin-left: 25%;
padding: 1px 16px;
height: 1000px;
}

.copyright {
display: block;
padding: 8px 50px;
color: var(--nord10);
margin-bottom: 10px;
text-decoration: none;
font-size: 12px;
}

.copyright a {
margin: 0;
padding: 0;
display: unset;
}

img {
width: 97%;
max-width: max-content;
height: auto;
box-shadow: 0 10px 30px 0 rgba(0, 0, 0, 0.3);
border-radius: 8px;
}[/CODE]
elinize sağlık hocam
 
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Geri
Yukarı