Best Places to Live in Ontario 2018


.WB18{
box-sizing:border-box
}
.WB18 *{
box-sizing:inherit
}
.WB18 a{
transition-property:background-color,color;
transition-duration:.2s
}
.grid>div{
float:left
}
.grid{
display:flex;
flex-direction:column
}
.font__display–proxima{
font-family:proxima-nova,”Helvetica Neue”,Helvetica,Arial,sans-serif
}
.font__display–jubilat{
font-family:jubilat,Georgia,serif
}
.WB18 h1,.WB18 h2,.WB18 h3,.WB18 h4,.WB18 h5,.WB18 h6{
font-family:proxima-nova,”Helvetica Neue”,Helvetica,Arial,sans-serif;
font-weight:900
}
.WB18__header–wrap{
/*margin-bottom:2em */
}
.WB18__header{
display:block;
padding: 0;
text-align:center;
background-color:#2fbcf2;
color:#fff;
background-position:center center;
font-family:jubilat,Georgia,serif;
cursor:pointer
}
.WB18__header:hover{
color:#afeeee;
background-color:#29c4f2
}
.WB18__header span{
display:inline-block;
color:#dc1b1b;
transition-property:color;
transition-duration:.2s
}
.WB18__header span.to-animate{
animation-name:tada;
animation-duration:.9s;
animation-delay:1s
}
.WB18__header:hover span{
color:#dc143c
}
.WB18__header:hover span.label__year{
color:#444
}
.WB18__desktop {
display: none;
}
@media (min-width:768px){
.grid{
flex-direction:row
}
.grid>*{
padding-left:1em;
padding-right:1em;
flex-grow:1
}
.grid>:first-child{
margin-left:0
}
.grid>:last-child{
margin-right:0
}
.block{
width:100%
}
.WB18__header{
padding:0;
}
}
.WB18__headline,.single-post article h1.WB18__headline{
color:#fff
}
.WB18__header .label__year{
display:block;
position:absolute;
line-height:1em;
padding:.3em .8em .2em;
top:.25em;
right:.25em;
background-color:gold;
color:#444;
font-weight:900;
box-shadow:2px 2px 6px rgba(0,0,0,.5);
border-radius:20%/50%
}
.WB18__nav{
display:flex;
flex-wrap:wrap;
flex-direction:column;
margin:0;
background-color:#eee
}
@media (min-width:768px){
.WB18__header .label__year{
font-size:1.4em;
right:-.25em
}
.WB18__nav{
flex-direction:row;
justify-content:stretch
}
.WB18__nav a,.WB18__nav button{
/* flex-grow:1 */
flex-basis: 50%;
}
}
@media (min-width: 1264px){
.WB18__nav a,.WB18__nav button{
/* flex-grow:1 */
flex-basis: 25%;
}
}
.WB18__nav a,.WB18__nav button{
padding:1rem 0.8rem;
border:0;
text-align:left;
background-color:#eee;
color:#dc1b1b;
font-family:proxima-nova,”Helvetica Neue”,Helvetica,Arial,sans-serif
}
#WB18__nav–togglerOne.active,#WB18__nav–togglerTwo.active,.WB18__nav a:hover,.WB18__nav button:hover{
background-color:#29c4f2;
color:#fff
}
.WB18__nav–overview{
order:1
}
.WB18__nav–other{
order:2
}
#WB18__nav–togglerOne{
order:3
}
#WB18__nav–togglerTwo{
order:4
}
.WB18__nav button{
outline:0
}
.WB18__nav #WB18__nav–togglerOne,.WB18__nav #WB18__nav–togglerTwo{
position:relative;
z-index:20
}
.WB18__nav #WB18__nav–togglerOne::after,.WB18__nav #WB18__nav–togglerTwo::after{
display:inline-block;
padding:0 1rem;
content:’ 025BE’;
transition-property:transform;
transition-duration:.2s
}
.WB18__nav #WB18__nav–togglerOne.active::after,.WB18__nav #WB18__nav–togglerTwo.active::after{
content:’ 025BE’;
transform:rotate(180deg)
}
.WB18__nav–citylistOne,.WB18__nav–citylistTwo{
position:absolute;
display:flex;
width:100%;
z-index:10;
flex-direction:column;
transform:translateX(-999em);
box-shadow:0 6px 4px rgba(0,0,0,.5)
}
.WB18__nav–citylistOne.active,.WB18__nav–citylistTwo.active{
transform:translateX(0);
z-index:20
}
.WB18__nav–citylistOne a,.WB18__nav–citylistTwo a{
background-color:#29c4f2;
color:#eee
}
.WB18__nav–citylistOne a:hover,.WB18__nav–citylistTwo a:hover{
background-color:#444;
color:#eee
}
@media (min-width:768px){
.WB18__nav–overview{
order:1
}
.WB18__nav–other{
order:4
}
#WB18__nav–togglerOne{
order:2
}
#WB18__nav–togglerTwo{
order:3
}
.WB18__mobile {
display: none;
}
.WB18__desktop {
display: block;
}
}
@keyframes tada{
from,to{
–transform:scale3d(1,1,1);
transform:scale3d(1,1,1)
}
10%,20%{
–transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);
transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)
}
30%,50%,70%,90%{
–transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);
transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)
}
40%,60%,80%{
–transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);
transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)
}
}

! function(e, t) { “object” == typeof exports && “object” == typeof module ? module.exports = t() : “function” == typeof define && define.amd ? define([], t) : “object” == typeof exports ? exports.inView = t() : e.inView = t() }(this, function() { return function(e) { function t(i) { if (n[i]) return n[i].exports; var r = n[i] = { exports: {}, id: i, loaded: !1 }; return e[i].call(r.exports, r, r.exports, t), r.loaded = !0, r.exports } var n = {}; return t.m = e, t.c = n, t.p = “”, t(0) }([function(e, t, n) { “use strict”; var i, r = n(2), o = (i = r) && i.__esModule ? i : { default: i }; e.exports = o.default }, function(e, t) { e.exports = function(e) { var t = typeof e; return null != e && (“object” == t || “function” == t) } }, function(e, t, n) { “use strict”; function i(e) { return e && e.__esModule ? e : { default: e } } Object.defineProperty(t, “__esModule”, { value: !0 }); var r = i(n(9)), o = i(n(3)), u = n(4); t.default = function() { if (“undefined” != typeof window) { var e = { history: [] }, t = { offset: {}, threshold: 0, test: u.inViewport }, n = (0, r.default)(function() { e.history.forEach(function(t) { e[t].check() }) }, 100); [“scroll”, “resize”, “load”].forEach(function(e) { return addEventListener(e, n) }), window.MutationObserver && addEventListener(“DOMContentLoaded”, function() { new MutationObserver(n).observe(document.body, { attributes: !0, childList: !0, subtree: !0 }) }); var i = function(n) { if (“string” == typeof n) { var i = [].slice.call(document.querySelectorAll(n)); return e.history.indexOf(n) > -1 ? e[n].elements = i : (e[n] = (0, o.default)(i, t), e.history.push(n)), e[n] } }; return i.offset = function(e) { if (void 0 === e) return t.offset; var n = function(e) { return “number” == typeof e }; return [“top”, “right”, “bottom”, “left”].forEach(n(e) ? function(n) { return t.offset[n] = e } : function(i) { return n(e[i]) ? t.offset[i] = e[i] : null }), t.offset }, i.threshold = function(e) { return “number” == typeof e && e >= 0 && e <= 1 ? t.threshold = e : t.threshold }, i.test = function(e) { return "function" == typeof e ? t.test = e : t.test }, i.is = function(e) { return t.test(e, t) }, i.offset(0), i } }() }, function(e, t) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }); var n = function() { function e(e, t) { for (var n = 0; n -1, o = !n && r; n && !r && (e.current.push(t), e.emit(“enter”, t)), o && (e.current.splice(i, 1), e.emit(“exit”, t)) }), this } }, { key: “on”, value: function(e, t) { return this.handlers[e].push(t), this } }, { key: “once”, value: function(e, t) { return this.singles[e].unshift(t), this } }, { key: “emit”, value: function(e, t) { for (; this.singles[e].length;) this.singles[e].pop()(t); for (var n = this.handlers[e].length; –n > -1;) this.handlers[e][n](t); return this } }]), e }(); t.default = function(e, t) { return new i(e, t) } }, function(e, t) { “use strict”; Object.defineProperty(t, “__esModule”, { value: !0 }), t.inViewport = function(e, t) { var n = e.getBoundingClientRect(), i = n.top, r = n.right, o = n.bottom, u = n.left, c = n.width, s = n.height, f = o, a = window.innerWidth – u, l = window.innerHeight – i, d = r, p = t.threshold * c, h = t.threshold * s; return f > t.offset.top + h && a > t.offset.right + p && l > t.offset.bottom + h && d > t.offset.left + p } }, function(e, t) { (function(t) { var n = “object” == typeof t && t && t.Object === Object && t; e.exports = n }).call(t, function() { return this }()) }, function(e, t, n) { var i = n(5), r = “object” == typeof self && self && self.Object === Object && self, o = i || r || Function(“return this”)(); e.exports = o }, function(e, t, n) { var i = n(1), r = n(8), o = n(10), u = “Expected a function”, c = Math.max, s = Math.min; e.exports = function(e, t, n) { function f(t) { var n = h, i = v; return h = v = void 0, w = t, m = e.apply(i, n) } function a(e) { var n = e – b; return void 0 === b || n >= t || n = y } function l() { var e, n, i = r(); return a(i) ? d(i) : void(g = setTimeout(l, (e = i, n = t – (e – b), x ? s(n, y – (e – w)) : n))) } function d(e) { return g = void 0, T && h ? f(e) : (h = v = void 0, m) } function p() { var e, n = r(), i = a(n); if (h = arguments, v = this, b = n, i) { if (void 0 === g) return e = b, w = e, g = setTimeout(l, t), O ? f(e) : m; if (x) return g = setTimeout(l, t), f(b) } return void 0 === g && (g = setTimeout(l, t)), m } var h, v, y, m, g, b, w = 0, O = !1, x = !1, T = !0; if (“function” != typeof e) throw new TypeError(u); return t = o(t) || 0, i(n) && (O = !!n.leading, y = (x = “maxWait” in n) ? c(o(n.maxWait) || 0, t) : y, T = “trailing” in n ? !!n.trailing : T), p.cancel = function() { void 0 !== g && clearTimeout(g), w = 0, h = b = v = g = void 0 }, p.flush = function() { return void 0 === g ? m : d(r()) }, p } }, function(e, t, n) { var i = n(6); e.exports = function() { return i.Date.now() } }, function(e, t, n) { var i = n(7), r = n(1), o = “Expected a function”; e.exports = function(e, t, n) { var u = !0, c = !0; if (“function” != typeof e) throw new TypeError(o); return r(n) && (u = “leading” in n ? !!n.leading : u, c = “trailing” in n ? !!n.trailing : c), i(e, t, { leading: u, maxWait: t, trailing: c }) } }, function(e, t) { e.exports = function(e) { return e } }]) }), function(e, t) { if (“function” == typeof define && define.amd) define([“module”, “exports”], t); else if (“undefined” != typeof exports) t(module, exports); else { var n = { exports: {} }; t(n, n.exports), e.fitty = n.exports } }(this, function(e, t) { “use strict”; Object.defineProperty(t, “__esModule”, { value: !0 }); var n = Object.assign || function(e) { for (var t = 1; t 1 && void 0 !== arguments[1] ? arguments[1] : {}; return “string” == typeof e ? t(r(document.querySelectorAll(e)), n) : t([e], n)[0] } if (e) { var r = function(e) { return [].slice.call(e) }, o = { IDLE: 0, DIRTY_CONTENT: 1, DIRTY_LAYOUT: 2, DIRTY: 3 }, u = [], c = null, s = “requestAnimationFrame” in e ? function() { e.cancelAnimationFrame(c), c = e.requestAnimationFrame(function() { a(u.filter(function(e) { return e.dirty })) }) } : function() {}, f = function(e) { return function() { u.forEach(function(t) { t.dirty = e }), s() } }, a = function(e) { e.filter(function(e) { return !e.styleComputed }).forEach(function(e) { e.styleComputed = p(e) }), e.filter(h).forEach(y), e.filter(d).forEach(l), e.forEach(v), e.forEach(m) }, l = function(e) { e.availableWidth = e.element.parentNode.clientWidth, e.currentWidth = e.element.scrollWidth, e.previousFontSize = e.currentFontSize, e.currentFontSize = Math.min(Math.max(e.minSize, e.availableWidth / e.currentWidth * e.previousFontSize), e.maxSize), e.whiteSpace = e.multiLine && e.currentFontSize === e.minSize ? “normal” : “nowrap” }, d = function(e) { return e.dirty !== o.DIRTY_LAYOUT || e.dirty === o.DIRTY_LAYOUT && e.element.parentNode.clientWidth !== e.availableWidth }, p = function(t) { var n = e.getComputedStyle(t.element, null); t.currentFontSize = parseInt(n.getPropertyValue(“font-size”), 10), t.display = n.getPropertyValue(“display”), t.whiteSpace = n.getPropertyValue(“white-space”) }, h = function(e) { var t = !1; return /inline-/.test(e.display) || (t = !0, e.display = “inline-block”), “nowrap” !== e.whiteSpace && (t = !0, e.whiteSpace = “nowrap”), t }, v = function(e) { y(e), e.dirty = o.IDLE }, y = function(e) { e.originalStyle || (e.originalStyle = e.element.getAttribute(“style”) || “”), e.element.style.cssText = e.originalStyle + “;white-space:” + e.whiteSpace + “;display:” + e.display + “;font-size:” + e.currentFontSize + “px” }, m = function(e) { e.element.dispatchEvent(new CustomEvent(“fit”, { detail: { oldValue: e.previousFontSize, newValue: e.currentFontSize, scaleFactor: e.currentFontSize / e.previousFontSize } })) }, g = function(e, t) { return function() { e.dirty = t, s() } }, b = function(e) { e.newbie = !0, e.dirty = !0, u.push(e) }, w = function(e) { return function() { u = u.filter(function(t) { return t.element !== e.element }), e.observeMutations && e.observer.disconnect(), e.element.style.cssText = e.originalStyle } }, O = function(e) { e.observeMutations && (e.observer = new MutationObserver(g(e, o.DIRTY_CONTENT)), e.observer.observe(e.element, e.observeMutations)) }, x = { minSize: 16, maxSize: 512, multiLine: !0, observeMutations: “MutationObserver” in e && { subtree: !0, childList: !0, characterData: !0 } }, T = null, L = function() { e.clearTimeout(T), T = e.setTimeout(f(o.DIRTY_LAYOUT), i.observeWindowDelay) }, S = [“resize”, “orientationchange”]; return Object.defineProperty(i, “observeWindow”, { set: function(t) { var n = (t ? “add” : “remove”) + “EventListener”; S.forEach(function(t) { e[n](t, L) }) } }), i.observeWindow = !0, i.observeWindowDelay = 100, i.fitAll = f(o.DIRTY), i } }(“undefined” == typeof window ? null : window), e.exports = t.default }), fitty(“.fit”), inView(“.fit”).on(“enter”, function() { fitty(“.fit”) }), function(e) { function t() { if (this.id === “WB18__nav–togglerOne”) { !1 === e.cityListOneOpen ? e.cityListOneOpen = !0 : e.cityListOneOpen = !1, e.togglerOne.classList.toggle(“active”), e.submenuOne.classList.toggle(“active”); } else if (this.id === “WB18__nav–togglerTwo”) { !1 === e.cityListTwoOpen ? e.cityListTwoOpen = !0 : e.cityListTwoOpen = !1, e.togglerTwo.classList.toggle(“active”), e.submenuTwo.classList.toggle(“active”); } } e.cityListOneOpen = !1, e.togglerOne = document.querySelector(“#WB18__nav–togglerOne”), e.submenuOne = document.querySelector(“.WB18__nav–citylistOne”), e.togglerOne.addEventListener(“click”, t), e.addEventListener(“keyup”, function(n) { 27 === n.keyCode && !0 === e.cityListOneOpen && t() }), e.cityListTwoOpen = !1, e.togglerTwo = document.querySelector(“#WB18__nav–togglerTwo”), e.submenuTwo = document.querySelector(“.WB18__nav–citylistTwo”), e.togglerTwo.addEventListener(“click”, t), e.addEventListener(“keyup”, function(n) { 27 === n.keyCode && !0 === e.cityListTwoOpen && t() }) }(this);

oakville

Bronte Harbour Marina in Oakville, Ontario.

Anyone looking for a great place to live in Ontario is spoiled for choice.

Fully half of the 50 best places to live in the country are in Ontario. This is partly because it’s the most populous province, but people flock there for a reason. Ontario has a strong economy, cultural amenities in Toronto and Ottawa and, of course, decent weather — for Canada.

You can read about Oakville, our overall winner, here. Oakville is also the best place to live for New Canadians, partly thanks to its rich and growing diversity — the percentage of visible minorities in Oakville has increased from 18 per cent to 31 per cent over the past 10 years.


PHOTOS:


Ottawa took the no. 2 spot, after spending two years in a row as the Best Places to Live reigning champion. This year, Ottawa was named the best place to retire, thanks to its ease of getting around and excellent access to health care.

Toronto broke the top 20 this year, taking the 16th spot overall. Yes, it’s expensive, but housing prices are actually going up faster in the surrounding suburbs now, as buyers finally abandon the dream of owning a downtown home.

Torontonians love to complain about the transit system, but the city still boasts the second highest percentage of its population that commutes to work by bus, streetcar or subway. And of course, you can’t beat the amenities the city has to offer — in that category, Toronto is no. 1.

The Best Places to Live ranks 415 cities across the country based on 10 categories: Wealth and economy, affordability, population growth, taxes, commute, crime, weather, access to health care, amenities and culture. For more information, please see the methodology page.

See the full ranking of Ontario cities »

The post Best Places to Live in Ontario 2018 appeared first on MoneySense.



Source link

Leave a Reply

Your email address will not be published. Required fields are marked *