This film is told through three different points in the protagonist's life.
Part I. Little
In Miami, a drug dealer named Juan (Mahershala Ali) meets with one of his boys near the dope holes in town. A junkie is desperately trying to buy something off the other man, but he is continuously rejected.
Juan goes by a hole in which a young boy (Alex Hibbert) has been chased into by a group of bullies. The bullies throw rocks at the window before leaving. Juan pulls off a wooden board from the window and finds the boy hiding. He takes the boy out to get food and asks him his name, but the boy never responds. Juan brings him to the home of his girlfriend Teresa (Janelle Monae), where the boy finally says his name is Chiron, but the other kids call him "Little."
The next day, Juan brings Chiron back to his home. His mother Paula (Naomie Harris) brings Chiron inside and keeps him away from Juan as he tries to say his farewell.
A group of schoolboys play on a field near the railroad tracks. Chiron leaves the group and is followed by his only friend Kevin (Jaden Piner). Kevin tells Chiron that he needs to show the other boys that he's not soft so they will stop picking on him. They play-fight before running off home.
After class, the boys are in a room showing each other their penises. Chiron enters the room after Kevin lets him in. He unzips his pants and shows himself to Kevin and the other boys.
Juan takes Chiron to the beach to teach him how to swim. They sit on the sand as Juan tells Chiron about his own childhood, telling the boy how he must carve out his own path in this world and not let anyone else decide for him.
At night, Juan sees someone smoking crack in the streets. He discovers that Paula is with the man, being her boyfriend. Juan chastises Paula for smoking crack, but she hits back that he's the one that sold it to her. They argue about how Chiron is being raised, with Paula asking Juan if he is trying to raise her son and if he knows why the other boys pick on him. She later goes home and angrily calls Chiron a faggot.
In the morning, Chiron goes to Juan and Teresa's house. He expresses his hatred for Paula and then asks Juan what a faggot is. After Juan explains, Chiron asks if he himself is one. He then asks Juan about his drug-dealing and selling to his mother. Chiron leaves, and Juan appears tearfully remorseful.
Part II. Chiron
Skipping forward a few years, Chiron is now a teenager (now played by Ashton Sanders). Juan has long since passed away. Chiron is harassed at school by a punk named Terrel (Patrick Decile), who mocks Chiron in the middle of class until their teacher kicks Terrel out.
After class, Kevin (now played by Jharrel Jerome) goes up to Chiron to brag about receiving a blowjob from a girl on the staircase and how he got detention for doing so. He also gives Chiron the nickname "Black". Chiron continues to visit Teresa for food, a place to crash some nights, and sometimes some money. When Chiron goes back toward his home, a very high Paula comes out and starts demanding money from Chiron so she may get more drugs for herself. She tries to forcibly takes money from his pockets until he relents and hands it over to her.
As Chiron walks home from school, Terrel and his buddy run up on Chiron and taunt him about his mother and Teresa. When Chiron responds angrily, the two threaten him and make him take a step back.
Chiron visits the beach and sits on the sand. He is joined moments later by Kevin, who shares a blunt with him. They talk to each other about their goals, and eventually get close enough to start kissing. Kevin then gives Chiron a handjob.
At school, Chiron tries to sit with Kevin at lunch before Terrel sits with him. They have a pleasant chat as Terrel recalls an old "game" called "Knocked Down, Stay Down," which Kevin was apparently good at. Terrel tries to find someone for Kevin to knock down. He picks Chiron and pressures Kevin into hitting him. Kevin reluctantly strikes Chiron a few times in the face and tells him to stay down. Chiron continues to get up, leading to Terrel and his friends to start stomping him out. Later, Chiron sees a social worker who urges him to give up the names of his attackers. He feels that nothing will be stopped if he says names.
The next day, Chiron walks into class and immediately grabs a chair and smashes it over Terrel's back, knocking him to the ground. Chiron tries to get more hits in, but he is held back by the teacher and other students. He is later arrested, and Kevin sees him being taken away in the police car..
Part III. Black
The story jumps about ten years later. Chiron (now played by Trevante Rhodes) is living in Atlanta after a stint in juvie, and is now pushing drugs for a living. He lives alone in a small house and is significantly more bulked up than in his youth. One night, Chiron receives an unexpected phone call from Kevin (now played by Andre Holland), who got Chiron's number from Teresa. Kevin apologizes for what happened in school and for what he did to Chiron. Chiron is silent, but he sheds a tear. Kevin says he is now working as a cook in Miami and he invites Chiron to visit him for a free meal.
On his way through Florida, Chiron stops to visit his mother. Paula is deeply upset with how she treated Chiron as a child and for letting her drug addiction take over. She tells Chiron she loves him and knows he doesn't have to love her back. Chiron forgives Paula.
Chiron arrives at diner where Kevin works. Kevin is surprised to see Chiron seated at the front counter. He cooks a chef's special for Chiron, which is a Cuban dish. Kevin brings some wine over for them to drink. Chiron is still fairly quiet, but the two eventually engage in conversation. Kevin says he'd had a son (Kevin Jr.) with a woman, named Samantha, whom he is married to. When Chiron asks, "Y'all still down?", Kevin says, "Nah, not like that, man," although he says he and Samantha are "cool" on account of Kevin Jr. Chiron admits that he is selling drugs, to Kevin's displeasure. Chiron claims "it is what it is", but Kevin disagrees.
Kevin brings Chiron to his apartment for the night. There, Kevin admits that he's not where he thought he would have been in life, but at least he is happy with his job and family. Chiron states that he hasn't been touched by anyone since Kevin back in high school. Chiron and Kevin then sit on the bed with Chiron resting his head on Kevin's shoulder, and Kevin starts stroking Chiron's head.
The film ends with a shot of Chiron as a child standing alone on the beach.