Как сохранить значение темы с помощью cookie

154
10 апреля 2019, 08:00

У меня есть сайт на котором есть возможность пользователю сменить задний фон, меняет он его только для себя.

Проблема заключается в том, что фон не сохраняется при перезапуске страницы или при переходе на другую страницу сайта.

Код написан, смена фона написана only CSS + HTML, без JS. Хотелось бы, чтоб при перезагрузке страницы фон сохранился.

HTML:

<input id="settings-btn" type="checkbox" class="settings-btn">
<label for="settings-btn" class="settings-box-element"><i class="fa fa-2x fa-gear"></i></label>
<div class="buttons-wrapper settings-box-element"></div>
<input id="light-layout" class="light-layout" type="radio" name="layout" checked>
<label for="light-layout" class="layout-buttons settings-box-element">Космос</label>
<input id="dark-layout" class="dark-layout" type="radio" name="layout">
<label for="dark-layout" class="layout-buttons settings-box-element">Закат</label>
<input id="image-layout" class="image-layout" type="radio" name="layout">
<label for="image-layout" class="layout-buttons settings-box-element">Няши</label>
<input id="pattern-layout" class="pattern-layout" type="radio" name="layout">
<label for="pattern-layout" class="layout-buttons settings-box-element">Техно-город</label>

CSS:

* {
  transition: all 0.3s;
  box-sizing: border-box;
}

.main-wrapper {
  height: 100%;
}
.content {
  margin: auto;
  max-width: 600px;
  padding: 30px;
  background: #777;
  color: white;
}
/*==========================================
    settings box
==========================================*/
input[type="checkbox"], input[type="radio"] {
  position: absolute;
  visibility: hidden;
}
.settings-box-element {
  z-index: 10;
}
.buttons-wrapper {
  position: fixed;
  top: 130px;
  right: -200px;
  width: 200px;
  height: 200px;
  background: #fff;
}
.settings-btn + label {
  position: fixed;
  top: 130px;
  right: 0;
  display: block;
  width: 35px;
  color: #e83737;
  text-align: center;
  background: #fff;
  cursor: pointer;
}
.settings-btn:checked + label {
  right: 200px;
}
.settings-btn:checked ~ .buttons-wrapper {
  right: 0;
}
.layout-buttons {
  display: block;
  width: 150px;
  padding: 10px 0;
  text-align: center;
  border: 2px solid black;
  box-sizing: border-box;
  font-size: 0.875em;
  cursor: pointer;
}
.settings-btn:checked ~ .layout-buttons {
  right: 30px;
}
input[type="radio"]:checked + label {
  background: #e83737;
  color: #fff;
  border-color: #e83737;
}
.light-layout + label {
  position: fixed;
  top: 140px;
  right: -150px;
}
.dark-layout + label {
  position: fixed;
  top: 185px;
  right: -150px;
}
.image-layout + label {
  position: fixed;
  top: 230px;
  right: -150px;
}
.pattern-layout + label {
  position: fixed;
  top: 275px;
  right: -150px;
}
.hide-show-content + label {
  position: fixed;
  top: 320px;
  right: -150px;
}
.dark-layout:checked ~ .main-wrapper {
        background: url(../images/1.jpg) no-repeat center center fixed;
       -webkit-background-size: cover;
       -moz-background-size: cover;
    background-size: cover;
        position: relative;
           height:100%;
}
.light-layout:checked ~ .main-wrapper {
        background: url(../images/2.jpg) no-repeat center center fixed;
       -webkit-background-size: cover;
       -moz-background-size: cover;
    background-size: cover;
        position: relative;
           height:100%;
}
.image-layout:checked ~ .main-wrapper {
        background: url(../images/3.jpg) no-repeat center center fixed;
       -webkit-background-size: cover;
       -moz-background-size: cover;
    background-size: cover;
        position: relative;
           height:100%;
}
.pattern-layout:checked ~ .main-wrapper {
        background: url(../images/7.jpg) no-repeat center center fixed;
       -webkit-background-size: cover;
       -moz-background-size: cover;
    background-size: cover;
        position: relative;
           height:100%;
}

Я понимаю, что нужно сделать через куки, но я не знаю как. В этом всём я не давно и очень прошу объяснять развернуто и доходчиво.

Answer 1

Вставляем данный JavaScript код в удобное для вас место.

// возвращает cookie с именем name, если есть, если нет, то undefined
function getCookie(name) {
    var matches = document.cookie.match(new RegExp(
        "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
    ));
    return matches ? decodeURIComponent(matches[1]) : undefined;
}
// Функция для создания/обновления cookie
function setCookie(name, value, options) {
    options = options || {};
    var expires = options.expires;
    if (typeof expires == "number" && expires) {
        var d = new Date();
        d.setTime(d.getTime() + expires * 1000);
        expires = options.expires = d;
    }
    if (expires && expires.toUTCString) {
        options.expires = expires.toUTCString();
    }
    value = encodeURIComponent(value);
    var updatedCookie = name + "=" + value;
    for (var propName in options) {
        updatedCookie += "; " + propName;
        var propValue = options[propName];
        if (propValue !== true) {
            updatedCookie += "=" + propValue;
        }
    }
    document.cookie = updatedCookie;
}
// Сохраняем выбранный фон в cookie
$(document).on('change', '[name="layout"]', function () {
    setCookie('layout', $(this).attr('class'), {expires: 3600 * 24 * 365});
});
// Раскомментировать код ниже у случае когда нет возможности использовать PHP
/* $(document).ready(function () {
    // Получаем cookie с именем layout
    var fon = getCookie('layout');
    // если пользователь ранее ничего не выбирал то выводим по дефолту light-layout
    if (typeof fon == "undefined") fon = 'light-layout';
    // Переключаем на нужный нам фон
    $('.' + fon).attr('checked', 'checked');
}); */

А теперь подправим немного HTML разметку

    <input <?= isset($_COOKIE['layout']) && $_COOKIE['layout'] == 'light-layout' ? 'checked' : '' ?> id="light-layout" class="light-layout" type="radio" name="layout" checked>
    <label for="light-layout" class="layout-buttons settings-box-element">Космос</label>
    <input <?= isset($_COOKIE['layout']) && $_COOKIE['layout'] == 'dark-layout' ? 'checked' : '' ?> id="dark-layout" class="dark-layout" type="radio" name="layout">
    <label for="dark-layout" class="layout-buttons settings-box-element">Закат</label>
    <input <?= isset($_COOKIE['layout']) && $_COOKIE['layout'] == 'image-layout' ? 'checked' : '' ?> id="image-layout" class="image-layout" type="radio" name="layout">
    <label for="image-layout" class="layout-buttons settings-box-element">Няши</label>
    <input <?= isset($_COOKIE['layout']) && $_COOKIE['layout'] == 'pattern-layout' ? 'checked' : '' ?> id="pattern-layout" class="pattern-layout" type="radio" name="layout">
    <label for="pattern-layout" class="layout-buttons settings-box-element">Техно-город</label>
READ ALSO
Написать расширение для php 7

Написать расширение для php 7

Никогда не связывался с этим, вот решил заняться, интересует вопрос как правильно написать расширение под php 7, чтобы выполнялся простейший...

182
Открыть файл в /root/ из /www/html

Открыть файл в /root/ из /www/html

Как открыть файл, который находится в директории root прямиком из Под сайтаТ

185
cURL Error (28): Operation timed out after

cURL Error (28): Operation timed out after

Стоит задача парсинга robotstxt

134
Форма связи и копиями полей

Форма связи и копиями полей

Возможно не правильно задал вопросМожно ли как-то сделать форму, чтобы при заполнении и отправке происходила отправка письма и тут же появлялось...

138