Я пытаюсь создать веб-сайт, на котором можно переключать языки с английского на французский, нажав кнопку переключения. Я попробовал несколько способов без Javascript, потому что мало что знаю, и только с CSS, но так и не нашел желаемого результата.
Только <h2 class = "title">welcome!</h2>
меняется на "yoohoo les nazes"
, остальное не меняется.
Кто-нибудь может помочь?
document.querySelector('#togBtn').addEventListener('input', (event) => {
document.querySelector('.title', '.1', '.2', '.3', '.4', '.5').textContent = data[event.currentTarget.checked ? 'francais' : 'english'].title;
.1;
});
var data = {
"english": {
"title": "welcome!",
"1": "My work is primarily inspired by nature.",
"2": "Each creation is unique.",
"3": "The white porcelain I use",
"4": "I studied and graduated",
"5": "I wish to thank"
},
"francais": {
"title": "yoohoo les nazes",
"1": "Mon travail est d'abord inspiré sur la nature.",
"2": "chaque création est unique.",
"3": "La porcelaine blanche que j'utilise",
"4": "j'ai étudiée et sui diplômée",
"5": "j'aimerai remercier"
}
}
.switch {
position: relative;
display: inline-block;
width: 80px;
height: 34px;
}
.switch input {
display: none;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: brown;
-webkit-transition: .4s;
transition: .4s;
}
.slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: 4px;
bottom: 4px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
}
input:checked+.slider {
background-color: burlywood;
}
input:focus+.slider {
box-shadow: 0 0 1px #2196F3;
}
input:checked+.slider:before {
-webkit-transform: translateX(26px);
-ms-transform: translateX(26px);
transform: translateX(45px);
}
.slider {
border-radius: 34px;
}
.slider:before {
border-radius: 50%;
}
.on {
display: none;
}
.on,
.off {
color: white;
position: absolute;
transform: translate(-50%, -50%);
top: 50%;
left: 50%;
font-size: 10px;
font-family: Verdana, sans-serif;
}
input:checked+.slider .on {
display: block;
}
input:checked+.slider .off {
display: none;
}
<link rel = "preconnect" href = "https://fonts.googleapis.com">
<link rel = "preconnect" href = "https://fonts.gstatic.com" crossorigin>
<link href = "https://fonts.googleapis.com/css2?family=Whisper&display=swap" rel = "stylesheet">
<link rel = "stylesheet" href = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css" integrity = "sha512-SnH5WK+bZxgPHs44uWIX+LLJAJ9/2PkPKZ5QiAj6Ta86w+fsb2TkcmfRyVX3pBnMFcV7oQPJkl9QevSCWr3W6A= = " crossorigin = "anonymous" referrerpolicy = "no-referrer"
/>
<label class = "switch">
<input type = "checkbox" id = "togBtn">
<div class = "slider round">
<span language='english' class = "on">EN</span>
<span language='francais' class = "off">FR</span>
</div>
</label>
<ul class = "nav-items">
<div class = "content">
<h2 class = "title">welcome!</h2>
<p class = "1">My work is primarily inspired by nature.</p>
<p class = "2">Each creation is unique.</p>
<p class = "3">The white porcelain I use</p>
<p class = "4">I studied and graduated </p>
<p class = "5">I wish to thank</p>
</div>
</ul>
И, к вашему сведению, вы не можете выбирать на основе классов, которые начинаются с такой цифры, вам нужно будет экранировать ее в селекторе, см. mathiasbynens.be/notes/css-escapes Лучше вообще избегать таких имен классов, и хотя бы используйте нечисловой префикс.
Первая проблема, с которой вы столкнулись, заключается в том, что document.querySelector()
можно выбрать только один элемент. Чтобы выбрать несколько элементов, вместо этого используйте querySelectorAll()
. Однако использованный вами синтаксис неверен. Вам необходимо предоставить один селектор строк, а не несколько аргументов, например:
document.querySelector('.title, .element1, .element2, .element3, .element4, .element5');
Чтобы улучшить качество кода, вы можете использовать один общий класс, который вы добавляете ко всем элементам, подлежащим переводу, я использовал .translate
в следующем примере. Отсюда вы можете перебрать все эти элементы и использовать атрибут data
, чтобы предоставить «ключ» перевода, который будет использоваться для этого конкретного элемента.
Кроме того, обратите внимание, что метки EN
и FR
в переключателе были инвертированы для отображаемого языка.
Наконец, как отметил @CBroe в комментариях, браузеры терпимы к числовым значениям class
и id
, однако это выходит за рамки спецификации и не является хорошей практикой. Вместо этого я преобразовал их в буквенно-цифровые значения.
Вот рабочий пример с внесенными выше изменениями:
document.querySelector('#togBtn').addEventListener('change', e => {
document.querySelectorAll('.translate').forEach(el => {
el.textContent = data[e.target.checked ? 'francais' : 'english'][el.dataset['tkey']];
});
});
var data = {
"english": {
"title": "welcome!",
"para-01": "My work is primarily inspired by nature.",
"para-02": "Each creation is unique.",
"para-03": "The white porcelain I use",
"para-04": "I studied and graduated",
"para-05": "I wish to thank"
},
"francais": {
"title": "yoohoo les nazes",
"para-01": "Mon travail est d'abord inspiré sur la nature.",
"para-02": "chaque création est unique.",
"para-03": "La porcelaine blanche que j'utilise",
"para-04": "j'ai étudiée et sui diplômée",
"para-05": "j'aimerai remercier"
}
}
.switch {
position: relative;
display: inline-block;
width: 80px;
height: 34px;
}
.switch input {
display: none;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: brown;
-webkit-transition: .4s;
transition: .4s;
}
.slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: 4px;
bottom: 4px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
}
input:checked+.slider {
background-color: burlywood;
}
input:focus+.slider {
box-shadow: 0 0 1px #2196F3;
}
input:checked+.slider:before {
-webkit-transform: translateX(26px);
-ms-transform: translateX(26px);
transform: translateX(45px);
}
.slider {
border-radius: 34px;
}
.slider:before {
border-radius: 50%;
}
.on {
display: none;
}
.on,
.off {
color: white;
position: absolute;
transform: translate(-50%, -50%);
top: 50%;
left: 50%;
font-size: 10px;
font-family: Verdana, sans-serif;
}
input:checked+.slider .on {
display: block;
}
input:checked+.slider .off {
display: none;
}
<link rel = "preconnect" href = "https://fonts.googleapis.com">
<link rel = "preconnect" href = "https://fonts.gstatic.com" crossorigin>
<link href = "https://fonts.googleapis.com/css2?family=Whisper&display=swap" rel = "stylesheet">
<link rel = "stylesheet" href = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css" integrity = "sha512-SnH5WK+bZxgPHs44uWIX+LLJAJ9/2PkPKZ5QiAj6Ta86w+fsb2TkcmfRyVX3pBnMFcV7oQPJkl9QevSCWr3W6A= = " crossorigin = "anonymous" referrerpolicy = "no-referrer"
/>
<label class = "switch">
<input type = "checkbox" id = "togBtn">
<div class = "slider round">
<span class = "on">FR</span>
<span class = "off">EN</span>
</div>
</label>
<ul class = "nav-items">
<div class = "content">
<h2 class = "translate" data-tkey = "title">welcome!</h2>
<p class = "translate" data-tkey = "para-01">My work is primarily inspired by nature.</p>
<p class = "translate" data-tkey = "para-02">Each creation is unique.</p>
<p class = "translate" data-tkey = "para-03">The white porcelain I use</p>
<p class = "translate" data-tkey = "para-04">I studied and graduated </p>
<p class = "translate" data-tkey = "para-05">I wish to thank</p>
</div>
</ul>
Просто отметим, что технически вы можете использовать оператор запятой: document.querySelectorAll('.title, .1, .2, .3, .4, .5') должно быть в порядке.
@Symtox, ты совершенно прав. Я обновил ответ, чтобы быть более точным. Спасибо!
Помимо идеального решения, предложенного @Rory McCrossan, я предлагаю другое решение, использующее полезные «селекторы с подстановочными знаками» и индекс массива без атрибута данных.
let checkBox = document.querySelector('#togBtn')
var data = {
"english": {
"0": "welcome!",
"1": "My work is primarily inspired by nature.",
"2": "Each creation is unique.",
"3": "The white porcelain I use",
"4": "I studied and graduated",
"5": "I wish to thank"
},
"francais": {
"0": "yoohoo les nazes",
"1": "Mon travail est d'abord inspiré sur la nature.",
"2": "chaque création est unique.",
"3": "La porcelaine blanche que j'utilise",
"4": "j'ai étudiée et sui diplômée",
"5": "j'aimerai remercier"
}
}
checkBox.addEventListener('change', () => {
let elemToChange = document.querySelectorAll('[class^ = "myclass"]')
elemToChange.forEach((elem,idx)=>{
elem.innerHTML=data[checkBox.checked ? "francais" : "english"][idx]
})
});
.switch {
position: relative;
display: inline-block;
width: 80px;
height: 34px;
}
.switch input {
display: none;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: brown;
-webkit-transition: .4s;
transition: .4s;
}
.slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: 4px;
bottom: 4px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
}
input:checked+.slider {
background-color: burlywood;
}
input:focus+.slider {
box-shadow: 0 0 1px #2196F3;
}
input:checked+.slider:before {
-webkit-transform: translateX(26px);
-ms-transform: translateX(26px);
transform: translateX(45px);
}
.slider {
border-radius: 34px;
}
.slider:before {
border-radius: 50%;
}
.on {
display: none;
}
.on,
.off {
color: white;
position: absolute;
transform: translate(-50%, -50%);
top: 50%;
left: 50%;
font-size: 10px;
font-family: Verdana, sans-serif;
}
input:checked+.slider .on {
display: block;
}
input:checked+.slider .off {
display: none;
}
<body>
<label class = "switch">
<input type = "checkbox" id = "togBtn">
<div class = "slider round">
<span language='english' class = "off">En</span>
<span language='francais' class = "on">Fr</span>
</div>
</label>
<ul class = "nav-items">
<div class = "content">
<h2 class = "myclass0">welcome!</h2>
<p class = "myclass1">My work is primarily inspired by nature.</p>
<p class = "myclass2">Each creation is unique.</p>
<p class = "myclass3">The white porcelain I use</p>
<p class = "myclass4">I studied and graduated </p>
<p class = "myclass5">I wish to thank</p>
</div>
</ul>
</body>
.
document.querySelector('.title', '.1', '.2', '.3', '.4', '.5').textContent =
- вы не можете использоватьquerySelector
таким образом, он принимает только один параметр. Вы хотите использоватьquerySelectorAll
с одним параметром, который выбирает все эти элементы, а затем вам нужно перебрать полученный список элементов и установить текстовое содержимое для каждого из них индивидуально.