我正在设计一个星级评分系统,用于评价任何餐厅。在用户界面上,所有的“属性”都是动态的,我通过JSON格式获取数据。
我有五个属性,每个属性都有5个星级评分选项。
我的数据如下:
[
{
"ATTRIBUTEID": "FOODQUALITY",
"ATTRIBUTENAME": "Quality Of Food",
"POSITION": 1
},
{
"ATTRIBUTEID": "CLEANLINESS",
"ATTRIBUTENAME": "Cleanliness",
"POSITION": 2
},
{
"ATTRIBUTEID": "SERVICE",
"ATTRIBUTENAME": "Service",
"POSITION": 3
},
{
"ATTRIBUTEID": "STAFFBEHAVE",
"ATTRIBUTENAME": "Staf Behavior",
"POSITION": 4
},
{
"ATTRIBUTEID": "AMBIENCE",
"ATTRIBUTENAME": "Ambience",
"POSITION": 5
}
];
我想要实现的目标是这样的:
我已经完成的工作
@charset "ISO-8859-1";
div.stars {
width: 300px;
display: inline-block;
margin-left: -35px;
}
.commonLable {
margin-left: 55px;
font-family: sans-serif;
font-weight: bold;
margin-bottom: 0;
}
input.star {
display: none;
}
label.star {
float: right;
padding: 5px;
font-size: 40px;
color: grey;
transition: all .2s;
margin-top: -25px;
}
hr {
margin: 0;
}
input.star:checked~label.star:before {
content: '\2605';
color: #ffd309;
transition: all .25s;
}
input.star-5:checked~label.star:before {
color: #ffe840;
text-shadow: 0 0 20px #952;
}
input.star-1:checked~label.star:before {
color: #f24800;
}
label.star:hover {
transform: rotate(-15deg) scale(1.3);
cursor: pointer;
}
label.star:before {
content: '\2605';
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/js/bootstrap.min.js"></script>
<div class="stars">
<form action="">
<div class="form-row">
<label class="commonLable"> Cleanliness</label>
<div class="form-group col-lg-12">
<input class="star star-5" id="star-5" type="radio" name="star" value="5" />
<label class="star star-5" for="star-5"></label>
<input class="star star-4" id="star-4" type="radio" name="star" value="4" />
<label class="star star-4" for="star-4"></label>
<input class="star star-3" id="star-3" type="radio" name="star" value="3" />
<label class="star star-3" for="star-3"></label>
<input class="star star-2" id="star-2" type="radio" name="star" value="2" />
<label class="star star-2" for="star-2"></label>
<input class="star star-1" id="star-1" type="radio" name="star" value="1" />
<label class="star star-1" for="star-1"></label>
</div>
</div>
<div class="form-row">
<label class="commonLable"> Quality Of Food
</label>
<div class="form-group col-lg-12">
<input class="star star-5" id="star-5r" type="radio" name="starr" />
<label class="star star-5" for="star-5r"></label>
<input class="star star-4" id="star-4r" type="radio" name="starr" />
<label class="star star-4" for="star-4r"></label>
<input class="star star-3" id="star-3r" type="radio" name="starr" />
<label class="star star-3" for="star-3r"></label>
<input class="star star-2" id="star-2r" type="radio" name="starr" />
<label class="star star-2" for="star-2r"></label>
<input class="star star-1" id="star-1r" type="radio" name="starr" />
<label class="star star-1" for="star-1r"></label>
</div>
</div>
</form>
</div>
</form>
</div>
编辑
我已经编辑了我的代码片段,其中有两个属性食物质量
和清洁度
,但当我点击清洁度
星星时,上面的星星也被填充成颜色了。我知道这是因为通用的CSS样式,但这是我的问题,所有属性都是动态的,请检查我上传的JSON数据和我正在尝试做的事情的图片。
编辑
这是动态代码,可以动态创建星级和标签。
$(document).ready(function() {
var data = [{
"ATTRIBUTEID": "FOODQUALITY",
"ATTRIBUTENAME": "Quality Of Food",
"POSITION": 1
},
{
"ATTRIBUTEID": "CLEANLINESS",
"ATTRIBUTENAME": "Cleanliness",
"POSITION": 2
},
{
"ATTRIBUTEID": "SERVICE",
"ATTRIBUTENAME": "Service",
"POSITION": 3
},
{
"ATTRIBUTEID": "STAFFBEHAVE",
"ATTRIBUTENAME": "Staf Behavior",
"POSITION": 4
},
{
"ATTRIBUTEID": "AMBIENCE",
"ATTRIBUTENAME": "Ambience",
"POSITION": 5
}
];
for (v = 0; v < data.length; v++) {
var container = document.getElementById("container");
var firstDiv = document.createElement('div');
firstDiv.setAttribute("class", "form-row");
var secondDiv = document.createElement('div');
secondDiv.setAttribute("class", "commonLable");
secondDiv.append(data[v].ATTRIBUTENAME);
var thirdDiv = document.createElement('div');
thirdDiv.setAttribute("class", "form-group col-lg-12");
/// append stars
for (i = 1; i < data.length + 1; i++) {
var incrementedVar = i + 1;
var stars = document.createElement("input");
var label = document.createElement("label");
stars.setAttribute("type", "radio");
stars.setAttribute("id", '"' + data[v].ATTRIBUTEID + i + '"');
stars.setAttribute("name", '"' + data[v].ATTRIBUTEID + i + '"');
stars.setAttribute("class", "star star-5");
stars.setAttribute("value", i);
label.setAttribute("class", "star star-5");
label.setAttribute("for", '"' + data[v].ATTRIBUTEID + i + '"');
thirdDiv.append(stars, label);
}
secondDiv.append(thirdDiv);
firstDiv.append(secondDiv);
container.appendChild(firstDiv);
}
$('input:radio').change(
function() {
alert($(this).val());
});
});
@charset "ISO-8859-1";
div.stars {
width: 300px;
display: inline-block;
margin-left: -35px;
}
.commonLable {
margin-left: 55px;
font-family: sans-serif;
font-weight: bold;
margin-bottom: 0;
}
input.star {
display: none;
}
label.star {
float: right;
padding: 5px;
font-size: 40px;
color: grey;
transition: all .2s;
margin-top: -25px;
}
hr {
margin: 0;
}
input.star:checked~label.star:before {
content: '\2605';
color: #ffd309;
transition: all .25s;
}
input.star-5:checked~label.star:before {
color: #ffe840;
text-shadow: 0 0 20px #952;
}
input.star-1:checked~label.star:before {
color: #f24800;
}
label.star:hover {
transform: rotate(-15deg) scale(1.3);
cursor: pointer;
}
label.star:before {
content: '\2605';
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css">
<div class="stars">
<form action="" id="container">
</form>
</div>
问题:如果我将星号标记为4并希望将其从4到2取消标记,则无法实现。 请检查使用HTML的静态代码的片段1,我想要那种功能。