How to calculate width of remaining part of line
The computations are somewhat similar to those in the other answers, but this solution also copes with unnumbered sections and long titles.
\documentclass[a4paper]{book}
\usepackage{lipsum}
\usepackage{titlesec}
\usepackage{xcolor}
\newsavebox{\sectionlabelbox}
\newlength{\sectionlabelwidth}
\colorlet{mygray}{gray!90}
\colorlet{myblue}{blue!80}
\newcommand{\sectionlabel}{%
\sbox{\sectionlabelbox}{\colorbox{mygray}{\strut\color{white}Section~\thesection}}%
\global\sectionlabelwidth=\wd\sectionlabelbox
\usebox{\sectionlabelbox}%
}
\newcommand{\sectiontitle}[1]{%
\colorbox{myblue}{%
\parbox[t]{\dimexpr\columnwidth-\sectionlabelwidth-2\fboxsep-0.5ex}{
\raggedright\strut\color{white}#1
}%
}%
}
\titleformat{\section}[hang]
{\large\bfseries\global\sectionlabelwidth=-0.5ex }%
{\sectionlabel}
{.5ex}
{\sectiontitle}
\begin{document}
\section{A test}
\setcounter{section}{9}
\section{Another test}
\section{Another test, but with a title that is so long it has to be
split across lines}
\section*{A further test}
\end{document}
Here's a modification where the grey box has the same vertical size of the blue box.
\documentclass[a4paper]{book}
\usepackage{lipsum}
\usepackage{titlesec}
\usepackage{xcolor}
\newsavebox{\sectiontitlebox}
\newlength{\sectionlabelwidth}
\colorlet{mygray}{gray!90}
\colorlet{myblue}{blue!80}
\newcommand{\sectiontitle}[1]{%
\settowidth{\sectionlabelwidth}{%
\colorbox{mygray}{\strut\color{white}Section~\thesection}%
}%
\sbox{\sectiontitlebox}{%
\colorbox{myblue}{%
\parbox[t]{\dimexpr\columnwidth-\sectionlabelwidth-2\fboxsep-0.5ex}{
\raggedright\strut\color{white}#1
}%
}%
}%
\colorbox{mygray}{%
\vrule height \dimexpr\ht\sectiontitlebox-\fboxsep\relax
depth \dimexpr\dp\sectiontitlebox-\fboxsep\relax
width 0pt
\color{white}Section~\thesection
}%
\hspace{0.5ex}%
\usebox{\sectiontitlebox}%
}
\newcommand{\sectionstartitle}[1]{%
\colorbox{myblue}{%
\parbox[t]{\dimexpr\columnwidth-2\fboxsep}{
\raggedright\strut\color{white}#1
}%
}%
}
\titleformat{name=\section}[hang]
{\large\bfseries}
{}
{0pt}
{\sectiontitle}
\titleformat{name=\section,numberless}[hang]
{\large\bfseries}
{}
{0pt}
{\sectionstartitle}
\begin{document}
\section{A test}
\setcounter{section}{9}
\section{Another test}
\section{Another test, but with a title that is so long it has to be
split across lines}
\section*{A further test}
\end{document}
Based on Is there a way to measure the remaining space of a line of text?
\documentclass[a4paper]{book}
\usepackage{lipsum}
\usepackage[explicit]{titlesec}
\usepackage{xcolor}
\newlength{\myl}
\colorlet{mygray}{gray!90}
\colorlet{myblue}{blue!80}
\newcommand{\graybox}{\colorbox{mygray}{\strut \color{white}Section~\thesection}}
\settowidth{\myl}{\graybox}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\currentsidemargin}{%
\ifodd\value{page}%
\oddsidemargin%
\else%
\evensidemargin%
\fi%
}
\newlength{\whatsleft}
\newcommand{\measureremainder}[1]{%
\begin{tikzpicture}[overlay,remember picture]
% Helper nodes
\path (current page.north west) ++(\hoffset, -\voffset)
node[anchor=north west, shape=rectangle, inner sep=0, minimum width=\paperwidth, minimum height=\paperheight]
(pagearea) {};
\path (pagearea.north west) ++(1in+\currentsidemargin,-1in-\topmargin-\headheight-\headsep)
node[anchor=north west, shape=rectangle, inner sep=0, minimum width=\textwidth, minimum height=\textheight]
(textarea) {};
% Measure distance to right text border
\path let \p0 = (0,0), \p1 = (textarea.east) in
[/utils/exec={\pgfmathsetlength#1{\x1-\x0}\global#1=#1}];
\end{tikzpicture}%
}
\titleformat{\section}[hang]{\large\bfseries}%
{\graybox}{.5ex}{\measureremainder{\whatsleft}\colorbox{myblue}{\makebox[\dimexpr\whatsleft-2\fboxsep][l]%
{\strut\color{white}\large\bfseries #1}}}
\pagestyle{empty}
\begin{document}
\section{blub}
\setcounter{section}{10}
\section{blub}
\lipsum
\end{document}