Whether or not it's easily possible and done with Javascript I'm not sure but..
As shown in the code below, I've 5 players, each with a different score. I'm looking to code it so that it will automatically relist the players based off how high their score is. IDEALLY, I would also want to colour the first 3 rows to be gold-silver-bronze if that was possible.
Any help making this or pointing me in the right direction would be much appreciated. I'm not sure where I should start.
#container {
width: 600px;
height: auto;
}
.row {
position: relative;
display: block;
width: 100%;
height: 40px;
border-bottom: 1px solid #AFAFAF;
}
.name {
position: relative;
display: inline-block;
width: 75%;
line-height: 45px;
}
.score {
position: relative;
display: inline-block;
width: 25%;
}
<div id="container">
<div class="row">
<div class="name">Player1</div><div class="score">430</div>
</div>
<div class="row">
<div class="name">Player2</div><div class="score">580</div>
</div>
<div class="row">
<div class="name">Player3</div><div class="score">310</div>
</div>
<div class="row">
<div class="name">Player4</div><div class="score">640</div>
</div>
<div class="row">
<div class="name">Player5</div><div class="score">495</div>
</div>
</div>
You can make the first 3 rows the color you want by using nth-child()
/* Gold */
.row:nth-child(1) {background: gold;}
/* Silver */
.row:nth-child(2) {background: #c0c0c0;}
/* Bronze */
.row:nth-child(3) {background: #cd7f32;}
Next to sort the items you can put the rows into an array, then use sort to sort the items.
document.addEventListener('DOMContentLoaded', () => {
let elements = []
let container = document.querySelector('#container')
// Add each row to the array
container.querySelectorAll('.row').forEach(el => elements.push(el))
// Clear the container
container.innerHTML = ''
// Sort the array from highest to lowest
elements.sort((a, b) => b.querySelector('.score').textContent - a.querySelector('.score').textContent)
// Put the elements back into the container
elements.forEach(e => container.appendChild(e))
})
#container {
width: 600px;
height: auto;
}
.row {
position: relative;
display: block;
width: 100%;
height: 40px;
border-bottom: 1px solid #AFAFAF;
}
.name {
position: relative;
display: inline-block;
width: 75%;
line-height: 45px;
}
.score {
position: relative;
display: inline-block;
width: 25%;
}
.row:nth-child(1) {
background: gold;
}
.row:nth-child(2) {
background: #c0c0c0;
}
.row:nth-child(3) {
background: #cd7f32;
}
<div id="container">
<div class="row">
<div class="name">Player1</div><div class="score">430</div>
</div>
<div class="row">
<div class="name">Player2</div><div class="score">580</div>
</div>
<div class="row">
<div class="name">Player3</div><div class="score">310</div>
</div>
<div class="row">
<div class="name">Player4</div><div class="score">640</div>
</div>
<div class="row">
<div class="name">Player5</div><div class="score">495</div>
</div>
</div>
I do believe you will have a much more pleasant time here if you represent your data structure with Javascript rather than HTML. What you are describing to me sounds like a collection of data, and in this case I'd make it a Javascript array of objects.
const playerArray = [
{name: "Player1", score: "430", id:"player1"},
{name: "Player2", score: "580"}, id:"player2"},
{name: "Player3", score: "310"}, id:"player3"},
{name: "Player4", score: "640" id:"player4"},
{name: "Player5", score: "495", id:"player5"}
]
Then sorting this array based on the "score property of the objects is a bit tricky, but with the help of this stack overflow answer I'd say you can write it like this:
function compare(a,b) { return b.score - a.score }
playerArray.sort(compare);
You would then call this sort method each time a player joined , left, submitted a score, etc (anything that modifies the playerArray).
You could then remove all gold, silver, bronze styling from all the rows and then add add the gold color with
document.getElementById(playerArray[0].id).style.background: gold;
document.getElementById(playerArray[1].id).style.background: #c0c0c0;
document.getElementById(playerArray[2].id).style.background: #cd7f32;;
As a side note, a front-end framework such as angular or react could allow you more more easily keep your ui updated based on the Javascript collection and with a more declarative syntax.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With