The biggest protest was in Bordeaux, where about 3,000 people staged a counter-demonstration.
As well as Bordeaux, demonstrators hit the streets of Lille, in the north, Nancy and Reims, in the east, and Le Mans in the north-west.
Organisers claimed that 20,000 joined the march in Bordeaux, although police put the number at 7,000, and 32,000 in total, with police estimating the national turnout at 12,700.
In all the cities supporters of “marriage for all” demonstrated in favour of the proposed change to the law and police intervened to keep both sides apart.
The new law, which was one of President François Hollande's election campaign promises, will be debated on 29 January and its opponents will demonstrate in Paris on 13 January.
The main right-wing opposition party, the UMP, has backed the rally, as has the Catholic fundamentalist group Civitas.
The ruling Socialist Party has called for a support for a demonstration in favour of marriage for all and medically assisted procreation on 16 December.
On 17 November an estimated 100,000 people demonstrated against the proposed legislation across France.