Oskar, a meek 12-year-old boy, resides with his mother Yvonne in the western Stockholm suburb of Blackeberg in 1981. His classmates regularly bully him, and he spends his evenings imagining revenge, collecting clippings from newspapers and magazines about grisly murders. One night he meets Eli, who appears to be a pale girl of his age. Eli has recently moved into the next-door apartment with an older man, Håkan. Eli initially informs Oskar that they cannot be friends. Over time, however, they begin to form a close relationship, with Oskar lending his Rubik’s Cube to Eli, and the two exchanging Morse code messages through their adjoining wall. Håkan requests that Eli stop seeing Oskar. After questioning Oskar about a cut on his cheek, Eli learns that the boy is being bullied by schoolmates and encourages him to stand up for himself. This inspires Oskar to enroll for weight-training classes after school.
Earlier, Håkan stops and kills a passerby on a busy footpath near a main road to harvest fresh blood for Eli, but he fails to return with any when he is interrupted by an approaching dog walker. Eli is prompted to waylay and kill a local man, Jocke, making his way home from a bar after having said goodnight to his best friend, Lacke. A local cat-loving recluse, Gösta, witnesses the attack from his flat. He does not believe what he has seen and decides not to report the incident. Håkan hides Jocke’s body in an ice-hole in the local lake. Håkan later makes another well-prepared but incompetently executed effort to obtain blood for Eli by trapping a teenage boy in a changing room after school. The boy’s friends are waiting for him to emerge, and go to see what is holding him up. Before he is discovered, Håkan pours concentrated hydrochloric acid onto his own face, disfiguring it to prevent the authorities from identifying him. Eli learns that Håkan has been taken to the hospital and scales the building to access his restricted room. Håkan opens the window for Eli and offers his neck for feeding; drained of blood, Håkan falls out of the window onto the snow and dies. Now alone, Eli goes to Oskar’s apartment and spends the night with him, during which time they agree to “go steady”. While Eli states, “I’m not a girl”, Oskar (ambiguously) either ignores this or accepts the unclear nature of the relationship.
During an ice skating field trip at the lake, some of Oskar’s fellow students discover Jocke’s body. At the same time, Oskar finally stands up to his tormentors and strikes the leader of the bullies, Conny, on the side of the head with a pole, splitting his ear. Some time later, Oskar shows Eli a private place he knows. Unaware that Eli is a vampire, Oskar suggests that they form a blood bond, and cuts his hand, asking Eli to do the same. Eli, thirsting for blood but not wanting to harm Oskar, laps up his spilled blood before running away. Lacke’s girlfriend, Virginia, is subsequently attacked by Eli. Lacke turns up in time to interrupt the attack. Virginia survives, but soon discovers that she has become painfully sensitive to sunlight. Seeking Lacke, Virginia visits Gösta, only to be fiercely attacked by Gösta’s cats. In the hospital, Virginia, who has realized what she has become, asks an orderly to open the blinds in her room. When the sunlight streams in, she bursts into flames.
Realizing the situation, Oskar confronts Eli, who admits to being a vampire. Oskar is initially upset by Eli’s need to kill people for survival. However, Eli insists that their bloodthirsty natures are alike, in that Oskar wants to kill and Eli needs to kill, and encourages Oskar to “be me, for a little while.”
Lacke, who has lost both his best friend and girlfriend to the attacks, tracks Eli down to the closed-off apartment. Breaking in, he discovers Eli asleep in the bathtub. He prepares to kill Eli, but Oskar, who was hiding inside the apartment, interferes; Eli immediately wakes up, jumps on Lacke and kills him, feeding on his blood. Eli thanks Oskar and kisses him in gratitude. However, an upstairs neighbor is angrily knocking on the ceiling due to the disturbance the fight has caused. Eli realizes that it is no longer safe to stay and leaves the same night.
The next morning, Oskar receives a phone call from Conny’s friend, Martin, who lures Oskar out to resume the after-school fitness program at the local swimming pool. The bullies, led by Conny and his sadistic older brother Jimmy, start a fire to draw Mr Ávila, the teacher in charge, outside, and enter the pool area, ordering the other children to clear out. This leaves Oskar trapped alone in the pool. Jimmy forces Oskar under the water, threatening to stab his eye out if he does not hold his breath for three minutes. While Oskar is being held underwater, Eli arrives and rescues him by killing and dismembering the bullies, except for the most reluctant of their number, Andreas, who is left sobbing on a bench.
Later, Oskar is traveling on a train with Eli in a box beside him, safe from sunlight. From inside, Eli taps the word “kiss” to Oskar in Morse code, to which he taps back “puss” (small kiss in Swedish).