1665651180
When you gather emails from your users or visitors, you want to make sure they’re valid and functional. Otherwise, you risk cutting users off from their accounts or cluttering your database with fake addresses you’ll have no use for. Luckily, there are several fairly obvious approaches to validating emails in Python.
Why bother, though, one might ask. There’s plenty of significant reasons behind having proper validation in place:
When you’re, for example, offering access to free Wi-Fi or an online resource in exchange for someone’s email address, some (many) users will provide fake addresses. Some others will use a disposable, 10-minute-mail account that will be gone by the time you finish your morning coffee. Each message resulting in a hard bounce, will increase the chance of emails sent to legitimate addresses going to spam or bouncing as well.
In all honesty, nearly always I leave a wsbfre@fwejfb.com-type of email address when forced to sign in to airport Wi-Fi. And I’m sure most fellow travelers do the same. Whoever tries to utilize this database without any validation must be enjoying some pretty dramatic delivery rates.
There will always be typos and large databases will be flooded with the kind of “gmial.com” or “outlook.con” addresses if no validation is in place. If your app accepts that kind of addresses without a blink of the (virtual) eye, users might be effectively locked out of their account before they even access it for the first time. Your confirmation emails will bounce too, further hurting your deliverability.
Having a valid email address lets you reach them on any occasion. You can chase them when they abandon their card or a payment fails or just keep them in the loop about features and tips. If an email address is all they provide at registration, you don’t want to have an invalid one on your records.
It’s important to note that there’s no 100% error-proof method of validating emails other than just emailing a user. And for the top reason stated above, you shouldn’t do it. But the methods we’re going to present are quite effective and have saved thousands of Python devs from collecting useless addresses.
The first approach is to use a regex in Python. It will check inserted addresses for certain conditions and return a “valid” or “invalid” response.
Example 1:
This regex checks if an email address has a proper format. It also verifies if the top-level domain length is between two and four characters. You might want to raise the final number to a higher value to include top-level domains such as .travel, but that might also lead to some false positives.
^[w-.]+@([w-]+.)+[w-]{2,4}$
This script is not any good for catching typos or fake email addresses such as !32d!3@dfsjn@dwef.com, but it will do for a very basic check.
Example 2:
Let’s make it more sophisticated and assume we want the following criteria to be met for an account@domain email address:
^[a-z]([w-]*[a-z]|[w-.]*[a-z]{2,}|[a-z])*@[a-z]([w-]*[a-z]|[w-.]*[a-z]{2,}|[a-z]){4,}?.[a-z]{2,}$
This is also a basic regex, and it will still capture some fake addresses. Although .com, .org or .net domains need to be two or more characters long, many other top-level domains will allow just one character to be present. For example, Google’s Chinese domain, g.cn, would fail this test, but emails sent to big_brother@g.cn may just reach the target.
Above all, this regex completely ignores 99.9% of typos, making it ineffective as a standalone solution.
Example 3:
Since the other two examples did almost nothing about typos, you can also include another condition for popular email providers, such as Gmail:
import re
example = "example@gmial.com"
if re.search("@gm(ia|a|i)l.com$", example):
print("Maybe you meant @gmail.com?")
If the domain name is gmial.com, gmal.com or gmil.com (very very likely indicating a Gmail account) then we can show a warning to the user.
Of course, to validate all possible typos, more sophisticated methods should be used, but listing the most common typos might just do the job.
Be aware that however sophisticated regex you write, it will eventually fail for some legitimate email. Read more about the possible trade-offs here. If you don’t require perfect accuracy, a script will do for your needs.
Another way of running sophisticated checks is with ready-to-use packages, and there are plenty to choose from. Here are several popular options:
This library focuses strictly on the domain part of an email address, and checks if it’s in an x@y.com format.
As a bonus, the library also comes with a validation tool. It checks if the domain name can be resolved, thus giving you a good idea about its validity.
This Python program to validate email addresses can also be used to validate both a domain and an email address with just one call. If a given address can’t be validated, the script will inform you of the most likely reasons.
This comprehensive library checks an email address for a proper structure, but it doesn’t just stop there.
It also verifies if the domain’s MX records exist (as in, is able to send/receive emails), whether a particular address on this domain exists, and also if it’s not blacklisted. This way, you avoid emailing blacklisted accounts, which would affect deliverability.
Finally, there’re also a number of APIs you can use with your Python app. Here are some popular choices:
This REST API verifies the format of each email. Like the libraries we just talked about, it also verifies if MX records exist and if an address is disposable. It offers a score for each email address checked.
Mailboxlayer is free to use with up to 250 requests per month. If you need more than that, the plans start from $9.99 per month with additional functionality available.
This simple API checks for SMTP servers on the domain provided. It then verifies if an email address exists in this domain.
100 requests/day are offered for free. You then pay $3 for every 5,000 requests, with no subscription plan.
Sendgrid’s Email Validation API
This sophisticated API runs a number of checks to determine a score for each email address. It checks, as predecessors on this list, for MX records, and also looks for A records. SendGrid will also easily track down disposable and role addresses (admin@, support@ etc.)
SendGrid claims to use machine learning to determine the likelihood of a bounce, and with the amount of data they have at their disposal, these might prove to be pretty accurate predictions.
Sendgrid’s Email Validation API is only available to its customers on paid plans. For detailed pricing and a calculator, consult their page.
Many ESPs will incorporate their own techniques for validating emails. They may be more sophisticated than the scripts we listed above, but won’t be bullet-proof (until an email is sent).
If you’ve already accumulated a list of email addresses and want to validate them in bulk, there are a number of free tools, such as ValidateEmailAddress.org or emailvalidator.co. You upload your list of contacts and, for each, they will return either of the following results:
Other considerations
Validating emails is just one aspect of successful email campaigns in Python. Another is testing if emails are sent out as expected. This is something that Mailtrap can help you with.
Mailtrap is an environment for pre-production email testing. You route your test emails to your Mailtrap inbox so you inspect them, check them against spam filters and improve them before they’re sent to real users.
That's it! Thank you for reading our guide on how to overcome python validate_email 500 error. The article was initially written by Piotr Malek for the Mailtrap blog.
1655730729
Neste guia, você aprenderá como criar botões de rádio personalizados incríveis usando apenas HTML e CSS. Para criar botões de rádio personalizados incríveis usando apenas HTML e CSS. Primeiro, você precisa criar dois arquivos, um arquivo HTML e outro arquivo CSS.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Custom Radio Buttons | Codequs</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="wrapper">
<div class="title">Select your option</div>
<div class="box">
<input type="radio" name="select" id="option-1">
<input type="radio" name="select" id="option-2">
<input type="radio" name="select" id="option-3">
<input type="radio" name="select" id="option-4">
<label for="option-1" class="option-1">
<div class="dot"></div>
<div class="text">Gamer</div>
</label>
<label for="option-2" class="option-2">
<div class="dot"></div>
<div class="text">YouTuber</div>
</label>
<label for="option-3" class="option-3">
<div class="dot"></div>
<div class="text">Student</div>
</label>
<label for="option-4" class="option-4">
<div class="dot"></div>
<div class="text">Developer</div>
</label>
</div>
</div>
</body>
</html>
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap');
*{
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Poppins', sans-serif;
}
html,body{
display: grid;
height: 100%;
place-items: center;
}
.wrapper{
width: 350px;
background: #fff;
border-radius: 10px;
box-shadow: 5px 5px 30px rgba(0,0,0,0.2);
}
.wrapper .title{
color: #fff;
line-height: 65px;
text-align: center;
background: #333;
font-size: 25px;
font-weight: 500;
border-radius: 10px 10px 0 0;
}
.wrapper .box{
padding: 20px 30px;
background: #fff;
border-radius: 10px;
}
.wrapper .box label{
display: flex;
height: 53px;
width: 100%;
align-items: center;
border: 1px solid lightgrey;
border-radius: 50px;
margin: 10px 0;
padding-left: 20px;
cursor: default;
transition: all 0.3s ease;
}
#option-1:checked ~ .option-1,
#option-2:checked ~ .option-2,
#option-3:checked ~ .option-3,
#option-4:checked ~ .option-4{
background: #333;
border-color: #333;
}
.wrapper .box label .dot{
height: 20px;
width: 20px;
background: #d9d9d9;
border-radius: 50%;
position: relative;
transition: all 0.3s ease;
}
#option-1:checked ~ .option-1 .dot,
#option-2:checked ~ .option-2 .dot,
#option-3:checked ~ .option-3 .dot,
#option-4:checked ~ .option-4 .dot{
background: #fff;
}
.box label .dot::before{
position: absolute;
content: "";
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(2);
width: 9px;
height: 9px;
border-radius: 50%;
transition: all 0.3s ease;
}
#option-1:checked ~ .option-1 .dot::before,
#option-2:checked ~ .option-2 .dot::before,
#option-3:checked ~ .option-3 .dot::before,
#option-4:checked ~ .option-4 .dot::before{
background: #333;
transform: translate(-50%, -50%) scale(1);
}
.wrapper .box label .text{
color: #333;
font-size: 18px;
font-weight: 400;
padding-left: 10px;
transition: color 0.3s ease;
}
#option-1:checked ~ .option-1 .text,
#option-2:checked ~ .option-2 .text,
#option-3:checked ~ .option-3 .text,
#option-4:checked ~ .option-4 .text{
color: #fff;
}
.wrapper .box input[type="radio"]{
display: none;
}
Agora você criou com sucesso botões de rádio personalizados incríveis usando apenas HTML e CSS.
1655734395
Trong hướng dẫn này, bạn sẽ học cách tạo các Nút radio tùy chỉnh tuyệt vời chỉ bằng HTML và CSS. Để tạo các Nút radio tùy chỉnh tuyệt vời chỉ bằng HTML và CSS. Đầu tiên, bạn cần tạo hai Tệp, một Tệp HTML và một tệp khác là Tệp CSS.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Custom Radio Buttons | Codequs</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="wrapper">
<div class="title">Select your option</div>
<div class="box">
<input type="radio" name="select" id="option-1">
<input type="radio" name="select" id="option-2">
<input type="radio" name="select" id="option-3">
<input type="radio" name="select" id="option-4">
<label for="option-1" class="option-1">
<div class="dot"></div>
<div class="text">Gamer</div>
</label>
<label for="option-2" class="option-2">
<div class="dot"></div>
<div class="text">YouTuber</div>
</label>
<label for="option-3" class="option-3">
<div class="dot"></div>
<div class="text">Student</div>
</label>
<label for="option-4" class="option-4">
<div class="dot"></div>
<div class="text">Developer</div>
</label>
</div>
</div>
</body>
</html>
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap');
*{
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Poppins', sans-serif;
}
html,body{
display: grid;
height: 100%;
place-items: center;
}
.wrapper{
width: 350px;
background: #fff;
border-radius: 10px;
box-shadow: 5px 5px 30px rgba(0,0,0,0.2);
}
.wrapper .title{
color: #fff;
line-height: 65px;
text-align: center;
background: #333;
font-size: 25px;
font-weight: 500;
border-radius: 10px 10px 0 0;
}
.wrapper .box{
padding: 20px 30px;
background: #fff;
border-radius: 10px;
}
.wrapper .box label{
display: flex;
height: 53px;
width: 100%;
align-items: center;
border: 1px solid lightgrey;
border-radius: 50px;
margin: 10px 0;
padding-left: 20px;
cursor: default;
transition: all 0.3s ease;
}
#option-1:checked ~ .option-1,
#option-2:checked ~ .option-2,
#option-3:checked ~ .option-3,
#option-4:checked ~ .option-4{
background: #333;
border-color: #333;
}
.wrapper .box label .dot{
height: 20px;
width: 20px;
background: #d9d9d9;
border-radius: 50%;
position: relative;
transition: all 0.3s ease;
}
#option-1:checked ~ .option-1 .dot,
#option-2:checked ~ .option-2 .dot,
#option-3:checked ~ .option-3 .dot,
#option-4:checked ~ .option-4 .dot{
background: #fff;
}
.box label .dot::before{
position: absolute;
content: "";
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(2);
width: 9px;
height: 9px;
border-radius: 50%;
transition: all 0.3s ease;
}
#option-1:checked ~ .option-1 .dot::before,
#option-2:checked ~ .option-2 .dot::before,
#option-3:checked ~ .option-3 .dot::before,
#option-4:checked ~ .option-4 .dot::before{
background: #333;
transform: translate(-50%, -50%) scale(1);
}
.wrapper .box label .text{
color: #333;
font-size: 18px;
font-weight: 400;
padding-left: 10px;
transition: color 0.3s ease;
}
#option-1:checked ~ .option-1 .text,
#option-2:checked ~ .option-2 .text,
#option-3:checked ~ .option-3 .text,
#option-4:checked ~ .option-4 .text{
color: #fff;
}
.wrapper .box input[type="radio"]{
display: none;
}
Bây giờ bạn đã tạo thành công các Nút radio tùy chỉnh tuyệt vời chỉ bằng HTML và CSS.
1655727060
In diesem Leitfaden erfahren Sie, wie Sie fantastische benutzerdefinierte Optionsfelder nur mit HTML und CSS erstellen. Um fantastische benutzerdefinierte Optionsfelder nur mit HTML und CSS zu erstellen. Zuerst müssen Sie zwei Dateien erstellen, eine HTML-Datei und eine CSS-Datei.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Custom Radio Buttons | Codequs</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="wrapper">
<div class="title">Select your option</div>
<div class="box">
<input type="radio" name="select" id="option-1">
<input type="radio" name="select" id="option-2">
<input type="radio" name="select" id="option-3">
<input type="radio" name="select" id="option-4">
<label for="option-1" class="option-1">
<div class="dot"></div>
<div class="text">Gamer</div>
</label>
<label for="option-2" class="option-2">
<div class="dot"></div>
<div class="text">YouTuber</div>
</label>
<label for="option-3" class="option-3">
<div class="dot"></div>
<div class="text">Student</div>
</label>
<label for="option-4" class="option-4">
<div class="dot"></div>
<div class="text">Developer</div>
</label>
</div>
</div>
</body>
</html>
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap');
*{
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Poppins', sans-serif;
}
html,body{
display: grid;
height: 100%;
place-items: center;
}
.wrapper{
width: 350px;
background: #fff;
border-radius: 10px;
box-shadow: 5px 5px 30px rgba(0,0,0,0.2);
}
.wrapper .title{
color: #fff;
line-height: 65px;
text-align: center;
background: #333;
font-size: 25px;
font-weight: 500;
border-radius: 10px 10px 0 0;
}
.wrapper .box{
padding: 20px 30px;
background: #fff;
border-radius: 10px;
}
.wrapper .box label{
display: flex;
height: 53px;
width: 100%;
align-items: center;
border: 1px solid lightgrey;
border-radius: 50px;
margin: 10px 0;
padding-left: 20px;
cursor: default;
transition: all 0.3s ease;
}
#option-1:checked ~ .option-1,
#option-2:checked ~ .option-2,
#option-3:checked ~ .option-3,
#option-4:checked ~ .option-4{
background: #333;
border-color: #333;
}
.wrapper .box label .dot{
height: 20px;
width: 20px;
background: #d9d9d9;
border-radius: 50%;
position: relative;
transition: all 0.3s ease;
}
#option-1:checked ~ .option-1 .dot,
#option-2:checked ~ .option-2 .dot,
#option-3:checked ~ .option-3 .dot,
#option-4:checked ~ .option-4 .dot{
background: #fff;
}
.box label .dot::before{
position: absolute;
content: "";
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(2);
width: 9px;
height: 9px;
border-radius: 50%;
transition: all 0.3s ease;
}
#option-1:checked ~ .option-1 .dot::before,
#option-2:checked ~ .option-2 .dot::before,
#option-3:checked ~ .option-3 .dot::before,
#option-4:checked ~ .option-4 .dot::before{
background: #333;
transform: translate(-50%, -50%) scale(1);
}
.wrapper .box label .text{
color: #333;
font-size: 18px;
font-weight: 400;
padding-left: 10px;
transition: color 0.3s ease;
}
#option-1:checked ~ .option-1 .text,
#option-2:checked ~ .option-2 .text,
#option-3:checked ~ .option-3 .text,
#option-4:checked ~ .option-4 .text{
color: #fff;
}
.wrapper .box input[type="radio"]{
display: none;
}
Jetzt haben Sie erfolgreich fantastische benutzerdefinierte Optionsfelder nur mit HTML und CSS erstellt.
1655723340
このガイドでは、HTMLとCSSのみを使用して素晴らしいカスタムラジオボタンを作成する方法を学習します。HTMLとCSSのみを使用して素晴らしいカスタムラジオボタンを作成します。まず、2つのファイルを作成する必要があります。1つはHTMLファイルで、もう1つはCSSファイルです。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Custom Radio Buttons | Codequs</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="wrapper">
<div class="title">Select your option</div>
<div class="box">
<input type="radio" name="select" id="option-1">
<input type="radio" name="select" id="option-2">
<input type="radio" name="select" id="option-3">
<input type="radio" name="select" id="option-4">
<label for="option-1" class="option-1">
<div class="dot"></div>
<div class="text">Gamer</div>
</label>
<label for="option-2" class="option-2">
<div class="dot"></div>
<div class="text">YouTuber</div>
</label>
<label for="option-3" class="option-3">
<div class="dot"></div>
<div class="text">Student</div>
</label>
<label for="option-4" class="option-4">
<div class="dot"></div>
<div class="text">Developer</div>
</label>
</div>
</div>
</body>
</html>
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap');
*{
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Poppins', sans-serif;
}
html,body{
display: grid;
height: 100%;
place-items: center;
}
.wrapper{
width: 350px;
background: #fff;
border-radius: 10px;
box-shadow: 5px 5px 30px rgba(0,0,0,0.2);
}
.wrapper .title{
color: #fff;
line-height: 65px;
text-align: center;
background: #333;
font-size: 25px;
font-weight: 500;
border-radius: 10px 10px 0 0;
}
.wrapper .box{
padding: 20px 30px;
background: #fff;
border-radius: 10px;
}
.wrapper .box label{
display: flex;
height: 53px;
width: 100%;
align-items: center;
border: 1px solid lightgrey;
border-radius: 50px;
margin: 10px 0;
padding-left: 20px;
cursor: default;
transition: all 0.3s ease;
}
#option-1:checked ~ .option-1,
#option-2:checked ~ .option-2,
#option-3:checked ~ .option-3,
#option-4:checked ~ .option-4{
background: #333;
border-color: #333;
}
.wrapper .box label .dot{
height: 20px;
width: 20px;
background: #d9d9d9;
border-radius: 50%;
position: relative;
transition: all 0.3s ease;
}
#option-1:checked ~ .option-1 .dot,
#option-2:checked ~ .option-2 .dot,
#option-3:checked ~ .option-3 .dot,
#option-4:checked ~ .option-4 .dot{
background: #fff;
}
.box label .dot::before{
position: absolute;
content: "";
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(2);
width: 9px;
height: 9px;
border-radius: 50%;
transition: all 0.3s ease;
}
#option-1:checked ~ .option-1 .dot::before,
#option-2:checked ~ .option-2 .dot::before,
#option-3:checked ~ .option-3 .dot::before,
#option-4:checked ~ .option-4 .dot::before{
background: #333;
transform: translate(-50%, -50%) scale(1);
}
.wrapper .box label .text{
color: #333;
font-size: 18px;
font-weight: 400;
padding-left: 10px;
transition: color 0.3s ease;
}
#option-1:checked ~ .option-1 .text,
#option-2:checked ~ .option-2 .text,
#option-3:checked ~ .option-3 .text,
#option-4:checked ~ .option-4 .text{
color: #fff;
}
.wrapper .box input[type="radio"]{
display: none;
}
これで、HTMLとCSSのみを使用して素晴らしいカスタムラジオボタンを正常に作成できました。
1655726968
В этом руководстве вы узнаете, как создавать потрясающие настраиваемые радиокнопки, используя только HTML и CSS. Чтобы создать удивительные пользовательские радиокнопки, используя только HTML и CSS. Во-первых, вам нужно создать два файла: один файл HTML, а другой — файл CSS.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Custom Radio Buttons | Codequs</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="wrapper">
<div class="title">Select your option</div>
<div class="box">
<input type="radio" name="select" id="option-1">
<input type="radio" name="select" id="option-2">
<input type="radio" name="select" id="option-3">
<input type="radio" name="select" id="option-4">
<label for="option-1" class="option-1">
<div class="dot"></div>
<div class="text">Gamer</div>
</label>
<label for="option-2" class="option-2">
<div class="dot"></div>
<div class="text">YouTuber</div>
</label>
<label for="option-3" class="option-3">
<div class="dot"></div>
<div class="text">Student</div>
</label>
<label for="option-4" class="option-4">
<div class="dot"></div>
<div class="text">Developer</div>
</label>
</div>
</div>
</body>
</html>
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap');
*{
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Poppins', sans-serif;
}
html,body{
display: grid;
height: 100%;
place-items: center;
}
.wrapper{
width: 350px;
background: #fff;
border-radius: 10px;
box-shadow: 5px 5px 30px rgba(0,0,0,0.2);
}
.wrapper .title{
color: #fff;
line-height: 65px;
text-align: center;
background: #333;
font-size: 25px;
font-weight: 500;
border-radius: 10px 10px 0 0;
}
.wrapper .box{
padding: 20px 30px;
background: #fff;
border-radius: 10px;
}
.wrapper .box label{
display: flex;
height: 53px;
width: 100%;
align-items: center;
border: 1px solid lightgrey;
border-radius: 50px;
margin: 10px 0;
padding-left: 20px;
cursor: default;
transition: all 0.3s ease;
}
#option-1:checked ~ .option-1,
#option-2:checked ~ .option-2,
#option-3:checked ~ .option-3,
#option-4:checked ~ .option-4{
background: #333;
border-color: #333;
}
.wrapper .box label .dot{
height: 20px;
width: 20px;
background: #d9d9d9;
border-radius: 50%;
position: relative;
transition: all 0.3s ease;
}
#option-1:checked ~ .option-1 .dot,
#option-2:checked ~ .option-2 .dot,
#option-3:checked ~ .option-3 .dot,
#option-4:checked ~ .option-4 .dot{
background: #fff;
}
.box label .dot::before{
position: absolute;
content: "";
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(2);
width: 9px;
height: 9px;
border-radius: 50%;
transition: all 0.3s ease;
}
#option-1:checked ~ .option-1 .dot::before,
#option-2:checked ~ .option-2 .dot::before,
#option-3:checked ~ .option-3 .dot::before,
#option-4:checked ~ .option-4 .dot::before{
background: #333;
transform: translate(-50%, -50%) scale(1);
}
.wrapper .box label .text{
color: #333;
font-size: 18px;
font-weight: 400;
padding-left: 10px;
transition: color 0.3s ease;
}
#option-1:checked ~ .option-1 .text,
#option-2:checked ~ .option-2 .text,
#option-3:checked ~ .option-3 .text,
#option-4:checked ~ .option-4 .text{
color: #fff;
}
.wrapper .box input[type="radio"]{
display: none;
}
Теперь вы успешно создали потрясающие настраиваемые радиокнопки, используя только HTML и CSS.