Duff joined Blackburn Rovers as a trainee in 1996 after playing for Leicester Celtic, Lourdes Celtic and St. Kevin's Boys as a schoolboy in Dublin. He made his Blackburn debut at the age of 18 against Leicester City on the final day of the 1996–97 season for which he won the Man of the match award. In his first full season (1997–98) he scored four goals. Blackburn were relegated the following season.
Duff helped Blackburn achieve promotion back to the Premier League in 2001 and then win the League Cup in 2002, beating Tottenham Hotspur 2–1 at the Millennium Stadium. Following the 2002 World Cup, Duff signed a new four-year contract with Rovers. Despite injury problems in the 2002–03 season, he finished as Blackburn's top goalscorer with 11 goals, which helped his team finish sixth and qualify for the UEFA Cup.
In the run up to the 2003–04 season, Chelsea made a series of bids for Duff, with a £17 million offer, eventually triggering a release clause in the player's contract. Duff chose to move to West London in July. Signed by manager Claudio Ranieri as part of the development of Chelsea financed by new owner Roman Abramovich, Duff made his debut in August 2003 in the Champions League against Slovakian side MŠK Žilina. Chelsea won 2–0 and Duff was described as the "star of the show". He scored his first Chelsea goal on 20 September 2003 in a 5–0 away win against Wolverhampton Wanderers. Duff scored the third Chelsea goal and was named as Man of the match. Duff played 23 games in all competitions for Chelsea in the 2003–04 season scoring five goals. He missed the Champions League semi-finals as Chelsea lost to AS Monaco but was instrumental in securing for Chelsea second place in the Premiership, the club's highest league finish for 49 years as well as being part of the Champions League run, but the season ultimately ended trophyless and with the sacking of manager Claudio Ranieri.
The arrival of Dutch winger Arjen Robben and new manager José Mourinho posed a threat to Duff's place in the starting line-up for the 2004–05 season, but an injury to Robben at the start of the season saw Duff as the only available winger. Mourinho, however, did not play Duff in the early part of the 2004–05 season, preferring a more narrow approach. Duff eventually got into the side after four games and, when Robben returned to the side, Duff's versatility saw him move to the right wing and form a wing partnership with Robben. The season proved to be successful for both Duff and Chelsea. He scored ten goals, including a crucial strike in a 4–2 win against Barcelona in the Champions League, while the team won the Premiership title by 12 points from second placed Arsenal, and the League Cup, in which Duff scored the winning goal in the semi-final against Manchester United. He scored three goals in 28 league appearances in the following season as the club retained their Premier League title.
In July 2006, Duff agreed terms over a £5 million move to Newcastle United, signing a five-year contract. Duff made his competitive debut in a UEFA Cup second round qualifying first leg match against Latvian side Ventspils on 10 August 2006. He scored his first goal for Newcastle in September that year in a 2–0 victory over West Ham United away at the Boleyn Ground. Duff suffered a knee injury in November that kept him out for four months, during which Newcastle had a bad run of defeats. He returned but was then ruled out for the rest of the season due to an ankle injury in a 2–1 loss to Portsmouth in April 2007. Sam Allardyce later described Duff's injury as 'career threatening'. Under the new appointment of Alan Shearer as manager, Duff was asked to play as left back.
In the final match of the 2008–09 Season, against Aston Villa in a crucial relegation decider, Duff unluckily scored the deciding own goal by deflecting in a 20-yard shot by Villa's Gareth Barry which sent Newcastle down . Duff confirmed his intention to stay at the relegated club and help them back into the Premier League. Duff scored Newcastle's first goal of the 2009–10 season in a 1–1 draw against West Bromwich Albion on 8 August 2009 equalizing a West Brom goal from Shelton Martis.
After playing one game for Newcastle in 2009–10, Duff returned to the Premier League, signing for Fulham on a three-year contract for £4 million, and re-joining Roy Hodgson, his first manager at Blackburn Rovers. He made his Fulham debut coming on as a substitute against Amkar Perm in the Cottagers' UEFA Europa League qualifier match, setting up the third goal in a 3–1 win. Duff scored his first league goal for Fulham on 13 September 2009 in a 2–1 victory over Everton, scoring in the 79th minute. On 19 December 2009, just six days before Christmas in a Premier League game vs. Manchester United at Craven Cottage Duff scored in the 75th minute in a 3–0 victory. On 17 January 2010, Duff started the game against Blackburn Rovers at Ewood Park and also completed the full 90 minutes in a 2–0 defeat.
On 22 August 2010, he started and played the full 90 minutes against Manchester United at Craven Cottage in a 2–2 draw and also picked up a booking. On 18 September 2010, he started and played the entire match against Blackburn Rovers at Ewood Park in a 1–1 draw. On 15 January 2011, Duff made his 500th career appearance in English football when he lined up against Wigan Athletic playing the full 90 minutes in a 1–1 draw at the DW Stadium. On 5 February 2011, he started the Premier League game against Aston Villa in a 2–2 draw at Villa Park, but was replaced on 67 minutes by Simon Davies. On 27 February 2011, he played the full 90 minutes and also scored a goal in the match with Manchester City at Eastlands in a 1–1 draw.
On 5 March 2011, Duff scored a brace in a 3–2 win against former side Blackburn Rovers at Craven Cottage. With the two goals, he continued a run of four goals in five matches.
About Fulham and his time at the football club, Duff stated: "I like to think that I have found my feet again here at Fulham. It's a good environment and one that players feel very comfortable in. This is a club with so much character and I'm very happy to be helping move it forward." At the end of the 2010–11 season, Duff made 27 appearances and scored 4 goals in all competitions, including making 24 Premier League appearances. As of July 2011, he has made 81 appearances and has scored 15 goals for Fulham in all competitions.
On 19 August 2011, Duff signed a one-year extension to his current deal.
After nine goalless matches, Duff scored in Fulham's 2–1 win over Norwich City on 31 March 2012. A week later, on 7 April 2012, he starred in Fulham's 0–3 away win over Bolton Wanderers, setting up Clint Dempsey for the second goal of the match. During the match, which marked his 350th league appearance, he was a constant threat on the right wing. On 18 August 2012 Duff scored the opening goal in Fulham's 5–0 win over Norwich City on the opening day of the 2012–13 Premier League. He scored again in the following game, a 3–2 defeat to Manchester United.
On 22 February 2013, Duff signed a new contract with Fulham, keeping him at the club until summer 2014. On 16 April 2014, Duff confirmed his intention to leave Fulham at the end of the 2013–14 season. Duff told The Irish Times, "I'll be leaving Fulham. The club haven't spoken to me and I haven't spoken to the club but we don't need to speak." He was released from the club on 23 May.
In June 2014, Duff joined Australian A-League club Melbourne City as a free transfer in a one-year deal. Duff made his debut against Sydney FC on match day one, assisting David Villa for his first goal in the A-League. Duff scored his first goal against the Newcastle Jets in a 5–2 win. In March 2015, Duff confirmed that he would leave Melbourne City to return to his homeland, with the intention of finishing his career in the League of Ireland.
On 14 July 2015, Duff signed for League of Ireland Premier Division club Shamrock Rovers, and revealed he would be donating his wages to charity. After nine games for the Dublin-based side, on 21 December 2015 he announced his retirement from football.