England met the Springboks challenge head on at Kings Park and were level at 6-6 at half-time after Owen Farrell and Steyn traded penalties.
South Africa began to gain the upper hand after the break as Steyn and captain De Villiers broke through and the hosts held on despite two more Farrell penalties applying pressure.
Ben Foden claimed a late England consolation after the final hooter and head coach Stuart Lancaster will take some heart from the fighting display of his players.
Despite that, what was England’s eighth successive Test loss to the Springboks still leaves them facing an uphill fight to win their first three-match series in South Africa.
The scoreline might have been close but the normally reliable Steyn, who still scored 17 of his side’s points, did miss two conversions and a penalty.
Heavy rain eased before kick-off but the surface remained slick.
The Springboks looked to impose themselves early on with some powerful hits and the more expansive handling of the two sides.
Bryan Habana gave England an early warning as he claimed a high kick from scrum-half Ben Youngs and weaved his way through several failed tackles before being halted on halfway.
But England also went hard into their tackles and were handed the chance to open the scoring when Eben Etzebeth, one of three debutants for the hosts, was penalised.
Farrell drilled a long-range effort between the posts and the fly-half had an opportunity to open up the Springboks defence soon after but his delicate kick was not read by any team-mates.
South Africa pulled themselves level with a Steyn penalty after Youngs, who was given a thorough examination throughout, lost possession and England were caught offside.
England survived a scare after Francois Hougaard found a gap and almost put Pierre Spies over when Manu Tuilagi produced a fine tackle to block the Springboks number eight on the line.
The tourists relieved the pressure after earning a penalty inside their own half and managed to claim three more points when a South African offside allowed Farrell another shot at goal.
But it was a penalty soon cancelled out by Steyn after another offside decision.
Mike Brown sparked an England attack when he broke a tackle from Habana and right wing Chris Ashton side-stepped Zane Kirchner to race clear. It took a fine recovering tackle from Hougaard to deny him.
Steyn had a chance to put South Africa ahead from wide on the left in the closing seconds of the first half but dragged his attempt wide.
England carried their fighting spirit into the second half and Tuilagi barged through an attempted tackle from De Villiers.
But it was South Africa who took a grip on the game by claiming the opening try in the 48th minute.
Prop Jannie du Plessis and De Villiers were both stopped inches short of the line before the ball was spun out left for Steyn to crash over.
That proved the start of prolonged spell of South African pressure.
England initially held firm, albeit at a price as Durban-born centre Brad Barritt was forced off with a head injury.
JP Pietersen almost found a way through on the left but was pushed into touch by Brown, an act the South Africa wing took exception to by sparking a minor fracas.
South Africa continued to pour forward with Habana proving a particularly tricky customer.
Eventually England had to crack and it was De Villiers who broke through for a second try on the hour as he raced onto a Pietersen pass and powered through a weak Brown tackle.
After another missed goal attempt by Steyn, England – not disheartened – powered forward in an attempt to find a way back into the game with Foden and Ashton finding gaps.
A kick over the top by Farrell looked to have proved fruitless but England came away with a penalty and the fly-half reduced the arrears to 16-9.
Farrell then cut that by another three points with just under 15 minutes remaining after another South African indiscretion.
The Springboks regrouped and extended their lead a little further when an England offside presented Steyn with a kickable penalty.
He added another in the closing moments as England ran out of steam.
England claimed a consolation after the final hooter when Foden dived over in the corner.