Match ends, Fulham 2, Aston Villa 0.
Fulham made it 10 league games unbeaten and boosted their Championship promotion hopes by ending Aston Villa's seven-match winning run in the league.
After a tight first half it took just seven minutes after the break for Ryan Sessegnon to sweep the hosts in front.
Floyd Ayite made it 2-0, controlling keeper Sam Johnstone's poor free-kick from out wide and firing into an empty net from inside the centre circle.
Villa slipped a place to third with the loss, while Fulham stayed fifth.
Victory extended Fulham's home run to seven consecutive wins, while they have also scored 14 goals in their past four matches at Craven Cottage.
Both teams came into the game in form and full of goals but, the absence of Jack Grealish and leading scorer Albert Adomah, Villa's attacking options seemed blunted and Fulham capitalised.
The first half was a low-key affair, Conor Hourihane and Scott Hogan firing over the bar for the visitors, while Fulham striker Aleksandar Mitrovic, on loan from Newcastle United, was a lively presence without threatening the goal.
However, once Fulham had broken the deadlock, they were the side in control.
Steve Bruce's Villa dropped Championship points for the first time in 2018 and therefore were overhauled by Cardiff, who beat Middlesbrough to go second.
Fulham manager Slavisa Jokanovic:
"We played with confidence, but we cannot think the job is done. We must show solidarity and work together.
"All the squad will be needed, not just the players who started today, but those on the bench and in the stand.
"In the second half we tried something a little bit different, we scored two goals and we could have scored some more. We must be satisfied with our performance, we played very good football, (but) it is only three points."
Aston Villa manager Steve Bruce told BBC WM:
"I didn't think there was anything in it. It was a tense game with two very good teams for the first 60 minutes.
"It was always going to be the first goal (that was likely to decide the game) and we're disappointed because we know they're very good down the flanks in particular, they're quick in wide areas and we've been done down the wide area..
"We've made a mistake for the first and a mistake for the second. We've made more mistakes today than we've probably done in six weeks, but that's football."
- 8JohansenBooked at 67minsSubstituted forOdoiat 90+1'minutes
- 11AyitéSubstituted forPiazonat 88'minutes
- 32MitrovicSubstituted forKamaraat 79'minutes
- 3R Sessegnon
- 15JedinakBooked at 59minsSubstituted forGrabbanat 67'minutes
- 27El MohamadySubstituted forOnomahat 45'minutes
- 7SnodgrassSubstituted forDavisat 88'minutes
- Tony Harrington
- Shots on Target
Second Half ends, Fulham 2, Aston Villa 0.
Substitution, Fulham. Denis Odoi replaces Stefan Johansen.
Attempt saved. Aboubakar Kamara (Fulham) right footed shot from the left side of the box is saved in the centre of the goal. Assisted by Tom Cairney.
Attempt missed. Ryan Sessegnon (Fulham) right footed shot from the right side of the box is too high. Assisted by Ryan Fredericks.
Substitution, Aston Villa. Keinan Davis replaces Robert Snodgrass.
Substitution, Fulham. Lucas Piazon replaces Floyd Ayité.
Aboubakar Kamara (Fulham) wins a free kick in the attacking half.
Foul by Robert Snodgrass (Aston Villa).
Offside, Fulham. Tim Ream tries a through ball, but Stefan Johansen is caught offside.
Delay over. They are ready to continue.
Delay in match Kevin McDonald (Fulham) because of an injury.
Attempt saved. Kevin McDonald (Fulham) right footed shot from the right side of the box is saved in the bottom right corner. Assisted by Floyd Ayité with a through ball.
Foul by Ryan Sessegnon (Fulham).
Robert Snodgrass (Aston Villa) wins a free kick on the right wing.
Tom Cairney (Fulham) wins a free kick in the defensive half.
Foul by Conor Hourihane (Aston Villa).
Substitution, Fulham. Aboubakar Kamara replaces Aleksandar Mitrovic.
Attempt missed. Scott Hogan (Aston Villa) right footed shot from the centre of the box is close, but misses to the right. Assisted by Birkir Bjarnason with a through ball.
Attempt missed. Floyd Ayité (Fulham) header from the centre of the box is just a bit too high. Assisted by Ryan Sessegnon with a cross.