In the small logging town of Lumberton, Jeffrey Beaumont (Kyle MacLachlan
) returns home from college after his father (Jack Harvey) suffers a near fatal stroke. He stays with his mother (Priscilla Pointer
) and Aunt Barbara (Frances Bay
) while he takes over working at the local hardware store that his father owns. While walking home from the hospital one day after visiting his father, he cuts through a vacant lot where he discovers a severed ear buried under overgrown grass and puts it in a paper bag. Jeffrey takes the ear to the police station and speaks to Detective John Williams (George Dickerson) whom he knows as a neighbor.
Later that evening, Jeffrey goes to Williams' house to glean further details. He finds the detective evasive about the case and receives a stern warning from Williams not to talk about what he found to anyone because it might jeopardize an ongoing police investigation. Outside the house, Jeffrey meets the detective's daughter, Sandy Williams (Laura Dern
). She tells him a name she overheard from her father of a woman being investigated, Dorothy Vallens (Isabella Rossellini
), a singer who also lives in the neighborhood. Increasingly curious, Jeffrey devises a plan to sneak into Dorothy's apartment that involves posing as an exterminator.
The next day, Jeffrey picks up Sandy from her high school and they drive over to the apartment building where Dorothy lives. Dorothy believes Jeffrey's ruse and lets him into her apartment to spray for bugs. Unexpectedly, a man dressed in a yellow jacket (Fred Pickler) knocks on Dorothy's door while Jeffrey's in the kitchen, and Jeffrey takes advantage of the distraction to steal Dorothy's spare keys.
That evening, Jeffrey and Sandy attend Dorothy's performance at the Slow Club. While Dorothy sings onstage, Jeffrey sneaks into her apartment to snoop. Sandy's parked outside of the building as a look-out in case Dorothy returns, but when she honks the car horn to warn Jeffrey, he doesn't hear it. He only has a few seconds to hide in a closet off the living room when he hears Dorothy approaching and unlocking the door. However, Dorothy, wielding a knife, finds him hiding and threatens to hurt him. When she realizes he is merely a curious boy, she assumes his intentions are sexual in nature, and is excited by his voyeurism. She makes him undress at knife point, then performs an act of fellatio on him.
Frank Booth (Dennis Hopper
) interrupts their encounter with a knock on the door. Dorothy urges Jeffrey to return to the closet and he witnesses Frank's bizarre sexual engagement with Dorothy in her living room, which includes gas inhalation/asphyxia with a mask, dry humping, and sado-masochistic acts. One of Frank's fetish objects is a blue velvet robe that he makes Dorothy wear during the ordeal. Frank is a foul-mouthed, violent sociopath whose orgasmic climax is a fit of both pleasure and rage. When Frank leaves, a saddened and desperate Dorothy tries to seduce Jeffrey again. She demands that he also hit her but when he refuses she tells him to leave.
The next day, Jeffrey tells Sandy a censored version of what he saw and concludes that Frank might have kidnapped Dorothy's husband Don (Dick Green) and young son Little Donny (Jon Jon Snipes), holding them hostage to extort sexual favors from Dorothy.
The following evening, Jeffrey again observes Dorothy's show at the Slow Club, where she performs "Blue Velvet" by Bobby Vinton. Frank is also present at the nightclub. Later, in the car park, Jeffrey watches Frank and his three cohorts, Raymond (Brad Dourif
), Paul (Jack Nance
), and Hunter (J. Michael Hunter) drive away and follows them to Frank's apartment building in a desolate industrial area. Jeffrey returns and spends all night and day staking out the building and secretly photographing Frank and his visitors, which include the man in the yellow jacket (aka the Yellow Man) and a well-dressed man with a briefcase. He also follows Frank to a location where he is seen pointing in the distance to a gruesome drug-murder crime-scene investigation by the police.
After reporting to Sandy on the bizarre and dangerous nature of Dorothy's situation, Jeffrey goes to Dorothy's apartment again and makes love to her, this time indulging her demands that he hit her. As he strikes her he notices she smiles. Just as he is leaving, Frank and his thugs arrive at the building and Frank forces them both to accompany him on a "joyride," which ends up at the house of Ben (Dean Stockwell
), a suave, effeminate partner in crime. Jeffrey overhears Frank talking to Ben about their accomplice, named Gordon, who murdered a drug courier in order to steal the drugs. Frank allows Dorothy to see her captive son in a back room -- Jeffrey overhears her pleading with her son to remember she's his mother. At Frank's request, Ben lip-synchs Roy Orbison's "In Dreams," sending Frank into maudlin sadness, then rage. He shouts to his crew that they're going for another high-speed joyride.
Back on the road, Frank becomes more brutish and confrontational, taunting Dorothy as well as Jeffrey. When Frank pulls over at a sawmill yard and begins to abuse Dorothy, Jeffrey hits Frank, enraging him further. Frank and his thugs yank Jeffrey from the car and savagely beat him as "In Dreams" plays on the car stereo. Jeffrey wakes up on the ground the next morning and goes home, where he is overcome with guilt and despair. Jeffrey finally realizes that things have gone too far and decides to go to the police. At the police station, Jeffrey sees that Detective Williams' partner, Detective Gordon (the same "Gordon" that Frank mentioned earlier to Ben), is the "Yellow Man" and hurriedly leaves. Later, at Sandy's home, Jeffrey briefs Detective Williams on his findings. Williams reminds Jeffrey of the need to keep quiet. Jeffrey does not reveal Sandy's involvement.
A few days later, Jeffrey and Sandy go to a dance party together, profess their newfound love and embrace. As he drives Sandy home, they're followed and rear-ended several times by another driver. Jeffrey is relieved to discover that it's only Sandy's jealous ex-boyfriend Mike (Ken Stovitz). A confrontation is avoided when they see a naked and distressed Dorothy waiting on Jeffrey's front lawn -- she has been severely beaten and is covered in bruises. They drive Dorothy to Sandy's house where Dorothy reveals her clandestine sexual relationship with Jeffrey in front of Sandy and her mother.
From the hospital, Jeffrey tells Sandy (who has already forgiven him for starting a romantic relationship with her while sexually involved with a vulnerable and mentally unstable woman) that he must return to Dorothy's apartment and asks Sandy to send her father there immediately. When he arrives at Dorothy's apartment, he finds the dead body of Dorothy's husband, who is missing an ear and has a swatch of blue velvet cloth stuck in his mouth. Detective Gordon is also there, standing in a daze with a severe head injury. When Jeffrey tries to leave, he sees the Well Dressed Man coming up the steps and recognizes him as Frank in disguise. Jeffrey talks to Det. Williams over Gordon's police radio, but then remembers having seen Frank with a police radio as well. Jeffrey lies about his location inside the apartment, hoping Frank will assume he does not know about Frank's radio. Across town, Detective Williams and his men are engaged in a gunfight with Frank's thugs at his apartment building, and Jeffrey is on his own. Frank enters Dorothy's apartment and taunts Jeffrey about having heard Jeffrey's location over his own police radio. When Frank fails to find Jeffrey in the bedroom where Jeffrey announced over the radio that he'd hide, he returns to the living room. Upon Frank's opening the closet door, Jeffrey shoots him point-blank in the forehead with Det. Gordon's gun, killing him instantly. Det. Williams arrives with Sandy in tow. He points his pistol at Jeffrey and lowers it just after telling him "it's all over."
Some time later, the Beaumont and Williams families enjoy an afternoon together. Jeffrey's father has recovered from his stroke and he and Det. Williams are talking in the back yard. Jeffrey points out a robin in a tree that's caught a bug. Sandy, who had earlier told Jeffrey about a dream she had involving robins and how they symbolized love, smiles with Jeffrey as they share this moment of contentment and hope.
In another afternoon scene, Dorothy and her son play happily in the park together. She embraces the boy and a bittersweet expression comes across her face as Dorothy's voice sings the lyrics ". . . and I still can see blue velvet through my tears." A pair of blue velvet curtains draw to a close, ending the story.